-- cgit v1.2.3 From 524fdd3ac8d24dabcfb8c62961a2740920ad271b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 20 Feb 2016 10:56:10 +0100 Subject: initial checkin of manuals to public repo The manuals existed in different form for several years in an internal sysmocom repository. However, since they had just recently been converted from docboox-xml to asciidoc and all files have been re-shuffled for enabling the public release, there's not much point in keeping the history with git-filter-branch. --- doc/manuals/Makefile | 14 + doc/manuals/abis/abis-startup.msc | 23 + doc/manuals/abis/ipa.adoc | 106 ++++ doc/manuals/abis/oml-mo-bts.msc | 26 + doc/manuals/abis/oml-mo-carrier.msc | 24 + doc/manuals/abis/oml-mo-channel.msc | 20 + doc/manuals/abis/oml-mo-sitemgr.msc | 17 + doc/manuals/abis/oml-mo-transceiver.msc | 23 + doc/manuals/abis/oml-startup.msc | 34 ++ doc/manuals/abis/oml-startup2.msc | 50 ++ doc/manuals/abis/oml-startup3.msc | 51 ++ doc/manuals/abis/oml.adoc | 937 +++++++++++++++++++++++++++++ doc/manuals/abis/rsl-startup-pri.msc | 22 + doc/manuals/abis/rsl-startup-sec.msc | 16 + doc/manuals/abis/rsl-tch-rtp.msc | 56 ++ doc/manuals/abis/rsl.adoc | 681 +++++++++++++++++++++ doc/manuals/abis/rtp.adoc | 33 + doc/manuals/chapters/architecture.adoc | 120 ++++ doc/manuals/chapters/bts-models.adoc | 405 +++++++++++++ doc/manuals/chapters/configuration.adoc | 154 +++++ doc/manuals/chapters/interfaces.adoc | 130 ++++ doc/manuals/chapters/overview.adoc | 105 ++++ doc/manuals/osmobts-abis-docinfo.xml | 68 +++ doc/manuals/osmobts-abis.adoc | 90 +++ doc/manuals/osmobts-usermanual-docinfo.xml | 42 ++ doc/manuals/osmobts-usermanual.adoc | 32 + 26 files changed, 3279 insertions(+) create mode 100644 doc/manuals/Makefile create mode 100644 doc/manuals/abis/abis-startup.msc create mode 100644 doc/manuals/abis/ipa.adoc create mode 100644 doc/manuals/abis/oml-mo-bts.msc create mode 100644 doc/manuals/abis/oml-mo-carrier.msc create mode 100644 doc/manuals/abis/oml-mo-channel.msc create mode 100644 doc/manuals/abis/oml-mo-sitemgr.msc create mode 100644 doc/manuals/abis/oml-mo-transceiver.msc create mode 100644 doc/manuals/abis/oml-startup.msc create mode 100644 doc/manuals/abis/oml-startup2.msc create mode 100644 doc/manuals/abis/oml-startup3.msc create mode 100644 doc/manuals/abis/oml.adoc create mode 100644 doc/manuals/abis/rsl-startup-pri.msc create mode 100644 doc/manuals/abis/rsl-startup-sec.msc create mode 100644 doc/manuals/abis/rsl-tch-rtp.msc create mode 100644 doc/manuals/abis/rsl.adoc create mode 100644 doc/manuals/abis/rtp.adoc create mode 100644 doc/manuals/chapters/architecture.adoc create mode 100644 doc/manuals/chapters/bts-models.adoc create mode 100644 doc/manuals/chapters/configuration.adoc create mode 100644 doc/manuals/chapters/interfaces.adoc create mode 100644 doc/manuals/chapters/overview.adoc create mode 100644 doc/manuals/osmobts-abis-docinfo.xml create mode 100644 doc/manuals/osmobts-abis.adoc create mode 100644 doc/manuals/osmobts-usermanual-docinfo.xml create mode 100644 doc/manuals/osmobts-usermanual.adoc diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile new file mode 100644 index 00000000..092856d8 --- /dev/null +++ b/doc/manuals/Makefile @@ -0,0 +1,14 @@ +TOPDIR := .. +ASCIIDOCS := osmobts-usermanual osmobts-abis + +include $(TOPDIR)/build/Makefile.asciidoc.inc + +# for the upload target +include $(TOPDIR)/build/Makefile.inc + +# dependencies +osmobts-abis.pdf: abis/*.adoc abis/*.msc +osmobts-usermanual.pdf: chapters/*.adoc + +clean: + rm -rf $(cleanfiles) diff --git a/doc/manuals/abis/abis-startup.msc b/doc/manuals/abis/abis-startup.msc new file mode 100644 index 00000000..d30fe41d --- /dev/null +++ b/doc/manuals/abis/abis-startup.msc @@ -0,0 +1,23 @@ +msc { + bts [label="BTS"], bsc [label="BSC"]; + + bts => bsc [label="TCP Connect (Port 3002, OML)"]; + bts box bsc [label="IPA CCM Identification (Port 3002)"]; + bts <= bsc [label="OML Configuration of BTS via OML"]; + ...; + bts <= bsc [label="OML (TRX=0) IPA RSL CONNECT"]; + bts => bsc [label="TCP Connect (Port 3003, RSL, TRX 0)"]; + bts box bsc [label="IPA CCM Identification Port 3003"]; + bts <= bsc [label="RSL BCCH filling (System Information)"]; + bts <= bsc [label="RSL SACCH filling (SI 5/6)"]; + ...; + bts <= bsc [label="OML (TRX=1) IPA RSL CONNECT"]; + bts => bsc [label="TCP Connect (Port 3003, RSL, TRX 1)"]; + bts box bsc [label="IPA CCM Identification (Port 3003)"]; + bts <= bsc [label="RSL SACCH filling (SI 5/6)"]; + ...; + bts <= bsc [label="OML (TRX=N) IPA RSL CONNECT"]; + bts => bsc [label="TCP Connect (Port 3003, RSL, TRX N)"]; + bts box bsc [label="IPA CCM Identification (Port 3003)"]; + bts <= bsc [label="RSL SACCH filling (SI 5/6)"]; +} diff --git a/doc/manuals/abis/ipa.adoc b/doc/manuals/abis/ipa.adoc new file mode 100644 index 00000000..9768cdd6 --- /dev/null +++ b/doc/manuals/abis/ipa.adoc @@ -0,0 +1,106 @@ +== IPA Multiplex + +The ETSI/3GPP specifications for A-bis transport (ETSI/3GPP TS 08.56) +specify the transmission of RSL and OML messages over a LAPD based +framing on top of 64kBit/s signalling times slots (B-channels) on E1 +lines. + +OsmoBTS does not implement this LAPD based transport, but instead +implements A-bis over IP in a flavor first observed by ip.access nanoBTS +products. The OsmoBTS implementation is a clean-room re-implementation +based on the observation and dissection of protocol traces. + +LAPD as used in E1 signalling channels provides in-order transmission +and reliable delivery. This is why TCP was chosen as Layer 4 transport +protocol on top of IP. TCP however, is a stream based transport +protocol, which doesn't preserve the boundaries of messages. + +To work around this shortcoming, an additional framing layer called the +IPA multiplex was introduced between TCP and the RSL and OML messages. + +.Protocol Stacking +[width="30%"] +|=== +|RSL + OML (this document) +|IPA (this document) +|TCP (IETF RFC 793) +|IP (IETF RFC 791) +|Ethernet (IEEE 802.3) +|=== + +=== IPA Header + +Each higher-layer PDU is encapsulated by a three-byte IPA header with +the following structure: + +.IPA Header Structure +[options="header",cols="10%,15%,15%,60%"] +|=== +|Offset (Octets)|Length|Name|Description +|0|2|Length|Length of the variable-length payload section in network +byte order (excluding the length of the IPA Header) +|2|1|Stream Identifier|Identifies the stream of the payload +|3|Variable|Payload|higher-layer PDU (i.e. RSL or OML message) +|=== + +=== IPA Stream Identifiers + +The IPA Stream Identifier serves to differentiate different streams +within the multiplex. In the context of A-bis, it can be seen as +analogous to the LAPD TEI on classic A-bis over E1. + +The following IPA stream identifiers are being used in A-bis/IP: + +.IPA Stream Identifiers +[options="header",width="70%",cols="20%,20%,60%"] +|=== +|Value (Hex)|Name|Description +|0x00|RSL|A-bis RSL according to this document, TRX 0 +|0x01|RSL|A-bis RSL according to this document, TRX 1 +|0x0n|RSL|A-bis RSL according to this document, TRX n +|0xfe|CCM|IPA Connection Management +|0xff|OML|A-bis OML according to this document +|=== + + +=== IPA Connection Management (CCM) + +The IPA Connection Management is a sub-layer underneath the IPA +multiplex which is used to manage the connection itself. It supports +functions like Identity Management and Keep-Alive. + +==== Identity Management + +When a BTS connects to the BSC, the BSC must identify the connected BTS +somehow. In ETSI/3GPP A-bis, the E1 multiplex + signalling timeslot +number is used for this. In IP, there is no similar usable identity. +Hence, the Unit ID is used for this purpose. + +.Procedure for IPA peer identification is as follows +[options="header",cols="20%,80%"] +|=== +|Direction|Operation +|BTS -> BSC|BTS connects the TCP connection to be used with IPA +|BTS <- BSC|BSC requests BTS identity with ID_GET +|BTS -> BSC|BTS responds BTS Unit ID with ID_RESP +|BTS <- BSC|BSC responds with ID_ACK, if the Unit ID is known to the BSC +|=== + +Following the above peer identification procedure, transfer of +higher-level messages such as OML or RSL commences. + +==== IPA CCM Messages + +IPA CCM supports the following messages + +.IPA CCM Messages +[options="header"] +[cols="10%,15%,75%"] +|=== +|Value|Name|Purpose +|0x00|PING|Request a PONG from the peer +|0x01|PONG|Response to a PING +|0x04|ID_GET|Request Identity from peer +|0x05|ID_RESP|Response to ID_GET +|0x06|ID_ACK|Identity Acknowledged +|=== diff --git a/doc/manuals/abis/oml-mo-bts.msc b/doc/manuals/abis/oml-mo-bts.msc new file mode 100644 index 00000000..75c283fb --- /dev/null +++ b/doc/manuals/abis/oml-mo-bts.msc @@ -0,0 +1,26 @@ +msc { + bts [label="BTS"], bsc [label="BSC"]; + # this is for the BTS Object + --- [label="Initial state after establishing OML"]; + bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"]; + --- [label="MO requests software activation"]; + bts => bsc [label="SW Activate Req"]; + bts <= bsc [label="SW Activate Req Ack"]; + --- [label="BTS instructs BTS to activate software"]; + bts <= bsc [label="Activate SW"]; + bts => bsc [label="Activate SW Ack"]; + --- [label="MO reports new state after SW activation"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency)"]; + bts => bsc [label="SW Activated Report"]; + --- [label="Configure the MO with its attributes"]; + bts <= bsc [label="Set BTS Attributes"]; + bts => bsc [label="Set BTS Attributes Ack"]; + bts <= bsc [label="OPSTART"]; + bts => bsc [label="OPSTART ACK"]; + --- [label="As this object is locked, we need to unlock it"]; + bts <= bsc [label="Change Adm State (Unlocked)"]; + bts => bsc [label="Change Adm State Ack (Unlocked)"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"]; + --- [label="Initialize Radio Transceiver, Radio Carrier, Channels"]; + bts => bsc [label="STATE CHG REP (Enabled/OK)"]; +} diff --git a/doc/manuals/abis/oml-mo-carrier.msc b/doc/manuals/abis/oml-mo-carrier.msc new file mode 100644 index 00000000..fc5070f6 --- /dev/null +++ b/doc/manuals/abis/oml-mo-carrier.msc @@ -0,0 +1,24 @@ +msc { + bts [label="Radio Carrier"], bsc [label="BSC"]; + --- [label="Initial state after establishing OML"]; + bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"]; + --- [label="MO requests software activation"]; + bts => bsc [label="SW Activate Req"]; + bts <= bsc [label="SW Activate Req Ack"]; + --- [label="BTS instructs BTS to activate software"]; + bts <= bsc [label="Activate SW"]; + bts => bsc [label="Activate SW Ack"]; + --- [label="MO reports new state after SW activation"]; + bts => bsc [label="STATE CHG REP (Disabled/Offline)"]; + bts => bsc [label="SW Activated Report"]; + --- [label="Configure the MO with its attributes"]; + bts <= bsc [label="Set Radio Carrier Attributes"]; + bts => bsc [label="Set Radio Carrier Attributes Ack"]; + bts <= bsc [label="OPSTART"]; + bts => bsc [label="OPSTART ACK"]; + --- [label="As this object is locked, we need to unlock it"]; + bts <= bsc [label="Change Adm State (Unlocked)"]; + bts => bsc [label="Change Adm State Ack (Unlocked)"]; + bts => bsc [label="STATE CHG REP (Disabled/OK/Unlocked)"]; + bts => bsc [label="STATE CHG REP (Enabled)"]; +} diff --git a/doc/manuals/abis/oml-mo-channel.msc b/doc/manuals/abis/oml-mo-channel.msc new file mode 100644 index 00000000..624ae724 --- /dev/null +++ b/doc/manuals/abis/oml-mo-channel.msc @@ -0,0 +1,20 @@ +msc { + bts [label="Channel"], bsc [label="BSC"]; + --- [label="Initial state after establishing OML"]; + bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"]; + --- [label="MO reports new state after SW activation of Baseband Transceiver"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency)"]; + bts => bsc [label="SW Activated Report"]; + --- [label="Configure the MO with its attributes"]; + bts <= bsc [label="Set Channel Attributes"]; + bts => bsc [label="Set Channel Attributes Ack"]; + bts <= bsc [label="OPSTART"]; + bts => bsc [label="OPSTART ACK"]; + --- [label="As this object is locked, we need to unlock it"]; + bts <= bsc [label="Change Adm State (Unlocked)"]; + bts => bsc [label="Change Adm State Ack (Unlocked)"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"]; + --- [label="Initialize Radio Carrier / Baseband Transceiver"]; + bts => bsc [label="STATE CHG REP (Disabled/Offline)"]; + bts => bsc [label="STATE CHG REP (Enabled/OK)"]; +} diff --git a/doc/manuals/abis/oml-mo-sitemgr.msc b/doc/manuals/abis/oml-mo-sitemgr.msc new file mode 100644 index 00000000..39e4d159 --- /dev/null +++ b/doc/manuals/abis/oml-mo-sitemgr.msc @@ -0,0 +1,17 @@ +msc { + bts [label="Site Manager"], bsc [label="BSC"]; + # this is for the Site Manager Object + --- [label="Initial state after establishing OML"]; + bts => bsc [label="STATE CHG REP (Disabled/Notinstalled)"]; + --- [label="MO requests software activation"]; + bts => bsc [label="SW Activate Req"]; + bts <= bsc [label="SW Activate Req Ack"]; + --- [label="BTS instructs BTS to activate software"]; + bts <= bsc [label="Activate SW"]; + bts => bsc [label="Activate SW Ack"]; + --- [label="MO reports new state after SW activation"]; + bts => bsc [label="STATE CHG REP (Enabled)"]; + bts => bsc [label="SW Activated Report"]; + bts <= bsc [label="OPSTART"]; + bts => bsc [label="OPSTART ACK"]; +} diff --git a/doc/manuals/abis/oml-mo-transceiver.msc b/doc/manuals/abis/oml-mo-transceiver.msc new file mode 100644 index 00000000..d40e7cc0 --- /dev/null +++ b/doc/manuals/abis/oml-mo-transceiver.msc @@ -0,0 +1,23 @@ +msc { + bts [label="Baseband Transceiver"], bsc [label="BSC"]; + --- [label="Initial state after establishing OML"]; + bts => bsc [label="STATE CHG REP (Disabled/Notinstalled/Locked)"]; + --- [label="MO requests software activation"]; + bts => bsc [label="SW Activate Req"]; + bts <= bsc [label="SW Activate Req Ack"]; + --- [label="BTS instructs BTS to activate software"]; + bts <= bsc [label="Activate SW"]; + bts => bsc [label="Activate SW Ack"]; + --- [label="MO reports new state after SW activation"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency)"]; + bts => bsc [label="SW Activated Report"]; + --- [label="BSC requests RSL establishment"]; + bts <= bsc [label="IPA RSL Connect"]; + bts => bsc [label="IPA RSL Connect ACK"]; + bts <= bsc [label="OPSTART"]; + bts => bsc [label="OPSTART ACK"]; + --- [label="As this object is locked, we need to unlock it"]; + bts <= bsc [label="Change Adm State (Unlocked)"]; + bts => bsc [label="Change Adm State Ack (Unlocked)"]; + bts => bsc [label="STATE CHG REP (Disabled/Dependency/Unlocked)"]; +} diff --git a/doc/manuals/abis/oml-startup.msc b/doc/manuals/abis/oml-startup.msc new file mode 100644 index 00000000..de5d0392 --- /dev/null +++ b/doc/manuals/abis/oml-startup.msc @@ -0,0 +1,34 @@ +msc { + hscale = 2; + + chan [label="Channel"], rc [label="Radio Carrier"], smg [label="Site Manager"], bts [label="BTS"], bsc [label="BSC"]; + + bts => bsc [label="TCP Connect (Port 3003, OML)"]; + bts box bsc [label="IPA CCM Identification (Port 3003)"]; + |||; + smg => bsc [label="(Site Mgr) STATE CHG REP (Disabled/NotInstalled)"]; + bts => bsc [label="(BTS) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 0) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 1) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 2) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 3) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 4) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 5) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 6) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + chan => bsc [label="(Ch 7) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + rc => bsc [label="(RC) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + bts => bsc [label="(GPRS-NSE) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + bts => bsc [label="(GPRS-CELL) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + bts => bsc [label="(GPRS-NSVC0) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + bts => bsc [label="(GPRS-NSVC1) STATE CHG REP (Disabled/NotInstalled/Locked)"]; + |||; + smg => bsc [label="(Site Mgr) SW Activate Req"]; + smg <= bsc [label="(Site Mgr) SW Activate Req Ack"]; + smg <= bsc [label="(Site Mgr) Activate SW"]; + smg => bsc [label="(Site Mgr) Activate SW Ack"]; + smg => bsc [label="(Site Mgr) STATE CHG REP (Enabled)"]; + smg => bsc [label="(Site Mgr) SW Activated Report"]; + smg <= bsc [label="(Site Mgr) OPSTART"]; + smg => bsc [label="(Site Mgr) OPSTART ACK"]; +} diff --git a/doc/manuals/abis/oml-startup2.msc b/doc/manuals/abis/oml-startup2.msc new file mode 100644 index 00000000..8a97e124 --- /dev/null +++ b/doc/manuals/abis/oml-startup2.msc @@ -0,0 +1,50 @@ +msc { + hscale = 2; + + chan [label="Channel"], rc [label="Radio Carrier"], bts [label="BTS"], bsc [label="BSC"]; + + bts box bsc [label="OML Connect + Site Manager Init"]; + ...; + bts => bsc [label="(BTS) SW Activate Req"]; + bts <= bsc [label="(BTS) SW Activate Req Ack"]; + bts <= bsc [label="(BTS) Activate SW"]; + bts => bsc [label="(BTS) Activate SW Ack"]; + bts => bsc [label="(BTS) STATE CHG REP (Disabled/Dependency)"]; + bts => bsc [label="(BTS) SW Activated Report"]; + |||; + rc => bsc [label="(TRANSC) SW Activate Req"]; + rc => bsc [label="(RC) SW Activated Req"]; + |||; + bts <= bsc [label="(BTS) Set BTS Attributes"]; + bts => bsc [label="(BTS) Set BTS Attributes Ack"]; + bts <= bsc [label="(BTS) OPSTART"]; + bts => bsc [label="(BTS) OPSTART Ack"]; + |||; + bts <= bsc [label="(BTS) Change Adm State (Unlocked)"]; + bts => bsc [label="(BTS) Change Adm State ACK (Unlocked)"]; + bts => bsc [label="(BTS) STATE CHG REP (Disabled/Dependency/Unlcoked)"]; + |||; + rc <= bsc [label="(TRANSC) SW Activate Req Ack"]; + rc <= bsc [label="(TRANSC) Activate SW"]; + rc => bsc [label="(TRANSC) Activate SW Ack"]; + rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Dependency)"]; + rc => bsc [label="(TRANSC) SW Activated Report"]; + + chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 1) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 2) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 3) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 4) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 5) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 6) STATE CHG REP (Disabled/Dependency)"]; + chan => bsc [label="(CHAN 7) STATE CHG REP (Disabled/Dependency)"]; + |||; + chan => bsc [label="(CHAN 0) SW Activated Report"]; + chan => bsc [label="(CHAN 1) SW Activated Report"]; + chan => bsc [label="(CHAN 2) SW Activated Report"]; + chan => bsc [label="(CHAN 3) SW Activated Report"]; + chan => bsc [label="(CHAN 4) SW Activated Report"]; + chan => bsc [label="(CHAN 5) SW Activated Report"]; + chan => bsc [label="(CHAN 6) SW Activated Report"]; + chan => bsc [label="(CHAN 7) SW Activated Report"]; +} diff --git a/doc/manuals/abis/oml-startup3.msc b/doc/manuals/abis/oml-startup3.msc new file mode 100644 index 00000000..c1fffd2c --- /dev/null +++ b/doc/manuals/abis/oml-startup3.msc @@ -0,0 +1,51 @@ +msc { + hscale = 2; + + chan [label="Channel"], rc [label="Radio Carrier"], bts [label="BTS"], bsc [label="BSC"]; + + ...; + rc <= bsc [label="(RC) SW Activate Req Ack"]; + rc <= bsc [label="(RC) Activate SW"]; + rc => bsc [label="(RC) Activate SW Ack"]; + rc => bsc [label="(RC) STATE CHG REP (Disabled/Offline)"]; + rc => bsc [label="(RC) SW Activated Report"]; + rc <= bsc [label="(TRANSC) IPA RSL Connect"]; + rc => bsc [label="(TRANSC) IPA RSL Connect Ack"]; + rc <= bsc [label="(TRANSC) OPSTART"]; + rc => bsc [label="(TRANSC) OPSTART Ack"]; + rc <= bsc [label="(TRANSC) Change Adm State (Unlocked)"]; + rc => bsc [label="(TRANSC) Change Adm State Ack (Unlocked)"]; + rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Dependency/Unlocked)"]; + |||; + chan <= bsc [label="(CHAN 0) Set Channel Attributes"]; + chan => bsc [label="(CHAN 0) Set Channel Attributes Ack"]; + chan <= bsc [label="(CHAN 0) OPSTART"]; + chan => bsc [label="(CHAN 0) OPSTART Ack"]; + chan <= bsc [label="(CHAN 0) Change Adm State (Unlocked)"]; + chan => bsc [label="(CHAN 0) Change Adm State Ack (Unlocked)"]; + chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Dependency/Unlocked)"]; + ...; + chan <= bsc [label="(CHAN 7) Set Channel Attributes"]; + chan => bsc [label="(CHAN 7) Set Channel Attributes Ack"]; + chan <= bsc [label="(CHAN 7) OPSTART"]; + chan => bsc [label="(CHAN 7) OPSTART Ack"]; + chan <= bsc [label="(CHAN 7) Change Adm State (Unlocked)"]; + chan => bsc [label="(CHAN 7) Change Adm State Ack (Unlocked)"]; + chan => bsc [label="(CHAN 7) STATE CHG REP (Disabled/Dependency/Unlocked)"]; + |||; + rc <= bsc [label="(RC) Set Radio Carrier Attributes"]; + rc => bsc [label="(RC) Set Radio Carrier Attributes Ack"]; + rc <= bsc [label="(RC) OPSTART"]; + rc => bsc [label="(RC) OPSTART Ack"]; + rc <= bsc [label="(RC) Change Adm State (Unlocked)"]; + rc => bsc [label="(RC) Change Adm State Ack (Unlocked)"]; + rc => bsc [label="(RC) STATE CHG REP (Disabled/OK/Unlocked)"]; + rc => bsc [label="(RC) STATE CHG REP (Enabled)"]; + rc => bsc [label="(TRANSC) STATE CHG REP (Disabled/Offline)"]; + rc => bsc [label="(TRANSC) STATE CHG REP (Enabled/OK)"]; + |||; + chan => bsc [label="(CHAN 0) STATE CHG REP (Disabled/Offline)"]; + chan => bsc [label="(CHAN 0) STATE CHG REP (Enabled/OK)"]; + |||; + bts => bsc [label="(BTS) STATE CHG REP (Enabled/OK)"]; +} diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc new file mode 100644 index 00000000..778a084b --- /dev/null +++ b/doc/manuals/abis/oml.adoc @@ -0,0 +1,937 @@ +== Organization & Maintenance Link (OML) + +=== List of Messages + +The following tables list the OML messages used by OsmoBTS, grouped by their +level of compliance with 3GPP TS 12.21. + +==== Messages Compliant With TS 12.21 + +Specific limitations apply, see the linked sections. + +.Messages compliant with TS 12.21 +[options="header",cols="10%,10%,20%,35%,5%,20%"] +|=== +| TS 12.21 § | type code (hex) | This document § | Message | <-/-> | Received/Sent by OsmoBTS +6+<| *SW Download Management Messages:* +| 8.3.7 | 0x10 | <> | SW Activated Report | -> | Sent +6+<| *Air Interface Management Messages:* +.3+.| 8.6.1 | 0x41 .3+.| <> | Set BTS Attributes | <- | Received + | 0x42 | Set BTS Attributes Ack | -> | Sent + | 0x43 | Set BTS Attributes Nack | -> | Sent +.3+.| 8.6.2 | 0x44 .3+.| <> | Set Radio Carrier Attributes | <- | Received + | 0x45 | Set Radio Carrier Attributes Ack | -> | Sent + | 0x46 | Set Radio Carrier Attributes Nack | -> | Sent +.3+.| 8.6.3 | 0x47 .3+.| <> | Set Channel Attributes | <- | Received + | 0x48 | Set Channel Attributes Ack | -> | Sent + | 0x49 | Set Channel Attributes Nack | -> | Sent +6+<| *State Management and Event Report Messages:* + | 8.8.1 | 0x61 | <> | State Changed Event Report | -> | Sent +.3+.| 8.8.5 | 0x69 .3+.| <> | Change Administrative State | <- | Received + | 0x6A | Change Administrative State Ack | -> | Sent + | 0x6B | Change Administrative State Nack | -> | Sent +6+<| *Equipment Management Messages:* +.3+.| 8.9.2 | 0x74 .3+.| <> | Opstart | <- | Received + | 0x75 | Opstart Ack | -> | Sent + | 0x76 | Opstart Nack | -> | Sent +|=== + + +==== Messages Specific to OsmoBTS + +.Messages specific to OsmoBTS, not found in 3GPP TS 12.21 +[options="header"] +[options="header",cols="20%,55%,5%,20%"] +|=== +| This document § | Message | <-/-> | Received/Sent by OsmoBTS +| <> | Set Attribute | <- | Received +|=== + + +==== Messages Not Implemented by OsmoBTS +.3GPP TS 12.21 messages not implemented by OsmoBTS +[options="header",cols="10%,10%,80%"] +|=== +| TS 12.21 § | type code (hex) | Message +3+<| *SW Download Management Messages:* +.3+.| 8.3.1 | 0x01 | Load Data Initiate + | 0x02 | Load Data Initiate Ack + | 0x03 | Load Data Initiate Nack +.2+.| 8.3.2 | 0x04 | Load Data Segment + | 0x05 | Load Data Segment Ack + | 8.3.3 | 0x06 | Load Data Abort +.3+.| 8.3.4 | 0x07 | Load Data End + | 0x08 | Load Data End Ack + | 0x09 | Load Data End Nack +.3+.| 8.3.5 | 0x0A | SW Activate Request + | 0x0B | SW Activate Request Ack + | 0x0C | SW Activate Request Nack +.3+.| 8.3.6 | 0x0D | Activate SW + | 0x0E | Activate SW Ack + | 0x0F | Activate SW Nack +3+<| *A-bis Interface Management Messages:* +.3+.| 8.4.1 | 0x21 | Establish TEI + | 0x22 | Establish TEI Ack + | 0x23 | Establish TEI Nack +.3+.| 8.4.2 | 0x24 | Connect Terrestrial Signalling + | 0x25 | Connect Terrestrial Signalling Ack + | 0x26 | Connect Terrestrial Signalling Nack +.3+.| 8.4.3 | 0x27 | Disconnect Terrestrial Signalling + | 0x28 | Disconnect Terrestrial Signalling Ack + | 0x29 | Disconnect Terrestrial Signalling Nack +.3+.| 8.4.4 | 0x2A | Connect Terrestrial Traffic + | 0x2B | Connect Terrestrial Traffic Ack + | 0x2C | Connect Terrestrial Traffic Nack +.3+.| 8.4.5 | 0x2D | Disconnect Terrestrial Traffic + | 0x2E | Disconnect Terrestrial Traffic Ack + | 0x2F | Disconnect Terrestrial Traffic Nack +3+<| *Transmission Management Messages:* +.3+.| 8.5.1 | 0x31 | Connect Multi-Drop Link + | 0x32 | Connect Multi-Drop Link Ack + | 0x33 | Connect Multi-Drop Link Nack +.3+.| 8.5.2 | 0x34 | Disconnect Multi-Drop Link + | 0x35 | Disconnect Multi-Drop Link Ack + | 0x36 | Disconnect Multi-Drop Link Nack +3+<| *Test Management Messages:* +.3+.| 8.7.1 | 0x51 | Perform Test + | 0x52 | Perform Test Ack + | 0x53 | Perform Test Nack +.3+.| 8.7.2 | 0x54 | Test Report + | 0x55 | Send Test Report + | 0x56 | Send Test Report Ack + | 8.7.3 | 0x57 | Send Test Report Nack +.3+.| 8.7.4 | 0x58 | Stop Test + | 0x59 | Stop Test Ack + | 0x5A | Stop Test Nack +3+<| *State Management and Event Report Messages:* + | 8.8.2 | 0x62 | Failure Event Report +.3+.| 8.8.3 | 0x63 | Stop Sending Event Reports + | 0x64 | Stop Sending Event Reports Ack + | 0x65 | Stop Sending Event Reports Nack +.3+.| 8.8.4 | 0x66 | Restart Sending Event Reports + | 0x67 | Restart Sending Event Reports Ack + | 0x68 | Restart Sending Event Reports Nack +.3+.| 8.8.6 | 0x6C | Change Administrative State Request + | 0x6D | Change Administrative State Request Ack + | 0x6E | Change Administrative State Request Nack +.3+.| 8.8.7 | 0x93 | Report Outstanding Alarms + | 0x94 | Report Outstanding Alarms Ack + | 0x95 | Report Outstanding Alarms Nack +3+<| *Equipment Management Messages:* +.3+.| 8.9.1 | 0x71 | Changeover + | 0x72 | Changeover Ack + | 0x73 | Changeover Nack +.3+.| 8.9.3 | 0x87 | Reinitialize + | 0x88 | Reinitialize Ack + | 0x89 | Reinitialize Nack +.3+.| 8.9.4 | 0x77 | Set Site Outputs + | 0x78 | Set Site Outputs Ack + | 0x79 | Set Site Outputs Nack +.3+.| 8.9.5 | 0x90 | Change HW Configuration + | 0x91 | Change HW Configuration Ack + | 0x92 | Change HW Configuration Nack +3+<| *Measurement Management Messages:* + | 8.10.1 | 0x8A | Measurement Result Request + | 8.10.2 | 0x8B | Measurement Result Response + | 8.10.3 | 0x8C | Stop Measurement + | 8.10.4 | 0x8D | Start Measurement +3+<| *Other Messages:* + | 8.11.1 | 0x81 | Get Attributes + | 8.11.3 | 0x82 | Get Attribute(s) Response + | 8.11.1 | 0x83 | Get Attributes Nack +.3+.| 8.11.2 | 0x84 | Set Alarm Threshold + | 0x85 | Set Alarm Threshold Ack + | 0x86 | Set Alarm Threshold Nack +|=== + + +=== Details on Compliant OML Messages + +[[sw_act_rep]] +==== SW Activated Report + +OsmoBTS will send an _SW Activated Report_ when RF has been activated +successfully. The message is compliant with 3GPP TS 12.21 § 8.3.7. + +Upon RF activation, two _SW Activated Report_ messages will be sent, for the Object Classes + +- Radio Carrier (0x02) +- Baseband Transceiver (0x04) + +[[set_bts_attr]] +==== Set BTS Attributes + +OsmoBTS will receive a _Set BTS Attributes_ message and reply with a +corresponding ACK message on success. IE handling is fully compliant to TS +12.21, except that a change of BCCH ARFCN or BSIC while in operation is not +supported, and hence the _Starting Time_ IE is rejected. + +._Set BTS Attributes_ IEs not handled by OsmoBTS +[options="header",cols="10%,30%,60%"] +|=== +| TS 12.21 § | IE Name | Handling +| 9.4.52 | Starting Time | not supported (provokes NACK cause 0x10) +|=== + + +[[set_radio_attr]] +==== Set Radio Carrier Attributes + +This message conforms to 3GPP TS 12.21, with the following limitation, +as frequency hopping is not supported by OsmoBTS: + +._Set Radio Carrier Attributes_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 12.21 § | IE Name | Handling +| 9.4.5 | ARFCN List | ignored +|=== + + +[[set_chan_attr]] +==== Set Channel Attributes + +This message conforms to 3GPP TS 12.21, with the following limitation: OpenBTS +does not support frequency hopping, and the following 3GPP TS 12.21 IEs provoke +a NACK response when sent to OsmoBTS, as frequency hopping is not +supported: + +._Set Channel Attributes_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 12.21 § | IE Name | Handling +| 9.4.21 | HSN | not supported (provokes NACK cause 0x10) +| 9.4.27 | MAIO | not supported (provokes NACK cause 0x10) +| 9.4.52 | Starting Time | not supported (provokes NACK cause 0x10) +|=== + +[[state_changed_rep]] +==== State Changed Event Report + +This message is compliant with 3GPP TS 12.21. Exactly these IEs are sent by +OsmoBTS: + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message Type (0xf5) | 3GPP TS 12.21 9.1 | M | V | 1 +| Object Class | 3GPP TS 12.21 9.2 | M | V | 1 +| Object Instance | 3GPP TS 12.21 9.3 | M | V | 3 +| Operational State | 3GPP TS 12.21 9.4.38 | O | TV | 2 +| Availability Status | 3GPP TS 12.21 9.4.7 | O | TL16V (with length of 1) | 3 +|=== + +[[chg_adm_state]] +==== Change Administrative State + +This message is compliant with 3GPP TS 12.21 § 8.8.5. It applies to all of the +Objects Classes defined in 3GPP TS 12.21 § 9.2 as well as +<>. + +[[opstart]] +==== Opstart + +This message is compliant with 3GPP TS 12.21 § 8.9.2. It applies to all of the +Objects Classes defined in 3GPP TS 12.21 § 9.2 as well as +<>. + + +=== Details on OsmoBTS Specific Messages + +[[ipacc_set_attr]] +==== Set Attribute + +The message type is 0xf5. This message is sent to OsmoBTS to set +attributes on instances of managed objects of the non-standard +additional Object Classes (see <>). + +The message specifics depend on the Object Class and are detailed in +<>. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message Type (0xf5) | 3GPP TS 12.21 9.1 | M | V | 1 +| Object Class | 3GPP TS 12.21 9.2 | M | V | 1 +| Object Instance | 3GPP TS 12.21 9.3 | M | V | 3 +5+<| _Object Class specific IEs follow, see <>..._ +|=== + + +[[addnl_obj_classes]] +=== Additional Object Classes + +In addition to 3GPP TS 12.21 Chapter 9.2, the following managed objects +are supported: + +.Additional Managed Object Classes +[options="header"] +[cols="20%,20%,60%"] +|=== +| Value | Name | Description +| 0xf0 | GPRS NSE | GPRS-NS Entity +| 0xf1 | GPRS CELL | GPRS Cell Entity +| 0xf2 | GPRS NSVC | GPRS NS Virtual Circuit +|=== + +==== GPRS-NSE Managed Object + +There is one NS Entity per BTS. It supports the *Set Attribute* message +with the following Information Elements: + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message Type | 3GPP TS 12.21 9.1 | M | V | 1 +| Object Class | 3GPP TS 12.21 9.2 | M | V | 1 +| Object Instance | 3GPP TS 12.21 9.3 | M | V | 3 +| GPRS NSEI | <> | O | TL16V | >= 5 +| GPRS NS Configuration | <> | O | TL16V | >= 10 +| GPRS BSSGP Configuration | <> | O | TL16V | >= 14 +|=== + +==== GPRS Cell Managed Object + +There is one GPRS Cell entity per BTS. It supports the *Set Attribute* +message with the following Information Elements: + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message Type | 3GPP TS 12.21 9.1 | M | V | 1 +| Object Class | 3GPP TS 12.21 9.2 | M | V | 1 +| Object Instance | 3GPP TS 12.21 9.3 | M | V | 3 +| GPRS Routing Area Code | <> | O | TL16V | >= 4 +| GPRS Paging Configuration | <> | O | TL16V | >= 5 +| GPRS RLC Configuration | <> | O | TL16V | >= 12 +| GPRS Coding Schemes | <> | O | TL16V | >= 5 +| GPRS RLC Configuration 2 | <> | O | TL16V | >= 8 +| GPRS RLC Configuration 3 | <> | O | TL16V | >= 4 +|=== + +==== GPRS NS-VC Managed Object + +There are two GPRS NS-VC instances per BTS. It supports the *Set +Attribute* message with the following Information Elements: + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message Type | 3GPP TS 12.21 9.1 | M | V | 1 +| Object Class | 3GPP TS 12.21 9.2 | M | V | 1 +| Object Instance | 3GPP TS 12.21 9.3 | M | V | 3 +| GPRS NSVCI | <> | O | TL16V | >= 5 +| GPRS NS Link Configuration | <> | O | TL16V | >= 11 +|=== + + +=== Information Elements Overview + +All of the IEs handled by OsmoBTS are listed below, with limitations and +additions to TS 12.21 specified in more detail. + +==== IEs Conforming to TS 12.21 + +The following Information Elements are accepted by OsmoBTS. Not all IEs are +actually evaluated. + +.IEs conforming to TS 12.21 +[options="header",cols="5%,10%,40%,5%,40%"] +|=== +| tag (hex) | TS 12.21 § | IE name | <-/-> | Received/Sent by OsmoBTS +| 0x00 | 9.4.1 | Abis Channel | | _ignored_ +| 0x01 | 9.4.2 | Additional Info | | _ignored_ +| 0x02 | 9.4.3 | Additional Text | | _ignored_ +| 0x03 | 9.4.4 | Administrative State | <- -> | Received & Sent +| 0x04 | 9.4.5 | ARFCN List | <- | Received, with exactly 1 ARFCN: see <>; + ignored by _Set Radio Attribute_ message (<>) +| 0x05 | 9.4.6 | Autonomously Report | | _ignored_ +| 0x06 | 9.4.7 | Availability Status | -> | Sent +| 0x07 | 9.4.8 | BCCH ARFCN | <- | Received +| 0x08 | 9.4.9 | BSIC | <- | Received +| 0x09 | 9.4.10 | BTS Air Timer | <- | Received +| 0x0a | 9.4.11 | CCCH Load Indication Period | <- | Received +| 0x0b | 9.4.12 | CCCH Load Threshold | <- | Received +| 0x0c | 9.4.13 | Channel Combination | <- | Received, with additional channel combinations: see <> +| 0x0d | 9.4.14 | Connection Failure Criterion | <- | Received, with limitations see <> +| 0x0e | 9.4.15 | Destination | | _ignored_ +| 0x0f | 9.4.16 | Event Type | | _ignored_ +| 0x11 | 9.4.17 | File Data | | _ignored_ +| 0x12 | 9.4.18 | File Id | | _ignored_ +| 0x13 | 9.4.19 | File Version | | _ignored_ +| 0x14 | 9.4.20 | GSM Time | | _ignored_ +| 0x16 | 9.4.22 | HW Configuration | | _ignored_ +| 0x18 | 9.4.24 | Intave Parameter | <- | _ignored_ +| 0x19 | 9.4.25 | Interference level Boundaries | <- | _ignored_ +| 0x1a | 9.4.26 | List of Required Attributes | | _ignored_ +| 0x1c | 9.4.28 | Manufacturer Dependent State | | _ignored_ +| 0x1d | 9.4.29 | Manufacturer Dependent Thresholds | | _ignored_ +| 0x1e | 9.4.30 | Manufacturer Id | | _ignored_ +| 0x1f | 9.4.31 | Max Timing Advance | <- | Received +| 0x20 | 9.4.34 | Multi-drop BSC Link | | _ignored_ +| 0x21 | 9.4.35 | Multi-drop next BTS Link | | _ignored_ +| 0x22 | 9.4.36 | Nack Causes | -> | Sent +| 0x23 | 9.4.37 | Ny1 | <- | Received +| 0x24 | 9.4.38 | Operational State | -> | Sent +| 0x25 | 9.4.39 | Overload Period | <- | _ignored_ +| 0x26 | 9.4.40 | Physical Config | | _ignored_ +| 0x27 | 9.4.41 | Power Class | | _ignored_ +| 0x28 | 9.4.42 | Power Output Thresholds | | _ignored_ +| 0x29 | 9.4.43 | Probable Cause | | _ignored_ +| 0x2a | 9.4.44 | RACH Busy Threshold | <- | Received +| 0x2b | 9.4.45 | RACH Load Averaging Slots | <- | _ignored_ +| 0x2c | 9.4.46 | Radio Sub Channel | | _ignored_ +| 0x2d | 9.4.47 | RF Max Power Reduction | <- | Received +| 0x2e | 9.4.48 | Site Inputs | | _ignored_ +| 0x2f | 9.4.49 | Site Outputs | | _ignored_ +| 0x30 | 9.4.50 | Source | | _ignored_ +| 0x31 | 9.4.51 | Specific Problems | | _ignored_ +| 0x33 | 9.4.53 | T200 | <- | _ignored_ (1s on DCCH, 2s on ACCH) +| 0x34 | 9.4.54 | TEI | | _ignored_ +| 0x35 | 9.4.55 | Test Duration | | _ignored_ +| 0x36 | 9.4.56 | Test No | | _ignored_ +| 0x37 | 9.4.57 | Test Report Info | | _ignored_ +| 0x38 | 9.4.58 | VSWR Thresholds | | _ignored_ +| 0x39 | 9.4.59 | Window Size | | _ignored_ +| 0x40 | 9.4.60 | TSC | <- | Received, with limitations: see <> +| 0x41 | 9.4.61 | SW Configuration | | _ignored_ +| 0x43 | 9.4.63 | Perceived Severity | | _ignored_ +| 0x44 | 9.4.64 | Get Attribute Response Info | | _ignored_ +| 0x45 | 9.4.65 | Outstanding Alarm Sequence | | _ignored_ +| 0x46 | 9.4.66 | HW Conf Change Info | | _ignored_ +| 0x47 | 9.4.32 | Measurement Result | | _ignored_ +|=== + +==== IEs Not Conforming to TS 12.21 + +.IEs not conforming to TS 12.21 +[options="header",cols="5%,10%,30%,55%"] +|=== +| tag (hex) | TS 12.21 § | IE name | Description +| 0x15 | 9.4.21 | HSN | presence causes NACK response +| 0x17 | 9.4.23 | HW Description | _ignored_ by OsmoBTS, but coding may differ, see <> +| 0x1b | 9.4.27 | MAIO | presence causes NACK response +| 0x32 | 9.4.52 | Starting Time | presence causes NACK response +| 0x42 | 9.4.62 | SW Description | not supported +| 0x48 | 9.4.33 | Measurement Type | not supported +|=== + + +==== Additional Attributes and Parameters + +The following Information Elements are defined in addition to those +specified in 3GPP TS 12.21 Chapter 9.4. + +All of these additional IEs are _received_ by OsmoBTS. + +The content of these attributes is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + +.Additional IEs handled by OsmoBTS but not defined in TS 12.21 +[options="header",cols="5%,50%,45%"] +|=== +| tag (hex) | IE name | Description +| 0x80 | RSL Destination IP Address | <> +| 0x81 | RSL Destination TCP Port | <> +| 0x85 | RSL IPA Stream ID | <> +| 0x9a | GPRS Routing Area Code | <> +| 0x9c | GPRS Paging Configuration | <> +| 0x9d | GPRS NSEI | <> +| 0x9e | GPRS BVCI | <> +| 0x9f | GPRS NSVCI | <> +| 0xa0 | GPRS NS Configuration | <> +| 0xa1 | GPRS BSSGP Configuration | <> +| 0xa2 | GPRS NS Link Configuration | <> +| 0xa3 | GPRS RLC Configuration | <> +| 0xa8 | GPRS Coding Schemes | <> +| 0xa9 | GPRS RLC Configuration 2 | <> +| 0xac | GPRS RLC Configuration 3 | <> +|=== + + +=== Details on IEs + +[[ie_hw_desc]] +==== HW Description + +TS 12.21 suggests a series of 5 length-value pairs for the _HW Description_ IE. +Instead, OsmoBTS interprets it as a single TL16V. The value of this IE is +ignored by OsmoBTS, yet the coding may affect message parsing. + +[width="40%",cols="90%,10%"] +[grid="none"] +|=== +| Attribute Identifier (0x17) | 1 +| Length | 2-3 +| Ignored | N +|=== + + +[[NM_ATT_ARFCN_LIST]] +==== ARFCN List + +Since OsmoBTS does not support frequency hopping, the _ARFCN List_ must contain +exactly one ARFCN. + +[[ie_chan_comb]] +==== Additional Channel Combinations + +In addition to 3GPP TS 12.21 Chapter 9.4.13, the following channel +combinations are supported: + +.Additional Channel Combinations +[options="header"] +[cols="10%,90%"] +|=== +| Value | Description +| 0x0b | Reserved for PBCCH + PCCCH + PDTCH/F + PACCH/F + PTCCH/F +| 0x0c | Reserved for PBCCH + PDTCH/F + PACCH/F + PTCCH/F +| 0x0d | PDTCH/F + PACCH/F + PTCCH/F +| 0x80 | Reserved for Dynamic TCH/F / PDCH +| 0x81 | Reserved for Dynamic TCH/F / TCH/H +|=== + +[[ie_conn_fail_crit]] +==== Connection Fail Criterion + +3GPP TS 12.21 Chapter 9.4.14 specifies two different options for the +_Connection Failure Criterion_. OsmoBTS only implements the option +coded as 0x01, i.e. based upon uplink SACCH error rate +(RADIO_LINK_TIMEOUT). + +[[NM_ATT_TSC]] +==== TSC + +Due to limitations in the currently supported PHY implementations, +OsmoBTS supports only one global TSC for all channels on one TRX, rather +than a separate TSC for each timeslot, as expected by 3GPP TS 12.21. + + +[[NM_ATT_IPACC_DST_IP]] +==== RSL Destination IP Address + +The value part of this attribute has a length of 4 octets and is encoded +as IPv4 address in network byte order. + +[width="40%",cols="90%,10%"] +[grid="none"] +|=== +| Attribute Identifier (0x80) | 1 +| IPv4 Address (MSB first) | 2-5 +|=== + + +[[NM_ATT_IPACC_DST_IP_PORT]] +==== RSL Destination TCP Port + +The value part of this attribute has a length of 2 octets and contains +the TCP destination port for the RSL connection, encoded in network byte +order. + +[width="40%",cols="90%,10%"] +[grid="none"] +|=== +| Attribute Identifier (0x81) | 1 +| Port number (MSB first) | 2-3 +|=== + + +[[NM_ATT_IPACC_STREAM_ID]] +==== RSL IPA Stream ID + +The value part of this attribute has a length of one octet and specifies +the IPA stream ID to be used for the RSL connection of this TRX. + +[width="40%",cols="90%,10%"] +[grid="none"] +|=== +| Attribute Identifier (0x85) | 1 +| Stream ID | 2 +|=== + + +[[NM_ATT_IPACC_RAC]] +==== GPRS Routing Area Code + +The value part of the GPRS Routing Area code consist of a single octet +encoding the GPRS Routing Area Code. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_GPRS_PAGING_CFG]] +==== GPRS Paging Configuration + +The value part of this attribute consists of two octets encoded as +follows: + +[options="header"] +[cols="10%,90%"] +|=== +| Offset | Description +| 0 | GPRS Paging repeat time in units of 50ms intervals +| 1 | GPRS Paging repeat count +|=== + + +[[NM_ATT_IPACC_NSEI]] +==== GPRS NSEI + +The value part of the GPRS NSEI is encoded as 16bit integer value in +network byte order. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_BVCI]] +==== GPRS BVCI + +The value part of this attribute consists of two octets encoding the +BSSGP Virtual Circuit Identifier (BVCI) as unsigned 16 bit integer in +network byte order. + + +[[NM_ATT_IPACC_NSVCI]] +==== GPRS NSVCI + +The value part of the GPRS NSVCI attribute is a 16bit unsigned integer +in network byte order, encoding the GPRS NSVCI as specified in 3GPP TS +08.16. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_NS_CFG]] +==== GPRS NS Configuration + +The value part of the GPRS NS Configuration consist of an array of 7 octets, each +describing one GPRS NS related timer: + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_BSSGP_CFG]] +==== GPRS BSSGP Configuration + +The value part of the GPRS BSSGP configuration consists of an array of +11 octets, each describing one GPRS BSSGP related timer: + +[options="header"] +[cols="10%,90%"] +|=== +| Offset | Description +| 0 | Blocking Timer (T1) +| 1 | Blocking Retries +| 2 | Unblocking Retries +| 3 | Reset Timer (T2) +| 4 | Reset Retries +| 5 | Suspend Timer (T3) in units of 100ms +| 6 | Suspend Retries +| 7 | Resume Timer (T4) in units of 100ms +| 8 | Resume Retries +| 9 | Capability Update Timer (T5) +| 10 | Capability Update Retries +|=== + +The detailed description of the meaning of those timers is given in the +GPRS BSSGP specification 3GPP TS 08.18. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_NS_LINK_CFG]] +==== GPRS NS Link Configuration + +The content of this attribute is 8 octets long and encoded as follows: +[options="header"] +[cols="10%,10%,80%"] +|=== +| Offset | Length | Description +| 0 | 2 | GPRS-NS Remote UDP Port Number (SGSN side) +| 2 | 4 | GPRS-NS Remote IPv4 Address (SGSN side) +| 6 | 2 | GPRS-NS Local UDP Port Number (BTS side) +|=== + +All values are encoded in network byte order. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_RLC_CFG]] +==== GPRS RLC Configuration + +The value part of the GPRS RLC Configuration consists of an array of 9 +octets, each describing a RLC timer: + +[options="header"] +[width="60%",cols="10%,80%,10%"] +|=== +| Offset | Description | Unit +| 0 | GPRS RLC Timer T3142 | s +| 1 | GPRS RLC Timer T3169 | s +| 2 | GPRS RLC Timer T3191 | s +| 3 | GPRS RLC Timer T3193 | 10ms +| 4 | GPRS RLC Timer T3195 | s +| 5 | GPRS RLC Timer T3101 | s +| 6 | GPRS RLC Timer T3103 | s +| 7 | GPRS RLC Timer T3105 | s +| 8 | GPRS RLC CV Countdown | - +|=== + +The meaning of the RLC timers are specified in 3GPP TS 04.60. + +The countdown value specifies the RLC CV value from which the countdown +procedure is started. + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_CODING_SCHEMES]] +==== GPRS Coding Schemes + +The value part of the GPRS Coding Schemes consists of two octets +encoding the available GPRS and EDGE coding schemes. + +[options="header"] +|=== +| *bit* | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 +| byte at offset 0 | MCS9 | x | x | x | CS4 | CS3 | CS2 | CS1 +| byte at offset 1 | MCS8 | MCS7| MCS6 | MCS5 | MCS4| MCS3 | MCS2 | MCS1 +|=== + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_RLC_CFG_2]] +==== GPRS RLC Configuration 2 + +The value part of this attribute is 8 octets long and encoded as +follows: +[options="header"] +[width="60%",cols="10%,10%,70%,10%"] +|=== +| Offset | Length | Description | Unit +| 0 | 2 | Downlink TBF Extension Timer | 10ms +| 2 | 2 | Uplink TBF Extension Timer | 10ms +| 4 | 2 | Initial GPRS Coding Scheme | - +|=== + +The Initial GPRS Coding Scheme is encoded as follows: +[options="header"] +[width="40%",cols="50%,50%"] +|=== +| Value | Description +| 1 | CS 1 +| 2 | CS 2 +| 3 | CS 3 +| 4 | CS 4 +|=== + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + + +[[NM_ATT_IPACC_RLC_CFG_3]] +==== GPRS RLC Configuration 3 + +The content of this attribute contains information about the initial MCS +used for new EDGE TBFs. + +It is encoded as follows: +[options="header"] +[width="40%",cols="50%,50%"] +|=== +| Value | Description +| 1 | MCS 1 +| 2 | MCS 2 +| 3 | MCS 3 +| 4 | MCS 4 +| 5 | MCS 5 +| 6 | MCS 6 +| 7 | MCS 7 +| 8 | MCS 8 +| 9 | MCS 9 +|=== + +The content of this attribute is not used by OsmoBTS, but +simply passed to OsmoPCU connected to the PCU socket. + +=== A-bis OML Initialization / BTS bring-up + +At the time an Abis/IP BTS connects to via OML to the BSC, it is +initialized according to the procedures described in 3GPP TS 12.21 as +amended in this document. + +Each Managed Object (MO) is separately initialized. The initialization +sequence and parameters differ slightly depending on the MO involved. + +Some parts of the sequences described below are optional, such as the +Software activation. In the OsmoBTS case, the software is nod modular +and thus all MOs start with the software fully activated. Thus, no +__Software Activate Request__ is being sent by the MO to the BSC, nor +does the BSC need to initialize the __Activate Software__ procedure. + +Still, the full sequences are shown in order to explain the Abis/IP +protocol. + +Also, the initial state of the MOs at time of OML connection +initialization is not always guaranteed to be Disabled/Notinstalled. +Rather, the BSC implementation has to deal with the initial state as +reported by the MOs at time of re-connection. + +==== Site Manager MO Initialization + +.A-bis OML Initialization of Site Manager MO +["mscgen"] +---- +include::oml-mo-sitemgr.msc[] +---- + +As the Site Manager MO does not depend on other MOs, nor does it have an +Administrative state (__Locked/Unlocked__), it immediately ends up in the +__Enabled__ state. + +==== BTS MO Initialization + +.A-bis OML Initialization of BTS MO +["mscgen"] +---- +include::oml-mo-bts.msc[] +---- + +As can be seen in the BTS MO, its state is + +* Availability state __Dependency__, meaning it depends on other MOs to + be initialized before becoming enabled. +* Administrative state __Locked__, as the object is first waiting to + receive attributes in the __Locked__ state, before the __Change + Administrative State (Unlocked)__ procedure is used to request + transitioning into Unlocked state. + +==== Baseband Transceiver MO Initialization + +.A-bis OML Initialization of Baseband Transceiver MO +["mscgen"] +---- +include::oml-mo-transceiver.msc[] +---- + +There is one Baseband Transceiver MO per TRX in the BTS. For a +multi-TRX BTS, the above procedure must be repeated for each TRX. + + +==== Radio Carrier MO Initialization + +.A-bis OML Initialization of Radio Carrier MO +["mscgen"] +---- +include::oml-mo-carrier.msc[] +---- + +There is one Radio Carrier MO per TRX in the BTS. For a multi-TRX BTS, +the above procedure must be repeated for each TRX. + + +==== Channel MO Initialization + +.A-bis OML Initialization of Radio Carrier MO +["mscgen"] +---- +include::oml-mo-channel.msc[] +---- + +There are 8 Timeslots in each TRX, and correspondingly 8 Channel MOs in +every TRX. The above procedure must thus be repeated for each timeslot +in each transceiver of the BTS. + + +==== Full Initialization of entire BTS + +Some of the steps are optional, as is their detailed ordering. In +reality, the procedures for different MOs may overlap. The message +sequence charts in this document have been hand-crafted to avoid such +overlap for the sake of clarity. + +[[oml-msc-1]] +.A-bis OML BTS bring-up (1/3) +["mscgen"] +---- +include::oml-startup.msc[] +---- + +As can be seen in <>, after the OML TCP connection is +established + +. the identity is exchanged via IPA CCM, +. the BTS sends an 'OML EVENT STATE CHANGED REPORT' for every + Managed Object +. the BTS subsequently requests the activation of its 'Site Manager' Object + which the BSC performs by the 'Activate SW' command. +. After successful activation of the software in the Site Manager, +.. the state changes to 'Enabled', and an event report is generated + accordingly +.. the BSC is notified about the SW activation in an associated report +. Finally, the BSC requests the start of the Site Manager +.. using the 'OPSTART' command, +.. which is subsequently acknowledged by the Site Manager. + +[[oml-msc-2]] +.A-bis OML BTS bring-up (2/3) +["mscgen"] +---- +include::oml-startup2.msc[] +---- + +[[oml-msc-3]] +.A-bis OML BTS bring-up (3/3) +["mscgen"] +---- +include::oml-startup3.msc[] +---- + +In <>, we can see + +. Software Activation and associated state transitions of the BTS MO +. Setting of the BTS Attributes followed by OPSTART +. Software Activation and associated state transitions of the 'Baseband + Transceiver' MO +. Software Activation and associated state transitions of the 'Radio + Carrier' MO +. Once the 'Baseband Transceiver' MO has its software activated, the + 'Channel' MOs (one for each timeslot) indicate their state change and + software activation, too. + +In <>, we can see + +. The 'Radio Carrier' MO Software Activation +. The Request to the 'Baseband Transceiver' MO to establish the RSL + signalling connection to the BSC. +. Subsequent OPSTART and Change of Administrative State on the 'Baseband + Transceiver' MO +. The following procedure for each of the 'Channel' MOs: +.. Setting the Channel Attributes (such as channel combination) +.. OPSTART +.. Changing the Administrative State to Unlocked +.. Subsequent State Change Event Report with the new state +. After all 'Channel' MOs are initialized, the Radio Carrier goes through + a similar procedure of +.. Setting its attributes +.. OPSTART +.. Changing its Administrative State to Unlocked +.. Subsequent State Change Event Report with the new State (Enabled/OK) +. All 'Channel' MOs now also report their state as Enabled/OK +. Finally, the BTS reports its state as Enabled/OK + diff --git a/doc/manuals/abis/rsl-startup-pri.msc b/doc/manuals/abis/rsl-startup-pri.msc new file mode 100644 index 00000000..a4798df9 --- /dev/null +++ b/doc/manuals/abis/rsl-startup-pri.msc @@ -0,0 +1,22 @@ +msc { + bts [label="TRX"], bsc [label="BSC"]; + + bts => bsc [label="TCP Connect (Port 3003, RSL)"]; + bts box bsc [label="IPA CCM Identification (Port 3003)"]; + |||; + + bts <= bsc [label="BCCH Information (SI1)"]; + bts <= bsc [label="BCCH Information (SI2)"]; + ...; + bts <= bsc [label="BCCH Information (SI3)"]; + bts <= bsc [label="BCCH Information (SI4)"]; + |||; + bts <= bsc [label="SACCH FILLING (SI5)"]; + ...; + bts <= bsc [label="SACCH FILLING (SI6)"]; + |||; + bts => bsc [label="RF Resource Indication"]; + ...; + bts => bsc [label="RF Resource Indication"]; + ...; +} diff --git a/doc/manuals/abis/rsl-startup-sec.msc b/doc/manuals/abis/rsl-startup-sec.msc new file mode 100644 index 00000000..d961412b --- /dev/null +++ b/doc/manuals/abis/rsl-startup-sec.msc @@ -0,0 +1,16 @@ +msc { + bts [label="TRX"], bsc [label="BSC"]; + + bts => bsc [label="TCP Connect (Port 3003, RSL)"]; + bts box bsc [label="IPA CCM Identification (Port 3003)"]; + |||; + + bts <= bsc [label="SACCH FILLING (SI5)"]; + ...; + bts <= bsc [label="SACCH FILLING (SI6)"]; + |||; + bts => bsc [label="RF Resource Indication"]; + ...; + bts => bsc [label="RF Resource Indication"]; + ...; +} diff --git a/doc/manuals/abis/rsl-tch-rtp.msc b/doc/manuals/abis/rsl-tch-rtp.msc new file mode 100644 index 00000000..55228b48 --- /dev/null +++ b/doc/manuals/abis/rsl-tch-rtp.msc @@ -0,0 +1,56 @@ +msc { + hscale = 2; + + ms [label="MS"], bts [label="BTS"], bsc [label="BSC"], Msc [label="MSC"], mgw [label="MGW"]; + + ms => bts [label="L1 RACH burst"]; + bts => bsc [label="RSL CHAN RQD"]; + bts <= bsc [label="RSL CHAN ACT"]; + bts => bsc [label="RSL CHAN ACT ACK"]; + bts <= bsc [label="RSL IMM ASS CMD (RR IMM ASS)"]; + ms <= bts [label="RR IMMEDIATE ASSIGN"]; + ms => bts [label="LAPDm SABM (CM SERVICE REQ)"]; + ms <= bts [label="LAPDm FIXME"]; + bts => bsc [label="RSL ESTABLISH IND (CM SERVICE REQ)"]; + bsc => Msc [label="CR (BSSAP COMPLETE L3 (CM SERVICE REQ))"]; + ...; + ms box Msc [label="MM Common Procedures (INFO, ID, AUTH, CIPH)"]; + ...; + ms => bts [label="CC SETUP"]; + bts => bsc [label="RSL DATA IND (CC SETUP)"]; + bsc => Msc [label="DT1 (DTAP (CC SETUP))"]; + ...; + ms box Msc [label="CC Signalling"]; + ...; + bsc <= Msc [label="BSSAP ASSIGNMENT CMD (TCH)"]; + bts <= bsc [label="RSL IPA CRCX", id="1"]; + bts => bsc [label="RSL IPA CRCX ACK (IP/Port @ BTS)"]; + bsc => Msc [label="FIXME"]; + Msc => mgw [label="FIXME"]; + bts <- mgw [label="Start RTP + RTCP UDP Flows"]; + + bts <= bsc [label="RSL DATA REQ (RR CHAN MOD MODIFY)"]; + ms <= bts [label="RR CHAN MOD MODIFY"]; + ms => bts [label="RR CHAN MOD MODIFY ACK"]; + bts => bsc [label="RSL DATA IND (RR CHAN MOD MODIFY ACK)"]; + |||; + bts <= bsc [label="RSL MODE MODIFY REQ"]; + bts => bsc [label="RSL MODE MODIFY ACK"]; + + Msc <= mgw [label="FIXME"]; + bsc <= Msc [label="FIXME"]; + bts <= bsc [label="RSL IPA MDCX (IP/Port @ MGW)", id="2"]; + bts => bsc [label="RSL IPA MDCX ACK"]; + + bts -> mgw [label="Start RTP + RTCP UDP Flows"]; + ms box mgw [label="Active Voice Call"]; + bts => bsc [label="RSL MEAS RES"]; + ...; + + bts <= bsc [label="RSL IPA DLCX"]; + bts => bsc [label="RSL IPA DLCX ACK"]; + bts -x mgw [label="Stop RTP + RTCP UDP Flows"]; + + bts <= bsc [label="RSL RF CHAN REL"]; + bts => bsc [label="RSL RF CHAN REL ACK"]; +} diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc new file mode 100644 index 00000000..e157b25e --- /dev/null +++ b/doc/manuals/abis/rsl.adoc @@ -0,0 +1,681 @@ +== Radio Signalling Link (RSL) + +=== List of Messages + +The following tables list the RSL messages used by OsmoBTS A-bis/IP, +grouped by their level of compliance with 3GPP TS 08.58. + +==== Messages Compliant With TS 08.58 + +Specific limitations apply, see the linked sections. + +.Messages compliant with TS 08.58 +[options="header",cols="10%,20%,45%,5%,20%"] +|=== +| TS 08.58 § | This document § | Message | <-/-> | Received/Sent by OsmoBTS +5+<| *Radio link layer management messages* +| 8.3.1 | - | DATA REQUEST | <- | Received +| 8.3.2 | - | DATA INDICATION | -> | Sent +| 8.3.3 | - | ERROR INDICATION | -> | Sent +| 8.3.4 | - | ESTABLISH REQUEST | <- | Received +| 8.3.5 | - | ESTABLISH CONFIRM | -> | Sent +| 8.3.6 | - | ESTABLISH INDICATION | -> | Sent +| 8.3.7 | - | RELEASE REQUEST | <- | Received +| 8.3.8 | - | RELEASE CONFIRM | -> | Sent +| 8.3.9 | - | RELEASE INDICATION | -> | Sent +| 8.3.10 | - | UNIT DATA REQUEST | <- | Received +| 8.3.11 | - | UNIT DATA INDICATION | -> | Sent +5+<| *DEDICATED CHANNEL MANAGEMENT MESSAGES* +| 8.4.1 | - | CHANNEL ACTIVATION | <- | Received +| 8.4.2 | - | CHANNEL ACTIVATION ACKNOWLEDGE | -> | Sent +| 8.4.3 | - | CHANNEL ACTIVATION NEGATIVE ACKNOWLEDGE | -> | Sent +| 8.4.4 | - | CONNECTION FAILURE INDICATION | -> | Sent +| 8.4.5 | - | DEACTIVATE SACCH | <- | Received +| 8.4.6 | - | ENCRYPTION COMMAND | <- | Received +| 8.4.7 | - | HANDOVER DETECTION | -> | Sent +| 8.4.8 | <> | MEASUREMENT RESULT | -> | Sent +| 8.4.9 | <> | MODE MODIFY | <- | Received +| 8.4.10 | - | MODE MODIFY ACKNOWLEDGE | -> | Sent +| 8.4.11 | - | MODE MODIFY NEGATIVE ACKNOWLEDGE | -> | Sent +| 8.4.14 | - | RF CHANNEL RELEASE | <- | Received +| 8.4.15 | <> | MS POWER CONTROL | <- | Received +| 8.4.19 | - | RF CHANNEL RELEASE ACKNOWLEDGE | -> | Sent +| 8.4.20 | <> | SACCH INFO MODIFY | <- | Received +5+<| *COMMON CHANNEL MANAGEMENT MESSAGES* +| 8.5.1 | <> | BCCH INFORMATION | <- | Received +| 8.5.2 | - | CCCH LOAD INDICATION | -> | Sent +| 8.5.3 | <> | CHANNEL REQUIRED | -> | Sent +| 8.5.5 | <> | PAGING COMMAND | <- | Received +| 8.5.6 | - | IMMEDIATE ASSIGN COMMAND | <- | Received +| 8.5.8 | <> | SMS BROADCAST COMMAND | <- | Received +5+<| *TRX MANAGEMENT MESSAGES* +| 8.6.1 | <> | RF RESOURCE INDICATION | -> | Sent +| 8.6.2 | <> | SACCH FILLING | <- | Received +| 8.6.4 | - | ERROR REPORT | -> | Sent +|=== + +==== Messages Specific to OsmoBTS + +.Messages specific to OsmoBTS, not found in 3GPP TS 08.58 +[options="header",cols="15%,15%,45%,5%,20%"] +|=== +2+| This document § | Message | <-/-> | Received/Sent by OsmoBTS +5+<| *User Plane Transport Management* (<>) +.3+.| <> | <> | RSL Create Connection (CRCX) | <- | Received + | <> | RSL Create Connection (CRCX) ACK | -> | Sent + | <> | RSL Create Connection (CRCX) NACK | -> | Sent +.3+.| <> | <> | RSL Modify Connection (MDCX) | <- | Received + | <> | RSL Modify Connection (MDCX) ACK | -> | Sent + | <> | RSL Modify Connection (MDCX) NACK | -> | Sent +.3+.| <> | <> | RSL Delete Connection (DLCX) | <- | Received + | <> | RSL Delete Connection (DLCX) ACK | -> | Sent + | <> | RSL Delete Connection (DLCX) NACK | -> | Sent + | <> | <> | RSL Delete Connection (DLCX) Indication | -> | Sent +|=== + +==== Messages Not Implemented by OsmoBTS + +.3GPP TS 08.58 messages not implemented by OsmoBTS +[options="header",cols="10%,90%"] +|=== +| TS 08.58 § | Message +2+<| *DEDICATED CHANNEL MANAGEMENT MESSAGES* +| 8.4.12 | PHYSICAL CONTEXT REQUEST +| 8.4.13 | PHYSICAL CONTEXT CONFIRM +| 8.4.16 | BS POWER CONTROL +| 8.4.17 | PREPROCESS CONFIGURE +| 8.4.18 | PREPROCESSED MEASUREMENT RESULT +| 8.4.21 | TALKER DETECTION +| 8.4.22 | LISTENER DETECTION +| 8.4.23 | REMOTE CODEC CONFIGURATION REPORT +| 8.4.24 | ROUND TRIP DELAY REPORT +| 8.4.25 | PRE-HANDOVER NOTIFICATION +| 8.4.26 | MULTIRATE CODEC MODIFICATION REQUEST +| 8.4.27 | MULTIRATE CODEC MODIFICATION ACKNOLEWDGE +| 8.4.28 | MULTIRATE CODEC MODIFICATION NEGATIVE ACKNOWLEDGE +| 8.4.29 | MULTIRATE CODEC MODIFICATION PERFORMED +| 8.4.30 | TFO REPORT +| 8.4.31 | TFO MODIFICATION REQUEST +2+<| *COMMON CHANNEL MANAGEMENT MESSAGES* +| 8.5.4 | DELETE INDICATION +| 8.5.7 | SMS BROADCAST REQUEST +| 8.5.9 | CBCH LOAD INDICATION +| 8.5.10 | NOTIFICATION COMMAND +2+<| *TRX MANAGEMENT MESSAGES* +| 8.6.3 | OVERLOAD +2+<| *LOCATION SERVICES MESSAGES* +| 8.7.1 | LOCATION INFORMATION +|=== + + +=== Message Limitation Details + +[[MEASUREMENT_RESULT]] +==== Measurement Result + +Conforms to 3GPP TS 08.58 § 8.4.8 with this limitation: + +._Measuremet Result_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.37 | MS Timing Offset | never sent by OsmoBTS +|=== + +[[MODE_MODIFY]] +==== Mode Modify + +Conforms to 3GPP TS 08.58 § 8.4.9 with these limitations: + +._Mode Modify_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.45 | Main channel reference | _ignored_ +| 9.3.53 | MultiRate Control | _ignored_ +| 9.3.54 | Supported Codec Types | _ignored_ +|=== + +[[MS_POWER_CONTROL]] +==== MS Power Control + +Conforms to 3GPP TS 08.58 § 8.4.15 with these limitations: + +._MS Power Control_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.31 | MS Power Parameters | _ignored_ +|=== + + +[[SACCH_INFO_MODIFY]] +==== SACCH Info Modify + +Conforms to 3GPP TS 08.58 § 8.4.20, with these exceptions: + +._SACCH Info Modify_ IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.30 | System Info Type | See below for available types +| 9.3.23 | Starting Time | not supported, provokes an _Error Report_ response +|=== + +._System Info Type_ values that can occur on the SACCH +[options="header",width="50%",cols="20%,80%"] +|=== +| Value | Name +| 0x05 | RSL_SYSTEM_INFO_5 +| 0x06 | RSL_SYSTEM_INFO_6 +| 0x0d | RSL_SYSTEM_INFO_5bis +| 0x0e | RSL_SYSTEM_INFO_5ter +| 0x47 | RSL_EXT_MEAS_ORDER +| 0x48 | RSL_MEAS_INFO +|=== + +[[BCCH_INFORMATION]] +==== BCCH Information + +Conforms to 3GPP TS 08.58 § 8.5.1, with these limitations and extensions: + +._BCCH Information_ IE details +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.30 | System Info Type | See <> for available types +| 9.3.11 | L3 Info | This IE may be included instead of a 9.3.39 _Full BCCH Info_ IE. + The _Full BCCH Info_ takes precedence over _L3 Info_. + To stop SI transmission, both of these IEs must be omitted. +|=== + + +[[CHANNEL_REQUIRED]] +==== Channel Required + +Conforms to 3GPP TS 08.58 § 8.5.3, with these limitations: + +._Channel Required_ message IE details +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.16 | Physical Context | never sent by OsmoBTS +|=== + + +[[PAGING_COMMAND]] +==== Paging Command + +Conforms to 3GPP TS 08.58 § 8.5.5, with these limitations: + +._Paging Command_ message IE details +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.49 | eMLPP Priority | _ignored_ +|=== + +NOTE: If adding the identity to the paging queue fails, the BSC is not notified +in any way. + +[[SMS_BROADCAST_COMMAND]] +=== SMS Broadcast Command + +Conforms to 3GPP TS 08.58 § 8.5.8, with these limitations: + +._Broadcast Command_ message IE details +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.44 | SMSCB Channel Indicator | _ignored_ +|=== + + +[[RF_RESOURCE_INDICATION]] +==== RF Resource Indication + +This message does not conform to 3GPP TS 08.58 § 8.6.1, in that it omits the +_Resource Information_ IE that would contain the actual payload data, which +renders this message void. + +._RF Resource Indication_ message IE exceptions +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.21 | Resource Information | OsmoBTS omits this IE, though TS 08.58 + specifies it as mandatory. +|=== + + +[[SACCH_FILLING]] +==== SACCH Filling + +Conforms to 3GPP TS 08.58 § 8.6.2, with these limitations: + +._SACCH Filling_ message IE limitations +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.3.30 | System Info Type | See <> for available types +| 9.3.23 | Starting Time | _ignored_ +|=== + + +[[user_plane_txp_mgmt]] +=== User Plane Transport Management + +This chapter defines the A-bis/IP specific RSL procedures that are +introduced in addition to the 3GPP TS 08.58 standard procedures. + +In classic A-bis over E1, user plane traffic is carried over 16kBps +sub-slots of 64kBps E1 time-slots according to ETSI/3GPP TS 08.60. As +the E1 line is a dedicated line between BTS and BSC, no further +addressing information is required. + +In A-bis/IP as described by the present document, new RSL procedures +have been introduced in order to deal with the different properties of +the underlying IP based transport medium. + +[[rsl_crcx]] +==== RSL Create Connection (CRCX) + +This procedure is used by the BSC to request the BTS to allocate + bind +to a BTS-local UDP port for the subsequent transmission of user-plane +data via RTP. + +To do so, the BSC sends the *Create Connection (CRCX)* message. In case of +successful outcome, the BTS responds with *Create Connection (CRCX) +ACK*. In case of any error, the BTS responds with *Create Connection +(CRCX) NACK*. + +See <>, <>, <> + +[[rsl_mdcx]] +==== RSL Modify Connection (MDCX) + +This procedure is used by the BSC to request the BTS to modify an +already-bound BTS-local UDP port for user-plane RTP. It is used in +particular to configure the remote IP address and UDP port to which the +BTS shall send user-plane RTP traffic. This remote address is normally +either a Media Gateway (MGW) of some sort, but could also be the RTP +socket of the corresponding other leg of a mobile-to-mobile call. + +To modify a user-plane connection, the BSC sends the *Modify Connection* +message. In case of successful outcome, the BTS responds with +*Modify Connection (MDCX) ACK*. In case of any error, the BTS responds +with *Modify Connection (MDCX) NACK*. + +See <>, <>, <> + +[[rsl_dlcx]] +==== RSL Delete Connection (DLCX) + +This procedure is used by the BSC to request the BTS to delete an +already-existing BTS-local UDP port for user-plane RTP. + +To delete a user-plane connection, the BSC sends the *Delete Connection +(DLCX)* message. In case of successful outcome, the BTS responds with +*Delete Connection (DLCX) ACK*. In case of any error, the BTS responds +with *Delete Connection (DLCX) NACK*. + +See <>, <>, <> + +[[rsl_dlcx_ind]] +==== RSL Delete Connection (DLCX) Indication + +When a BTS-local UDP connection for user-plane RTP is automatically +released at the time of RF CHANNEL RELEASE, the BTS sends a unilateral, +non-acknowledged *RSL Delete Connection (DLCX) Indication* to the BSC. + +See <> + + +=== Message Formats and Contents + +[[rsl_crcx_msg]] +==== Create Connection (CRCX) + +This message is sent by the BSC to the BTS in order to request the +creation of a user-plane RTP connection for the specified *Channel +number*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Destination IP Address | <> | O | TV | 5 +| Destination IP Port | <> | O | TV | 3 +| IP Speech Mode | <> | O | TV | 2 +| RTP Payload Type 2 | <> | O | TV | 2 +|=== + +[[rsl_crcx_msg_ack]] +==== Create Connection (CRCX) ACK + +This message is sent by the BTS to the BSC in order to acknowledge the +successful outcome of creating a user-plane RTP connection. It is sent +in response to the *Create Connection (CRCX)*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | M | TV | 3 +| Source IP Address | <> | O | TV | 5 +| Source IP Port | <> | O | TV | 3 +| RTP Payload Type 2 | <> | O | TV | 2 +|=== + +[[rsl_crcx_msg_nack]] +==== Create Connection (CRCX) NACK + +This message is sent by the BTS to the BSC in order to signal the +unsuccessful outcome of creating a user-plane RTP connection. It is +sent in response to the *Create Connection (CRCX)*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Destination IP Address | <> | O | TV | 5 +| Destination IP Port | <> | O | TV | 3 +| Cause | 08.58 9.3.26 | O | TLV | >= 3 +|=== + + +[[rsl_mdcx_msg]] +==== Modify Connection (MDCX) + +This message is sent by the BSC to the BTS in order to modify the +properties of a user-plane RTP connection. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | O | TV | 3 +| Destination IP Address | <> | O | TV | 5 +| Destination IP Port | <> | O | TV | 3 +| IP Speech Mode | <> | O | TV | 2 +| RTP Payload Type 2 | <> | O | TV | 2 +|=== + +[[rsl_mdcx_msg_ack]] +==== Modify Connection (MDCX) ACK + +This message is sent by the BTS to the BSC in order to acknowledge the +successful modification of a user-plane RTP connection. It is sent in +response to a *Modify Connection (MDCX)* + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | O | TV | 3 +| Source IP Address | <> | C | TV | 5 +| Source IP Port | <> | C | TV | 3 +| RTP Payload Type 2 | <> | O | TV | 2 +|=== + +[[rsl_mdcx_msg_nack]] +==== Modify Connection (MDCX) NACK + +This message is sent by the BTS to the BSC in order to signal the +unsuccessful outcome of modifying the user-plane RTP connection for the +specified Channel number. It is sent in response to the *Modify +Connection (MDCX)*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Cause | 08.58 9.3.26 | M | TLV | >= 3 +|=== + +[[rsl_dlcx_ind_msg]] +==== Delete Connection (DLCX) Indication + +This message is sent by the BTS in order to indicate the automatic +deletion of a BTS-local UDP connection for user-plane RTP traffic at the +time of RF Channel release. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | M | TV | 3 +| Connection Id | <> | M | TV | 3 +| Cause | 08.58 9.3.26 | M | TLV | >= 3 +|=== + +[[rsl_dlcx_msg]] +==== Delete Connection (DLCX) + +This message is sent by the BSC to the BTS in order to request the +disconnection of a user-plane RTP connection for the specified Channel +number. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | O | TV | 3 +|=== + +[[rsl_dlcx_msg_ack]] +==== Delete Connection (DLCX) ACK + +This message is sent by the BTS in order to signal the successful +outcome of deleting the user-plane RTP connection for the specified +Channel number. It is sent in response to the *Delete Connection +(DLCX)*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | O | TV | 3 +| Connection Statistics | <> | C | TV | 29 +|=== + +[[rsl_dlcx_msg_nack]] +==== Delete Connection (DLCX) NACK + +This message is sent by the BTS in order to signal the unsuccessful +outcome of deleting the user-plane RTP connection for the specified +Channel number. It is sent in response to the *Delete Connection +(DLCX)*. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Connection Id | <> | O | TV | 3 +| Cause | 08.58 9.3.26 | M | TLV | >= 3 +|=== + + +=== Information Element Codings + +[[own_msg_types]] +==== A-bis/IP specific RSL Message discriminators + +The following message descriminators are used in addition to those +indicated in 3GPP TS 08.58 Section 9.1: + +.OsmoBTS specific new message discriminators +[options="header",cols="10%,50%,40%"] +|=== +| Message Type | Message | This document § +| 0x70 | Create Connection (CRCX) | <> +| 0x71 | Create Connection (CRCX) ACK | <> +| 0x72 | Create Connection (CRCX) NACK | <> +| 0x73 | Modify Connection (MDCX) | <> +| 0x74 | Modify Connection (MDCX) ACK | <> +| 0x75 | Modify Connection (MDCX) NACK | <> +| 0x76 | Delete Connection (DLCX) Indication | <> +| 0x77 | Delete Connection (DLCX) | <> +| 0x78 | Delete Connection (DLCX) ACK | <> +| 0x79 | Delete Connection (DLCX) NACK | <> +|=== + +==== A-bis/IP specific RSL IEIs + +The following Information Element Identifiers (IEIs) are used in +addition to those indicated in 3GPP TS 08.58 Section 9.3.1: + +.A-bis/IP specific information elements +[options="header",cols="10%,50%,40%"] +|=== +| IEI | Name | This document § +| 0xf0 | RSL_IE_IPAC_REMOTE_IP | <> +| 0xf1 | RSL_IE_IPAC_REMOTE_PORT | <> +| 0xf3 | RSL_IE_IPAC_LOCAL_PORT | <> +| 0xf4 | RSL_IE_IPAC_SPEECH_MODE | <> +| 0xf5 | RSL_IE_IPAC_LOCAL_IP | <> +| 0xf6 | RSL_IE_IPAC_CONN_STAT | <> +| 0xf8 | RSL_IE_IPAC_CONN_ID | <> +| 0xfc | RSL_IE_IPAC_RTP_PAYLOAD2 | <> +|=== + +[[RSL_IE_IPAC_REMOTE_IP]] +==== RSL_IE_IPAC_REMOTE_IP + +This information element contains the remote (MGW side) IPv4 address in +network byte order. It is encoded as fixed-size element with one byte +IEI followed by four bytes IPv4 address. + +[[RSL_IE_IPAC_REMOTE_PORT]] +==== RSL_IE_IPAC_REMOTE_PORT + +This information element contains the remote (MGW side) UDP port in +network byte order. It is encoded as fixed-size element with one byte +IEI followed by two bytes UDP port number. + +[[RSL_IE_IPAC_LOCAL_PORT]] +==== RSL_IE_IPAC_LOCAL_PORT + +This information element contains the local (BTS side) IPv4 address in +network byte order. It is encoded as fixed-size element with one byte +IEI followed by two bytes UDP port number. + +[[RSL_IE_IPAC_SPEECH_MODE]] +==== RSL_IE_IPAC_SPEECH_MODE + +This information element encodes the speech mode. It is set according +to the voice codec used on the connection. It is encoded as a fixed-size +element of two bytes, with one byte IEI followed by one byte Speech mode +indicator. + +.A-bis/IP Speech Mode Indicator Values +[options="header",width="40%",cols="20%,80%"] +|=== +| Value | Description +| 0x00 | TCH/F with FR codec +| 0x01 | TCH/F with EFR codec +| 0x02 | TCH/F with AMR codec +| 0x03 | TCH/H with HR codec +| 0x05 | TCH/H with AMR codec +|=== + +[[RSL_IE_IPAC_LOCAL_IP]] +==== RSL_IE_IPAC_LOCAL_IP + +This information element contains the local (BTS side) IPv4 address in +network byte order. It is encoded as fixed-size element with one byte +IEI followed by four bytes IPv4 address. + +[[RSL_IE_IPAC_CONN_STAT]] +==== RSL_IE_IPAC_CONN_STAT + +This information element contains statistics about the RTP connection. + +It is encoded as 29 bytes, with the first byte as IEI and 28 bytes +fixed-length payload encoded as follows: + +.A-bis/IP Connection Statistics +[options="header",width="60%",cols="15%,15%,70%"] +|=== +| Offset | Size | Description +| 0 | 4 | Total number of RTP packets sent +| 4 | 4 | Total number of octets sent +| 8 | 4 | Total number of RTP packets received +| 12 | 4 | Total number of octets received +| 16 | 4 | Total number of lost packets in Rx direction +| 20 | 4 | Inter-arrival Jitter +| 24 | 4 | Average transmission delay +|=== + +All the above values are each encoded in network byte order. + +A detailed definition of the individual values is given in RFC 1889. + +[[RSL_IE_IPAC_CONN_ID]] +==== RSL_IE_IPAC_CONN_ID + +This IE is a TV with a value length of two bytes. The value is a 16 bit +connection ID in network byte order. + + +[[RSL_IE_IPAC_RTP_PAYLOAD2]] +==== RSL_IE_IPAC_RTP_PAYLOAD2 + +This information element contains the RTP payload identifier, which is +used in the PT (Payload Type) field of the RTP header in subsequent +transmissions of the RTP flow. + +=== A-bis RSL Initialization / BTS bring-up + +Upon receiving the 'IPA RSL CONNECT' OML message by the respective +'Baseband Transceiver' MO, the BTS proceeds with establishing a separate +TCP connection for the given TRX. + +[[rsl-msc-pri]] +.A-bis RSL BTS bring-up for primary TRX +["mscgen"] +---- +include::rsl-startup-pri.msc[] +---- + +[[rsl-msc-sec]] +.A-bis RSL BTS bring-up for secondary TRXs +["mscgen"] +---- +include::rsl-startup-sec.msc[] +---- + +As can be seen by the differences between <> and +<>, the initialization of the primary and secondary TRX +slightly differ. As the secondary TRX has no BCCH, it does not (need +to) receive any 'RSL BCCH INFORMATION' messages from the BSC. + diff --git a/doc/manuals/abis/rtp.adoc b/doc/manuals/abis/rtp.adoc new file mode 100644 index 00000000..e64b5c11 --- /dev/null +++ b/doc/manuals/abis/rtp.adoc @@ -0,0 +1,33 @@ +== User-Plane Traffic via RTP + +RTP (Realtime Transfer Protocol) is a protocol for streaming of audio +and video streaming data. It is specified by IETF RFC 1889. + +OsmoBTS A-bis/IP implements RTP as transport medium for circuit-switched +user-plane traffic, contrary to the E1 sub-slot based transport as +specified in 3GPP TS 08.60. + +The RTP transport endpoint parameters are configured using the RSL User +Plane Transport Management procedures described in <>. + +RTCP is implemented in addition to RTP, on a UDP port number of the RTP +port incremented by one. + +=== RTP Payload Formats + +The RTP payload format depends on the voice codec used on the radio +channel. The OsmoBTS is simply passing the GSM speech frames between +the Um radio interface channels and the RTP payload (and vice-versa). + +No transcoding function is implemented in the BTS! + +.RTP Payload formats +[options="header",width="60%",cols="15%,15%,70%"] +|=== +| TCH | Codec | RTP payload format specification +| TCH/F | FR | IETF RFC 3551 Section 4.5.8 +| TCH/F | EFR | IETF RFC 3551 Section 4.5.9 +| TCH/F | AMR | IETF RFC 4867 +| TCH/H | HR | IETF RFC 5993 +| TCH/H | AMR | IETF RFC 4867 +|=== diff --git a/doc/manuals/chapters/architecture.adoc b/doc/manuals/chapters/architecture.adoc new file mode 100644 index 00000000..aca5bb95 --- /dev/null +++ b/doc/manuals/chapters/architecture.adoc @@ -0,0 +1,120 @@ +== OsmoBTS software architecture + +=== OsmoBTS PHY interface abstraction + +The OsmoBTS PHY interface serves as an internal abstraction layer +between given PHY hardware (as provided by the bts_model) and the actual +logical transceivers (TRXs) of a BTS inside the OsmoBTS code base. + + +==== PHY link + +A PHY link is a physical connection / link towards a given PHY. This +might be, for example, + +* a set of file descriptors to device nodes in the /dev/ directory + (sysmobts, litecell15) +* a packet socket for sending raw Ethernet frames to an OCTPHY +* a set of UDP sockets for interacting with OsmoTRX + +Each PHY interface has a set of attribute/parameters and a list of 1 to +n PHY instances. + +PHY links are numbered 0..n globally inside OsmoBTS. + +Each PHY link is configured via the VTY using its individual top-level +vty node. Given the different bts-model / phy specific properties, the +VTY configuration options (if any) of the PHY instance differ between +BTS models. + +The PHY links and instances must be configured above the BTS/TRX nodes +in the configuration file. If the file is saved via the VTY, the code +automatically ensures this. + + +==== PHY instance + +A PHY instance is an instance of a PHY, accessed via a PHY link. + +In the case of osmo-bts-sysmo and osmo-bts-trx, there is only one +instance in every PHY link. This is due to the fact that the API inside +that PHY link does not permit for distinguishing multiple different +logical TRXs. + +Other PHY implementations like the OCTPHY however do support addressing +multiple PHY instances via a single PHY link. + +PHY instances are numbered 0..n inside each PHY link. + +Each PHY instance is configured via the VTY as a separate node beneath each +PHY link. Given the different bts-model / phy specific properties, the +VTY configuration options (if any) of the PHY instance differ between +BTS models. + + +==== Mapping PHY instances to TRXs + +Each TRX node in the VTY must use the 'phy N instance M' command in +order to specify which PHY instance is allocated to this specific TRX. + +=== Internal control flow + +==== start-up / sequencing during OsmoBTS start + +.Control flow at OsmoBTS start-up procedure +[options="header",cols="10%,35%,55%"] +|=== +| section | function | description +| bts-specific | main() | Entering main() from glibc +| common | bts_main() | initialization of talloc contexts +| common | bts_log_init() | initialization of logging +| common | handle_options() | common option parsing +| bts-specific | bts_model_handle_options() | model-specific option parsing +| common | gsm_bts_alloc() | allocation of BTS/TRX/TS data structures +| common | vty_init() | Initialziation of VTY core, libosmo-abis and osmo-bts VTY +| common | main() | Setting of scheduler RR priority (if configured) +| common | main() | Initialization of GSMTAP (if configured) +| common | bts_init() | configuration of defaults in bts/trx/s object +| bts-specific | bts_model_init | ? +| common | abis_init() | Initialization of libosmo-abis +| common | vty_read_config_file() | Reading of configuration file +| bts-specific | bts_model_phy_link_set_defaults() | Called for every PHY link created +| bts-specific | bts_model_phy_instance_set_defaults() | Called for every PHY Instance created +| common | bts_controlif_setup() | Initialization of Control Interface +| bts-specific | bts_model_ctrl_cmds_install() | Install model-specific control interface commands +| common | telnet_init() | Initialization of telnet interface +| common | pcu_sock_init() | Initializaiton of PCU socket +| common | main() | Installation of signal handlers +| common | abis_open() | Start of the A-bis connection to BSC +| common | phy_links_open() | Iterate over list of configured PHY links +| bts-specific | bts_model_phy_link_open() | Open each of the configured PHY links +| common | write_pid_file() | Generate the pid file +| common | osmo_daemonize() | Fork as daemon in background (if configured) +| common | bts_main() | Run main loop until global variable quit >= 2 +|=== + + +==== At time of OML establishment + +.Control flow at time of OML establishment +[options="header",cols="10%,35%,55%"] +|=== +| section | function | description +| bts-specific | bts_model_oml_estab() | Called by core once OML link is established +| bts-specific | bts_model_check_oml() | called each time OML sets some attributes on a MO, checks if attributes are valid +| bts-specific | bts_model_apply_oml() | called each time OML sets some attributes on a MO, stores attribute contents in data structures +| bts-specific | bts_model_opstart() | for NM_OC_BTS, NM_OC_SITE_MANAGER, NM_OC_GPRS_NSE, NM_OC_GPRS_CELL, NMO_OC_GPRS_NSVC +| bts-specific | bts_model_opstart() | for NM_OC_RADIO_CARRIER for each trx +| bts-specific | bts_model_opstart() | for NM_OC_BASEB_TRANSC for each trx +| bts-specific | bts_model_opstart() | for NM_OC_CHANNEL for each timeslot on each trx +| bts-specific | bts_model_change_power() | change transmit power for each trx (power ramp-up/ramp-down) +|=== + +==== At time of RSL connection loss + +.Control flow at time of RSL connection loss +[options="header",cols="10%,35%,55%"] +|=== +| section | function | description +| bts-specific | bts_model_abis_close() | called when either one of the RSL links or the OML link are down +|=== diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc new file mode 100644 index 00000000..5a967f61 --- /dev/null +++ b/doc/manuals/chapters/bts-models.adoc @@ -0,0 +1,405 @@ +== OsmoBTS hardware support + +OsmoBTS consists of a generic part common to all BTS, and a +hardware-specific _common_ part, and a _hardware-specific_ part. The +hardware specific part is generally referred to as the _bts_model_ code. + +The common part includes the core BTS architecture as well as code for +implementing the external interfaces such Abis, control, PCU socket and +GSMTAP. + +The bts_model parts include support for driving one particular +implementation of a GSM physical layer (PHY). Such a physical layer +implementation can come in many forms. Sometimes it runs on a general +purpose CPU, sometimes on a dedicated ARM core, a dedicated DSP, a +combination of DSP and FPGA. + +Every PHY implementation offers some kind of primitives by which the PHY +can be controlled, and by which the PHY exchanges data with the higher +layers of the protocol stack in the OsmoBTS code. + +The PHY-specific primitives are encapsulated in the bts_model code, and +offered as a PHY-independent _L1SAP_ interface towards the common part of +OsmoBTS. + +In addition, each bts_model implements a set of functions that the +common part calls. Those functions are pre-fixed by bts_model_. + +Each bts_model may offer + +* model-specific VTY commands for both configuration and run-time interaction +* model-specific command line arguments +* model-specific control interface commands + +== `osmo-bts-sysmo` for sysmocom sysmoBTS + +The sysmocom sysmoBTS is a range of GSM BTSs basd around an embedded +system implementing the PHY in a combination of DSP+FPGA. The PHY is +configured by a set of primitives described by header files. Those +primitives are exchanged ove a set of message queues exposed on the +Linux-running ARM core via device nodes in `/dev/msgq/`. Internally, +the message queues map to shared memory between the Linux-running ARM +core and the DSP running the PHY implementation. + +The OsmoBTS bts_model code for the sysmoBTS can be found in the +`src/osmo-bts-sysmo` sub-directory of the OsmoBTS code base. + +`osmo-bts-sysmo` has been the primary target platform for +OsmoBTS for many years and is thus the most feature-complete and mature +platform supported by OsmoBTS at this point. + +The sysmoBTS PHY supports a direct PHY interface to OsmoPCU, reducing +the latency and amount of primitives that OsmoBTS would otherwise need +to pass through from the PHY message queues to the PCU socket and +vice-versa. + + +=== `osmo-bts-sysmo` specific command line arguments + +*--dsp-trace 'DSPMASK'*:: + Set the DSP trace flags (a single hexadecimal 32bit value). + This has been deprecated by VTY based commands, see + <> for further information. +*--pcu-direct*:: + Indicate that an external PCU (e.g. OsmoPCU) will directly + open the DSP messge queues to the PHY / PH-SAP, and only MPH + primitives are passed via OsmoBTS. + + +=== `osmo-bts-sysmo` specific VTY commands + +For a auto-generated complete syntax reference of the VTY commands, +please see the associated _OsmoBTS VTY reference manual_ +<>. The section +below only lists the most important commands. + +==== at the 'SHOW' node + +===== `show trx 0 clock-source` + +Display the currently active clock source configuration for the TRX + +[[osmo-bts-sysmo-dsp-trace]] +===== `show trx 0 dsp-trace-flags` + +Show the currently active DSP trace flags for the TRX + +===== `trx 0 dsp-trace-flag` + +Use this command to enable/disable/configure the DSP tracing flags that +define what debug messages will appear on `/dev/rtfifo/dsp_trace`. + +==== at the 'ENABLE' node + +===== `trx 0 tx-power <-110-100>` + +Change the current TRX transmit power to the given value in dBm. + +===== `trx 0 rf-clock-info reset` + +Part of the clock calibration procedure: +Reset the clock correction value. + +===== `trx 0 rf-clock-info correct` + +Part of the clock calibration procedure: +Apply the current measured correction value between the reference clock +and the local clock. + +==== at the 'PHY instance' node + +==== `clock-calibration eeprom` + +Obtain clock calibration value from EEPROM. + +==== `clock-calibration default` + +Use hardware default clock calibration value. + +==== `clock-calibration <-4095-4095>` + +Use specified clock calibration value (not EEPROM/default). + +==== `clock-source (tcxo|ocxo|ext|gps)` + +Specify the clock source for the PHY: + +tcxo:: + Use the TCXO. This is the default on sysmoBTS 2050. +ocxo:: + Use the OCXO (only valid on units equipped with OCXO). This is + the default on all sysmoBTS 1002/1020/1100 and SOB-BTS. +ext:: + Use the external clock input. +gps:: + Use the clock derived from GPS. You shouldn't use this clock + directly, but rather use the TCXO and regularly re-calibrate + against GPS. + +==== `trx-calibration-path PATH` + +Use calibration files from the given 'PATH', rather tan calibration +values from the EEPROM. + +=== `osmo-bts-sysmo` specific control interface commands + +==== trx.0.clock-info + +Obtain information on the current clock status: + +---- +bsc_control.py -d localhost -p 4238 -g trx.0.clock-info +Got message: GET_REPLY 1 trx.0.clock-info -100,ocxo,0,0,gps +---- + +which is to be interpreted as: + +* current clock correction value is -100 ppb +* current clock source is OCXO +* deviation between clock source and calibration source is 0 ppb +* resolution of clock error measurement is 0 ppt (0 means no result yet) +* current calibration source is GPS + +When this attribute is set, any value passed on is discarded, but the clock +calibration process is re-started. + +==== trx.0.clock-correction + +This attribute can get and set the current clock correction value: + +---- +bsc_control.py -d localhost -p 4238 -g trx.0.clock-correction +Got message: GET_REPLY 1 trx.0.clock-correction -100 +---- + +---- +bsc_control.py -d localhost -p 4238 -s trx.0.clock-correction -- -99 +Got message: SET_REPLY 1 trx.0.clock-correction success +---- + + +== `osmo-bts-trx` for OsmoTRX + +OsmoTRX is a C-language implementation of the GSM radio modem, +originally developed as the 'Transceiver' part of OpenBTS. This radio +modem offers an interface based on top of UDP streams. + +The OsmoBTS bts_model code for OsmoTRX is called +`osmo-bts-trx`. It implements the UDP stream interface of +OsmoTRX, so both parts can be used together to implement a complete GSM +BTS based on general-purpose computing SDR. + +As OsmoTRX is general-purpose software running on top of Linux, it is +thus not tied to any specific physical hardware. At the time of this +writing, OsmoTRX supports a variety of Ettus USRP SDRs via the UHD +driver, as well as the Fairwaves UmTRX and derived products. + +OsmoTRX is not a complete GSM PHY but 'just' the radio modem. This +means that all of the Layer 1 functionality such as scheduling, +convolutional coding, etc. is actually also implemented inside OsmoBTS. + +As such, the boundary between OsmoTRX and `osmo-bts-trx` is at +a much lower interface, which is an internal interface of other more +traditional GSM PHY implementations. + +Besides OsmoTRX, there are also other implementations (both Free +Software and proprietary) that implement the same UDP stream based radio +modem interface. + + +=== `osmo-bts-trx` specific VTY commands + +For a auto-generated complete syntax reference of the VTY commands, +pleas see the associated _OsmoBTS VTY reference manual_ +<>. The section below only lists the most important +commands. + +==== at the 'SHOW' node + +===== `show transceivers` + +Display information about configured/connected OsmoTRX transceivers in +human-readable format to current VTY session. + +==== at the 'PHY' configuration node + +===== `osmotrx ip HOST` + +Set the IP addess of the OsmoTRX transceiver to which we should connect +to. + +===== `osmotrx base-port (local|remote) <0-65535>` + +Configure the base UDP port for the OsmoTRX interface for either the +local (OsmoBTS) or remote (OsmoTRX) side of the UDP flows. + +===== `osmotrx fn-advance <0-30>` + +Set the number of frames to be transmitted to transceiver in advance of +current GSM frame number. + +===== `osmotrx rts-advance <0-30>` + +Set the number of frames to be requested from PCU in advance of current +frame number. Do not change this unless you have a good reason! + +===== `osmotrx rx-gain <0-50>` + +Set the receiver gain (configured in the hardware) in dB. + +===== `osmotrx tx-attenuation <0-50>` + +Set the transmitter attenuation (configured in the hardware) in dB. + +===== `osmotrx tx-attenuation oml` + +Use the Value in the A-bis OML Attribute `MAX_POWER_REDUCTION` as +transmitter attenuation. + +==== at the 'PHY Instance' configuration node + +===== `slotmask (1|0) (1|0) (1|0) (1|0) (1|0) (1|0) (1|0) (1|0)` + +Configure which timeslots should be active on this TRX. Normally all +timeslots are enabled, unless you are running on a cpu-constrained +deeply embedded system. + +===== `osmotrx maxdly <0-31>` + +Set the maximum delay for received symbols (in number of GSM symbols). + + +== `osmo-bts-octphy` for Octasic OCTPHY-2G + +The Octasic OCTPHY-2G is a GSM PHY implementation inside an Octasic +proprietary 24-core DSP called OCTDSP. + +This DSP has a built-in Gigabit Ethernet interface, over which it +exchanges PHY-layer primitives in raw Ethernet frames with the upper +layers running on another CPU attached to the same Ethernet. Those +primitives are described in a set of C-language header files. + +OsmoBTS implements the raw Ethernet frame based primitives as well as +the associated transport protocol (OKTPKT/OCTVC1) in the +`osmo-btso-octphy` bts_model code. + +You can run the `osmo-bts-octphy` on any system connected to the same +Ethernet as the OCTDSP running the OCTPHY. This can be either an +embedded ARM or x86 SoM part of the OCTBTS hardware, or it can be any +other Linux system attached via an Ethernet switch. + +Each OCTDSP running OCTSDR-2G offers a set of primitives part of a +OCTPKT session, which is mapped to an OsmoBTS PHY link. Depending on +the OCTSDR-2G software version, you may create multiple software TRX by +creating multiple OsmoBTS PHY instances inside that PHY link. + +Multiple DSPs may exsist in one circuit board, then each of the DSPs is +interfaced by one OsmoBTS PHY link, and each of them may have one or +more OsmoBTS PHY instances creating a Multi-TRX configuration. + + +== `osmo-bts-litecell15` for Nutaq/Nuran LiteCell 1.5 + +The Nutaq/Nuran LiteCell 1.5 implements a dual-transceiver GSM BTS based +on a mixed ARM/DSP/FPGA architecture. The PHY layer is implemented on +DSP/FPGA and similar to that of the sysmoBTS: It exchanges primitives +described in a set of C-language header files over message queues +between the ARM and the DSP. + +This interface is implemented in the `osmo-bts-litecell15` bts_model of +OsmoBTS. You would run `osmo-bts-litecell15` on the ARM/Linux processor +of the Litecell 1.5. + +The two transceivers of the Litecell 1.5 each have their own set of DSP +message queues. Each set of message queues is wrapped into one OsmoBTS +PHY link, offering one OsmoBTS PHY instance. + +The Litecell 1.5 PHY supports a direct PHY interface to OsmoPCU, +reducing the latency and amount of primitives that OsmoBTS would +otherwise need to pass through from the PHY message queues to the PCU +socket and vice-versa. + +=== `osmo-bts-trx` specific VTY commands + +For a auto-generated complete syntax reference of the VTY commands, +please see the associated _OsmoBTS VTY reference manual_ +<>. The section below only lists the most important +commands. + +==== at the 'SHOW' node + +===== `show phy <0-255> system-information` + +Show information about the hardware platform, DSP and OCTPHY-2G software +version. + +===== `show phy <0-255> rf-port-stats <0-1>` + +Show information about the RF port interfaces. + +===== `show phy <0-255> clk-sync-stats` + +Show information about the clock synchronization manager. + +==== at the 'PHY' configuration node + +===== `octphy hw-addr HWADDR` + +Specify the Ethernet hardware address (mac address) of the DSP running +the OCTPHY-2G software for this PHY link. + +===== `octphy net-device NAME` + +Specify the Ethernet network device (like `eth0`) through which the DSP +can be reached from OsmoBTS. + +===== `octphy rf-port-index <0-255>` + +Specify which RF port should be used for this PHY link. + +===== `octphy rx-gain <0-73>` + +Configure the receiver gain in dB. + +===== `octphy tx-attenuation <0-359>` + +Configure the transmitter attenuation in quarter-dB + + + + +== `osmo-bts-virtual` for Virtual Um Interface + +This is a special BTS model used for research, simulation and testing. +Rather than communicating over a wireless RF interface, the GSM Um +messages are encapsulated over GSMTAP/UDP/IP. + +At the time of writing, this functionality is not fully completed. It +is the idea to adopt the OsmocomBB MS-side GSM implementation to +interface with this virtual Um interface, so that many instances of +virtual MS can connect to some instances of OsmoBTS, testing MS, BTS, +BSC and core network functionality. + +=== `osmo-bts-trx` specific VTY commands + +For a auto-generated complete syntax reference of the VTY commands, +please see the associated _OsmoBTS VTY reference manual_ +<>. The section below only lists the most important +commands. + +==== at the 'PHY' config node + +===== `virtual-um net-device NETDEV` + +Configure the network device used for sending/receiving the virtual Um +interface messages (e.g. `eth0`). + +===== `virtual-um udp-port <0-65535>` + +Configure the UDP port used for sending/receiving the virtual Um +interface messages (default: GSMTAP 2775). + +===== `virtual-um multicast-group GROUP` + +Configure the IP multicast group used for sending/receiving the virtual +Um interface messages. diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc new file mode 100644 index 00000000..a2d06249 --- /dev/null +++ b/doc/manuals/chapters/configuration.adoc @@ -0,0 +1,154 @@ +== BTS Configuration + +The role of the BTS is to handle the GSM radio interface. When the BTS +application is starting, the A-bis OML connection is established towards +the BSC. Almost all BTS configuration (such as ARFCN, channel +configuration, transmit power, etc.) will be sent from the BSC to the +BTS via OML messages. After OML start-up has competed, the BSC will +instruct the BTS to establish the RSL connections. + +Given that most configuration is downloaded from the BSC into the BTS at +start-up time, only some very basic settings have to be made in the +OsmoBTS software. + + +=== Command Line Options + +Ths OsmoBTS executables (`osmo-bts-sysmo`, `osmo-bts-trx`, +`osmo-bts-octphy`, `osmo-bts-litecell15`, ...) share the following +generic command line options: + +==== SYNOPSIS +*osmo-bts-sysmo* [-h|-V] [-d 'DBGMASK'] [-D] [-c 'CONFIGFILE' ] [-s] [-T] [-e 'LOGLEVEL'] [-r 'PRIO'] [-i 'GSMTAP-IP'] [-t <1-255>] + +==== OPTIONS +*-h, --help*:: + Print a short help message about the supported options +*-V, --version*:: + Print the compile-time version number of the OsmoBTS program +*-d, --debug 'DBGMASK','DBGLEVELS'*:: + Set the log subsystems and levels for logging to stderr. This + has mostly been superseded by VTY-based logging configuration, + see <> for further information. +*-D, --daemonize*:: + Fork the process as a daemon into background. +*-c, --config-file 'CONFIGFILE'*:: + Specify the file and path name of the configuration file to be + used. If none is specified, use `osmo-bts.cfg` in the current + working directory. +*-s, --disable-color*:: + Disable colors for logging to stderr. This has mostly been + deprecated by VTY based logging configuration, see <> + for further information. +*-T, --timestamp*:: + Enable time-stamping of log messages to stderr. This has mostly + been deprecated by VTY based logging configuration, see + <> for further information. +*-e, --log-level 'LOGLEVEL'*:: + Set the global log level for logging to stderr. This has mostly + been deprecated by VTY based logging configuration, see + <> for further information. +*-r, --realtime 'PRIO'*:: + Enable use of the Linux kernel realtime priority scheduler with + the specified priority. + It is recommended you use this option on low-performance + embedded systems or systems that encounter high non-GSM/GPRS + load. +*-i, --gsmtap-ip 'GSMTAP-IP'*:: + Specify the destination IP address for GSMTAP messages. +*-t, --trx-num <1-255>*:: + Specify the number of TRX supported by this BTS. + +There may be additional, hardware specific command line options by the +different bts_model implementations. + + +=== Configuration using the VTY + +Most configuration as well as run-time monitoring and system +introspection is implemented using a command-line based interface +called _VTY_. A full reference syntax of all existing VTY command is +available as a separate document. + +See <> for further information on the VTY. + + +==== Required BTS/TRX configuration + +There are some settings that have to be configured locally in the +sysmoBTS, as they cannot be set remotely from the BSC. Those +settings are stored in the OsmoBTS configuration file, which commonly +is stored in `/etc/osmocom/osmo-bts.cfg`. + +.Example Minimal configuration file +---- +! +! OsmoBTS (0.0.1.100-0455) configuration saved from vty +!! +! +phy 0 <1> + instance 0 <2> +bts 0 <3> + band DCS1800 + ipa unit-id 1801 0 <4> + oml remote-ip 192.168.100.11 <5> + trx 0 <6> + phy 0 instance 0 <7> +---- +<1> You must configure at least one PHY link by means of the PHY node +<2> You must configure at least one PHY instance in the PHY link +<3> There is always exactly one BTS (`bts 0`) configured in OsmoBTS +<4> The `ipa unit-id` is what is used to identify this BTS to the BSC +<6> The OML Remote IP is the IP address of the BSC, to which the BTS shall connect to. +<6> There must be at least one trx (`trx 0`) in each BTS +<7> Every TRX must be mapped to a specific PHY instance this way + +For a full reference of all available VTY configuration parameters, +please refer to the OsmoBTS VTY Reference document. + +[[gsmtap]] +==== Configuring GSMTAP tracing + +In addition to being able to obtain pcap protocol traces of the A-bis +communication and the text-based logging from the OsmoBTS +software, there is also the capability of tracing all communication on +the radio interface. To do so, OsmoBTS can encapsulate +MAC blocks (23byte messages at the L2-L1 interface) into _GSMTAP_ and send +them via UDP/IP. At that point, they can be captured with utilities like +*tcpdump* or *tshark* for further analysis by the *wireshark* protocol +analyzer. + +In order to activate this feature, you first need to make sure to start +OsmoBTS using the `-i` or `--gsmtap-ip` command line option, specifying +the destination IP address for the GSMTAP messages. In most cases, +using 127.0.0.1 for passing the messages over the loopback (`lo`) device +will be sufficient. + +OsmoBTS can selectively trace such messages by their L1 SAPI, for both +Rx and Tx. For a complete list of L1 SAPI values, please refer to the +_OsmoBTS VTY reference manual_ <>. + +For example, to enable GSMTAP tracing for messages on all SDCCH +channels, you can use the gsmtap-sapi sdcch command at the CONFIG TRX +node of the OsmoBTS VTY. + +.Example: Enabling GSMTAP for SDCCH +---- +OsmoBTS> enable +OsmoBTS# configure terminal +OsmoBTS(config)# bts +OsmoBTS(bts)# trx 0 +OsmoBTS(trx)# gsmtap-sapi sdcch +OsmoBTS(trx)# write <1> +---- +<1> the `write` command will make the configuration persistent in the +configuration file. This is not required if you wish to enable GSMTAP +only in the current session of OsmoBTS. + +De-activation can be performed similarly by using the `no gsmtap-sapi +sdcch` command at the `trx` node of the OsmoBTS VTY. + +From the moment they are enabled via VTY, GSMTAP messages will be +generated and sent in UDP encapsulation to the IANA-registered UDP port +for GSMTAP (4729) at the IP address specified in the command line +argument. diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc new file mode 100644 index 00000000..f5bf1b20 --- /dev/null +++ b/doc/manuals/chapters/interfaces.adoc @@ -0,0 +1,130 @@ +== OsmoBTS Interfaces + +OsmoBTS offers a set of interfaces to interact with external entities: + +* A-bis/IP interface to talk to the BSC +* bts_model specific PHY interface +* VTY interface +* Osmocom control interface +* GSMTAP interface +* PCU interface + + +=== OsmoBTS Abis/IP Interface + +OsmoBTS implements the GSM A-bis interface as described in the relevant +3GPP specifications: + +* A-bis RSL according to 3GPP TS 08.58 +* A-bis OML according to 3GPP TS 12.21 + +As the 3GPP specified A-bis only over E1 interfaces and not over IP, +significant enhancements and modifications have been performed as opposed +to the 3GPP specifications. Nevertheless, the implementation tries to +stay as close a possible to the 3GPP specifications. + +Please see the _OsmoBTS Abis Protocol Specification_ +<> for more information on this subject. + + +=== bts_model specific PHY interface + +This interface is specific to the bts_model that OsmoBTS was compiled +for. It can take any form as required by the respective hardware. + +Please see the PHY documentation of your respective BTS hardware for more +details. + + +=== OsmoBTS VTY Interface + +See <> for further information. + + +=== OsmoBTS Control Interface + +The general structure of the Omsocom control interface is described in +<>. + +The number of control interface commands/attributes is currently quite +limited and largely depends on the bts_model used. + +==== trx.N.thermal-attenuation + +The idea of this paramter is to attenuate the system output power as part of +thermal management. In some cases the PA might be passing a critical level, +so an external control process can use this attribute to reduce the system +output power. + +Please note that all values in the context of transmit power calculation +are integers in milli-dB (1/10000 bel), so the below example is setting +the attenuation at 3 dB: + +---- +bsc_control.py -d localhost -p 4238 -s trx.0.thermal-attenuation 3000 +Got message: SET_REPLY 1 trx.0.thermal-attenuation 3000 +---- + +---- +bsc_control.py -d localhost -p 4238 -g trx.0.thermal-attenuation +Got message: GET_REPLY 1 trx.0.thermal-attenuation 3000 +---- + + + +=== OsmoBTS GSMTAP Interface + +GSMTAP is a standard created by Osmocom to UDP-encapsulate GSM protocol +messages normally communicated over non-IP interfaces for the primary +purpose of protocol analysis in the wireshark dissector. + +The initial purpose was to encapsulate GSM Um frames including some +meta-data like ARFCN and GSM frame number into something that can be +parsed and dispatched within the wireshark dissector. + +This interface has since been extended to many other +GSM/GPRS/UMTS interfaces and protocols, and even to TETRA and GMR. + +In OsmoBTS, it is possible to export both uplink and downlink Um +messages via GSMTAP. There is a set of VTY configuration options to +specify for which logical channels of the Um interface GSMTAP messages +shall be emitted, and to which destination IP address they shall be +sent. + +Using GSMTAP it is possible to place a virtual tap at the air interface +between BTS and MS, without going through the trouble of setting up an +actual radio receiver at the same frequencies. Also, GSMTAP export is +performed before the Um air-interface encryption (A5) is performed, so +all frames are always in plain text. + +Please refer to <> for more information on how to configure and +use this interface. + + +=== OsmoBTS PCU Socket Interface + +In order to assist the provisioning of GPRS services over the same radio +interface as circuit-switched GSM, OsmoBTS exposes a Unix domain socket +based interface towards OsmoPCU. + +OsmoPCU is the Osmocom implementation of the GPRS Packet Control Unit +(PCU), which is co-located with the BTS in the Osmocom implementation. +Contrary to that, many classic E1-based implementations of the GSM RAN +co-locate the PCU with the BSC. However, the GSM specifications keep +the location up to the implementor. + +The PCU socket interface serves the following purposes: + +* to pass PCU relevant configuration from BTS to PCU +* to forward paging requests from BTS to PCU +* to forward RACH Requests from BTS to PCU + +Depending on your bts_model, the PCU may also be passing actual +PH-DATA.request / PH-DATA.indication / PH-RTS.indication primitives for +the PDCH. This is considered sub-optimal, and some BTS models offer a +direct interface by which the PCU can exchange those primitives directly +with the PHY. + +The default PCU socket interface name is `/tmp/pcu_sock`, but this can +be overridden by the @pcu-socket@ VTY command in the BTS configuration +VTY node. diff --git a/doc/manuals/chapters/overview.adoc b/doc/manuals/chapters/overview.adoc new file mode 100644 index 00000000..6b6b8284 --- /dev/null +++ b/doc/manuals/chapters/overview.adoc @@ -0,0 +1,105 @@ +== Overview + +=== About this manual + +This manual should help you getting started with the OsmoBTS software. +It will cover aspects of configuring and running OsmoBTS as well as some +introduction about its internal architecture and external interfaces. + +=== About OsmoBTS + +OsmoBTS is an implementation of a GSM BTS (Base Transceiver Station). A +BTS serves as the interface between the Um radio interface towards +phones and the wired Abis interface towards the BSC (Base Station +Controller). It also implements the network side of the Layer 2 of the +Um radio interface: The LAPDm protocol. + +OsmoBTS is licensed as Free and Open Source Software (FOSS) under _GNU +AGPLv3_ <>. It is developed as one GSM network +infrastructure component part of the overall Osmocom project. + +As perhaps the first implementation of a GSM BTS ever in the industry, +OsmoBTS is implemented in a vendor-independent way and supports a large +variety of transceiver hardware and physical layer implementations from +many vendors. + +=== Credits + +OsmoBTS was originally developed in 2011 by Andreas Eversberg and Harald +Welte. It has since been maintained by Harald Welte and Holger Freyther +at sysmocom. + +=== OsmoBTS in the Osmocom GSM network architecture + +OsmoBTS can be used in combination with the various other GSM network +elements developed under the umbrella of the Osmocom project. + +Typical configurations either use OsmoBTS with OsmoBSC, or with +OsmoNITB, as can be seen in the following figures. + +[[fig-gsm-classic]] +.Classic GSM archtiecture using OsmoBTS with OsmoBTS components +[graphviz] +---- +digraph G { + rankdir=LR; + MS0 [label="MS"] + MS1 [label="MS"] + MS2 [label="MS"] + MS3 [label="MS"] + BTS0 [label="OsmoBTS"] + BTS1 [label="OsmoBTS"] + BSC [label="OsmoBSC"] + MSC [label="MSC/VLR"] + HLR [label="HLR/AUC"] + MS0->BTS0 [label="Um"] + MS1->BTS0 [label="Um"] + MS2->BTS1 [label="Um"] + MS3->BTS1 [label="Um"] + BTS0->BSC [label="Abis"] + BTS1->BSC [label="Abis"] + BSC->MSC [label="A"] + MSC->HLR [label="C"] + MSC->EIR [label="F"] + MSC->SMSC +} +---- + + +[[fig-gsm-nitb]] +.GSM architecture using OsmoBTS + OsmoNITB +[graphviz] +---- +digraph G { + rankdir=LR; + MS0 [label="MS"] + MS1 [label="MS"] + MS2 [label="MS"] + MS3 [label="MS"] + BTS0 [label="OsmoBTS"] + BTS1 [label="OsmoBTS"] + MS0->BTS0 [label="Um"] + MS1->BTS0 [label="Um"] + MS2->BTS1 [label="Um"] + MS3->BTS1 [label="Um"] + BTS0->BSC [label="Abis"] + BTS1->BSC [label="Abis"] + subgraph cluster_nitb { + label = "OsmoNITB"; + BSC + MSC [label="MSC/VLR"] + HLR [label="HLR/AUC"] + BSC->MSC [label="A"] + MSC->HLR [label="C"] + MSC->EIR [label="F"] + MSC->SMSC; + } +} +---- + +If intended by the user, it is of course also possible to implement an +OsmoBTS-compatible Abis-over-IP interface in any third party BSC. The +Abis/IP interface and its protocol are documented in the _OsmoBTS +Abis Protocol Specification_ <>. However, be advised +that such a configuration is currently not officially supported by +Osmocom. diff --git a/doc/manuals/osmobts-abis-docinfo.xml b/doc/manuals/osmobts-abis-docinfo.xml new file mode 100644 index 00000000..6cbc28fa --- /dev/null +++ b/doc/manuals/osmobts-abis-docinfo.xml @@ -0,0 +1,68 @@ + + + 1 + December 2015 + NJH, HW + + Initial version, reflecting OsmoBTS master branch as on 2015-Dec-7 + (commit e28a20a2d9d049cd6312e218a7646593bbc43431). + + + + 2 + February 2016 + HW + + Updated version with Message Sequence Chart of OML and RSL bring-up. + + + + 2.1 + February 2016 + HW + + Fix A-bis OML/RSL port number swap in message seqeuence charts. + + + + + + + Neels + Hofmayr + nhofmayr@sysmocom.de + NJH + + sysmocom + sysmocom - s.f.m.c. GmbH + Senior Software Developer + + + + Harald + Welte + hwelte@sysmocom.de + HW + + sysmocom + sysmocom - s.f.m.c. GmbH + Managing Director + + + + + + 2015-2016 + sysmocom - s.f.m.c. GmbH + + + + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, + and no Back-Cover Texts. A copy of the license is included in + the section entitled "GNU Free Documentation License". + + diff --git a/doc/manuals/osmobts-abis.adoc b/doc/manuals/osmobts-abis.adoc new file mode 100644 index 00000000..6b4f0dac --- /dev/null +++ b/doc/manuals/osmobts-abis.adoc @@ -0,0 +1,90 @@ +OsmoBTS Abis Protocol Specification +=================================== +Neels Hofmeyr + +== Introduction + +This document describes the A-bis interface of *OsmoBTS*. Based on 3GPP TS +12.21 and 08.58, this document indicates which of the 3GPP specified A-bis +messages and IEs are implemented according to 3GPP specifications, which of +these are not or not fully implemented, as well as OsmoBTS-specific extensions +to the A-bis interface not specified by 3GPP. + +Extensions to the A-bis interface specific to OsmoBTS are detailed in this +document. For details on the messages and IEs that comply with abovementioned +3GPP specifications, please refer to those documents. + +.3GPP document versions referred to by this document +[cols="20%,80%"] +|=== +|3GPP TS 08.56 | version 8.0.1 Release 1999 +|3GPP TS 08.58 | version 8.6.0 Release 1999 +|3GPP TS 08.60 | version 8.2.1 Release 1999 +|3GPP TS 12.21 | version 8.0.0 Release 1999 +|=== + +.IETF documents referred to by his document +[cols="20%,80%"] +|=== +|IETF RFC 768 | User Datagram Protocol +|IETF RFC 791 | Internet Protocol +|IETF RFC 793 | Transmission Control Protocol +|IETF RFC 1889 | RTP: A Transport Protocol for Real-Time Applications +|IETF RFC 3551 | RTP Profle for Audio and Video Conferences with Minimal Control +|IETF RFC 4867 | RTP Payload Format and Files Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive Multi-Rate Wideband (AMR-WB) Audio Codecs +|IETF RFC 5993 | RTP Payload Format for Global Systems for Mobile Communications Half Rate (GSM-HR) +|=== + +== Overview + +The OsmoBTS A-bis interface consists of traffic management messages (RSL, Radio +Signalling Link) and network management messages (OML, Operation & Maintenance +Link), encapsulated in an IPA multiplex. + +OML and RSL each use a separate TCP connection. + +.TCP port numbers used by OsmoBTS Abis/IP +[options="header",width="50%",cols="35%,65%"] +|=== +|TCP Port Number|Usage +|3002|A-bis OML (inside IPA multiplex) +|3003|A-bis RSL (inside IPA multiplex) +|=== + +Both TCP connections for OML and RSL are established in the BTS -> BSC +direction, i.e. the BTS is running as a TCP client, while the BSC is +running as a TCP server. + +The BTS first establishes the TCP connection for OML. Via OML, the BSC +instructs the BTS to which IP address the RSL connection shall be +established. + +.Overview of A-bis connection establishment +["mscgen"] +---- +include::abis/abis-startup.msc[] +---- + +=== Identities + +The BTS is locally configured (via administrative means, out of band of +this specification) to have a Unit ID. The Unit ID consists of three +parts: + +* The Site Number +* The BTS number at the site +* The TRX number within the BTS + +include::abis/ipa.adoc[] + +include::abis/oml.adoc[] + +include::abis/rsl.adoc[] + +include::abis/rtp.adoc[] + +include::../common/chapters/port_numbers.adoc[] + +include::../common/chapters/glossary.adoc[] + +include::../common/chapters/gfdl.adoc[] diff --git a/doc/manuals/osmobts-usermanual-docinfo.xml b/doc/manuals/osmobts-usermanual-docinfo.xml new file mode 100644 index 00000000..aa3285f1 --- /dev/null +++ b/doc/manuals/osmobts-usermanual-docinfo.xml @@ -0,0 +1,42 @@ + + + 1 + January 2016 + HW + + Initial version, reflecting OsmoBTS master branch as on FIXME + (commit FIXME). + + + + + + + Harald + Welte + hwelte@sysmocom.de + HW + + sysmocom + sysmocom - s.f.m.c. GmbH + Managing Director + + + + + + 2016 + sysmocom - s.f.m.c. GmbH + + + + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with the Invariant Sections being just 'Foreword', + 'Acknowledgements' and 'Preface', with no Front-Cover Texts, + and no Back-Cover Texts. A copy of the license is included in + the section entitled "GNU Free Documentation License". + + diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc new file mode 100644 index 00000000..914fdbe2 --- /dev/null +++ b/doc/manuals/osmobts-usermanual.adoc @@ -0,0 +1,32 @@ +OsmoBTS User Manual +=================== +Harald Welte + +include::../common/chapters/preface.adoc[] + +include::chapters/overview.adoc[] + +include::chapters/abis.adoc[] + +include::chapters/interfaces.adoc[] + +include::../common/chapters/vty.adoc[] + +include::../common/chapters/logging.adoc[] + +include::chapters/configuration.adoc[] + +include::chapters/bts-models.adoc[] + +include::chapters/architecture.adoc[] + +include::../common/chapters/control_if.adoc[] + +include::../common/chapters/port_numbers.adoc[] + +include::../common/chapters/bibliography.adoc[] + +include::../common/chapters/glossary.adoc[] + +include::../common/chapters/gfdl.adoc[] + -- cgit v1.2.3 From 391c05776904ddd8a1c916c2bd28ed35ee9b8d3c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 20 Feb 2016 18:12:53 +0100 Subject: Add link to Asciidoc source code of manual --- doc/manuals/osmobts-abis-docinfo.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/manuals/osmobts-abis-docinfo.xml b/doc/manuals/osmobts-abis-docinfo.xml index 6cbc28fa..84d791ae 100644 --- a/doc/manuals/osmobts-abis-docinfo.xml +++ b/doc/manuals/osmobts-abis-docinfo.xml @@ -65,4 +65,10 @@ and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". + + The Asciidoc source code of this manual can be found at + + http://git.osmocom.org/osmo-gsm-manuals/ + + -- cgit v1.2.3 From 0078ba7af2471b5d87fc6261490393135711afb8 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 2 Mar 2016 21:07:26 +0100 Subject: OsmoBTS: Fix the author name and mail address --- doc/manuals/osmobts-abis-docinfo.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/osmobts-abis-docinfo.xml b/doc/manuals/osmobts-abis-docinfo.xml index 84d791ae..89c7bdcb 100644 --- a/doc/manuals/osmobts-abis-docinfo.xml +++ b/doc/manuals/osmobts-abis-docinfo.xml @@ -29,8 +29,8 @@ Neels - Hofmayr - nhofmayr@sysmocom.de + Hofmeyr + nhofmeyr@sysmocom.de NJH sysmocom -- cgit v1.2.3 From f450f40c12dc6ddc886f4be9a2f094ecf879199b Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 2 Mar 2016 22:50:13 +0100 Subject: OsmoBTS: typo x2 ('Objects Classes' -> 'Object Classes') --- doc/manuals/abis/oml.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index 778a084b..2147deff 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -226,14 +226,14 @@ OsmoBTS: ==== Change Administrative State This message is compliant with 3GPP TS 12.21 § 8.8.5. It applies to all of the -Objects Classes defined in 3GPP TS 12.21 § 9.2 as well as +Object Classes defined in 3GPP TS 12.21 § 9.2 as well as <>. [[opstart]] ==== Opstart This message is compliant with 3GPP TS 12.21 § 8.9.2. It applies to all of the -Objects Classes defined in 3GPP TS 12.21 § 9.2 as well as +Object Classes defined in 3GPP TS 12.21 § 9.2 as well as <>. -- cgit v1.2.3 From d7c4778acaf164654a34261b4bd46a6ac0b561f8 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 3 Mar 2016 01:02:45 +0100 Subject: OsmoBTS: fix typos, streamline language style --- doc/manuals/abis/oml.adoc | 91 +++++++++++++++++++++++------------------------ doc/manuals/abis/rsl.adoc | 32 ++++++++--------- doc/manuals/abis/rtp.adoc | 6 ++-- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index 2147deff..542b424a 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -497,7 +497,7 @@ combinations are supported: |=== [[ie_conn_fail_crit]] -==== Connection Fail Criterion +==== Connection Failure Criterion 3GPP TS 12.21 Chapter 9.4.14 specifies two different options for the _Connection Failure Criterion_. OsmoBTS only implements the option @@ -558,7 +558,7 @@ the IPA stream ID to be used for the RSL connection of this TRX. [[NM_ATT_IPACC_RAC]] ==== GPRS Routing Area Code -The value part of the GPRS Routing Area code consist of a single octet +The value part of the GPRS Routing Area code consists of a single octet encoding the GPRS Routing Area Code. The content of this attribute is not used by OsmoBTS, but @@ -612,8 +612,8 @@ simply passed to OsmoPCU connected to the PCU socket. [[NM_ATT_IPACC_NS_CFG]] ==== GPRS NS Configuration -The value part of the GPRS NS Configuration consist of an array of 7 octets, each -describing one GPRS NS related timer: +The value part of the GPRS NS Configuration consists of an array of 7 octets, +each describing one GPRS NS related timer: The content of this attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -747,8 +747,8 @@ simply passed to OsmoPCU connected to the PCU socket. [[NM_ATT_IPACC_RLC_CFG_3]] ==== GPRS RLC Configuration 3 -The content of this attribute contains information about the initial MCS -used for new EDGE TBFs. +This attribute contains information about the initial MCS used for new EDGE +TBFs. It is encoded as follows: [options="header"] @@ -773,14 +773,14 @@ simply passed to OsmoPCU connected to the PCU socket. At the time an Abis/IP BTS connects to via OML to the BSC, it is initialized according to the procedures described in 3GPP TS 12.21 as -amended in this document. +amended by this document. Each Managed Object (MO) is separately initialized. The initialization sequence and parameters differ slightly depending on the MO involved. Some parts of the sequences described below are optional, such as the -Software activation. In the OsmoBTS case, the software is nod modular -and thus all MOs start with the software fully activated. Thus, no +Software activation. In the OsmoBTS case, the software is not modular +and thus all MOs start with the software fully activated. In effect, no __Software Activate Request__ is being sent by the MO to the BSC, nor does the BSC need to initialize the __Activate Software__ procedure. @@ -788,7 +788,7 @@ Still, the full sequences are shown in order to explain the Abis/IP protocol. Also, the initial state of the MOs at time of OML connection -initialization is not always guaranteed to be Disabled/Notinstalled. +initialization is not always guaranteed to be __Disabled/Notinstalled__. Rather, the BSC implementation has to deal with the initial state as reported by the MOs at time of re-connection. @@ -800,9 +800,9 @@ reported by the MOs at time of re-connection. include::oml-mo-sitemgr.msc[] ---- -As the Site Manager MO does not depend on other MOs, nor does it have an -Administrative state (__Locked/Unlocked__), it immediately ends up in the -__Enabled__ state. +The Site Manager MO does not depend on other MOs, nor does it have an +Administrative state (__Locked/Unlocked__), thus it immediately commences in +the __Enabled__ state. ==== BTS MO Initialization @@ -812,7 +812,7 @@ __Enabled__ state. include::oml-mo-bts.msc[] ---- -As can be seen in the BTS MO, its state is +As shown in the BTS MO, its state is * Availability state __Dependency__, meaning it depends on other MOs to be initialized before becoming enabled. @@ -853,15 +853,15 @@ the above procedure must be repeated for each TRX. include::oml-mo-channel.msc[] ---- -There are 8 Timeslots in each TRX, and correspondingly 8 Channel MOs in +There are 8 timeslots in each TRX, and correspondingly 8 Channel MOs in every TRX. The above procedure must thus be repeated for each timeslot in each transceiver of the BTS. -==== Full Initialization of entire BTS +==== Complete BTS Initialization Procedure -Some of the steps are optional, as is their detailed ordering. In -reality, the procedures for different MOs may overlap. The message +Some of below steps are optional, as is their detailed ordering. In +practice, the procedures for different MOs may overlap. The message sequence charts in this document have been hand-crafted to avoid such overlap for the sake of clarity. @@ -872,18 +872,17 @@ overlap for the sake of clarity. include::oml-startup.msc[] ---- -As can be seen in <>, after the OML TCP connection is -established +As shown in <>, after the OML TCP connection is established, . the identity is exchanged via IPA CCM, . the BTS sends an 'OML EVENT STATE CHANGED REPORT' for every - Managed Object + Managed Object, and . the BTS subsequently requests the activation of its 'Site Manager' Object which the BSC performs by the 'Activate SW' command. . After successful activation of the software in the Site Manager, .. the state changes to 'Enabled', and an event report is generated - accordingly -.. the BSC is notified about the SW activation in an associated report + accordingly, and +.. the BSC is notified about the SW activation in an associated report. . Finally, the BSC requests the start of the Site Manager .. using the 'OPSTART' command, .. which is subsequently acknowledged by the Site Manager. @@ -902,36 +901,36 @@ include::oml-startup2.msc[] include::oml-startup3.msc[] ---- -In <>, we can see +<> shows: -. Software Activation and associated state transitions of the BTS MO -. Setting of the BTS Attributes followed by OPSTART +. Software Activation and associated state transitions of the BTS MO; +. Setting of the BTS Attributes followed by OPSTART; . Software Activation and associated state transitions of the 'Baseband - Transceiver' MO + Transceiver' MO; . Software Activation and associated state transitions of the 'Radio - Carrier' MO + Carrier' MO; . Once the 'Baseband Transceiver' MO has its software activated, the - 'Channel' MOs (one for each timeslot) indicate their state change and - software activation, too. + 'Channel' MOs (one for each timeslot) indicate their state change as + well as software activation. -In <>, we can see +<> shows: -. The 'Radio Carrier' MO Software Activation +. The 'Radio Carrier' MO Software Activation; . The Request to the 'Baseband Transceiver' MO to establish the RSL - signalling connection to the BSC. + signalling connection to the BSC; . Subsequent OPSTART and Change of Administrative State on the 'Baseband - Transceiver' MO -. The following procedure for each of the 'Channel' MOs: -.. Setting the Channel Attributes (such as channel combination) -.. OPSTART -.. Changing the Administrative State to Unlocked -.. Subsequent State Change Event Report with the new state + Transceiver' MO; +. The following procedure takes place for each of the 'Channel' MOs: +.. Set the Channel Attributes (such as channel combination), +.. OPSTART, +.. change the Administrative State to Unlocked, +.. followed by a State Change Event Report with the new state. . After all 'Channel' MOs are initialized, the Radio Carrier goes through - a similar procedure of -.. Setting its attributes -.. OPSTART -.. Changing its Administrative State to Unlocked -.. Subsequent State Change Event Report with the new State (Enabled/OK) -. All 'Channel' MOs now also report their state as Enabled/OK -. Finally, the BTS reports its state as Enabled/OK + a similar procedure: +.. Set attributes, +.. OPSTART, +.. change Administrative State to Unlocked, +.. followed by a State Change Event Report with the new State (Enabled/OK) +. All 'Channel' MOs now also report their state as Enabled/OK. +. Finally, the BTS reports its state as Enabled/OK. diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index e157b25e..f32fb94e 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -273,7 +273,7 @@ the E1 line is a dedicated line between BTS and BSC, no further addressing information is required. In A-bis/IP as described by the present document, new RSL procedures -have been introduced in order to deal with the different properties of +have been introduced to deal with the different properties of the underlying IP based transport medium. [[rsl_crcx]] @@ -335,7 +335,7 @@ See <> [[rsl_crcx_msg]] ==== Create Connection (CRCX) -This message is sent by the BSC to the BTS in order to request the +This message is sent by the BSC to the BTS to request the creation of a user-plane RTP connection for the specified *Channel number*. @@ -355,7 +355,7 @@ number*. [[rsl_crcx_msg_ack]] ==== Create Connection (CRCX) ACK -This message is sent by the BTS to the BSC in order to acknowledge the +This message is sent by the BTS to the BSC to acknowledge the successful outcome of creating a user-plane RTP connection. It is sent in response to the *Create Connection (CRCX)*. @@ -375,7 +375,7 @@ in response to the *Create Connection (CRCX)*. [[rsl_crcx_msg_nack]] ==== Create Connection (CRCX) NACK -This message is sent by the BTS to the BSC in order to signal the +This message is sent by the BTS to the BSC to signal the unsuccessful outcome of creating a user-plane RTP connection. It is sent in response to the *Create Connection (CRCX)*. @@ -395,7 +395,7 @@ sent in response to the *Create Connection (CRCX)*. [[rsl_mdcx_msg]] ==== Modify Connection (MDCX) -This message is sent by the BSC to the BTS in order to modify the +This message is sent by the BSC to the BTS to modify the properties of a user-plane RTP connection. [options="header"] @@ -415,7 +415,7 @@ properties of a user-plane RTP connection. [[rsl_mdcx_msg_ack]] ==== Modify Connection (MDCX) ACK -This message is sent by the BTS to the BSC in order to acknowledge the +This message is sent by the BTS to the BSC to acknowledge the successful modification of a user-plane RTP connection. It is sent in response to a *Modify Connection (MDCX)* @@ -435,7 +435,7 @@ response to a *Modify Connection (MDCX)* [[rsl_mdcx_msg_nack]] ==== Modify Connection (MDCX) NACK -This message is sent by the BTS to the BSC in order to signal the +This message is sent by the BTS to the BSC to signal the unsuccessful outcome of modifying the user-plane RTP connection for the specified Channel number. It is sent in response to the *Modify Connection (MDCX)*. @@ -453,7 +453,7 @@ Connection (MDCX)*. [[rsl_dlcx_ind_msg]] ==== Delete Connection (DLCX) Indication -This message is sent by the BTS in order to indicate the automatic +This message is sent by the BTS to indicate the automatic deletion of a BTS-local UDP connection for user-plane RTP traffic at the time of RF Channel release. @@ -472,7 +472,7 @@ time of RF Channel release. [[rsl_dlcx_msg]] ==== Delete Connection (DLCX) -This message is sent by the BSC to the BTS in order to request the +This message is sent by the BSC to the BTS to request the disconnection of a user-plane RTP connection for the specified Channel number. @@ -489,7 +489,7 @@ number. [[rsl_dlcx_msg_ack]] ==== Delete Connection (DLCX) ACK -This message is sent by the BTS in order to signal the successful +This message is sent by the BTS to signal the successful outcome of deleting the user-plane RTP connection for the specified Channel number. It is sent in response to the *Delete Connection (DLCX)*. @@ -508,7 +508,7 @@ Channel number. It is sent in response to the *Delete Connection [[rsl_dlcx_msg_nack]] ==== Delete Connection (DLCX) NACK -This message is sent by the BTS in order to signal the unsuccessful +This message is sent by the BTS to signal the unsuccessful outcome of deleting the user-plane RTP connection for the specified Channel number. It is sent in response to the *Delete Connection (DLCX)*. @@ -636,7 +636,7 @@ fixed-length payload encoded as follows: | 24 | 4 | Average transmission delay |=== -All the above values are each encoded in network byte order. +All the above values are encoded in network byte order. A detailed definition of the individual values is given in RFC 1889. @@ -674,8 +674,8 @@ include::rsl-startup-pri.msc[] include::rsl-startup-sec.msc[] ---- -As can be seen by the differences between <> and -<>, the initialization of the primary and secondary TRX -slightly differ. As the secondary TRX has no BCCH, it does not (need -to) receive any 'RSL BCCH INFORMATION' messages from the BSC. +The initialization of the primary and secondary TRX slightly differ, as +illustrated by the differences of <> and <>. +Since the secondary TRX has no BCCH, it does not (need to) receive any 'RSL +BCCH INFORMATION' messages from the BSC. diff --git a/doc/manuals/abis/rtp.adoc b/doc/manuals/abis/rtp.adoc index e64b5c11..dde56515 100644 --- a/doc/manuals/abis/rtp.adoc +++ b/doc/manuals/abis/rtp.adoc @@ -1,10 +1,10 @@ == User-Plane Traffic via RTP -RTP (Realtime Transfer Protocol) is a protocol for streaming of audio -and video streaming data. It is specified by IETF RFC 1889. +RTP (Realtime Transfer Protocol) is a protocol for streaming audio +and video data. It is specified by IETF RFC 1889. OsmoBTS A-bis/IP implements RTP as transport medium for circuit-switched -user-plane traffic, contrary to the E1 sub-slot based transport as +user-plane traffic, contrary to the E1 sub-slot based transport specified in 3GPP TS 08.60. The RTP transport endpoint parameters are configured using the RSL User -- cgit v1.2.3 From e0064a8d2a7f1878e0be20d1c1e279de17131225 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 3 Mar 2016 12:01:38 +0100 Subject: OsmoBTS: s/content of this attribute/this attribute/ --- doc/manuals/abis/oml.adoc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index 542b424a..3db586f3 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -429,7 +429,7 @@ specified in 3GPP TS 12.21 Chapter 9.4. All of these additional IEs are _received_ by OsmoBTS. -The content of these attributes is not used by OsmoBTS, but +These attributes are not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. .Additional IEs handled by OsmoBTS but not defined in TS 12.21 @@ -561,7 +561,7 @@ the IPA stream ID to be used for the RSL connection of this TRX. The value part of the GPRS Routing Area code consists of a single octet encoding the GPRS Routing Area Code. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -586,7 +586,7 @@ follows: The value part of the GPRS NSEI is encoded as 16bit integer value in network byte order. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -605,7 +605,7 @@ The value part of the GPRS NSVCI attribute is a 16bit unsigned integer in network byte order, encoding the GPRS NSVCI as specified in 3GPP TS 08.16. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -615,7 +615,7 @@ simply passed to OsmoPCU connected to the PCU socket. The value part of the GPRS NS Configuration consists of an array of 7 octets, each describing one GPRS NS related timer: -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -645,14 +645,14 @@ The value part of the GPRS BSSGP configuration consists of an array of The detailed description of the meaning of those timers is given in the GPRS BSSGP specification 3GPP TS 08.18. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. [[NM_ATT_IPACC_NS_LINK_CFG]] ==== GPRS NS Link Configuration -The content of this attribute is 8 octets long and encoded as follows: +This attribute is 8 octets long and encoded as follows: [options="header"] [cols="10%,10%,80%"] |=== @@ -664,7 +664,7 @@ The content of this attribute is 8 octets long and encoded as follows: All values are encoded in network byte order. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -694,7 +694,7 @@ The meaning of the RLC timers are specified in 3GPP TS 04.60. The countdown value specifies the RLC CV value from which the countdown procedure is started. -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -711,7 +711,7 @@ encoding the available GPRS and EDGE coding schemes. | byte at offset 1 | MCS8 | MCS7| MCS6 | MCS5 | MCS4| MCS3 | MCS2 | MCS1 |=== -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -740,7 +740,7 @@ The Initial GPRS Coding Scheme is encoded as follows: | 4 | CS 4 |=== -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. @@ -766,7 +766,7 @@ It is encoded as follows: | 9 | MCS 9 |=== -The content of this attribute is not used by OsmoBTS, but +This attribute is not used by OsmoBTS, but simply passed to OsmoPCU connected to the PCU socket. === A-bis OML Initialization / BTS bring-up -- cgit v1.2.3 From bfb1257dce2649effb1e45d37fa0e1a577070ffd Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 3 Mar 2016 12:22:53 +0100 Subject: OsmoBTS: explain IEs marked 'ignored' *and* 'Received' --- doc/manuals/abis/oml.adoc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index 3db586f3..0daaec73 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -337,8 +337,15 @@ additions to TS 12.21 specified in more detail. ==== IEs Conforming to TS 12.21 -The following Information Elements are accepted by OsmoBTS. Not all IEs are -actually evaluated. +The following Information Elements are accepted by OsmoBTS. + +IEs marked __ignored__ may be sent to OsmoBTS without causing error +conditions. These IEs are skipped during message parsing and are never +evaluated. + +IEs marked __ignored__ and additionally marked as being received by OsmoBTS +(<-) are in fact parsed and their values are stored by OsmoBTS, but these +stored items are currently not used in the OsmoBTS code base. .IEs conforming to TS 12.21 [options="header",cols="5%,10%,40%,5%,40%"] -- cgit v1.2.3 From 1454a2c7527401d449b13fec2c3d61cad2d4ac25 Mon Sep 17 00:00:00 2001 From: Jonathan Brielmaier Date: Wed, 25 May 2016 15:01:11 +0200 Subject: fix various typos across all manuals --- doc/manuals/abis/rsl.adoc | 4 ++-- doc/manuals/chapters/architecture.adoc | 2 +- doc/manuals/chapters/bts-models.adoc | 10 +++++----- doc/manuals/chapters/interfaces.adoc | 2 +- doc/manuals/osmobts-abis.adoc | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index f32fb94e..331ccb3e 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -91,7 +91,7 @@ Specific limitations apply, see the linked sections. | 8.4.24 | ROUND TRIP DELAY REPORT | 8.4.25 | PRE-HANDOVER NOTIFICATION | 8.4.26 | MULTIRATE CODEC MODIFICATION REQUEST -| 8.4.27 | MULTIRATE CODEC MODIFICATION ACKNOLEWDGE +| 8.4.27 | MULTIRATE CODEC MODIFICATION ACKNOWLEDGE | 8.4.28 | MULTIRATE CODEC MODIFICATION NEGATIVE ACKNOWLEDGE | 8.4.29 | MULTIRATE CODEC MODIFICATION PERFORMED | 8.4.30 | TFO REPORT @@ -115,7 +115,7 @@ Specific limitations apply, see the linked sections. Conforms to 3GPP TS 08.58 § 8.4.8 with this limitation: -._Measuremet Result_ IE limitations +._Measurement Result_ IE limitations [options="header",cols="10%,30%,60%"] |=== | TS 08.58 § | IE Name | Handling diff --git a/doc/manuals/chapters/architecture.adoc b/doc/manuals/chapters/architecture.adoc index aca5bb95..a0e66cd0 100644 --- a/doc/manuals/chapters/architecture.adoc +++ b/doc/manuals/chapters/architecture.adoc @@ -83,7 +83,7 @@ order to specify which PHY instance is allocated to this specific TRX. | common | bts_controlif_setup() | Initialization of Control Interface | bts-specific | bts_model_ctrl_cmds_install() | Install model-specific control interface commands | common | telnet_init() | Initialization of telnet interface -| common | pcu_sock_init() | Initializaiton of PCU socket +| common | pcu_sock_init() | Initialization of PCU socket | common | main() | Installation of signal handlers | common | abis_open() | Start of the A-bis connection to BSC | common | phy_links_open() | Iterate over list of configured PHY links diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index 5a967f61..a4c65d25 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -33,10 +33,10 @@ Each bts_model may offer == `osmo-bts-sysmo` for sysmocom sysmoBTS -The sysmocom sysmoBTS is a range of GSM BTSs basd around an embedded +The sysmocom sysmoBTS is a range of GSM BTSs based around an embedded system implementing the PHY in a combination of DSP+FPGA. The PHY is configured by a set of primitives described by header files. Those -primitives are exchanged ove a set of message queues exposed on the +primitives are exchanged over a set of message queues exposed on the Linux-running ARM core via device nodes in `/dev/msgq/`. Internally, the message queues map to shared memory between the Linux-running ARM core and the DSP running the PHY implementation. @@ -62,7 +62,7 @@ vice-versa. <> for further information. *--pcu-direct*:: Indicate that an external PCU (e.g. OsmoPCU) will directly - open the DSP messge queues to the PHY / PH-SAP, and only MPH + open the DSP message queues to the PHY / PH-SAP, and only MPH primitives are passed via OsmoBTS. @@ -225,7 +225,7 @@ human-readable format to current VTY session. ===== `osmotrx ip HOST` -Set the IP addess of the OsmoTRX transceiver to which we should connect +Set the IP address of the OsmoTRX transceiver to which we should connect to. ===== `osmotrx base-port (local|remote) <0-65535>` @@ -293,7 +293,7 @@ OCTPKT session, which is mapped to an OsmoBTS PHY link. Depending on the OCTSDR-2G software version, you may create multiple software TRX by creating multiple OsmoBTS PHY instances inside that PHY link. -Multiple DSPs may exsist in one circuit board, then each of the DSPs is +Multiple DSPs may exist in one circuit board, then each of the DSPs is interfaced by one OsmoBTS PHY link, and each of them may have one or more OsmoBTS PHY instances creating a Multi-TRX configuration. diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc index f5bf1b20..a95f524d 100644 --- a/doc/manuals/chapters/interfaces.adoc +++ b/doc/manuals/chapters/interfaces.adoc @@ -51,7 +51,7 @@ limited and largely depends on the bts_model used. ==== trx.N.thermal-attenuation -The idea of this paramter is to attenuate the system output power as part of +The idea of this parameter is to attenuate the system output power as part of thermal management. In some cases the PA might be passing a critical level, so an external control process can use this attribute to reduce the system output power. diff --git a/doc/manuals/osmobts-abis.adoc b/doc/manuals/osmobts-abis.adoc index 6b4f0dac..930cbfb2 100644 --- a/doc/manuals/osmobts-abis.adoc +++ b/doc/manuals/osmobts-abis.adoc @@ -11,7 +11,7 @@ these are not or not fully implemented, as well as OsmoBTS-specific extensions to the A-bis interface not specified by 3GPP. Extensions to the A-bis interface specific to OsmoBTS are detailed in this -document. For details on the messages and IEs that comply with abovementioned +document. For details on the messages and IEs that comply with above mentioned 3GPP specifications, please refer to those documents. .3GPP document versions referred to by this document -- cgit v1.2.3 From e61a2eb734772468e99128628ef14046d7dc5692 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 4 May 2016 15:59:12 +0200 Subject: Add OsmoBTS control interface description --- doc/manuals/chapters/control.adoc | 24 ++++++++++++++++++++++++ doc/manuals/osmobts-usermanual.adoc | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 doc/manuals/chapters/control.adoc diff --git a/doc/manuals/chapters/control.adoc b/doc/manuals/chapters/control.adoc new file mode 100644 index 00000000..3b21669b --- /dev/null +++ b/doc/manuals/chapters/control.adoc @@ -0,0 +1,24 @@ +[[control]] +== Control interface + +The actual protocol is described in <>, the variables +common to all programs using it are described in <>. Here we +describe variables specific to OsmoBTS. The commands starting with prefix +"net.btsN." are specific to a certain BTS so N have to be replaced with BTS +number when issuing command. Similarly the +TRX-specific commands are additionally prefixed with TRX number e. g. +"net.bts1.trx2.thermal-attenuation". + + +.Variables available over control interface +[options="header",width="100%",cols="20%,5%,5%,50%,20%"] +|=== +|Name|Access|Trap|Value|Comment +|net.btsN.trxM.thermal-attenuation|RW|No|integer|See <> for details. +|=== + +[[ther]] +=== thermal-attenuation + +Allowed SET value for thermal attenuation is between 0 to 40 dB. Note: the value +is SET in dB units but GET will return value in mdB units used internally. diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc index 914fdbe2..0b847334 100644 --- a/doc/manuals/osmobts-usermanual.adoc +++ b/doc/manuals/osmobts-usermanual.adoc @@ -10,6 +10,8 @@ include::chapters/abis.adoc[] include::chapters/interfaces.adoc[] +include::chapters/control.adoc[] + include::../common/chapters/vty.adoc[] include::../common/chapters/logging.adoc[] -- cgit v1.2.3 From b14f6569fd468d494b3cb4c740ccf570c2caa086 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 27 Jun 2016 17:42:53 +0200 Subject: abis/oml.doc: remove duplicate sentence part --- doc/manuals/abis/oml.adoc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index 0daaec73..f6d7612e 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -191,10 +191,9 @@ as frequency hopping is not supported by OsmoBTS: [[set_chan_attr]] ==== Set Channel Attributes -This message conforms to 3GPP TS 12.21, with the following limitation: OpenBTS -does not support frequency hopping, and the following 3GPP TS 12.21 IEs provoke -a NACK response when sent to OsmoBTS, as frequency hopping is not -supported: +This message conforms to 3GPP TS 12.21, with the following limitation: the +following 3GPP TS 12.21 IEs provoke a NACK response when sent to OsmoBTS, as +frequency hopping is not supported: ._Set Channel Attributes_ IE limitations [options="header",cols="10%,30%,60%"] -- cgit v1.2.3 From 8f1eae66421bc9843411184e9160a9a4e5e13173 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 26 Jul 2016 12:46:33 +0200 Subject: OsmoBTS: typos '3GPP specified': when talking about written information, one usually uses the present tense '3GPP specifies'. --- doc/manuals/chapters/interfaces.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc index a95f524d..32822c58 100644 --- a/doc/manuals/chapters/interfaces.adoc +++ b/doc/manuals/chapters/interfaces.adoc @@ -18,10 +18,10 @@ OsmoBTS implements the GSM A-bis interface as described in the relevant * A-bis RSL according to 3GPP TS 08.58 * A-bis OML according to 3GPP TS 12.21 -As the 3GPP specified A-bis only over E1 interfaces and not over IP, +As the 3GPP specifies A-bis only over E1 interfaces and not over IP, significant enhancements and modifications have been performed as opposed to the 3GPP specifications. Nevertheless, the implementation tries to -stay as close a possible to the 3GPP specifications. +stay as close as possible to the 3GPP specifications. Please see the _OsmoBTS Abis Protocol Specification_ <> for more information on this subject. -- cgit v1.2.3 From a998d1040a5b0f0e755a20d2ecf198d9bb8b2885 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 26 Jul 2016 12:50:39 +0200 Subject: OsmoBTS: wording tweak --- doc/manuals/chapters/interfaces.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc index 32822c58..242fa235 100644 --- a/doc/manuals/chapters/interfaces.adoc +++ b/doc/manuals/chapters/interfaces.adoc @@ -19,9 +19,9 @@ OsmoBTS implements the GSM A-bis interface as described in the relevant * A-bis OML according to 3GPP TS 12.21 As the 3GPP specifies A-bis only over E1 interfaces and not over IP, -significant enhancements and modifications have been performed as opposed -to the 3GPP specifications. Nevertheless, the implementation tries to -stay as close as possible to the 3GPP specifications. +significant enhancements and modifications to the 3GPP specifications are +employed. Nevertheless, the implementation tries to stay as close as +possible to the 3GPP specifications. Please see the _OsmoBTS Abis Protocol Specification_ <> for more information on this subject. -- cgit v1.2.3 From 47d5ba401226474408ff26e91d911f5e26ae7610 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 26 Jul 2016 13:16:31 +0200 Subject: OsmoBTS: hardware support: remove dup, tweak wording Don't mention the common part twice. Use plural for hw specific parts. No commata before 'and'. --- doc/manuals/chapters/bts-models.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index a4c65d25..67d75bdf 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -1,8 +1,8 @@ == OsmoBTS hardware support -OsmoBTS consists of a generic part common to all BTS, and a -hardware-specific _common_ part, and a _hardware-specific_ part. The -hardware specific part is generally referred to as the _bts_model_ code. +OsmoBTS consists of a _common_ part that applies to all BTS models as well as +_hardware-specific_ parts for each BTS model. The hardware specific parts are +generally referred to as the _bts_model_ code. The common part includes the core BTS architecture as well as code for implementing the external interfaces such Abis, control, PCU socket and -- cgit v1.2.3 From c03c9c81fbf16aa4d22920be6aca649622ac4f80 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 26 Jul 2016 13:50:38 +0200 Subject: Document dynamic channels on Abis, both IPA and Osmocom style Based in ladder diagram and WIP wording for IPA style from Neels Hofmeyr, completed by me. --- doc/manuals/abis/dyn_ts_ipa_style.msc | 39 +++++ doc/manuals/abis/dyn_ts_osmocom_style.msc | 60 +++++++ doc/manuals/abis/oml.adoc | 10 +- doc/manuals/abis/rsl.adoc | 238 +++++++++++++++++++++++++++- doc/manuals/chapters/bts-models.adoc | 3 +- doc/manuals/chapters/dynamic-timeslots.adoc | 21 +++ doc/manuals/osmobts-usermanual.adoc | 2 + 7 files changed, 366 insertions(+), 7 deletions(-) create mode 100644 doc/manuals/abis/dyn_ts_ipa_style.msc create mode 100644 doc/manuals/abis/dyn_ts_osmocom_style.msc create mode 100644 doc/manuals/chapters/dynamic-timeslots.adoc diff --git a/doc/manuals/abis/dyn_ts_ipa_style.msc b/doc/manuals/abis/dyn_ts_ipa_style.msc new file mode 100644 index 00000000..ae7c0d0e --- /dev/null +++ b/doc/manuals/abis/dyn_ts_ipa_style.msc @@ -0,0 +1,39 @@ +msc { + hscale = "1.2"; + phy,bts,pcu,bsc; + + phy box bsc [ label = "PDCH Deactivation" ]; + bsc => bts [ label = "IPAC PDCH DEACT" ]; + --- [ label = "Disconnect PDTCH" ]; + bts => pcu [ label = "info ind (Deactivate)" ]; + pcu => bts [ label = "chan Deactivate request" ]; + bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; + bts => phy [ label = "L1 chan Disconnect PDTCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + --- [ label = "Connect TCH" ]; + bts => phy [ label = "L1 chan Connect TCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + bts => bsc [ label = "IPAC PDCH DEACT ACK" ]; + + phy box bsc [ label = "Now BSC may use TCH (example)" ]; + bsc => bts [ label = "Activate TCH/F" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + --- [ label = "Voice call..." ]; + bsc => bts [ label = "Deactivate TCH/F" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + + phy box bsc [ label = "PDCH Activation" ]; + bsc => bts [ label = "IPAC PDCH ACT" ]; + --- [ label = "Disconnect TCH" ]; + bts => phy [ label = "L1 chan Disconnect TCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + --- [ label = "Connect PDTCH" ]; + bts => phy [ label = "L1 chan Connect PDTCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + bts => pcu [ label = "info ind (Activate)" ]; + pcu => bts [ label = "chan Activate request" ]; + bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; + bts => bsc [ label = "IPAC PDCH ACT ACK" ]; +} diff --git a/doc/manuals/abis/dyn_ts_osmocom_style.msc b/doc/manuals/abis/dyn_ts_osmocom_style.msc new file mode 100644 index 00000000..10f89961 --- /dev/null +++ b/doc/manuals/abis/dyn_ts_osmocom_style.msc @@ -0,0 +1,60 @@ +msc { + hscale = "1.5"; + phy,bts,pcu,bsc; + + bts => bsc [ label = "RSL Chan Requested" ]; + phy box bsc [ label = "TS is in PDCH mode, deactivate" ]; + bsc => bts [ label = "RSL RF Channel Release (PDCH)" ]; + bts => pcu [ label = "Info Ind (Deactivate)" ]; + pcu => bts [ label = "Chan Deactivate request" ]; + bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (PDCH)" ]; + + phy box bsc [ label = "Activate TCH/H" ]; + bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; + --- [ label = "BTS notices: chan still connected as PDTCH, reconnect" ]; + bts => phy [ label = "L1 chan Disconnect PDTCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + bts => phy [ label = "L1 chan Connect TCH/H" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + --- [ label = "chan reconnect as TCH/H complete" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; + --- [ label = "Voice call 1 commences..." ]; + + phy box bsc [ label = "A second voice call is requested" ]; + bts => bsc [ label = "RSL Chan Requested" ]; + phy box bsc [ label = "BSC finds second slot on dynamic TS in TCH/H mode" ]; + bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; + --- [ label = "Voice call 2 commences..." ]; + + --- [ label = "...Voice call 1 ends" ]; + bts => bsc [ label = "Release Ind" ]; + bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; + --- [ label = "BSC notices: one chan still in use"]; + + --- [ label = "...Voice call 2 ends" ]; + bts => bsc [ label = "Release Ind" ]; + bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; + + phy box bsc [ label = "If all channels on TS are released, PDCH Activation" ]; + bsc => bts [ label = "RSL Channel Activation (PDCH)" ]; + --- [ label = "BTS notices: chan still connected as TCH/H, reconnect" ]; + bts => phy [ label = "L1 chan Disconnect TCH/H" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + bts => phy [ label = "L1 chan Connect PDTCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + --- [ label = "chan reconnect as PDTCH complete" ]; + bts => pcu [ label = "Info Ind (Activate)" ]; + pcu => bts [ label = "chan Activate request" ]; + bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (PDCH)" ]; +} diff --git a/doc/manuals/abis/oml.adoc b/doc/manuals/abis/oml.adoc index f6d7612e..4afcec04 100644 --- a/doc/manuals/abis/oml.adoc +++ b/doc/manuals/abis/oml.adoc @@ -498,10 +498,18 @@ combinations are supported: | 0x0b | Reserved for PBCCH + PCCCH + PDTCH/F + PACCH/F + PTCCH/F | 0x0c | Reserved for PBCCH + PDTCH/F + PACCH/F + PTCCH/F | 0x0d | PDTCH/F + PACCH/F + PTCCH/F -| 0x80 | Reserved for Dynamic TCH/F / PDCH +| 0x80 | ip.access style Dynamic TCH/F / PDCH | 0x81 | Reserved for Dynamic TCH/F / TCH/H +| 0x90 | Osmocom style Dynamic TCH/F / TCH/H / PDCH |=== +The _Reserved_ combinations are not actually supported/implemented +yet, but merely reserved for such functionality, if it is eventually +implemented. + +For more information on how the different dynamic channel combinations +work, please see the <>. + [[ie_conn_fail_crit]] ==== Connection Failure Criterion diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index 331ccb3e..b1b49641 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -7,7 +7,7 @@ grouped by their level of compliance with 3GPP TS 08.58. ==== Messages Compliant With TS 08.58 -Specific limitations apply, see the linked sections. +Specific additions and limitations apply, see the linked sections. .Messages compliant with TS 08.58 [options="header",cols="10%,20%,45%,5%,20%"] @@ -26,9 +26,9 @@ Specific limitations apply, see the linked sections. | 8.3.10 | - | UNIT DATA REQUEST | <- | Received | 8.3.11 | - | UNIT DATA INDICATION | -> | Sent 5+<| *DEDICATED CHANNEL MANAGEMENT MESSAGES* -| 8.4.1 | - | CHANNEL ACTIVATION | <- | Received -| 8.4.2 | - | CHANNEL ACTIVATION ACKNOWLEDGE | -> | Sent -| 8.4.3 | - | CHANNEL ACTIVATION NEGATIVE ACKNOWLEDGE | -> | Sent +| 8.4.1 | <> | CHANNEL ACTIVATION | <- | Received +| 8.4.2 | <> | CHANNEL ACTIVATION ACKNOWLEDGE | -> | Sent +| 8.4.3 | <> | CHANNEL ACTIVATION NEGATIVE ACKNOWLEDGE | -> | Sent | 8.4.4 | - | CONNECTION FAILURE INDICATION | -> | Sent | 8.4.5 | - | DEACTIVATE SACCH | <- | Received | 8.4.6 | - | ENCRYPTION COMMAND | <- | Received @@ -71,6 +71,13 @@ Specific limitations apply, see the linked sections. | <> | RSL Delete Connection (DLCX) ACK | -> | Sent | <> | RSL Delete Connection (DLCX) NACK | -> | Sent | <> | <> | RSL Delete Connection (DLCX) Indication | -> | Sent +5+<| *IPA style PDCH Management* (<>) +.3+.| <> | <> | RSL PDCH Activation | <- | Received + | <> | RSL PDCH Activation ACK | -> | Sent + | <> | RSL PDCH Activation NACK | -> | Sent +.3+.| <> | <> | RSL PDCH Deactivation | <- | Received + | <> | RSL PDCH Deactivation ACK | -> | Sent + | <> | RSL PDCH Deactivation NACK | -> | Sent |=== ==== Messages Not Implemented by OsmoBTS @@ -110,6 +117,16 @@ Specific limitations apply, see the linked sections. === Message Limitation Details +[[CHANNEL_ACTIVATION]] + +When used on a timeslot using the non-standard channel combination +'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' as configured by OML, the regular +RSL channel activation procedures can not only be used for activation +of circuit-switched channels, but also for activation of a PDCH. + +NOTE:: Do not confuse this with the ip.access style _PDCH ACT_ type +dynamic PDCH protocol employed by nanoBTS devices. + [[MEASUREMENT_RESULT]] ==== Measurement Result @@ -330,6 +347,41 @@ non-acknowledged *RSL Delete Connection (DLCX) Indication* to the BSC. See <> +[[ipa_style_pdch_mgmt]] +=== IPA style PDCH Management + +When using an IPA-style dynamic TCH/F+PDCH channel type on an +on-air timeslot, there are a couple of non-standard RSL messages used +in order to activate or deactivate this timeslot in PDCH mode. + +When the channel is used as TCH/F, regular circuit-switched activation +is performed, like on any traditional TCH/F. However, the BSC must +make sure to first disable the PDCH on the timeslot, before activating +it as TCH/F. Likewise, any circuit-switched TCH/F on the channel must +be deactivated using standard RSL signalling, before the specific PDCH +related procedures are used to enable the PDCH. + +[[pdch_act]] +==== PDCH Activate + +This procedure is used by the BSC to request the BTS to activate an +IPA-style dynamic TCH/F+PDCH channel in PDCH mode. + +The operation is not supported on any other physical channel type. + +See <>, <>, <> + +[[pdch_deact]] +==== PDCH Deactivate + +This procedure is used by the BSC to request the BTS to deactivate an +active PDCH on any an IPA-style dynamic TCH/F+PDCH channel. + +The operation is not supported on any other physical channel type. + +See <>, <>, <> + + === Message Formats and Contents [[rsl_crcx_msg]] @@ -524,6 +576,110 @@ Channel number. It is sent in response to the *Delete Connection | Cause | 08.58 9.3.26 | M | TLV | >= 3 |=== +[[rsl_pdch_act]] +==== PDCH Activate + +This message is sent by the BSC to request the activation of a PDCH on +a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels + +[[rsl_pdch_act_ack]] +==== PDCH Activate ACK + +This message is sent by the BTS to confirm the successful activation +of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Frame Number | 08.58 9.3.8 | O | TV | 3 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels + +[[rsl_pdch_act_nack]] +==== PDCH Activate NACK + +This message is sent by the BTS to reject the successful activation +of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Cause | 08.58 9.3.26 | M | TLV | >= 3 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels + +[[rsl_pdch_deact]] +==== PDCH Deactivate + +This message is sent by the BSC to request the deactivation of a PDCH +on a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels + +[[rsl_pdch_deact_ack]] +==== PDCH Deactivate ACK + +This message is sent by the BTS to confirm the successful deactivation +of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels + +[[rsl_pdch_deact_nack]] +==== PDCH Deactivate NACK + +This message is sent by the BTS to reject the deactivation of a PDCH +on a IPA-style dynamic TCH/F+PDCH channel. + +[options="header"] +[cols="30%,25%,15%,15%,15%"] +|=== +| INFORMATION ELEMENT | REFERENCE | PRESENCE | FORMAT | LENGTH +| Message discriminator | 08.58 9.1 | M | V | 1 +| Message type | <> | M | V | 1 +| Channel number | 08.58 9.3.1 | M | TV | 2 +| Cause | 08.58 9.3.26 | M | TLV | >= 3 +|=== + +NOTE:: This message is *not* used by Osmocom style dynamic channels === Information Element Codings @@ -547,17 +703,24 @@ indicated in 3GPP TS 08.58 Section 9.1: | 0x77 | Delete Connection (DLCX) | <> | 0x78 | Delete Connection (DLCX) ACK | <> | 0x79 | Delete Connection (DLCX) NACK | <> +| 0x48 | PDCH Activate | <> +| 0x49 | PDCH Activate ACK | <> +| 0x4a | PDCH Activate NACK | <> +| 0x4b | PDCH Deactivate | <> +| 0x4c | PDCH Deactivate ACK | <> +| 0x4d | PDCH Deactivate NACK | <> |=== ==== A-bis/IP specific RSL IEIs The following Information Element Identifiers (IEIs) are used in -addition to those indicated in 3GPP TS 08.58 Section 9.3.1: +addition to those indicated in 3GPP TS 08.58 Section 9.3: .A-bis/IP specific information elements [options="header",cols="10%,50%,40%"] |=== | IEI | Name | This document § +| 0x01 | RSL_IE_CHAN_NR | <> | 0xf0 | RSL_IE_IPAC_REMOTE_IP | <> | 0xf1 | RSL_IE_IPAC_REMOTE_PORT | <> | 0xf3 | RSL_IE_IPAC_LOCAL_PORT | <> @@ -568,6 +731,21 @@ addition to those indicated in 3GPP TS 08.58 Section 9.3.1: | 0xfc | RSL_IE_IPAC_RTP_PAYLOAD2 | <> |=== +[[RSL_IE_CHAN_NR]] +==== RSL_IE_CHAN_NR + +This information element is coded like 3GPP TS 08.58 Section 9.3.1, +but in addition supports the following extended coding: + +* C5..C1 bits 0b11000 for PDCH type channels + +The TN-Bits are not re-defined in this case but use the same encoding +as specified in TS 08.58 Section 9.3.1. + +NOTE:: The above extension is only valid on an Osmocom-style dynamic +channel, having configured the 'NM_CHANC_IPAC_TCHFull_PDCH' channel +combination by OML. + [[RSL_IE_IPAC_REMOTE_IP]] ==== RSL_IE_IPAC_REMOTE_IP @@ -679,3 +857,53 @@ illustrated by the differences of <> and <>. Since the secondary TRX has no BCCH, it does not (need to) receive any 'RSL BCCH INFORMATION' messages from the BSC. +[[rsl-dynamic-channels]] +=== Dynamic Channel Combinations + +In the classic data model established by ETSI/3GPP for A-bis, each +timeslot (channel) is configured using a static channel combination by +means of A-bis OML. Particularly in presence of GPRS services, this +is very unflexible and leads to inefficient use of air interface +resources. + +As such, several methods have been implemented to overcome this +limitation. The fundamental operation can be outlined like this: + +* Configuration of a particular _dynamic_ channel combination via OML +* activation of TCH works like on a classic TCH channel combination +* activation of PDCH requires some specific PDCH activation procedure + +There are two variants implemented in the OsmoBTS A-bis dialect: + +==== ip.access style Dynamic Channels + +This method is used when OML uses 'NM_CHANC_IPAC_TCHFull_PDCH' (0x80) +as channel combination for the given time-slot. + +When the ip.access style dynamic channel combination _TCH/F or PDCH_ +is set, the non-standard 'PDCH ACTIVATE' (<>) and 'PDCH +DEACTIVATE' (<>) procedures are used for switching an idle +channel into PDCH mode and back into idle mode. + +.Example for dynamic channel switchover, for ip.access style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_ipa_style.msc[] +---- + +==== Osmocom style Dynamic Channels + +This method is in use when OML uses +'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' (0x90) for the given time-slot. + +The activation of PDCH is performed by using the regular 'RSL CHANNEL +ACTIVATE' procedure according to <>, with the +exception that the 'cbits' part of the ' + +.Example for dynamic channel switchover, for ip.access style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_osmocom_style.msc[] +---- + + diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index 67d75bdf..1c619d3c 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -1,3 +1,4 @@ +[[osmobts_hardware_support]] == OsmoBTS hardware support OsmoBTS consists of a _common_ part that applies to all BTS models as well as @@ -23,7 +24,7 @@ offered as a PHY-independent _L1SAP_ interface towards the common part of OsmoBTS. In addition, each bts_model implements a set of functions that the -common part calls. Those functions are pre-fixed by bts_model_. +common part calls. Those functions are pre-fixed by _bts_model__. Each bts_model may offer diff --git a/doc/manuals/chapters/dynamic-timeslots.adoc b/doc/manuals/chapters/dynamic-timeslots.adoc new file mode 100644 index 00000000..68d6fe13 --- /dev/null +++ b/doc/manuals/chapters/dynamic-timeslots.adoc @@ -0,0 +1,21 @@ +== Support for Dynamic Timeslots (TCH/F, TCH/H, PDCH) + +OsmoBTS supports dynamic switchover of timeslots between different physical +channel configurations, initiated by the BSC via (non-standard) Abis messages +-- see the _OsmoBTS Abis Protocol Specification_ <>. + +The Abis message handling for dynamic timeslots is independent of the BTS +model. However, dynamic switchover will only work for BTS models that implement +the internal API to reconnect a timeslot (_bts_model_ts_disconnect()_ and +_bts_model_ts_connect()_). Currently, these BTS models support dynamic +timeslots: + +* _osmo-bts-sysmo_ +* _osmo-bts-litecell15_ +* _osmo-bts-trx_ + +See also <>. + +include::../../common/snippets/dyn_pdch_ladder.adoc[] + +include::../../common/snippets/dyn_ts_ladder_TCH_H.adoc[] diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc index 0b847334..a05becde 100644 --- a/doc/manuals/osmobts-usermanual.adoc +++ b/doc/manuals/osmobts-usermanual.adoc @@ -18,6 +18,8 @@ include::../common/chapters/logging.adoc[] include::chapters/configuration.adoc[] +include::chapters/dynamic-timeslots.adoc[] + include::chapters/bts-models.adoc[] include::chapters/architecture.adoc[] -- cgit v1.2.3 From 7a3ec76a2f59e82b393f429df97c7594042f746c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 31 Jul 2016 21:46:35 +0200 Subject: spelling: message discriminator, not descriminator --- doc/manuals/abis/rsl.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index b1b49641..5f49dc27 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -686,7 +686,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels [[own_msg_types]] ==== A-bis/IP specific RSL Message discriminators -The following message descriminators are used in addition to those +The following message discriminators are used in addition to those indicated in 3GPP TS 08.58 Section 9.1: .OsmoBTS specific new message discriminators -- cgit v1.2.3 From 51c04e0fd7715f1481faa907a12dd3a736f7e1ec Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 31 Jul 2016 21:53:33 +0200 Subject: osmobts-abis: Add Revision log regarding dynamic cannels --- doc/manuals/osmobts-abis-docinfo.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/manuals/osmobts-abis-docinfo.xml b/doc/manuals/osmobts-abis-docinfo.xml index 89c7bdcb..4e233943 100644 --- a/doc/manuals/osmobts-abis-docinfo.xml +++ b/doc/manuals/osmobts-abis-docinfo.xml @@ -24,6 +24,15 @@ Fix A-bis OML/RSL port number swap in message seqeuence charts. + + 2.2 + July 2016 + NJH, HW + + Add description on Dynamic Channel Configuration in OML and activation in RSL. + + + -- cgit v1.2.3 From e10b4d37134b176259741b603eb339ff8a7aff30 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Mon, 8 Aug 2016 17:03:39 +0200 Subject: Add section about configuring power-ramping --- doc/manuals/chapters/configuration.adoc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index a2d06249..43621663 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -152,3 +152,30 @@ From the moment they are enabled via VTY, GSMTAP messages will be generated and sent in UDP encapsulation to the IANA-registered UDP port for GSMTAP (4729) at the IP address specified in the command line argument. + +==== Configuring power ramping + +OsmoBTS can ramp up the power of its trx over time. This helps reduce +cell congestion in busy environments. + +In this example, the trx starts with 5dBm output power which increases by 1dB +every two seconds until it reaches nominal power. +Power ramping can use the power-ramp commands at the CONFIG TRX node of the +OsmoBTS VTY. + +.Example: Configure power ramping on trx 0 +---- +OsmoBTS> enable +OsmoBTS# configure terminal +OsmoBTS(config)# bts +OsmoBTS(bts)# trx 0 +OsmoBTS(trx)# power-ramp max-initial 5 dBm +OsmoBTS(trx)# power-ramp step-size 1 dB +OsmoBTS(trx)# power-ramp step-interval 2 +OsmoBTS(trx)# write <1> +---- +<1> the `write` command will make the configuration persistent in the +configuration file. + +De-activating power-ramping can be performed by setting the max-initial value +to the nominal power. The default max-initial value is 23 dBm. -- cgit v1.2.3 From 00ad09612ef11ba597a50e74cc5dc18fdf4bb05a Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 22 Aug 2016 17:36:28 +0200 Subject: OsmoBTS/abis/rsl: fix subtitle for ladder diagram of osmo dyn switchover --- doc/manuals/abis/rsl.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index 5f49dc27..a78afc54 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -900,7 +900,7 @@ The activation of PDCH is performed by using the regular 'RSL CHANNEL ACTIVATE' procedure according to <>, with the exception that the 'cbits' part of the ' -.Example for dynamic channel switchover, for ip.access style dynamic timeslots +.Example for dynamic channel switchover, for Osmocom style dynamic timeslots ["mscgen"] ---- include::dyn_ts_osmocom_style.msc[] -- cgit v1.2.3 From 00d13cf84cfcb4cdc9818afb798e7c1b3cb4db0a Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 23 Aug 2016 01:12:22 +0200 Subject: OsmoBTS/abis/dyn_ts_osmocom_style.msc: adjust PDCH Act ack The act ack for switchover to PDCH is now issued immediately, after commit 'dyn TS: if PCU is not connected, allow operation as TCH'. Adjust the chart accordingly. --- doc/manuals/abis/dyn_ts_osmocom_style.msc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/abis/dyn_ts_osmocom_style.msc b/doc/manuals/abis/dyn_ts_osmocom_style.msc index 10f89961..c9296482 100644 --- a/doc/manuals/abis/dyn_ts_osmocom_style.msc +++ b/doc/manuals/abis/dyn_ts_osmocom_style.msc @@ -46,6 +46,7 @@ msc { phy box bsc [ label = "If all channels on TS are released, PDCH Activation" ]; bsc => bts [ label = "RSL Channel Activation (PDCH)" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (PDCH) (unconditionally)" ]; --- [ label = "BTS notices: chan still connected as TCH/H, reconnect" ]; bts => phy [ label = "L1 chan Disconnect TCH/H" ]; phy -> bts [ label = "L1 chan Disconnect confirm" ]; @@ -56,5 +57,4 @@ msc { pcu => bts [ label = "chan Activate request" ]; bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; - bts -> bsc [ label = "RSL Channel Activation Ack (PDCH)" ]; } -- cgit v1.2.3 From ad4866b35f123bf6d49f2c3288a88961893c8aea Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Fri, 14 Oct 2016 16:56:42 +0200 Subject: OsmoBTS: add vty reference documentation Including the required changes of the Makefile which is now simliar as the other projects Makefile's. Based on: OsmoBTS 0.3.0.283-f869 Change-Id: Id7362ce1c584b1926330b93770d68453e091c71c --- doc/manuals/Makefile | 38 +- doc/manuals/osmobts-vty-reference.xml | 38 + doc/manuals/vty/bts_vty_additions.xml | 1 + doc/manuals/vty/bts_vty_reference.xml | 1633 +++++++++++++++++++++++++++++++++ 4 files changed, 1705 insertions(+), 5 deletions(-) create mode 100644 doc/manuals/osmobts-vty-reference.xml create mode 100644 doc/manuals/vty/bts_vty_additions.xml create mode 100644 doc/manuals/vty/bts_vty_reference.xml diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 092856d8..01683a76 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -1,14 +1,42 @@ +# XSL stylesheets downloaded from http://docbook.sourceforge.net/release/xsl/current/html/ +# Makefile from BitBake/OpenEmbedded manuals + +EXTRA_DEPS = gen-bts-vty-docbook + +topdir = . +bts_reference = $(topdir)/osmobts-vty-reference.xml +manuals = $(bts_reference) +# types = pdf txt rtf ps xhtml html man tex texi dvi +# types = pdf txt +types = $(docbooktotypes) +docbooktotypes = pdf +# htmlcssfile = +# htmlcss = + TOPDIR := .. -ASCIIDOCS := osmobts-usermanual osmobts-abis +ASCIIDOCS := osmobts-usermanual include $(TOPDIR)/build/Makefile.asciidoc.inc - -# for the upload target include $(TOPDIR)/build/Makefile.inc -# dependencies -osmobts-abis.pdf: abis/*.adoc abis/*.msc osmobts-usermanual.pdf: chapters/*.adoc clean: + rm -rf osmobts-usermanual__*.{svg,png} rm -rf $(cleanfiles) + +gen-bts-vty-docbook: FORCE + $(call command,xsltproc -o generated/combined1.xml \ + --stringparam with $(PWD)/../common/vty_additions.xml \ + $(MERGE_DOC) vty/bts_vty_reference.xml, \ + XSLTPROC,Merging Common VTY) + $(call command,xsltproc -o generated/combined2.xml \ + --stringparam with $(PWD)/../common/ns_vty_additions.xml \ + $(MERGE_DOC) generated/combined1.xml, \ + XSLTPROC,Merging Common NS VTY) + $(call command,xsltproc -o generated/combined3.xml \ + --stringparam with $(PWD)/vty/bts_vty_additions.xml \ + $(MERGE_DOC) generated/combined2.xml, \ + XSLTPROC,Merging BTS VTY) + $(call command,xsltproc ../vty_reference.xsl generated/combined3.xml > generated/docbook_vty.xml, \ + XSLTPROC,Converting BTS VTY to DocBook) diff --git a/doc/manuals/osmobts-vty-reference.xml b/doc/manuals/osmobts-vty-reference.xml new file mode 100644 index 00000000..0d0454ab --- /dev/null +++ b/doc/manuals/osmobts-vty-reference.xml @@ -0,0 +1,38 @@ + + + + +]> + + + + + + v1 + 13th October 2016 + hw + Initial + + + + OsmoBTS VTY Reference + + + 2016 + + + + This work is copyright by sysmocom - s.f.m.c. GmbH. All rights reserved. + + + + + + &chapter-vty; + + diff --git a/doc/manuals/vty/bts_vty_additions.xml b/doc/manuals/vty/bts_vty_additions.xml new file mode 100644 index 00000000..519c4b48 --- /dev/null +++ b/doc/manuals/vty/bts_vty_additions.xml @@ -0,0 +1 @@ + diff --git a/doc/manuals/vty/bts_vty_reference.xml b/doc/manuals/vty/bts_vty_reference.xml new file mode 100644 index 00000000..b50ac1ba --- /dev/null +++ b/doc/manuals/vty/bts_vty_reference.xml @@ -0,0 +1,1633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 2729bcfb932c46322248fe816cef88b51172bc08 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 02:52:10 +0200 Subject: OsmoBTS/abis/rsl.adoc: fix missing section header In effect, this fixes the dangling references from the table of RSL messages with additions/limitations to the Chan Act message description. Change-Id: Ic6f83f016ce9ec90af7eb0af1b1f71a10263915d --- doc/manuals/abis/rsl.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index a78afc54..827e353d 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -118,6 +118,7 @@ Specific additions and limitations apply, see the linked sections. === Message Limitation Details [[CHANNEL_ACTIVATION]] +==== Channel Activation When used on a timeslot using the non-standard channel combination 'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' as configured by OML, the regular -- cgit v1.2.3 From 9c74ccc4c8b83cf56afb0d75d12fc171a1025af0 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 02:53:31 +0200 Subject: OsmoBTS/chapters/dynamic-timeslots.adoc: Remove obsolete links Those file never existed and the ladder diagrams are instead at OsmoBTS/abis/dyn_ts*msc. Change-Id: Icbae85b959e80afe7f272a11f33064a3e594da53 --- doc/manuals/chapters/dynamic-timeslots.adoc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/doc/manuals/chapters/dynamic-timeslots.adoc b/doc/manuals/chapters/dynamic-timeslots.adoc index 68d6fe13..29dff5b7 100644 --- a/doc/manuals/chapters/dynamic-timeslots.adoc +++ b/doc/manuals/chapters/dynamic-timeslots.adoc @@ -15,7 +15,3 @@ timeslots: * _osmo-bts-trx_ See also <>. - -include::../../common/snippets/dyn_pdch_ladder.adoc[] - -include::../../common/snippets/dyn_ts_ladder_TCH_H.adoc[] -- cgit v1.2.3 From e834518123e1f1faf62001b95afee3cd26b20ef4 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 02:54:23 +0200 Subject: osmobts-usermanual.adoc: fix link to abis.adoc chapter The chapter is in ../common/chapters, not in ./chapters Change-Id: I698d83e96cb77900b99a0bd383587b1b68182efb --- doc/manuals/osmobts-usermanual.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc index a05becde..4d47b1c3 100644 --- a/doc/manuals/osmobts-usermanual.adoc +++ b/doc/manuals/osmobts-usermanual.adoc @@ -6,7 +6,7 @@ include::../common/chapters/preface.adoc[] include::chapters/overview.adoc[] -include::chapters/abis.adoc[] +include::../common/chapters/abis.adoc[] include::chapters/interfaces.adoc[] -- cgit v1.2.3 From de954a1aa0f37ab4965900469465f78655dd964e Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 02:59:43 +0200 Subject: OsmoBTS/chapters/configuration.adoc: fix index numbering Change-Id: Ibe507fe36e0130377dec361d56fd75596ca64e75 --- doc/manuals/chapters/configuration.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index 43621663..b91d8ac3 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -99,7 +99,7 @@ bts 0 <3> <2> You must configure at least one PHY instance in the PHY link <3> There is always exactly one BTS (`bts 0`) configured in OsmoBTS <4> The `ipa unit-id` is what is used to identify this BTS to the BSC -<6> The OML Remote IP is the IP address of the BSC, to which the BTS shall connect to. +<5> The OML Remote IP is the IP address of the BSC, to which the BTS shall connect to. <6> There must be at least one trx (`trx 0`) in each BTS <7> Every TRX must be mapped to a specific PHY instance this way -- cgit v1.2.3 From e332b4ca4e7158caaa8b7555add08a07a76d5b04 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 04:05:58 +0200 Subject: OsmoBTS/abis/rsl: cosmetic: 'IPA style' Consistently name the PDCH act methid 'IPA style', name ip.access only once in the 'IPA Style Dynamic Channels' section. Consistently write 'IPA style' without hyphen (not 'IPA-style'). Capitalize section headers ('IPA Style'). Change-Id: I91112c2d8af9424ebe7e1972fd4ef9c77d24a7b4 --- doc/manuals/abis/rsl.adoc | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index 827e353d..30a7d775 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -349,9 +349,9 @@ See <> [[ipa_style_pdch_mgmt]] -=== IPA style PDCH Management +=== IPA Style PDCH Management -When using an IPA-style dynamic TCH/F+PDCH channel type on an +When using an IPA style dynamic TCH/F+PDCH channel type on an on-air timeslot, there are a couple of non-standard RSL messages used in order to activate or deactivate this timeslot in PDCH mode. @@ -366,7 +366,7 @@ related procedures are used to enable the PDCH. ==== PDCH Activate This procedure is used by the BSC to request the BTS to activate an -IPA-style dynamic TCH/F+PDCH channel in PDCH mode. +IPA style dynamic TCH/F+PDCH channel in PDCH mode. The operation is not supported on any other physical channel type. @@ -376,7 +376,7 @@ See <>, <>, <> ==== PDCH Deactivate This procedure is used by the BSC to request the BTS to deactivate an -active PDCH on any an IPA-style dynamic TCH/F+PDCH channel. +active PDCH on any an IPA style dynamic TCH/F+PDCH channel. The operation is not supported on any other physical channel type. @@ -581,7 +581,7 @@ Channel number. It is sent in response to the *Delete Connection ==== PDCH Activate This message is sent by the BSC to request the activation of a PDCH on -a IPA-style dynamic TCH/F+PDCH channel. +a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -598,7 +598,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels ==== PDCH Activate ACK This message is sent by the BTS to confirm the successful activation -of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. +of a PDCH on a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -616,7 +616,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels ==== PDCH Activate NACK This message is sent by the BTS to reject the successful activation -of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. +of a PDCH on a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -634,7 +634,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels ==== PDCH Deactivate This message is sent by the BSC to request the deactivation of a PDCH -on a IPA-style dynamic TCH/F+PDCH channel. +on a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -651,7 +651,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels ==== PDCH Deactivate ACK This message is sent by the BTS to confirm the successful deactivation -of a PDCH on a IPA-style dynamic TCH/F+PDCH channel. +of a PDCH on a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -668,7 +668,7 @@ NOTE:: This message is *not* used by Osmocom style dynamic channels ==== PDCH Deactivate NACK This message is sent by the BTS to reject the deactivation of a PDCH -on a IPA-style dynamic TCH/F+PDCH channel. +on a IPA style dynamic TCH/F+PDCH channel. [options="header"] [cols="30%,25%,15%,15%,15%"] @@ -876,17 +876,19 @@ limitation. The fundamental operation can be outlined like this: There are two variants implemented in the OsmoBTS A-bis dialect: -==== ip.access style Dynamic Channels +==== IPA Style Dynamic Channels This method is used when OML uses 'NM_CHANC_IPAC_TCHFull_PDCH' (0x80) as channel combination for the given time-slot. -When the ip.access style dynamic channel combination _TCH/F or PDCH_ +'IPA style' refers to 'ip.access' compatible PDCH activation and deactivation. + +When the IPA style dynamic channel combination _TCH/F or PDCH_ is set, the non-standard 'PDCH ACTIVATE' (<>) and 'PDCH DEACTIVATE' (<>) procedures are used for switching an idle channel into PDCH mode and back into idle mode. -.Example for dynamic channel switchover, for ip.access style dynamic timeslots +.Example for dynamic channel switchover, for IPA style dynamic timeslots ["mscgen"] ---- include::dyn_ts_ipa_style.msc[] -- cgit v1.2.3 From 8b633e885bdf94d722167e66046303ff5bfdd41b Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 04:09:27 +0200 Subject: OsmoBTS/abis/rsl: add missing info for Osmocom Dyn Channels The section 'Osmocom Style Dynamic Channels' ended in mid-sentence without naming any of the hard facts. Complete that. Add section links. Change-Id: Ib92895fe1bb89fb1b14dc8fcbd88b98bbb6edeee --- doc/manuals/abis/rsl.adoc | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index 30a7d775..c9bb5551 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -125,8 +125,10 @@ When used on a timeslot using the non-standard channel combination RSL channel activation procedures can not only be used for activation of circuit-switched channels, but also for activation of a PDCH. -NOTE:: Do not confuse this with the ip.access style _PDCH ACT_ type -dynamic PDCH protocol employed by nanoBTS devices. +See <>. + +NOTE:: Do not confuse this with the IPA style _PDCH ACT_ type +dynamic PDCH protocol employed by nanoBTS devices (<>). [[MEASUREMENT_RESULT]] ==== Measurement Result @@ -894,14 +896,35 @@ channel into PDCH mode and back into idle mode. include::dyn_ts_ipa_style.msc[] ---- -==== Osmocom style Dynamic Channels +[[OSMOCOM_DYN_TS]] +==== Osmocom Style Dynamic Channels This method is in use when OML uses 'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' (0x90) for the given time-slot. -The activation of PDCH is performed by using the regular 'RSL CHANNEL -ACTIVATE' procedure according to <>, with the -exception that the 'cbits' part of the ' +The activation of PDCH is performed by using the regular 'RSL CHANNEL ACTIVATE' +procedure according to <>, with these modifications: + +* The 'C-bits' part of the 'Channel Number' IE take the non-standard binary + value 11000 (C5 thru C1 as seen in 3GPP TS 08.58 § 9.3.1). +* The 'A-bits' part of the 'Activation Type' IE take the non-standard binary + value 1111, with an additional fourth bit (add A4 to A3 thru A1 as seen in + 3GPP TS 08.58 § 9.3.3; all remaining reserved bits as well as the 'R' bit are + coded as zero). +* The normally mandatory 'Channel Mode' IE is omitted; none of the optional IEs + are included. + +Hence the message consists of exactly these IEs: + +.PDCH type _Channel Activation_ message IEs +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.1 | Message discriminator | Dedicated Channel Management +| 9.2 | Message type | CHANnel ACTIVation +| 9.3.1 | Channel number | 'C-bits' 11000, plus TS bits as usual +| 9.3.3 | Activation type | 'A-bits' 1111 +|=== .Example for dynamic channel switchover, for Osmocom style dynamic timeslots ["mscgen"] -- cgit v1.2.3 From 3537fa622461741feca4463446df82297d6675fa Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 04:42:34 +0200 Subject: make clean: also remove generated image files Change-Id: I80798e79b4ccee64f26f58f9754de02b2958e33e --- doc/manuals/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 01683a76..729704ec 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -22,8 +22,9 @@ include $(TOPDIR)/build/Makefile.inc osmobts-usermanual.pdf: chapters/*.adoc clean: - rm -rf osmobts-usermanual__*.{svg,png} rm -rf $(cleanfiles) + rm -rf osmobts-abis__*.{svg,png} + rm -rf osmobts-usermanual__*.{svg,png} gen-bts-vty-docbook: FORCE $(call command,xsltproc -o generated/combined1.xml \ -- cgit v1.2.3 From 236e9d575eaac73bbd62793f3cf0f87310066e17 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 06:15:34 +0200 Subject: add 'make check' target Generate *.check files from asciidoc output and grep for WARNINGs. Add *.check files to gitignore and to 'make clean'. Change-Id: Ibccc83a3415930a528f2e8e4e4dda3b81c6d0b64 --- doc/manuals/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 729704ec..f2c873a6 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -23,8 +23,8 @@ osmobts-usermanual.pdf: chapters/*.adoc clean: rm -rf $(cleanfiles) - rm -rf osmobts-abis__*.{svg,png} - rm -rf osmobts-usermanual__*.{svg,png} + rm -rf osmobts-abis__*.{svg,png,check} + rm -rf osmobts-usermanual__*.{svg,png,check} gen-bts-vty-docbook: FORCE $(call command,xsltproc -o generated/combined1.xml \ -- cgit v1.2.3 From 8580b9717f830db695580363053bc3a3442731fc Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 04:45:41 +0200 Subject: OsmoBTS/abis/rsl: combine separate dyn ts sections There were two separate sections saying basically the same. Move the entire 'Dynamic Channel Combinations' section further above and combine with the 'IPA Style PDCH Management' section to avoid repetition. Change-Id: Ic370ba34de5cb14f0194ff8c8661e45d7ca98e2b --- doc/manuals/abis/rsl.adoc | 156 +++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 79 deletions(-) diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index c9bb5551..ed8676ee 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -350,12 +350,36 @@ non-acknowledged *RSL Delete Connection (DLCX) Indication* to the BSC. See <> +[[rsl-dynamic-channels]] +=== Dynamic Channel Combinations + +In the classic data model established by ETSI/3GPP for A-bis, each +timeslot (channel) is configured using a static channel combination by +means of A-bis OML. Particularly in presence of GPRS services, this +is very unflexible and leads to inefficient use of air interface +resources. + +As such, several methods have been implemented to overcome this +limitation. The fundamental operation can be outlined like this: + +* Configuration of a particular _dynamic_ channel combination via OML +* activation of TCH works like on a classic TCH channel combination +* activation of PDCH requires some specific PDCH activation procedure + +There are two variants implemented in the OsmoBTS A-bis dialect: + [[ipa_style_pdch_mgmt]] -=== IPA Style PDCH Management +==== IPA Style Dynamic Channels -When using an IPA style dynamic TCH/F+PDCH channel type on an -on-air timeslot, there are a couple of non-standard RSL messages used -in order to activate or deactivate this timeslot in PDCH mode. +This method is used when OML uses 'NM_CHANC_IPAC_TCHFull_PDCH' (0x80) +as channel combination for the given time-slot. + +'IPA style' refers to 'ip.access' compatible PDCH activation and deactivation. + +When the IPA style dynamic channel combination _TCH/F or PDCH_ +is set, the non-standard 'PDCH ACTIVATE' (<>) and 'PDCH +DEACTIVATE' (<>) procedures are used for switching an idle +channel into PDCH mode and back into idle mode. When the channel is used as TCH/F, regular circuit-switched activation is performed, like on any traditional TCH/F. However, the BSC must @@ -365,7 +389,7 @@ be deactivated using standard RSL signalling, before the specific PDCH related procedures are used to enable the PDCH. [[pdch_act]] -==== PDCH Activate +===== PDCH Activate This procedure is used by the BSC to request the BTS to activate an IPA style dynamic TCH/F+PDCH channel in PDCH mode. @@ -375,7 +399,7 @@ The operation is not supported on any other physical channel type. See <>, <>, <> [[pdch_deact]] -==== PDCH Deactivate +===== PDCH Deactivate This procedure is used by the BSC to request the BTS to deactivate an active PDCH on any an IPA style dynamic TCH/F+PDCH channel. @@ -384,6 +408,53 @@ The operation is not supported on any other physical channel type. See <>, <>, <> +===== IPA Style Dynamic Switchover Example + +.Example for dynamic channel switchover, for IPA style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_ipa_style.msc[] +---- + + +[[OSMOCOM_DYN_TS]] +==== Osmocom Style Dynamic Channels + +This method is in use when OML uses +'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' (0x90) for the given time-slot. + +The activation of PDCH is performed by using the regular 'RSL CHANNEL ACTIVATE' +procedure according to <>, with these modifications: + +* The 'C-bits' part of the 'Channel Number' IE take the non-standard binary + value 11000 (C5 thru C1 as seen in 3GPP TS 08.58 § 9.3.1). +* The 'A-bits' part of the 'Activation Type' IE take the non-standard binary + value 1111, with an additional fourth bit (add A4 to A3 thru A1 as seen in + 3GPP TS 08.58 § 9.3.3; all remaining reserved bits as well as the 'R' bit are + coded as zero). +* The normally mandatory 'Channel Mode' IE is omitted; none of the optional IEs + are included. + +Hence the message consists of exactly these IEs: + +.PDCH type _Channel Activation_ message IEs +[options="header",cols="10%,30%,60%"] +|=== +| TS 08.58 § | IE Name | Handling +| 9.1 | Message discriminator | Dedicated Channel Management +| 9.2 | Message type | CHANnel ACTIVation +| 9.3.1 | Channel number | 'C-bits' 11000, plus TS bits as usual +| 9.3.3 | Activation type | 'A-bits' 1111 +|=== + +===== Osmocom Style Dynamic Switchover Example + +.Example for dynamic channel switchover, for Osmocom style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_osmocom_style.msc[] +---- + === Message Formats and Contents @@ -860,76 +931,3 @@ illustrated by the differences of <> and <>. Since the secondary TRX has no BCCH, it does not (need to) receive any 'RSL BCCH INFORMATION' messages from the BSC. -[[rsl-dynamic-channels]] -=== Dynamic Channel Combinations - -In the classic data model established by ETSI/3GPP for A-bis, each -timeslot (channel) is configured using a static channel combination by -means of A-bis OML. Particularly in presence of GPRS services, this -is very unflexible and leads to inefficient use of air interface -resources. - -As such, several methods have been implemented to overcome this -limitation. The fundamental operation can be outlined like this: - -* Configuration of a particular _dynamic_ channel combination via OML -* activation of TCH works like on a classic TCH channel combination -* activation of PDCH requires some specific PDCH activation procedure - -There are two variants implemented in the OsmoBTS A-bis dialect: - -==== IPA Style Dynamic Channels - -This method is used when OML uses 'NM_CHANC_IPAC_TCHFull_PDCH' (0x80) -as channel combination for the given time-slot. - -'IPA style' refers to 'ip.access' compatible PDCH activation and deactivation. - -When the IPA style dynamic channel combination _TCH/F or PDCH_ -is set, the non-standard 'PDCH ACTIVATE' (<>) and 'PDCH -DEACTIVATE' (<>) procedures are used for switching an idle -channel into PDCH mode and back into idle mode. - -.Example for dynamic channel switchover, for IPA style dynamic timeslots -["mscgen"] ----- -include::dyn_ts_ipa_style.msc[] ----- - -[[OSMOCOM_DYN_TS]] -==== Osmocom Style Dynamic Channels - -This method is in use when OML uses -'NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH' (0x90) for the given time-slot. - -The activation of PDCH is performed by using the regular 'RSL CHANNEL ACTIVATE' -procedure according to <>, with these modifications: - -* The 'C-bits' part of the 'Channel Number' IE take the non-standard binary - value 11000 (C5 thru C1 as seen in 3GPP TS 08.58 § 9.3.1). -* The 'A-bits' part of the 'Activation Type' IE take the non-standard binary - value 1111, with an additional fourth bit (add A4 to A3 thru A1 as seen in - 3GPP TS 08.58 § 9.3.3; all remaining reserved bits as well as the 'R' bit are - coded as zero). -* The normally mandatory 'Channel Mode' IE is omitted; none of the optional IEs - are included. - -Hence the message consists of exactly these IEs: - -.PDCH type _Channel Activation_ message IEs -[options="header",cols="10%,30%,60%"] -|=== -| TS 08.58 § | IE Name | Handling -| 9.1 | Message discriminator | Dedicated Channel Management -| 9.2 | Message type | CHANnel ACTIVation -| 9.3.1 | Channel number | 'C-bits' 11000, plus TS bits as usual -| 9.3.3 | Activation type | 'A-bits' 1111 -|=== - -.Example for dynamic channel switchover, for Osmocom style dynamic timeslots -["mscgen"] ----- -include::dyn_ts_osmocom_style.msc[] ----- - - -- cgit v1.2.3 From a4683812ed8acd071219b162b44adde9aaa9fda9 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 06:47:22 +0200 Subject: fix 'make clean': shell glob, ignore failure Unfortunately a glob like osmo-x__*.{svg,png} doesn't work, so have the suffixes in separate globs. Add dashes to indicate that failure should be ignored. Change-Id: I6bc4d9ea72b43a573acbc860c23397f748de2c7b --- doc/manuals/Makefile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index f2c873a6..73430fc6 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -22,9 +22,13 @@ include $(TOPDIR)/build/Makefile.inc osmobts-usermanual.pdf: chapters/*.adoc clean: - rm -rf $(cleanfiles) - rm -rf osmobts-abis__*.{svg,png,check} - rm -rf osmobts-usermanual__*.{svg,png,check} + -rm -rf $(cleanfiles) + -rm osmobts-abis__*.png + -rm osmobts-abis__*.svg + -rm osmobts-usermanual__*.png + -rm osmobts-usermanual__*.svg + -rm osmobts-abis*.check + -rm osmobts-usermanual*.check gen-bts-vty-docbook: FORCE $(call command,xsltproc -o generated/combined1.xml \ -- cgit v1.2.3 From 2c160a5dc45f6235a3780a52157031784dce7e99 Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Tue, 25 Oct 2016 03:53:16 +0200 Subject: OsmoBTS: generate osmobts-abis.pdf again broken by 05f5adbe837f2cbfb9301cdb8c9b454ca0bfc825 Change-Id: I7ca18e3d7fa3a5a6eac0590b919b4c664f73671c --- doc/manuals/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 73430fc6..1e70eac8 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -14,7 +14,7 @@ docbooktotypes = pdf # htmlcss = TOPDIR := .. -ASCIIDOCS := osmobts-usermanual +ASCIIDOCS := osmobts-usermanual osmobts-abis include $(TOPDIR)/build/Makefile.asciidoc.inc include $(TOPDIR)/build/Makefile.inc -- cgit v1.2.3 From c1ac0d8b6ab407d985fc2c4b16ca5866314932bc Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 17 Oct 2016 04:47:55 +0200 Subject: OsmoBTS/abis/rsl: split dyn TS ladder diagrams to fit on page Split both of the lengthy mscgen generated ladder diagrams in two so that the diagrams are split over two pages and don't bleed into the page footer. Change-Id: If90250123a85cd275f07c69ee64c6e10a7269f06 --- doc/manuals/abis/dyn_ts_ipa_style.msc | 39 ------------------- doc/manuals/abis/dyn_ts_ipa_style1.msc | 23 ++++++++++++ doc/manuals/abis/dyn_ts_ipa_style2.msc | 22 +++++++++++ doc/manuals/abis/dyn_ts_osmocom_style.msc | 60 ------------------------------ doc/manuals/abis/dyn_ts_osmocom_style1.msc | 34 +++++++++++++++++ doc/manuals/abis/dyn_ts_osmocom_style2.msc | 31 +++++++++++++++ doc/manuals/abis/rsl.adoc | 19 ++++++++-- 7 files changed, 125 insertions(+), 103 deletions(-) delete mode 100644 doc/manuals/abis/dyn_ts_ipa_style.msc create mode 100644 doc/manuals/abis/dyn_ts_ipa_style1.msc create mode 100644 doc/manuals/abis/dyn_ts_ipa_style2.msc delete mode 100644 doc/manuals/abis/dyn_ts_osmocom_style.msc create mode 100644 doc/manuals/abis/dyn_ts_osmocom_style1.msc create mode 100644 doc/manuals/abis/dyn_ts_osmocom_style2.msc diff --git a/doc/manuals/abis/dyn_ts_ipa_style.msc b/doc/manuals/abis/dyn_ts_ipa_style.msc deleted file mode 100644 index ae7c0d0e..00000000 --- a/doc/manuals/abis/dyn_ts_ipa_style.msc +++ /dev/null @@ -1,39 +0,0 @@ -msc { - hscale = "1.2"; - phy,bts,pcu,bsc; - - phy box bsc [ label = "PDCH Deactivation" ]; - bsc => bts [ label = "IPAC PDCH DEACT" ]; - --- [ label = "Disconnect PDTCH" ]; - bts => pcu [ label = "info ind (Deactivate)" ]; - pcu => bts [ label = "chan Deactivate request" ]; - bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; - phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; - bts => phy [ label = "L1 chan Disconnect PDTCH" ]; - phy -> bts [ label = "L1 chan Disconnect confirm" ]; - --- [ label = "Connect TCH" ]; - bts => phy [ label = "L1 chan Connect TCH" ]; - phy -> bts [ label = "L1 chan Connect confirm" ]; - bts => bsc [ label = "IPAC PDCH DEACT ACK" ]; - - phy box bsc [ label = "Now BSC may use TCH (example)" ]; - bsc => bts [ label = "Activate TCH/F" ]; - bts => phy [ label = "L1 chan Activate SAPIs" ]; - --- [ label = "Voice call..." ]; - bsc => bts [ label = "Deactivate TCH/F" ]; - bts => phy [ label = "L1 chan Deactivate SAPIs" ]; - - phy box bsc [ label = "PDCH Activation" ]; - bsc => bts [ label = "IPAC PDCH ACT" ]; - --- [ label = "Disconnect TCH" ]; - bts => phy [ label = "L1 chan Disconnect TCH" ]; - phy -> bts [ label = "L1 chan Disconnect confirm" ]; - --- [ label = "Connect PDTCH" ]; - bts => phy [ label = "L1 chan Connect PDTCH" ]; - phy -> bts [ label = "L1 chan Connect confirm" ]; - bts => pcu [ label = "info ind (Activate)" ]; - pcu => bts [ label = "chan Activate request" ]; - bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; - phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; - bts => bsc [ label = "IPAC PDCH ACT ACK" ]; -} diff --git a/doc/manuals/abis/dyn_ts_ipa_style1.msc b/doc/manuals/abis/dyn_ts_ipa_style1.msc new file mode 100644 index 00000000..ee917956 --- /dev/null +++ b/doc/manuals/abis/dyn_ts_ipa_style1.msc @@ -0,0 +1,23 @@ +msc { + hscale = "1.2"; + phy,bts,pcu,bsc; + + phy box bsc [ label = "PDCH Deactivation" ]; + bsc => bts [ label = "IPAC PDCH DEACT" ]; + --- [ label = "Disconnect PDTCH" ]; + bts => pcu [ label = "info ind (Deactivate)" ]; + pcu => bts [ label = "chan Deactivate request" ]; + bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; + bts => phy [ label = "L1 chan Disconnect PDTCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + --- [ label = "Connect TCH" ]; + bts => phy [ label = "L1 chan Connect TCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + bts => bsc [ label = "IPAC PDCH DEACT ACK" ]; + + phy box bsc [ label = "Now BSC may use TCH (example)" ]; + bsc => bts [ label = "Activate TCH/F" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + --- [ label = "Voice call..." ]; +} diff --git a/doc/manuals/abis/dyn_ts_ipa_style2.msc b/doc/manuals/abis/dyn_ts_ipa_style2.msc new file mode 100644 index 00000000..c2877895 --- /dev/null +++ b/doc/manuals/abis/dyn_ts_ipa_style2.msc @@ -0,0 +1,22 @@ +msc { + hscale = "1.2"; + phy,bts,pcu,bsc; + + --- [ label = "...Voice call ends" ]; + bsc => bts [ label = "Deactivate TCH/F" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + + phy box bsc [ label = "PDCH Activation" ]; + bsc => bts [ label = "IPAC PDCH ACT" ]; + --- [ label = "Disconnect TCH" ]; + bts => phy [ label = "L1 chan Disconnect TCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + --- [ label = "Connect PDTCH" ]; + bts => phy [ label = "L1 chan Connect PDTCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + bts => pcu [ label = "info ind (Activate)" ]; + pcu => bts [ label = "chan Activate request" ]; + bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; + bts => bsc [ label = "IPAC PDCH ACT ACK" ]; +} diff --git a/doc/manuals/abis/dyn_ts_osmocom_style.msc b/doc/manuals/abis/dyn_ts_osmocom_style.msc deleted file mode 100644 index c9296482..00000000 --- a/doc/manuals/abis/dyn_ts_osmocom_style.msc +++ /dev/null @@ -1,60 +0,0 @@ -msc { - hscale = "1.5"; - phy,bts,pcu,bsc; - - bts => bsc [ label = "RSL Chan Requested" ]; - phy box bsc [ label = "TS is in PDCH mode, deactivate" ]; - bsc => bts [ label = "RSL RF Channel Release (PDCH)" ]; - bts => pcu [ label = "Info Ind (Deactivate)" ]; - pcu => bts [ label = "Chan Deactivate request" ]; - bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; - phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; - bts -> bsc [ label = "RSL RF Channel Release Ack (PDCH)" ]; - - phy box bsc [ label = "Activate TCH/H" ]; - bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; - --- [ label = "BTS notices: chan still connected as PDTCH, reconnect" ]; - bts => phy [ label = "L1 chan Disconnect PDTCH" ]; - phy -> bts [ label = "L1 chan Disconnect confirm" ]; - bts => phy [ label = "L1 chan Connect TCH/H" ]; - phy -> bts [ label = "L1 chan Connect confirm" ]; - --- [ label = "chan reconnect as TCH/H complete" ]; - bts => phy [ label = "L1 chan Activate SAPIs" ]; - bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; - --- [ label = "Voice call 1 commences..." ]; - - phy box bsc [ label = "A second voice call is requested" ]; - bts => bsc [ label = "RSL Chan Requested" ]; - phy box bsc [ label = "BSC finds second slot on dynamic TS in TCH/H mode" ]; - bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; - bts => phy [ label = "L1 chan Activate SAPIs" ]; - bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; - --- [ label = "Voice call 2 commences..." ]; - - --- [ label = "...Voice call 1 ends" ]; - bts => bsc [ label = "Release Ind" ]; - bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; - bts => phy [ label = "L1 chan Deactivate SAPIs" ]; - bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; - --- [ label = "BSC notices: one chan still in use"]; - - --- [ label = "...Voice call 2 ends" ]; - bts => bsc [ label = "Release Ind" ]; - bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; - bts => phy [ label = "L1 chan Deactivate SAPIs" ]; - bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; - - phy box bsc [ label = "If all channels on TS are released, PDCH Activation" ]; - bsc => bts [ label = "RSL Channel Activation (PDCH)" ]; - bts -> bsc [ label = "RSL Channel Activation Ack (PDCH) (unconditionally)" ]; - --- [ label = "BTS notices: chan still connected as TCH/H, reconnect" ]; - bts => phy [ label = "L1 chan Disconnect TCH/H" ]; - phy -> bts [ label = "L1 chan Disconnect confirm" ]; - bts => phy [ label = "L1 chan Connect PDTCH" ]; - phy -> bts [ label = "L1 chan Connect confirm" ]; - --- [ label = "chan reconnect as PDTCH complete" ]; - bts => pcu [ label = "Info Ind (Activate)" ]; - pcu => bts [ label = "chan Activate request" ]; - bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; - phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; -} diff --git a/doc/manuals/abis/dyn_ts_osmocom_style1.msc b/doc/manuals/abis/dyn_ts_osmocom_style1.msc new file mode 100644 index 00000000..f02f6f60 --- /dev/null +++ b/doc/manuals/abis/dyn_ts_osmocom_style1.msc @@ -0,0 +1,34 @@ +msc { + hscale = "1.5"; + phy,bts,pcu,bsc; + + bts => bsc [ label = "RSL Chan Requested" ]; + phy box bsc [ label = "TS is in PDCH mode, deactivate" ]; + bsc => bts [ label = "RSL RF Channel Release (PDCH)" ]; + bts => pcu [ label = "Info Ind (Deactivate)" ]; + pcu => bts [ label = "Chan Deactivate request" ]; + bts => phy [ label = "L1 chan Deactivate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Deactivate SAPIs confirm" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (PDCH)" ]; + + phy box bsc [ label = "Activate TCH/H" ]; + bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; + --- [ label = "BTS notices: chan still connected as PDTCH, reconnect" ]; + bts => phy [ label = "L1 chan Disconnect PDTCH" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + bts => phy [ label = "L1 chan Connect TCH/H" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + --- [ label = "chan reconnect as TCH/H complete" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; + --- [ label = "Voice call 1 commences..." ]; + + phy box bsc [ label = "A second voice call is requested" ]; + bts => bsc [ label = "RSL Chan Requested" ]; + phy box bsc [ label = "BSC finds second slot on dynamic TS in TCH/H mode" ]; + bsc => bts [ label = "RSL Channel Activation (TCH/H)" ]; + bts => phy [ label = "L1 chan Activate SAPIs" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (TCH/H)" ]; + --- [ label = "Voice call 2 commences..." ]; + +} diff --git a/doc/manuals/abis/dyn_ts_osmocom_style2.msc b/doc/manuals/abis/dyn_ts_osmocom_style2.msc new file mode 100644 index 00000000..9ea65b69 --- /dev/null +++ b/doc/manuals/abis/dyn_ts_osmocom_style2.msc @@ -0,0 +1,31 @@ +msc { + hscale = "1.5"; + phy,bts,pcu,bsc; + + --- [ label = "...Voice call 1 ends" ]; + bts => bsc [ label = "Release Ind" ]; + bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; + --- [ label = "BSC notices: one chan still in use"]; + + --- [ label = "...Voice call 2 ends" ]; + bts => bsc [ label = "Release Ind" ]; + bsc => bts [ label = "RSL RF Channel Release (TCH/H)" ]; + bts => phy [ label = "L1 chan Deactivate SAPIs" ]; + bts -> bsc [ label = "RSL RF Channel Release Ack (TCH/H)" ]; + + phy box bsc [ label = "If all channels on TS are released, PDCH Activation" ]; + bsc => bts [ label = "RSL Channel Activation (PDCH)" ]; + bts -> bsc [ label = "RSL Channel Activation Ack (PDCH) (unconditionally)" ]; + --- [ label = "BTS notices: chan still connected as TCH/H, reconnect" ]; + bts => phy [ label = "L1 chan Disconnect TCH/H" ]; + phy -> bts [ label = "L1 chan Disconnect confirm" ]; + bts => phy [ label = "L1 chan Connect PDTCH" ]; + phy -> bts [ label = "L1 chan Connect confirm" ]; + --- [ label = "chan reconnect as PDTCH complete" ]; + bts => pcu [ label = "Info Ind (Activate)" ]; + pcu => bts [ label = "chan Activate request" ]; + bts => phy [ label = "L1 chan Activate PDTCH SAPIs" ]; + phy -> bts [ label = "L1 chan Activate SAPIs confirm" ]; +} diff --git a/doc/manuals/abis/rsl.adoc b/doc/manuals/abis/rsl.adoc index ed8676ee..33ae26d6 100644 --- a/doc/manuals/abis/rsl.adoc +++ b/doc/manuals/abis/rsl.adoc @@ -410,10 +410,16 @@ See <>, <>, <> ===== IPA Style Dynamic Switchover Example -.Example for dynamic channel switchover, for IPA style dynamic timeslots +.Part 1: example for dynamic channel switchover, for IPA style dynamic timeslots ["mscgen"] ---- -include::dyn_ts_ipa_style.msc[] +include::dyn_ts_ipa_style1.msc[] +---- + +.Part 2: example for dynamic channel switchover, for IPA style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_ipa_style2.msc[] ---- @@ -449,12 +455,17 @@ Hence the message consists of exactly these IEs: ===== Osmocom Style Dynamic Switchover Example -.Example for dynamic channel switchover, for Osmocom style dynamic timeslots +.Part 1: example for dynamic channel switchover, for Osmocom style dynamic timeslots ["mscgen"] ---- -include::dyn_ts_osmocom_style.msc[] +include::dyn_ts_osmocom_style1.msc[] ---- +.Part 2: example for dynamic channel switchover, for Osmocom style dynamic timeslots +["mscgen"] +---- +include::dyn_ts_osmocom_style2.msc[] +---- === Message Formats and Contents -- cgit v1.2.3 From 8be01aac1e2ad2549ee76b51fa9ca74b5d3d5ec8 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 3 Nov 2016 13:14:49 +0100 Subject: fix build: abis: re-add dependencies Below commit accidentally removed osmobts-abis.pdf from the Makefile entirely. The pdf was re-added, but the dependencies are still missing, so that osmobts-abis.pdf is not rebuilt when abis/* is newer. Fix that. Culprit: 05f5adbe837f2cbfb9301cdb8c9b454ca0bfc825 "OsmoBTS: add vty reference documentation" Half-fix: 707827196f0734eefa74ce0c35c2ab2fe754cc4c "OsmoBTS: generate osmobts-abis.pdf again" Change-Id: Id2ee8177cfb8eb58409d164bdd994ef5e86ad82b --- doc/manuals/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 1e70eac8..eadb940e 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -19,6 +19,7 @@ ASCIIDOCS := osmobts-usermanual osmobts-abis include $(TOPDIR)/build/Makefile.asciidoc.inc include $(TOPDIR)/build/Makefile.inc +osmobts-abis.pdf: abis/*.adoc abis/*.msc osmobts-usermanual.pdf: chapters/*.adoc clean: -- cgit v1.2.3 From 529c1f04cb6004e832c28d7d6dfbd3df0b58d323 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 20 Aug 2016 19:11:49 +0200 Subject: Documentation on AMR RTP in case of DTX Change-Id: I394f405b441c1eb000759151bd8350d5b3a84a0b --- doc/manuals/abis/rtp-amr.adoc | 858 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 858 insertions(+) create mode 100644 doc/manuals/abis/rtp-amr.adoc diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc new file mode 100644 index 00000000..800545b9 --- /dev/null +++ b/doc/manuals/abis/rtp-amr.adoc @@ -0,0 +1,858 @@ += AMR-RTP in Combination with DTX + +The purpose of this document is to describe the sometimes quite +intricate interactions between a MS, the BTS-PHY and the BTS softare +in case of AMR (Adaptive Multi Rate) codec and DTX (Discontinuous +Transmission). + +It is written with the OsmoBTS implementation and the Nutaq GSM PHY +API in mind, but should more or less be applicable to any GSM BTS +PHY or any BTS software implementation, assuming it uses RTP on the +back-haul towards the MGW. + +== Full-Rate (TCH/AFS) + +=== TCH/AFS Uplink (MS to Network) + +==== TCH/AFS Uplink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: Every four radio bursts, the BTS-PHY has one AMR frame +ready and hands it up to the BTS process, which creates an RTP AMR +frame from it and sends that to the MGW. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; +} +---- + +==== TCH/AFS Uplink: End of Voice; Start of Silence + +When the voice encoder in the MS detects no voice activity anymore, it +signals towards the MS-PHY that SID_FIRST shall be transmitted. + +The BTS-PHY reports the following primitives to the BTS after all four +related bursts have been received: + +The BTS sends an RTP frame with AMR Frame Type SID, in which the STI +is set to indicate a SID_FIRST message. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N-1, sub-block 1 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N-1, sub-block 2 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N-1, sub-block 3 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N-1, sub-block 4 of SID_FIRST)", id="ULSF2"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU2"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + +} +---- + +ULSF2:: The sub-blocks 5-8 of SID_FIRST are not transmitted, as all +information bits are contained in sub-blocks 1-4 only. + +ULSU2:: There must be exactly two suppressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. 60ms between SID_FIRST and +SID_UPDATE. + +==== TCH/AFS Uplink: During Silence + +While the period of silence is ongoing, the MS pauses all +transmissions, except the periodic scheduling of SID_UPDATE every 8 +voice frames (160ms). + +NOTE:: Silence can also be interrupted at any time by ONSET, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[afs-ul-onset]] +==== TCH/AFS Uplink: End of Silence; Start of Voice + +Once the voice encoder in the MS detects voice activity again, it +asks its transmitter to perform transmission of SID_ONSET, which is a +special frame whose information is encoded only in sub-blocks 3+4, and +sub-blocks 1+2 are discarded before transmission. + +A set of four radio bursts is sent, containing + +* the only four transmitted sub-blocks of the SID_ONSET frame +* all four sub-blocks of the first voice codec frame +* the first two blocks of the second voice codec frame + +The BTS-PHY informs the BTS using two primitives: + +* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of + SID_ONSET, including the Channel Mode Indication (irrespective of + CMI Phase) +* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame + +The BTS transmits an RTP frame with AMR payload of the corresponding +speech frame type, and sets the RTP MARKER bit to indicate the ONSET +condition. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms => phy [label="L1 burst (sub-block 5 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; + ms => phy [label="L1 burst (sub-block 6 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 7 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 8 of SID_ONSET + sub-block 4 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1), MARKER=1"]; + ...; +} +---- + +ULSO2:: sub-blocks 1..4 of SID_ONSET are never transmitted as all +infomration is contained in blocks 5..8. + +=== TCH/AFS Downlink (Network to MS) + +[[afs-dl-talk]] +==== TCH/AFS Downlink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: an RTP frame arrives every 20ms. + +The PHY sends a PH-RTS.ind in similar intervals, to which the BTS +responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. + +The BTS-PHY then encodes and interleaves the codec frame into eight +sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued +every four bursts. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AFS Downlink: End of Voice; Start of Silence + +When the BTS receives the first RTP frame with Frame Type SID, it will +generate a SID_FIRST AMR frame. The AMR frame is interleaved in a way +that all information is contained in the first four sub-blocks, with +the latter four sub-blocks being dropped and not transmitted. + +Three codec frames (60ms) later, the BTS needs to transmit a +SID_UPDATE AMR frame, which should consist of comfort noise parameters +received in either the first AMR SID frame, or a subsequent AMR SID +frame received meanwhile. + +In between SID_FIRST and SID_UPDATE, and after the SID_UPDATE, the BTS +sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to +cease transmission in those periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID First"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)", id="DLSF2"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="DLSU2"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; +} +---- + +DLSF2:: sub-frames 5..8 of SID_FIRST are not transmitted, as all +information is contained in sub-frames 1..4 + +DLSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) +after the SID_FIRST, resulting in two suppressed voice frame periods of +empty bursts in-between. + +==== TCH/AFS Downlink: During Silence + +During Silence periods, the BTS may at any time receive RTP AMR SID +frames, and keep a copy of the last received frame around. + +Every eight voice frames (160ms), the BTS shall respond to the +PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with +SID_UPDATE frame. + +At all other times, the BTS sends PH-EMPTY-FRAME.req to any received +PH-RTS.ind, causing the BTS-PHY to cease transmission in those +periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[afs-dl-onset]] +==== TCH/AFS Downlink: End of Silence; Start of Voice + +Once the BTS receives a non-SID AMR RTP frame (which should also have +the MARKER bit set to 1, but let's not take that for granted), the +contained AMR voice data is passed to the BTS-PHY in the next +PH-DATA.req (GsmL1_TchPlType_Amr_Onset). + +From that point onwards, regular transmission resumes, see +<> + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset", id="DLOS2"]; + ms <= phy [label="L1 burst (sub-block 5 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 6 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 7 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 8 of SID_ONSET + sub-block 4 of speech frame N)"]; + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +DLOS1:: The SID_ONSET and the first voice frame are sent in the same +block of four radio busts. Hence, the BTS must be able ot to send +actual codec payload along with the GsmL1_TchPlType_Amr_Onset +primitive. + +== Half-Rate (TCH/AHS) + +=== TCH/AHS Uplink (MS to Network) + +==== TCH/AHS Uplink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: Every two radio bursts, the BTS-PHY has one AMR frame +ready and hands it up to the BTS process, which creates an RTP AMR +frame from it and sends that to the MGW. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; +} +---- + +==== TCH AHS Uplink: End of Voice; Start of Silence + +When the voice encoder in the MS detects no voice activity anymore, it +signals towards the MS-PHY that SID_FIRST_P1 and SID_FIRST_P2 shall be +transmitted. + +The BTS-PHY reports the following primitives to the BTS after all four +related bursts have been received: + +* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1 +* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 + +The BTS sends an RTP frame with AMR Frame Type SID, in which the STI +is set to indicate a SID_FIRST message. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N-1, sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N-1, sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1", id="ULSF1"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU1"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + +} +---- + +ULSF1:: There are two separate indications for P1 and P2, despite both +P1 and P2 being multiplexed together in one batch of four bursts. Not +sure why they result in two separate PH-DATA.ind. Based on what we +know: If the MS sends P1 and P2, the PHY should receive SidFirstP1 and +SidFirstP2 indications immediately after each other, both for the same +GSM frame number. + +ULSU1:: There must be exactly two suppressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. 60ms between SID_FIRST and +SID_UPDATE. + +==== TCH/AFS Uplink: During Silence + +While the period of silence is ongoing, the MS pauses all +transmissions, except the periodic scheduling of SID_UPDATE every +8 voice frames (160ms). + +NOTE:: Silence can also be interrupted at any time by ONSET, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[ahs-ul-onset]] +==== TCH/AHS Uplink: End of Silence; Start of Voice + +Once the voice encoder in the MS detects voice activity again, it +asks its transmitter to perform transmission of SID_ONSET, which is a +special frame which has information encoded only in sub-blocks 3+4, and +sub-blocks 1+2 are discarded before transmission. + +A set of four radio bursts is sent, containing + +* the only two transmitted sub-blocks of the SID_ONSET frame +* all four sub-blocks of the first voice codec frame +* the first two blocks of the second voice codec frame + +The BTS-PHY informs the BTS using two primitives: + +* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of + SID_ONSET, including the Channel Mode Indication (irrespective of + CMI Phase) +* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame + +The BTS transmits a RTP frame with AMR payload of the corresponding +speech frame type, and sets the RTP MARKER bit to indicate the ONSET +condition. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + ...; +} +---- + +==== TCH/AHS Uplink: Inhibited SID_FIRST + +In case voice activity is detected again while the SID_FIRST_P1 +transmission is ongoing or completed, but the SID_FIRST_P2 has not +been transmitted yet, SID_FIRST can be inhibited by means of a +SID_FIRST_INH frame. This allows the first voice frame to be +transmitted with minimal delay, compared to first completing +the regular SID_FIRTS_P2 and SID_ONSET procedure. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ms .. mgw [label="End of talk-spurt with inhibited SID_FIRST"]; + + ms => phy [label="L1 burst (sub-block 3 of last speech frame N + sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 4 of last speech frame N + sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (block 1 of SID_FIRST_INH and sub-block 1 of speech frame N+1", id="SFI1"]; + ms => phy [label="L1 burst (block 2 of SID_FIRST_INH and sub-block 2 of speech frame N+1"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+2 + sub-block 1 of speech frame N+3)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+2 + sub-block 2 of speech frame N+3)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidInh", id="SFI2"]; + bts => bts [label="store CMI from SID_FIRST_INH"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; +} +---- + +==== TCH/AHS Uplink: Inhibited SID_UPDATE + +In case voice activity is detected again while the SID_UPDATE +transmission of the first two sub-blocks is ongoing or completed, but +the second two sub-blocks have not been transmitted yet, SID_UPDATE can +be inhibited by means of a SID_UPDATE_INH frame. This allows the +first voice frame to be transmitted with minimal delay, compared to +first completing the regular SID_UPDATE and SID_ONSET procedure. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + ms .. mgw [label="pre-empted SID Update (during silence period)"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of SID_UPD_INH + sub-block 1 of speech frame N-1)", id="SFU1"]; + ms => phy [label="L1 burst (sub-block 4 of SID_UPD_INH + sub-block 2 of speech frame N-1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidUpdateInH", id="SFU2"]; + bts => bts [label="lchan_set_marker() and store CMI from SID_UPD_INH"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1), MARKER=1"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; +} +---- + +=== TCH/AHS Downlink (Network to MS) + +[[ahs-dl-talk]] +==== TCH/AHS Downlink: During Talk-Spurt + +During a talk-spurt, the system behaves identically to a system without +DTX enabled: an RTP frame arrives every 20ms. + +The PHY sends a PH-RTS.ind in similar intervals, to which the BTS +responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. + +The BTS-PHY then encodes and interleaves the codec frame into four +sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued +every two bursts. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: End of Voice; Start of Silence + + +When the BTS receives the first RTP frame with Frame Type SID, it will +first issue a GsmL1_TchPlType_Amr_SidFirstP1 primitive towards the +BTS-PHY, followed by a GsmL1_TchPlType_Amr_SidFirstP2 primitive. + +The SID_FIRST_P2 is interleaved in a way that all information is +contained in the first two sub-blocks, with the latter two +sub-blocks being dropped and not transmitted. + +Three codec frames (60ms) later, the BTS needs to transmit a +SID_UPDATE AMR frame, which should consist of comfort noise +parameters received in either the first RTP AMR SID frame, or a +subsequent RTP AMR SID frame received meanwhile. + +In between SID_FIRST_P2 and SID_UPDATE, and after the SID_UPDATE, the +BTS sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to +cease transmission in those periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH +downlink frame). See Section <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="ULSU2"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-RTS.ind (TCH)", id="RTDSU1"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; +} +---- + +ULSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) +after the SID_FIRST, resulting in two suppressed voice frame periods of +empty bursts in between. + +RTDSU1:: Not sure whether BTS-PHY actually sends PH-RTS.ind during the +"double-length" SID-UPDATE? + +==== TCH/AHS Downlink: During Silence + +During Silence periods, the BTS may at any time receive RTP AMR SID +frames and keep a copy of the last received frame around. + +Every eight voice frames (160ms), the BTS shall respond to the +PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with +SID_UPDATE frame. + +At all other times, the BTS sends PH-EMPTY-FRAME.req to any received +PH-RTS.ind, causing the BTS-PHY to cease transmission in those +periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See Section <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-RTS.ind (TCH)", id="RTDSU2"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +RTDSU2:: Not sure whether BTS-PHY actually sends PH-RTS.ind during the +"double-length" SID-UPDATE? + +[[ahs-dl-onset]] +==== TCH/AHS Downlink: End of Silence; Start of Voice + +Once the BTS receives a non-SID AMR RTP frame (which should also have +the MARKER bit set to 1, but let’s not take that for granted), the +contained AMR voice data is passed to the BTS-PHY in the next +PH-DATA.req (GsmL1_TchPlType_Amr_Onset). + +From that point onwards, regular transmission resumes, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset", id="DLOS2"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_ONSET + sub-block 2 of speech frame N)"]; + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +DLOS2:: The SID_ONSET and the first voice frame are sent in the same +block of four radio bursts. Hence, the BTS must be able ot to send +actual codec payload along with the GsmL1_TchPlType_Amr_Onset +primitive. -- cgit v1.2.3 From d7f1457bedbedbf7bb88e8d316f311882200f407 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 3 Nov 2016 14:05:15 +0100 Subject: rtp-amr.adoc: TCH/AFS Uplink Add new chapter by Nutaq for Speech Frame Following a SID_FIRST frame Change-Id: Ib7cfb07525ea311d9dac051a6e139b0ae0549504 --- doc/manuals/abis/rtp-amr.adoc | 131 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 119 insertions(+), 12 deletions(-) diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc index 800545b9..12b5a9fd 100644 --- a/doc/manuals/abis/rtp-amr.adoc +++ b/doc/manuals/abis/rtp-amr.adoc @@ -167,28 +167,135 @@ msc { ...; --- [label="Once voice is active again"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms => phy [label="L1 burst (sub-block 5 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; - ms => phy [label="L1 burst (sub-block 6 of SID_ONSET + sub-block 2 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 7 of SID_ONSET + sub-block 3 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 8 of SID_ONSET + sub-block 4 of speech frame N)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1), MARKER=1"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; ...; } ---- ULSO2:: sub-blocks 1..4 of SID_ONSET are never transmitted as all -infomration is contained in blocks 5..8. +information is contained in blocks 5..8. + +==== TCH/AFS Uplink: Speech Frame Following a SID_FIRST frame + +The four last bursts of a SID_FIRST frame can be replaced by an ONSET frame in order to quickly resume speech. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Speech Frame Following a SID_FIRST"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + ...; +} +---- + +==== TCH/AFS Uplink: FACCH/F Frame During DTX Operation + +As mentioned in section A.5.1.2.1 of 3GPP TS 26.093 : + +* If the frame preceding the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then an ONSET frame shall be signalled to the CHE, followed by the FACCH frame(s). +* If the frame following the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then a SID_FIRST shall be signalled to the CHE. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/F Frame During DTX"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH frame)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH frame)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH frame)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH frame)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 5 of FACCH frame + sub-block 1 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 6 of FACCH frame + sub-block 2 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 7 of FACCH frame + sub-block 3 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 8 of FACCH frame + sub-block 4 of SID First frame)", id="Note"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind FACCH/F"]; + bts => mgw [label="FACCH/F"]; + + ms -x phy [label="Supressed L1 burst", id="ULSF2"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + ...; +} +---- + +ULSF2:: The sub-blocks 5-8 of SID_FIRST are not transmitted, as all +information bits are contained in sub-blocks 1-4 only + +Note:: It has been observed with some phones that the SID_FIRST is not sent following the FACCH/F +frame. If this case occures the No Data Frame and SID_UPDATE order resumes. === TCH/AFS Downlink (Network to MS) -- cgit v1.2.3 From d61b59bb18e237bbe61cd794465c25bff67bcd23 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 3 Nov 2016 14:08:30 +0100 Subject: rtp-amr.adoc: TCH/AFS Downlink: Inhibiting Add two new chapters contributed by Nutaq: * TCH/AFS Downlink: Inhibiting a SID_FIRST frame * TCH/AFS Downlink: FACCH/F During DTX Operation Change-Id: Ic39d035f9d17bd0634c2df78ae3359a5eb7dfd46 --- doc/manuals/abis/rtp-amr.adoc | 89 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc index 12b5a9fd..6716800b 100644 --- a/doc/manuals/abis/rtp-amr.adoc +++ b/doc/manuals/abis/rtp-amr.adoc @@ -495,10 +495,91 @@ msc { } ---- -DLOS1:: The SID_ONSET and the first voice frame are sent in the same -block of four radio busts. Hence, the BTS must be able ot to send -actual codec payload along with the GsmL1_TchPlType_Amr_Onset -primitive. +==== TCH/AFS Downlink: Inhibiting a SID_FIRST frame + +Here is the procedure to inhibit a SID_FIRST frame in order to quickly resume speech. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibiting a SID_FIRST frame"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; + } +---- + +==== TCH/AFS Downlink: FACCH/F During DTX Operation + +The following procedure must be observed if a FACCH/F frame must be transmitted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/F Frame During DTX"]; + + bts <= mgw [label="FACCH/F"]; + phy => bts [label="PH-RTS.ind (FACCH/F)"]; + phy => bts [label="PH-RTS.ind (TCH/F)"]; + phy <= bts [label="PH-DATA.req (FACCH/F)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset(TCH/F)", id="NOTE"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH/F)"]; + + phy => bts [label="PH-RTS.ind (FACCH)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 5 of FACCH/F + sub-block 1 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 6 of FACCH/F + sub-block 2 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 7 of FACCH/F + sub-block 3 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 8 of FACCH/F + sub-block 4 of SID_FIRST)"]; + + phy => bts [label="PH-RTS.ind (FACCH)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (TCH/F)"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; +} +---- + +NOTE:: The ONSET and the FACCH/F PH-DATA requests must both be sent to the PHY. == Half-Rate (TCH/AHS) -- cgit v1.2.3 From a9b521e2cb0ea7787e8e7c5f3e441fd39f528b97 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 3 Nov 2016 14:11:24 +0100 Subject: rtp-amr: TCH/AHS Uplink: FACCH/H During DTX New chapter contributed by Nutaq: * TCH/AHS Uplink: FACCH/H During DTX operation Change-Id: I4a9c58e02dcfeb388ff3a30ba321ea3cec325518 --- doc/manuals/abis/rtp-amr.adoc | 49 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc index 6716800b..fbd6b501 100644 --- a/doc/manuals/abis/rtp-amr.adoc +++ b/doc/manuals/abis/rtp-amr.adoc @@ -843,7 +843,54 @@ msc { ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; +} +---- + +==== TCH/AHS Uplink: FACCH/H During DTX operation + +The following procedure must be observed if a FACCH/H frame must be transmitted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + ms .. mgw [label="FACCH/H during DTX operation"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/H)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/H)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3+4 of FACCH/H)"]; + ms => phy [label="L1 burst (sub-block 5+6 of FACCH/H)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 7 of FACCH/H + sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 8 of FACCH/H + sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind FACCH/H"]; + bts => mgw [label="FACCH/H"]; + + ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1 + block 1 of SID_FIRST_P2)"]; + ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1 + block 2 of SID_FIRST_P2)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- -- cgit v1.2.3 From 932f6753d147ab584de92de682a442527303850f Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 3 Nov 2016 14:14:01 +0100 Subject: rtp-amr.adoc: New TCH/AHS downlink chapters Nutaq contributed the following chapters: * TCH/AHS Downlink: FACCH/H During DTX Operation * TCH/AHS Downlink: Inhibited SID_UPDATE * TCH/AHS Downlink: Inhibited SID_FIRST_P1 Change-Id: I55d8e9f98694b39514d1f31c517a80050103fdd6 --- doc/manuals/abis/rtp-amr.adoc | 111 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 4 deletions(-) diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc index fbd6b501..889a032c 100644 --- a/doc/manuals/abis/rtp-amr.adoc +++ b/doc/manuals/abis/rtp-amr.adoc @@ -1087,7 +1087,110 @@ msc { } ---- -DLOS2:: The SID_ONSET and the first voice frame are sent in the same -block of four radio bursts. Hence, the BTS must be able ot to send -actual codec payload along with the GsmL1_TchPlType_Amr_Onset -primitive. +==== TCH/AHS Downlink: Inhibited SID_FIRST_P1 + +The following procedure must be observed in case of a SID_FIRST must be inhibited. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibited SID_FIRST_P1"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstInh"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_FIRST_INH, sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_FIRST_INH, sub-block 2 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: Inhibited SID_UPDATE + +The following procedure must be observed in case of a SID_UPDATE must be inhibited. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibited SID_UPDATE"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidUpdateInh"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_UPDATE_INH, sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_UPDATE_INH, sub-block 2 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: FACCH/H During DTX Operation + +The following procedure must be observed in case of a FACCH/H frame must be inserted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/H During DTX Operation"]; + + bts <= mgw [label="FACCH/H"]; + phy => bts [label="PH-RTS.ind (FACCH/H)"]; + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req FACCH/H"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET, sub-block 1 of FACCH/H frame)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET, sub-block 2 of FACCH/H frame)"]; + + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 3+4 of FACCH/H frame)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of FACCH/H frame)"]; + + phy => bts [label="PH-RTS.ind (FACCH/H)"]; + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/H)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 7 of FACCH/H frame + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 8 of FACCH/H frame + sub-block 2 of SID_FIRST_P1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; +} +---- -- cgit v1.2.3 From dbb4c0389eccf68ad0a1d3f08f81c1fc07bdab1a Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 3 Nov 2016 14:21:03 +0100 Subject: rtp-amr.adoc: Fixes to Message Sequence Charts Nutaq added these clarifications/extensions/fixes tothe message sequence charts. Change-Id: Ic699bda828947ff616c3d80783026e21d853f962 --- doc/manuals/abis/rtp-amr.adoc | 259 ++++++++++++++++++++++++++++++------------ 1 file changed, 188 insertions(+), 71 deletions(-) diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc index 889a032c..f6013036 100644 --- a/doc/manuals/abis/rtp-amr.adoc +++ b/doc/manuals/abis/rtp-amr.adoc @@ -65,11 +65,11 @@ msc { ...; --- [label="Last AMR Speech (end of talk-spurt) and SID"]; - ms => phy [label="L1 burst (sub-block 5 of speech frame N-1, sub-block 1 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N-1, sub-block 2 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N-1, sub-block 3 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N-1, sub-block 4 of SID_FIRST)", id="ULSF2"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)", id="ULSF2"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; ms -x phy [label="Suppressed L1 burst"]; @@ -79,28 +79,36 @@ msc { phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU2"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- -ULSF2:: The sub-blocks 5-8 of SID_FIRST are not transmitted, as all -information bits are contained in sub-blocks 1-4 only. +ULSF2:: As per 3GPP TS 05.03 section 3.9.2.4 The last 4 bursts shall not be transmitted unless +the SID_FIRST frame is immediately followed by a speech frame. It has been observed that some phone +does not transmit the last 4 bursts even if it is not followed by a speech frame. -ULSU2:: There must be exactly two suppressed voice frames between the -SID_FIRST and the SID_UPDATE, i.e. 60ms between SID_FIRST and +ULSU2:: There must be exactly two supressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and SID_UPDATE. ==== TCH/AFS Uplink: During Silence @@ -125,7 +133,70 @@ msc { ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- @@ -480,14 +551,15 @@ msc { bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset", id="DLOS2"]; - ms <= phy [label="L1 burst (sub-block 5 of SID_ONSET + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 6 of SID_ONSET + sub-block 2 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 7 of SID_ONSET + sub-block 3 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 8 of SID_ONSET + sub-block 4 of speech frame N)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; @@ -603,10 +675,14 @@ msc { ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-2)"]; bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; } @@ -636,43 +712,44 @@ msc { ...; --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; - ms => phy [label="L1 burst (sub-block 3 of speech frame N-1, sub-block 1 of SID_FIRST_P1)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N-1, sub-block 2 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 3 of speech frame N, sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N, sub-block 2 of SID_FIRST_P1)"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1", id="ULSF1"]; bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU1"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2", id="NOTE"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- -ULSF1:: There are two separate indications for P1 and P2, despite both -P1 and P2 being multiplexed together in one batch of four bursts. Not -sure why they result in two separate PH-DATA.ind. Based on what we -know: If the MS sends P1 and P2, the PHY should receive SidFirstP1 and -SidFirstP2 indications immediately after each other, both for the same -GSM frame number. +ULSF1:: Only SID_FIRST_P1 contains information so it must be the only one transmitted over RTP. + +NOTE:: It has been observed that not all phones transmit SID_FIRST_P2 so the PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 is not guaranteed to be sent to the BTS. -ULSU1:: There must be exactly two suppressed voice frames between the -SID_FIRST and the SID_UPDATE, i.e. 60ms between SID_FIRST and +ULSU1:: There must be exactly two supressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and SID_UPDATE. ==== TCH/AFS Uplink: During Silence @@ -695,10 +772,55 @@ msc { ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- @@ -822,26 +944,27 @@ msc { ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; ...; - ms .. mgw [label="pre-empted SID Update (during silence period)"]; + ms .. mgw [label="Inhibited SID Update (during silence period)"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_NA"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; bts -x mgw [label="Suppressed RTP frame"]; - ms => phy [label="L1 burst (sub-block 3 of SID_UPD_INH + sub-block 1 of speech frame N-1)", id="SFU1"]; - ms => phy [label="L1 burst (sub-block 4 of SID_UPD_INH + sub-block 2 of speech frame N-1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidUpdateInH", id="SFU2"]; - bts => bts [label="lchan_set_marker() and store CMI from SID_UPD_INH"]; + ms => phy [label="L1 burst (block 1 of SID_UPD_INH + sub-block 1 of speech frame N)", id="SFU1"]; + ms => phy [label="L1 burst (block 2 of SID_UPD_INH + sub-block 2 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; bts -x mgw [label="Suppressed RTP frame"]; - ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1), MARKER=1"]; - ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidUpdateInH", id="SFU2"]; + bts => bts [label="lchan_set_marker() and store CMI from SID_UPD_INH"]; phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; } @@ -925,7 +1048,7 @@ msc { ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; } @@ -985,11 +1108,12 @@ msc { ms x- phy [label="Suppressed burst"]; ms x- phy [label="Suppressed burst"]; + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; phy => bts [label="PH-RTS.ind (TCH)"]; bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="ULSU2"]; ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-RTS.ind (TCH)", id="RTDSU1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; phy <= bts [label="PH-EMPTY-FRAME.req"]; ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; @@ -1005,9 +1129,6 @@ ULSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) after the SID_FIRST, resulting in two suppressed voice frame periods of empty bursts in between. -RTDSU1:: Not sure whether BTS-PHY actually sends PH-RTS.ind during the -"double-length" SID-UPDATE? - ==== TCH/AHS Downlink: During Silence During Silence periods, the BTS may at any time receive RTP AMR SID @@ -1039,21 +1160,16 @@ msc { bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-RTS.ind (TCH)", id="RTDSU2"]; + phy => bts [label="PH-RTS.ind (TCH)"]; phy <= bts [label="PH-EMPTY-FRAME.req"]; ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; } ---- 8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM TDMA frames! -RTDSU2:: Not sure whether BTS-PHY actually sends PH-RTS.ind during the -"double-length" SID-UPDATE? - [[ahs-dl-onset]] ==== TCH/AHS Downlink: End of Silence; Start of Voice @@ -1076,12 +1192,13 @@ msc { bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset", id="DLOS2"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; ms <= phy [label="L1 burst (sub-block 3 of SID_ONSET + sub-block 1 of speech frame N)"]; ms <= phy [label="L1 burst (sub-block 4 of SID_ONSET + sub-block 2 of speech frame N)"]; bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; } -- cgit v1.2.3 From 5fd42960d665925d3e63d2aea00357b1857e2599 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 2 Nov 2016 17:19:31 +0100 Subject: Move RTP AMR doc to top level Add it to Makefile with proper docinfo so it's build automatically alongside with other documentation. Change-Id: Iacd7fadc003ce0f9ffd20aa5b36c7d598b04f882 --- doc/manuals/Makefile | 4 +- doc/manuals/abis/rtp-amr.adoc | 1313 --------------------------------------- doc/manuals/rtp-amr-docinfo.xml | 46 ++ doc/manuals/rtp-amr.adoc | 1313 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 1362 insertions(+), 1314 deletions(-) delete mode 100644 doc/manuals/abis/rtp-amr.adoc create mode 100644 doc/manuals/rtp-amr-docinfo.xml create mode 100644 doc/manuals/rtp-amr.adoc diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index eadb940e..58df0e32 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -14,7 +14,7 @@ docbooktotypes = pdf # htmlcss = TOPDIR := .. -ASCIIDOCS := osmobts-usermanual osmobts-abis +ASCIIDOCS := osmobts-usermanual osmobts-abis rtp-amr include $(TOPDIR)/build/Makefile.asciidoc.inc include $(TOPDIR)/build/Makefile.inc @@ -26,6 +26,8 @@ clean: -rm -rf $(cleanfiles) -rm osmobts-abis__*.png -rm osmobts-abis__*.svg + -rm rtp-amr__*.png + -rm rtp-amr__*.svg -rm osmobts-usermanual__*.png -rm osmobts-usermanual__*.svg -rm osmobts-abis*.check diff --git a/doc/manuals/abis/rtp-amr.adoc b/doc/manuals/abis/rtp-amr.adoc deleted file mode 100644 index f6013036..00000000 --- a/doc/manuals/abis/rtp-amr.adoc +++ /dev/null @@ -1,1313 +0,0 @@ -= AMR-RTP in Combination with DTX - -The purpose of this document is to describe the sometimes quite -intricate interactions between a MS, the BTS-PHY and the BTS softare -in case of AMR (Adaptive Multi Rate) codec and DTX (Discontinuous -Transmission). - -It is written with the OsmoBTS implementation and the Nutaq GSM PHY -API in mind, but should more or less be applicable to any GSM BTS -PHY or any BTS software implementation, assuming it uses RTP on the -back-haul towards the MGW. - -== Full-Rate (TCH/AFS) - -=== TCH/AFS Uplink (MS to Network) - -==== TCH/AFS Uplink: During Talk-Spurt - -During a talk-spurt, the system behaves identical to a system without -DTX enabled: Every four radio bursts, the BTS-PHY has one AMR frame -ready and hands it up to the BTS process, which creates an RTP AMR -frame from it and sends that to the MGW. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Regular AMR Speech (has been ongoing for some time)"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; -} ----- - -==== TCH/AFS Uplink: End of Voice; Start of Silence - -When the voice encoder in the MS detects no voice activity anymore, it -signals towards the MS-PHY that SID_FIRST shall be transmitted. - -The BTS-PHY reports the following primitives to the BTS after all four -related bursts have been received: - -The BTS sends an RTP frame with AMR Frame Type SID, in which the STI -is set to indicate a SID_FIRST message. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Last AMR Speech (end of talk-spurt) and SID"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)", id="ULSF2"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU2"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; -} ----- - -ULSF2:: As per 3GPP TS 05.03 section 3.9.2.4 The last 4 bursts shall not be transmitted unless -the SID_FIRST frame is immediately followed by a speech frame. It has been observed that some phone -does not transmit the last 4 bursts even if it is not followed by a speech frame. - -ULSU2:: There must be exactly two supressed voice frames between the -SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and -SID_UPDATE. - -==== TCH/AFS Uplink: During Silence - -While the period of silence is ongoing, the MS pauses all -transmissions, except the periodic scheduling of SID_UPDATE every 8 -voice frames (160ms). - -NOTE:: Silence can also be interrupted at any time by ONSET, see -<>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Every 8 voice frames (160ms)", id="8VF"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; -} ----- - -8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM -TDMA frames! - -[[afs-ul-onset]] -==== TCH/AFS Uplink: End of Silence; Start of Voice - -Once the voice encoder in the MS detects voice activity again, it -asks its transmitter to perform transmission of SID_ONSET, which is a -special frame whose information is encoded only in sub-blocks 3+4, and -sub-blocks 1+2 are discarded before transmission. - -A set of four radio bursts is sent, containing - -* the only four transmitted sub-blocks of the SID_ONSET frame -* all four sub-blocks of the first voice codec frame -* the first two blocks of the second voice codec frame - -The BTS-PHY informs the BTS using two primitives: - -* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of - SID_ONSET, including the Channel Mode Indication (irrespective of - CMI Phase) -* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame - -The BTS transmits an RTP frame with AMR payload of the corresponding -speech frame type, and sets the RTP MARKER bit to indicate the ONSET -condition. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Once voice is active again"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; - ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; - ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; - ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - ...; -} ----- - -ULSO2:: sub-blocks 1..4 of SID_ONSET are never transmitted as all -information is contained in blocks 5..8. - -==== TCH/AFS Uplink: Speech Frame Following a SID_FIRST frame - -The four last bursts of a SID_FIRST frame can be replaced by an ONSET frame in order to quickly resume speech. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Speech Frame Following a SID_FIRST"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N+1)"]; - ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N+1)"]; - ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N+1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - ...; -} ----- - -==== TCH/AFS Uplink: FACCH/F Frame During DTX Operation - -As mentioned in section A.5.1.2.1 of 3GPP TS 26.093 : - -* If the frame preceding the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then an ONSET frame shall be signalled to the CHE, followed by the FACCH frame(s). -* If the frame following the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then a SID_FIRST shall be signalled to the CHE. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="FACCH/F Frame During DTX"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH frame)"]; - ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH frame)"]; - ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH frame)"]; - ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH frame)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 5 of FACCH frame + sub-block 1 of SID First frame)"]; - ms => phy [label="L1 burst (sub-block 6 of FACCH frame + sub-block 2 of SID First frame)"]; - ms => phy [label="L1 burst (sub-block 7 of FACCH frame + sub-block 3 of SID First frame)"]; - ms => phy [label="L1 burst (sub-block 8 of FACCH frame + sub-block 4 of SID First frame)", id="Note"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; - phy => bts [label="PH-DATA.ind FACCH/F"]; - bts => mgw [label="FACCH/F"]; - - ms -x phy [label="Supressed L1 burst", id="ULSF2"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - ...; -} ----- - -ULSF2:: The sub-blocks 5-8 of SID_FIRST are not transmitted, as all -information bits are contained in sub-blocks 1-4 only - -Note:: It has been observed with some phones that the SID_FIRST is not sent following the FACCH/F -frame. If this case occures the No Data Frame and SID_UPDATE order resumes. - -=== TCH/AFS Downlink (Network to MS) - -[[afs-dl-talk]] -==== TCH/AFS Downlink: During Talk-Spurt - -During a talk-spurt, the system behaves identical to a system without -DTX enabled: an RTP frame arrives every 20ms. - -The PHY sends a PH-RTS.ind in similar intervals, to which the BTS -responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. - -The BTS-PHY then encodes and interleaves the codec frame into eight -sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued -every four bursts. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Regular AMR Speech (has been ongoing for some time)"]; - - mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; - mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AFS Downlink: End of Voice; Start of Silence - -When the BTS receives the first RTP frame with Frame Type SID, it will -generate a SID_FIRST AMR frame. The AMR frame is interleaved in a way -that all information is contained in the first four sub-blocks, with -the latter four sub-blocks being dropped and not transmitted. - -Three codec frames (60ms) later, the BTS needs to transmit a -SID_UPDATE AMR frame, which should consist of comfort noise parameters -received in either the first AMR SID frame, or a subsequent AMR SID -frame received meanwhile. - -In between SID_FIRST and SID_UPDATE, and after the SID_UPDATE, the BTS -sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to -cease transmission in those periods. - -NOTE:: At any time, the BTS can end the silence period by issuing -ONSET (in case of a new downlink talk-spurt or a FACCH downlink -frame). See <>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Last AMR Speech (end of talk-spurt) and SID First"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; - bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)", id="DLSF2"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="DLSU2"]; - ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; -} ----- - -DLSF2:: sub-frames 5..8 of SID_FIRST are not transmitted, as all -information is contained in sub-frames 1..4 - -DLSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) -after the SID_FIRST, resulting in two suppressed voice frame periods of -empty bursts in-between. - -==== TCH/AFS Downlink: During Silence - -During Silence periods, the BTS may at any time receive RTP AMR SID -frames, and keep a copy of the last received frame around. - -Every eight voice frames (160ms), the BTS shall respond to the -PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with -SID_UPDATE frame. - -At all other times, the BTS sends PH-EMPTY-FRAME.req to any received -PH-RTS.ind, causing the BTS-PHY to cease transmission in those -periods. - -NOTE:: At any time, the BTS can end the silence period by issuing -ONSET (in case of a new downlink talk-spurt or a FACCH downlink -frame). See <>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Every 8 voice frames (160ms)", id="8VF"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; -} ----- - -8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM -TDMA frames! - -[[afs-dl-onset]] -==== TCH/AFS Downlink: End of Silence; Start of Voice - -Once the BTS receives a non-SID AMR RTP frame (which should also have -the MARKER bit set to 1, but let's not take that for granted), the -contained AMR voice data is passed to the BTS-PHY in the next -PH-DATA.req (GsmL1_TchPlType_Amr_Onset). - -From that point onwards, regular transmission resumes, see -<> - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Once voice is active again"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; - ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; - ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; - bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AFS Downlink: Inhibiting a SID_FIRST frame - -Here is the procedure to inhibit a SID_FIRST frame in order to quickly resume speech. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Inhibiting a SID_FIRST frame"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; - bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; - ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; - ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; - } ----- - -==== TCH/AFS Downlink: FACCH/F During DTX Operation - -The following procedure must be observed if a FACCH/F frame must be transmitted during DTX operation. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="FACCH/F Frame During DTX"]; - - bts <= mgw [label="FACCH/F"]; - phy => bts [label="PH-RTS.ind (FACCH/F)"]; - phy => bts [label="PH-RTS.ind (TCH/F)"]; - phy <= bts [label="PH-DATA.req (FACCH/F)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset(TCH/F)", id="NOTE"]; - ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/F)"]; - ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/F)"]; - ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH/F)"]; - ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH/F)"]; - - phy => bts [label="PH-RTS.ind (FACCH)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; - ms x- phy [label="L1 burst (sub-block 5 of FACCH/F + sub-block 1 of SID_FIRST)"]; - ms x- phy [label="L1 burst (sub-block 6 of FACCH/F + sub-block 2 of SID_FIRST)"]; - ms x- phy [label="L1 burst (sub-block 7 of FACCH/F + sub-block 3 of SID_FIRST)"]; - ms x- phy [label="L1 burst (sub-block 8 of FACCH/F + sub-block 4 of SID_FIRST)"]; - - phy => bts [label="PH-RTS.ind (FACCH)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; - phy <= bts [label="PH-EMPTY-FRAME.req (TCH/F)"]; - ms x- phy [label="Supressed burst"]; - ms x- phy [label="Supressed burst"]; - ms x- phy [label="Supressed burst"]; - ms x- phy [label="Supressed burst"]; -} ----- - -NOTE:: The ONSET and the FACCH/F PH-DATA requests must both be sent to the PHY. - -== Half-Rate (TCH/AHS) - -=== TCH/AHS Uplink (MS to Network) - -==== TCH/AHS Uplink: During Talk-Spurt - -During a talk-spurt, the system behaves identical to a system without -DTX enabled: Every two radio bursts, the BTS-PHY has one AMR frame -ready and hands it up to the BTS process, which creates an RTP AMR -frame from it and sends that to the MGW. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Regular AMR Speech (has been ongoing for some time)"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-2)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; -} ----- - -==== TCH AHS Uplink: End of Voice; Start of Silence - -When the voice encoder in the MS detects no voice activity anymore, it -signals towards the MS-PHY that SID_FIRST_P1 and SID_FIRST_P2 shall be -transmitted. - -The BTS-PHY reports the following primitives to the BTS after all four -related bursts have been received: - -* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1 -* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 - -The BTS sends an RTP frame with AMR Frame Type SID, in which the STI -is set to indicate a SID_FIRST message. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N, sub-block 1 of SID_FIRST_P1)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N, sub-block 2 of SID_FIRST_P1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; - ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1", id="ULSF1"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU1"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2", id="NOTE"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; -} ----- - -ULSF1:: Only SID_FIRST_P1 contains information so it must be the only one transmitted over RTP. - -NOTE:: It has been observed that not all phones transmit SID_FIRST_P2 so the PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 is not guaranteed to be sent to the BTS. - -ULSU1:: There must be exactly two supressed voice frames between the -SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and -SID_UPDATE. - -==== TCH/AFS Uplink: During Silence - -While the period of silence is ongoing, the MS pauses all -transmissions, except the periodic scheduling of SID_UPDATE every -8 voice frames (160ms). - -NOTE:: Silence can also be interrupted at any time by ONSET, see -<>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Every 8 voice frames (160ms)", id="8VF"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; -} ----- - -8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM -TDMA frames! - -[[ahs-ul-onset]] -==== TCH/AHS Uplink: End of Silence; Start of Voice - -Once the voice encoder in the MS detects voice activity again, it -asks its transmitter to perform transmission of SID_ONSET, which is a -special frame which has information encoded only in sub-blocks 3+4, and -sub-blocks 1+2 are discarded before transmission. - -A set of four radio bursts is sent, containing - -* the only two transmitted sub-blocks of the SID_ONSET frame -* all four sub-blocks of the first voice codec frame -* the first two blocks of the second voice codec frame - -The BTS-PHY informs the BTS using two primitives: - -* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of - SID_ONSET, including the Channel Mode Indication (irrespective of - CMI Phase) -* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame - -The BTS transmits a RTP frame with AMR payload of the corresponding -speech frame type, and sets the RTP MARKER bit to indicate the ONSET -condition. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Once voice is active again"]; - - ms -x phy [label="Suppressed L1 burst"]; - ms -x phy [label="Suppressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; - ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - ...; -} ----- - -==== TCH/AHS Uplink: Inhibited SID_FIRST - -In case voice activity is detected again while the SID_FIRST_P1 -transmission is ongoing or completed, but the SID_FIRST_P2 has not -been transmitted yet, SID_FIRST can be inhibited by means of a -SID_FIRST_INH frame. This allows the first voice frame to be -transmitted with minimal delay, compared to first completing -the regular SID_FIRTS_P2 and SID_ONSET procedure. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ms .. mgw [label="End of talk-spurt with inhibited SID_FIRST"]; - - ms => phy [label="L1 burst (sub-block 3 of last speech frame N + sub-block 1 of SID_FIRST_P1)"]; - ms => phy [label="L1 burst (sub-block 4 of last speech frame N + sub-block 2 of SID_FIRST_P1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms => phy [label="L1 burst (block 1 of SID_FIRST_INH and sub-block 1 of speech frame N+1", id="SFI1"]; - ms => phy [label="L1 burst (block 2 of SID_FIRST_INH and sub-block 2 of speech frame N+1"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N+2 + sub-block 1 of speech frame N+3)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N+2 + sub-block 2 of speech frame N+3)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidInh", id="SFI2"]; - bts => bts [label="store CMI from SID_FIRST_INH"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; -} ----- - -==== TCH/AHS Uplink: Inhibited SID_UPDATE - -In case voice activity is detected again while the SID_UPDATE -transmission of the first two sub-blocks is ongoing or completed, but -the second two sub-blocks have not been transmitted yet, SID_UPDATE can -be inhibited by means of a SID_UPDATE_INH frame. This allows the -first voice frame to be transmitted with minimal delay, compared to -first completing the regular SID_UPDATE and SID_ONSET procedure. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - ms .. mgw [label="Inhibited SID Update (during silence period)"]; - - ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (block 1 of SID_UPD_INH + sub-block 1 of speech frame N)", id="SFU1"]; - ms => phy [label="L1 burst (block 2 of SID_UPD_INH + sub-block 2 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; - ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidUpdateInH", id="SFU2"]; - bts => bts [label="lchan_set_marker() and store CMI from SID_UPD_INH"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; - bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; -} ----- - -==== TCH/AHS Uplink: FACCH/H During DTX operation - -The following procedure must be observed if a FACCH/H frame must be transmitted during DTX operation. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - ms .. mgw [label="FACCH/H during DTX operation"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/H)"]; - ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/H)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 3+4 of FACCH/H)"]; - ms => phy [label="L1 burst (sub-block 5+6 of FACCH/H)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms => phy [label="L1 burst (sub-block 7 of FACCH/H + sub-block 1 of SID_FIRST_P1)"]; - ms => phy [label="L1 burst (sub-block 8 of FACCH/H + sub-block 2 of SID_FIRST_P1)"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; - bts => bts [label="lchan_set_marker() and store CMI"]; - phy => bts [label="PH-DATA.ind FACCH/H"]; - bts => mgw [label="FACCH/H"]; - - ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1 + block 1 of SID_FIRST_P2)"]; - ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1 + block 2 of SID_FIRST_P2)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; - bts -x mgw [label="Suppressed RTP frame"]; - - ms -x phy [label="Supressed L1 burst"]; - ms -x phy [label="Supressed L1 burst"]; - phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1"]; - bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; -} ----- - -=== TCH/AHS Downlink (Network to MS) - -[[ahs-dl-talk]] -==== TCH/AHS Downlink: During Talk-Spurt - -During a talk-spurt, the system behaves identically to a system without -DTX enabled: an RTP frame arrives every 20ms. - -The PHY sends a PH-RTS.ind in similar intervals, to which the BTS -responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. - -The BTS-PHY then encodes and interleaves the codec frame into four -sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued -every two bursts. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Regular AMR Speech (has been ongoing for some time)"]; - - mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; - mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AHS Downlink: End of Voice; Start of Silence - - -When the BTS receives the first RTP frame with Frame Type SID, it will -first issue a GsmL1_TchPlType_Amr_SidFirstP1 primitive towards the -BTS-PHY, followed by a GsmL1_TchPlType_Amr_SidFirstP2 primitive. - -The SID_FIRST_P2 is interleaved in a way that all information is -contained in the first two sub-blocks, with the latter two -sub-blocks being dropped and not transmitted. - -Three codec frames (60ms) later, the BTS needs to transmit a -SID_UPDATE AMR frame, which should consist of comfort noise -parameters received in either the first RTP AMR SID frame, or a -subsequent RTP AMR SID frame received meanwhile. - -In between SID_FIRST_P2 and SID_UPDATE, and after the SID_UPDATE, the -BTS sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to -cease transmission in those periods. - -NOTE:: At any time, the BTS can end the silence period by issuing -ONSET (in case of a new downlink talk-spurt or a FACCH -downlink frame). See Section <>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; - ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; - ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="ULSU2"]; - ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms x- phy [label="Suppressed burst"]; - ms x- phy [label="Suppressed burst"]; -} ----- - -ULSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) -after the SID_FIRST, resulting in two suppressed voice frame periods of -empty bursts in between. - -==== TCH/AHS Downlink: During Silence - -During Silence periods, the BTS may at any time receive RTP AMR SID -frames and keep a copy of the last received frame around. - -Every eight voice frames (160ms), the BTS shall respond to the -PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with -SID_UPDATE frame. - -At all other times, the BTS sends PH-EMPTY-FRAME.req to any received -PH-RTS.ind, causing the BTS-PHY to cease transmission in those -periods. - -NOTE:: At any time, the BTS can end the silence period by issuing -ONSET (in case of a new downlink talk-spurt or a FACCH downlink -frame). See Section <>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Every 8 voice frames (160ms)", id="8VF"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; -} ----- - -8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM -TDMA frames! - -[[ahs-dl-onset]] -==== TCH/AHS Downlink: End of Silence; Start of Voice - -Once the BTS receives a non-SID AMR RTP frame (which should also have -the MARKER bit set to 1, but let’s not take that for granted), the -contained AMR voice data is passed to the BTS-PHY in the next -PH-DATA.req (GsmL1_TchPlType_Amr_Onset). - -From that point onwards, regular transmission resumes, see -<>. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Once voice is active again"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (sub-block 3 of SID_ONSET + sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (sub-block 4 of SID_ONSET + sub-block 2 of speech frame N)"]; - bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AHS Downlink: Inhibited SID_FIRST_P1 - -The following procedure must be observed in case of a SID_FIRST must be inhibited. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Inhibited SID_FIRST_P1"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstInh"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (block 1 of SID_FIRST_INH, sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (block 2 of SID_FIRST_INH, sub-block 2 of speech frame N)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AHS Downlink: Inhibited SID_UPDATE - -The following procedure must be observed in case of a SID_UPDATE must be inhibited. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="Inhibited SID_UPDATE"]; - - bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; - ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidUpdateInh"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; - ms <= phy [label="L1 burst (block 1 of SID_UPDATE_INH, sub-block 1 of speech frame N)"]; - ms <= phy [label="L1 burst (block 2 of SID_UPDATE_INH, sub-block 2 of speech frame N)"]; - - bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; - ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; - ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; -} ----- - -==== TCH/AHS Downlink: FACCH/H During DTX Operation - -The following procedure must be observed in case of a FACCH/H frame must be inserted during DTX operation. - -["mscgen"] ----- -msc { - hscale = 2; - ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; - - ...; - --- [label="FACCH/H During DTX Operation"]; - - bts <= mgw [label="FACCH/H"]; - phy => bts [label="PH-RTS.ind (FACCH/H)"]; - phy => bts [label="PH-RTS.ind (TCH/H)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; - phy <= bts [label="PH-DATA.req FACCH/H"]; - ms <= phy [label="L1 burst (block 1 of SID_ONSET, sub-block 1 of FACCH/H frame)"]; - ms <= phy [label="L1 burst (block 2 of SID_ONSET, sub-block 2 of FACCH/H frame)"]; - - phy => bts [label="PH-RTS.ind (TCH/H)"]; - phy <= bts [label="PH-EMPTY-FRAME.req"]; - ms <= phy [label="L1 burst (sub-block 3+4 of FACCH/H frame)"]; - ms <= phy [label="L1 burst (sub-block 5+6 of FACCH/H frame)"]; - - phy => bts [label="PH-RTS.ind (FACCH/H)"]; - phy => bts [label="PH-RTS.ind (TCH/H)"]; - phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/H)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; - ms <= phy [label="L1 burst (sub-block 7 of FACCH/H frame + sub-block 1 of SID_FIRST_P1)"]; - ms <= phy [label="L1 burst (sub-block 8 of FACCH/H frame + sub-block 2 of SID_FIRST_P1)"]; - - phy => bts [label="PH-RTS.ind (TCH)"]; - phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; - ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; - ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; -} ----- diff --git a/doc/manuals/rtp-amr-docinfo.xml b/doc/manuals/rtp-amr-docinfo.xml new file mode 100644 index 00000000..82131c4d --- /dev/null +++ b/doc/manuals/rtp-amr-docinfo.xml @@ -0,0 +1,46 @@ + + + 1 + October 2016 + HW + + Initial version + + + + + + + Harald + Welte + hwelte@sysmocom.de + HW + + sysmocom + sysmocom - s.f.m.c. GmbH + Managing Director + + + + + + 2016 + sysmocom - s.f.m.c. GmbH + + + + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, + and no Back-Cover Texts. A copy of the license is included in + the section entitled "GNU Free Documentation License". + + + The Asciidoc source code of this manual can be found at + + http://git.osmocom.org/osmo-gsm-manuals/ + + + diff --git a/doc/manuals/rtp-amr.adoc b/doc/manuals/rtp-amr.adoc new file mode 100644 index 00000000..f6013036 --- /dev/null +++ b/doc/manuals/rtp-amr.adoc @@ -0,0 +1,1313 @@ += AMR-RTP in Combination with DTX + +The purpose of this document is to describe the sometimes quite +intricate interactions between a MS, the BTS-PHY and the BTS softare +in case of AMR (Adaptive Multi Rate) codec and DTX (Discontinuous +Transmission). + +It is written with the OsmoBTS implementation and the Nutaq GSM PHY +API in mind, but should more or less be applicable to any GSM BTS +PHY or any BTS software implementation, assuming it uses RTP on the +back-haul towards the MGW. + +== Full-Rate (TCH/AFS) + +=== TCH/AFS Uplink (MS to Network) + +==== TCH/AFS Uplink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: Every four radio bursts, the BTS-PHY has one AMR frame +ready and hands it up to the BTS process, which creates an RTP AMR +frame from it and sends that to the MGW. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; +} +---- + +==== TCH/AFS Uplink: End of Voice; Start of Silence + +When the voice encoder in the MS detects no voice activity anymore, it +signals towards the MS-PHY that SID_FIRST shall be transmitted. + +The BTS-PHY reports the following primitives to the BTS after all four +related bursts have been received: + +The BTS sends an RTP frame with AMR Frame Type SID, in which the STI +is set to indicate a SID_FIRST message. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)", id="ULSF2"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU2"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +ULSF2:: As per 3GPP TS 05.03 section 3.9.2.4 The last 4 bursts shall not be transmitted unless +the SID_FIRST frame is immediately followed by a speech frame. It has been observed that some phone +does not transmit the last 4 bursts even if it is not followed by a speech frame. + +ULSU2:: There must be exactly two supressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and +SID_UPDATE. + +==== TCH/AFS Uplink: During Silence + +While the period of silence is ongoing, the MS pauses all +transmissions, except the periodic scheduling of SID_UPDATE every 8 +voice frames (160ms). + +NOTE:: Silence can also be interrupted at any time by ONSET, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[afs-ul-onset]] +==== TCH/AFS Uplink: End of Silence; Start of Voice + +Once the voice encoder in the MS detects voice activity again, it +asks its transmitter to perform transmission of SID_ONSET, which is a +special frame whose information is encoded only in sub-blocks 3+4, and +sub-blocks 1+2 are discarded before transmission. + +A set of four radio bursts is sent, containing + +* the only four transmitted sub-blocks of the SID_ONSET frame +* all four sub-blocks of the first voice codec frame +* the first two blocks of the second voice codec frame + +The BTS-PHY informs the BTS using two primitives: + +* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of + SID_ONSET, including the Channel Mode Indication (irrespective of + CMI Phase) +* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame + +The BTS transmits an RTP frame with AMR payload of the corresponding +speech frame type, and sets the RTP MARKER bit to indicate the ONSET +condition. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ...; +} +---- + +ULSO2:: sub-blocks 1..4 of SID_ONSET are never transmitted as all +information is contained in blocks 5..8. + +==== TCH/AFS Uplink: Speech Frame Following a SID_FIRST frame + +The four last bursts of a SID_FIRST frame can be replaced by an ONSET frame in order to quickly resume speech. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Speech Frame Following a SID_FIRST"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N, sub-block 1 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N, sub-block 2 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N, sub-block 3 of SID_FIRST)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N, sub-block 4 of SID_FIRST)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N+1)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 5 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 6 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 7 of speech frame N+1 + sub-block 3 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 8 of speech frame N+1 + sub-block 4 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + ...; +} +---- + +==== TCH/AFS Uplink: FACCH/F Frame During DTX Operation + +As mentioned in section A.5.1.2.1 of 3GPP TS 26.093 : + +* If the frame preceding the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then an ONSET frame shall be signalled to the CHE, followed by the FACCH frame(s). +* If the frame following the FACCH frame is not of TX_TYPE='SPEECH_GOOD', then a SID_FIRST shall be signalled to the CHE. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/F Frame During DTX"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH frame)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH frame)"]; + ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH frame)"]; + ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH frame)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 5 of FACCH frame + sub-block 1 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 6 of FACCH frame + sub-block 2 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 7 of FACCH frame + sub-block 3 of SID First frame)"]; + ms => phy [label="L1 burst (sub-block 8 of FACCH frame + sub-block 4 of SID First frame)", id="Note"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind FACCH/F"]; + bts => mgw [label="FACCH/F"]; + + ms -x phy [label="Supressed L1 burst", id="ULSF2"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + ...; +} +---- + +ULSF2:: The sub-blocks 5-8 of SID_FIRST are not transmitted, as all +information bits are contained in sub-blocks 1-4 only + +Note:: It has been observed with some phones that the SID_FIRST is not sent following the FACCH/F +frame. If this case occures the No Data Frame and SID_UPDATE order resumes. + +=== TCH/AFS Downlink (Network to MS) + +[[afs-dl-talk]] +==== TCH/AFS Downlink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: an RTP frame arrives every 20ms. + +The PHY sends a PH-RTS.ind in similar intervals, to which the BTS +responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. + +The BTS-PHY then encodes and interleaves the codec frame into eight +sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued +every four bursts. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of speech frame N)"]; + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 3 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AFS Downlink: End of Voice; Start of Silence + +When the BTS receives the first RTP frame with Frame Type SID, it will +generate a SID_FIRST AMR frame. The AMR frame is interleaved in a way +that all information is contained in the first four sub-blocks, with +the latter four sub-blocks being dropped and not transmitted. + +Three codec frames (60ms) later, the BTS needs to transmit a +SID_UPDATE AMR frame, which should consist of comfort noise parameters +received in either the first AMR SID frame, or a subsequent AMR SID +frame received meanwhile. + +In between SID_FIRST and SID_UPDATE, and after the SID_UPDATE, the BTS +sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to +cease transmission in those periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID First"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)", id="DLSF2"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="DLSU2"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; +} +---- + +DLSF2:: sub-frames 5..8 of SID_FIRST are not transmitted, as all +information is contained in sub-frames 1..4 + +DLSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) +after the SID_FIRST, resulting in two suppressed voice frame periods of +empty bursts in-between. + +==== TCH/AFS Downlink: During Silence + +During Silence periods, the BTS may at any time receive RTP AMR SID +frames, and keep a copy of the last received frame around. + +Every eight voice frames (160ms), the BTS shall respond to the +PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with +SID_UPDATE frame. + +At all other times, the BTS sends PH-EMPTY-FRAME.req to any received +PH-RTS.ind, causing the BTS-PHY to cease transmission in those +periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[afs-dl-onset]] +==== TCH/AFS Downlink: End of Silence; Start of Voice + +Once the BTS receives a non-SID AMR RTP frame (which should also have +the MARKER bit set to 1, but let's not take that for granted), the +contained AMR voice data is passed to the BTS-PHY in the next +PH-DATA.req (GsmL1_TchPlType_Amr_Onset). + +From that point onwards, regular transmission resumes, see +<> + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AFS Downlink: Inhibiting a SID_FIRST frame + +Here is the procedure to inhibit a SID_FIRST frame in order to quickly resume speech. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibiting a SID_FIRST frame"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + bts => bts [label="Store SID frame in case it contains comfort noise parameters"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N-1 + sub-block 1 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N-1 + sub-block 2 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N-1 + sub-block 3 of SID_FIRST)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N-1 + sub-block 4 of SID_FIRST)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 6 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 7 of speech frame N + sub-block 2 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 8 of speech frame N + sub-block 2 of speech frame N+1)"]; + } +---- + +==== TCH/AFS Downlink: FACCH/F During DTX Operation + +The following procedure must be observed if a FACCH/F frame must be transmitted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/F Frame During DTX"]; + + bts <= mgw [label="FACCH/F"]; + phy => bts [label="PH-RTS.ind (FACCH/F)"]; + phy => bts [label="PH-RTS.ind (TCH/F)"]; + phy <= bts [label="PH-DATA.req (FACCH/F)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset(TCH/F)", id="NOTE"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH/F)"]; + ms <= phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH/F)"]; + + phy => bts [label="PH-RTS.ind (FACCH)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 5 of FACCH/F + sub-block 1 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 6 of FACCH/F + sub-block 2 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 7 of FACCH/F + sub-block 3 of SID_FIRST)"]; + ms x- phy [label="L1 burst (sub-block 8 of FACCH/F + sub-block 4 of SID_FIRST)"]; + + phy => bts [label="PH-RTS.ind (FACCH)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/F)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (TCH/F)"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; + ms x- phy [label="Supressed burst"]; +} +---- + +NOTE:: The ONSET and the FACCH/F PH-DATA requests must both be sent to the PHY. + +== Half-Rate (TCH/AHS) + +=== TCH/AHS Uplink (MS to Network) + +==== TCH/AHS Uplink: During Talk-Spurt + +During a talk-spurt, the system behaves identical to a system without +DTX enabled: Every two radio bursts, the BTS-PHY has one AMR frame +ready and hands it up to the BTS process, which creates an RTP AMR +frame from it and sends that to the MGW. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-2)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; +} +---- + +==== TCH AHS Uplink: End of Voice; Start of Silence + +When the voice encoder in the MS detects no voice activity anymore, it +signals towards the MS-PHY that SID_FIRST_P1 and SID_FIRST_P2 shall be +transmitted. + +The BTS-PHY reports the following primitives to the BTS after all four +related bursts have been received: + +* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1 +* PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 + +The BTS sends an RTP frame with AMR Frame Type SID, in which the STI +is set to indicate a SID_FIRST message. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N, sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N, sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1", id="ULSF1"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU1"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2", id="NOTE"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +ULSF1:: Only SID_FIRST_P1 contains information so it must be the only one transmitted over RTP. + +NOTE:: It has been observed that not all phones transmit SID_FIRST_P2 so the PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 is not guaranteed to be sent to the BTS. + +ULSU1:: There must be exactly two supressed voice frames between the +SID_FIRST and the SID_UPDATE, i.e. there's 60ms between SID_FIRST and +SID_UPDATE. + +==== TCH/AFS Uplink: During Silence + +While the period of silence is ongoing, the MS pauses all +transmissions, except the periodic scheduling of SID_UPDATE every +8 voice frames (160ms). + +NOTE:: Silence can also be interrupted at any time by ONSET, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (SID_UPDATE)"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[ahs-ul-onset]] +==== TCH/AHS Uplink: End of Silence; Start of Voice + +Once the voice encoder in the MS detects voice activity again, it +asks its transmitter to perform transmission of SID_ONSET, which is a +special frame which has information encoded only in sub-blocks 3+4, and +sub-blocks 1+2 are discarded before transmission. + +A set of four radio bursts is sent, containing + +* the only two transmitted sub-blocks of the SID_ONSET frame +* all four sub-blocks of the first voice codec frame +* the first two blocks of the second voice codec frame + +The BTS-PHY informs the BTS using two primitives: + +* PH-DATA.ind GsmL1_TchPlType_Amr_Onset indicates the presence of + SID_ONSET, including the Channel Mode Indication (irrespective of + CMI Phase) +* PH-DATA.ind GsmL1_TchPlType_Amr indicates the first voice frame + +The BTS transmits a RTP frame with AMR payload of the corresponding +speech frame type, and sets the RTP MARKER bit to indicate the ONSET +condition. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + ms -x phy [label="Suppressed L1 burst"]; + ms -x phy [label="Suppressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + ...; +} +---- + +==== TCH/AHS Uplink: Inhibited SID_FIRST + +In case voice activity is detected again while the SID_FIRST_P1 +transmission is ongoing or completed, but the SID_FIRST_P2 has not +been transmitted yet, SID_FIRST can be inhibited by means of a +SID_FIRST_INH frame. This allows the first voice frame to be +transmitted with minimal delay, compared to first completing +the regular SID_FIRTS_P2 and SID_ONSET procedure. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ms .. mgw [label="End of talk-spurt with inhibited SID_FIRST"]; + + ms => phy [label="L1 burst (sub-block 3 of last speech frame N + sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 4 of last speech frame N + sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N-1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (block 1 of SID_FIRST_INH and sub-block 1 of speech frame N+1", id="SFI1"]; + ms => phy [label="L1 burst (block 2 of SID_FIRST_INH and sub-block 2 of speech frame N+1"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1)"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+2 + sub-block 1 of speech frame N+3)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+2 + sub-block 2 of speech frame N+3)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidInh", id="SFI2"]; + bts => bts [label="store CMI from SID_FIRST_INH"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N+1)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; +} +---- + +==== TCH/AHS Uplink: Inhibited SID_UPDATE + +In case voice activity is detected again while the SID_UPDATE +transmission of the first two sub-blocks is ongoing or completed, but +the second two sub-blocks have not been transmitted yet, SID_UPDATE can +be inhibited by means of a SID_UPDATE_INH frame. This allows the +first voice frame to be transmitted with minimal delay, compared to +first completing the regular SID_UPDATE and SID_ONSET procedure. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + ms .. mgw [label="Inhibited SID Update (during silence period)"]; + + ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_UPD_INH + sub-block 1 of speech frame N)", id="SFU1"]; + ms => phy [label="L1 burst (block 2 of SID_UPD_INH + sub-block 2 of speech frame N)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; + ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidUpdateInH", id="SFU2"]; + bts => bts [label="lchan_set_marker() and store CMI from SID_UPD_INH"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr (N)"]; + bts => mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; +} +---- + +==== TCH/AHS Uplink: FACCH/H During DTX operation + +The following procedure must be observed if a FACCH/H frame must be transmitted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + ms .. mgw [label="FACCH/H during DTX operation"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/H)"]; + ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/H)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 3+4 of FACCH/H)"]; + ms => phy [label="L1 burst (sub-block 5+6 of FACCH/H)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms => phy [label="L1 burst (sub-block 7 of FACCH/H + sub-block 1 of SID_FIRST_P1)"]; + ms => phy [label="L1 burst (sub-block 8 of FACCH/H + sub-block 2 of SID_FIRST_P1)"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_Onset"]; + bts => bts [label="lchan_set_marker() and store CMI"]; + phy => bts [label="PH-DATA.ind FACCH/H"]; + bts => mgw [label="FACCH/H"]; + + ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1 + block 1 of SID_FIRST_P2)"]; + ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1 + block 2 of SID_FIRST_P2)"]; + phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + bts -x mgw [label="Suppressed RTP frame"]; + + ms -x phy [label="Supressed L1 burst"]; + ms -x phy [label="Supressed L1 burst"]; + phy => bts [label="PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP1"]; + bts => mgw [label="RTP (AMR FT=SID,Q=1)"]; +} +---- + +=== TCH/AHS Downlink (Network to MS) + +[[ahs-dl-talk]] +==== TCH/AHS Downlink: During Talk-Spurt + +During a talk-spurt, the system behaves identically to a system without +DTX enabled: an RTP frame arrives every 20ms. + +The PHY sends a PH-RTS.ind in similar intervals, to which the BTS +responds with a PH-DATA.req containing GsmL1_TchPlType_Amr. + +The BTS-PHY then encodes and interleaves the codec frame into four +sub-blocks. Due to the interleaving, one new PH-RTS.ind is issued +every two bursts. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Regular AMR Speech (has been ongoing for some time)"]; + + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of speech frame N)"]; + mgw => bts [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: End of Voice; Start of Silence + + +When the BTS receives the first RTP frame with Frame Type SID, it will +first issue a GsmL1_TchPlType_Amr_SidFirstP1 primitive towards the +BTS-PHY, followed by a GsmL1_TchPlType_Amr_SidFirstP2 primitive. + +The SID_FIRST_P2 is interleaved in a way that all information is +contained in the first two sub-blocks, with the latter two +sub-blocks being dropped and not transmitted. + +Three codec frames (60ms) later, the BTS needs to transmit a +SID_UPDATE AMR frame, which should consist of comfort noise +parameters received in either the first RTP AMR SID frame, or a +subsequent RTP AMR SID frame received meanwhile. + +In between SID_FIRST_P2 and SID_UPDATE, and after the SID_UPDATE, the +BTS sends PH-EMPTY-FRAME.req to all PH-RTS.ind, causing the BTS-PHY to +cease transmission in those periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH +downlink frame). See Section <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Last AMR Speech (end of talk-spurt) and SID P1/P2"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)", id="ULSU2"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms x- phy [label="Suppressed burst"]; + ms x- phy [label="Suppressed burst"]; +} +---- + +ULSU2:: The SID_UPDATE must be sent exactly three voice frames (60ms) +after the SID_FIRST, resulting in two suppressed voice frame periods of +empty bursts in between. + +==== TCH/AHS Downlink: During Silence + +During Silence periods, the BTS may at any time receive RTP AMR SID +frames and keep a copy of the last received frame around. + +Every eight voice frames (160ms), the BTS shall respond to the +PH-RTS.ind with a PH-DATA.req containing a GsmL1_TchPlType_Amr with +SID_UPDATE frame. + +At all other times, the BTS sends PH-EMPTY-FRAME.req to any received +PH-RTS.ind, causing the BTS-PHY to cease transmission in those +periods. + +NOTE:: At any time, the BTS can end the silence period by issuing +ONSET (in case of a new downlink talk-spurt or a FACCH downlink +frame). See Section <>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Every 8 voice frames (160ms)", id="8VF"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; +} +---- + +8VF:: This happens every 8 *voice frames* (160ms), not every 8 GSM +TDMA frames! + +[[ahs-dl-onset]] +==== TCH/AHS Downlink: End of Silence; Start of Voice + +Once the BTS receives a non-SID AMR RTP frame (which should also have +the MARKER bit set to 1, but let’s not take that for granted), the +contained AMR voice data is passed to the BTS-PHY in the next +PH-DATA.req (GsmL1_TchPlType_Amr_Onset). + +From that point onwards, regular transmission resumes, see +<>. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Once voice is active again"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_ONSET + sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_ONSET + sub-block 2 of speech frame N)"]; + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: Inhibited SID_FIRST_P1 + +The following procedure must be observed in case of a SID_FIRST must be inhibited. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibited SID_FIRST_P1"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N-1 + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N-1 + sub-block 2 of SID_FIRST_P1)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstInh"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_FIRST_INH, sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_FIRST_INH, sub-block 2 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: Inhibited SID_UPDATE + +The following procedure must be observed in case of a SID_UPDATE must be inhibited. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="Inhibited SID_UPDATE"]; + + bts <= mgw [label="RTP (AMR FT=SID,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + bts => phy [label="PH-DATA.req GsmL1_TchPlType_Amr (SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; + ms <= phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1) MARKER=1"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidUpdateInh"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N)"]; + ms <= phy [label="L1 burst (block 1 of SID_UPDATE_INH, sub-block 1 of speech frame N)"]; + ms <= phy [label="L1 burst (block 2 of SID_UPDATE_INH, sub-block 2 of speech frame N)"]; + + bts <= mgw [label="RTP (AMR FT=0..7,Q=1)"]; + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr (N+1)"]; + ms <= phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; + ms <= phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; +} +---- + +==== TCH/AHS Downlink: FACCH/H During DTX Operation + +The following procedure must be observed in case of a FACCH/H frame must be inserted during DTX operation. + +["mscgen"] +---- +msc { + hscale = 2; + ms [label="MS"], phy [label="BTS-PHY"], bts [label="BTS"], mgw [label="MGW"]; + + ...; + --- [label="FACCH/H During DTX Operation"]; + + bts <= mgw [label="FACCH/H"]; + phy => bts [label="PH-RTS.ind (FACCH/H)"]; + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_Onset"]; + phy <= bts [label="PH-DATA.req FACCH/H"]; + ms <= phy [label="L1 burst (block 1 of SID_ONSET, sub-block 1 of FACCH/H frame)"]; + ms <= phy [label="L1 burst (block 2 of SID_ONSET, sub-block 2 of FACCH/H frame)"]; + + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-EMPTY-FRAME.req"]; + ms <= phy [label="L1 burst (sub-block 3+4 of FACCH/H frame)"]; + ms <= phy [label="L1 burst (sub-block 5+6 of FACCH/H frame)"]; + + phy => bts [label="PH-RTS.ind (FACCH/H)"]; + phy => bts [label="PH-RTS.ind (TCH/H)"]; + phy <= bts [label="PH-EMPTY-FRAME.req (FACCH/H)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP1"]; + ms <= phy [label="L1 burst (sub-block 7 of FACCH/H frame + sub-block 1 of SID_FIRST_P1)"]; + ms <= phy [label="L1 burst (sub-block 8 of FACCH/H frame + sub-block 2 of SID_FIRST_P1)"]; + + phy => bts [label="PH-RTS.ind (TCH)"]; + phy <= bts [label="PH-DATA.req GsmL1_TchPlType_Amr_SidFirstP2"]; + ms <= phy [label="L1 burst (sub-block 3 of SID_FIRST_P1, sub-block 1 of SID_FIRST_P2)"]; + ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; +} +---- -- cgit v1.2.3 From 08b14a2fac56f5b376822c6f9c6907aad2e6cb7b Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 2 Nov 2016 17:24:49 +0100 Subject: Add DTX implementation details to RTP AMR Add FSM and description. Change-Id: Ib37cb6e4038f970070c1715269961db7172ce377 --- doc/manuals/dtx.dot | 65 +++++++++++++++++++++++++++++++++++++++++ doc/manuals/rtp-amr-docinfo.xml | 19 ++++++++++++ doc/manuals/rtp-amr.adoc | 18 ++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 doc/manuals/dtx.dot diff --git a/doc/manuals/dtx.dot b/doc/manuals/dtx.dot new file mode 100644 index 00000000..1c60ee72 --- /dev/null +++ b/doc/manuals/dtx.dot @@ -0,0 +1,65 @@ +digraph dtx_dl_amr_fsm { + node [shape = doublecircle] ST_VOICE ST_FACCH_V ST_FACCH ST_SID_U + node [shape = circle] + + // default state for non-DTX and DTX when SPEECH is in progress + ST_VOICE -> ST_SID_F1 [ label = "E_SID_F" ] + ST_VOICE -> ST_SID_F1 [ label = "E_SID_U" ] + ST_VOICE -> ST_VOICE [ label = "E_VOICE" ] + ST_VOICE -> ST_VOICE [ label = "E_FACCH" ] + + // SID-FIRST or SID-FIRST-P1 in case of AMR HR: start of silence period (might be interrupted in case of AMR HR) + ST_SID_F1 -> ST_SID_F1 [ label = "E_SID_F" ] + ST_SID_F1 -> ST_SID_U [ label = "E_SID_U" ] + ST_SID_F1 -> ST_VOICE [ label = "E_VOICE" ] + ST_SID_F1 -> ST_ONSET_F [ label = "E_FACCH" ] + ST_SID_F1 -> ST_SID_F2 [ label = "E_COMPL" ] + ST_SID_F1 -> ST_F1_INH [ label = "E_INHIB" ] + ST_SID_F1 -> ST_ONSET_V [ label = "E_ONSET" ] + + // SID-FIRST P2 (only for AMR HR): actual start of silence period in case of AMR HR + ST_SID_F2 -> ST_SID_U [ label = "E_SID_U" ] + ST_SID_F2 -> ST_VOICE [ label = "E_VOICE" ] + ST_SID_F2 -> ST_ONSET_F [ label = "E_FACCH" ] + ST_SID_F2 -> ST_ONSET_V [ label = "E_ONSET" ] + + // SID-FIRST Inhibited: incoming SPEECH or FACCH (only for AMR HR) + ST_F1_INH -> ST_VOICE [ label = "E_VOICE" ] + ST_F1_INH -> ST_FACCH_V [ label = "E_FACCH" ] + + // SID-UPDATE Inhibited: incoming SPEECH or FACCH (only for AMR HR) + ST_U_INH -> ST_VOICE [ label = "E_VOICE" ] + ST_U_INH -> ST_FACCH [ label = "E_FACCH" ] + + // Silence period with periodic comfort noise data updates + ST_SID_U -> ST_ONSET_F [ label = "E_FACCH" ] + ST_SID_U -> ST_VOICE [ label = "E_VOICE" ] + ST_SID_U -> ST_U_INH [ label = "E_INHIB" ] + ST_SID_U -> ST_SID_U [ label = "E_SID_U" ] + ST_SID_U -> ST_SID_U [ label = "E_SID_F" ] + ST_SID_U -> ST_ONSET_V [ label = "E_ONSET" ] + + // ONSET - end of silent period due to incoming SPEECH frame + ST_ONSET_V -> ST_ONSET_V_REC [ label = "E_COMPL" ] + + // ONSET - end of silent period due to incoming FACCH frame + ST_ONSET_F -> ST_ONSET_F_REC [ label = "E_COMPL" ] + + // ONSET recursion in progress: ONSET itself was already sent, now have to send the voice that caused it + ST_ONSET_V_REC -> ST_VOICE [ label = "E_COMPL" ] + + // ONSET recursion in progress: ONSET itself was already sent, now have to send the data that caused it + ST_ONSET_F_REC -> ST_FACCH [ label = "E_COMPL" ] + + // FACCH sending state: SPEECH was observed before so once we're done FSM should get back to VOICE state + ST_FACCH_V -> ST_FACCH_V [ label = "E_FACCH" ] + ST_FACCH_V -> ST_VOICE [ label = "E_VOICE" ] + ST_FACCH_V -> ST_VOICE [ label = "E_SID_U" ] + ST_FACCH_V -> ST_SID_F1 [ label = "E_SID_F" ] + + // FACCH sending state: no SPEECH was observed before so once we're done FSM should get back to silent period via SID-FIRST + ST_FACCH -> ST_FACCH [ label = "E_FACCH" ] + ST_FACCH -> ST_VOICE [ label = "E_VOICE" ] + ST_FACCH -> ST_SID_F1 [ label = "E_SID_U" ] + ST_FACCH -> ST_SID_F1 [ label = "E_SID_F" ] +} diff --git a/doc/manuals/rtp-amr-docinfo.xml b/doc/manuals/rtp-amr-docinfo.xml index 82131c4d..fe5d6813 100644 --- a/doc/manuals/rtp-amr-docinfo.xml +++ b/doc/manuals/rtp-amr-docinfo.xml @@ -7,6 +7,14 @@ Initial version + + 2 + November 2016 + MS + + FSM added + + @@ -21,6 +29,17 @@ Managing Director + + Max + Suraev + msuraev@sysmocom.de + MS + + sysmocom + sysmocom - s.f.m.c. GmbH + Software Developer + + diff --git a/doc/manuals/rtp-amr.adoc b/doc/manuals/rtp-amr.adoc index f6013036..f7eda112 100644 --- a/doc/manuals/rtp-amr.adoc +++ b/doc/manuals/rtp-amr.adoc @@ -1311,3 +1311,21 @@ msc { ms <= phy [label="L1 burst (sub-block 4 of SID_FIRST_P1, sub-block 2 of SID_FIRST_P2)"]; } ---- + +== Implementation details + +There is FSM implementing all the necessary states and transitions for DTX DL. + +[[dtx_dl_fsm]] +[graphviz] +---- +include::dtx.dot[] +---- + +The idea is that each state corresponds to the particular message type which have to be send to L1 while state transition happens on incoming events like FACCH or Voice frames. There are 3 different classes of of events driving this FSM: + +* Voice frame types: E_VOICE, E_SID_U, E_SID_F +* Incoming FACCH: E_FACCH +* Internal: E_ONSET, E_INHIB, E_COMPL + +They represent different types of incoming RTP frames (Voice, SID UPDATE and SID FIRST correspondingly), incoming FACCH events or important events internal to DTX operations. The latter are Onset (interruption of silence period), Inhibition (of currently transmitted SID FIRST or UPDATE) and Completion (of silence initiation). \ No newline at end of file -- cgit v1.2.3 From dd4160e00331a9df8e0c5ce9a673f31bac0218a6 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 1 Dec 2016 03:02:03 +0100 Subject: dynamic timeslots: add BSC level config instructions Add high level description on and a config example for dynamic timeslots in a new chapter featured in the OsmoBSC and OsmoNITB manuals. From the OsmoBTS manual's chapter on dynamic timeslots, add references to the above. Change-Id: I44ff1e4c2340c65ff23e85408fc6d6a45ea9e046 --- doc/manuals/chapters/dynamic-timeslots.adoc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/manuals/chapters/dynamic-timeslots.adoc b/doc/manuals/chapters/dynamic-timeslots.adoc index 29dff5b7..7c43d187 100644 --- a/doc/manuals/chapters/dynamic-timeslots.adoc +++ b/doc/manuals/chapters/dynamic-timeslots.adoc @@ -7,11 +7,14 @@ channel configurations, initiated by the BSC via (non-standard) Abis messages The Abis message handling for dynamic timeslots is independent of the BTS model. However, dynamic switchover will only work for BTS models that implement the internal API to reconnect a timeslot (_bts_model_ts_disconnect()_ and -_bts_model_ts_connect()_). Currently, these BTS models support dynamic -timeslots: +_bts_model_ts_connect()_, see also <>). + +Currently, these OsmoBTS models support dynamic timeslots: * _osmo-bts-sysmo_ * _osmo-bts-litecell15_ * _osmo-bts-trx_ -See also <>. +Dynamic timeslots are driven by the BSC and need to be configured there. When +using OsmoBSC or OsmoNITB, see the BTS configuration chapter on dynamic +timeslots in <> or <>, respectively. -- cgit v1.2.3 From f87f1113ca5b6905322d40624980e1655f33b999 Mon Sep 17 00:00:00 2001 From: Ivaylo Kostov Date: Thu, 29 Dec 2016 15:26:59 +0100 Subject: BSC,BTS: add diagrams of PCU-BTS-NITB-SGSN relationships Change-Id: I0eb09706efb768fa4f6810872fb6568cbc9838cb --- doc/manuals/chapters/interfaces.adoc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc index 242fa235..127d4dc5 100644 --- a/doc/manuals/chapters/interfaces.adoc +++ b/doc/manuals/chapters/interfaces.adoc @@ -113,6 +113,32 @@ Contrary to that, many classic E1-based implementations of the GSM RAN co-locate the PCU with the BSC. However, the GSM specifications keep the location up to the implementor. +The GPRS network architecture is shown in <>. + +[[fig-gprs-pcubts]] +.GPRS network architecture +[graphviz] +---- +digraph G { + rankdir=LR; + MS0 [label="MS"]; + MS1 [label="MS"]; + BTS; + BSC; + MSC; + PCU; + SGSN; + GGSN; + MS0->BTS [label="Um"]; + MS1->BTS [label="Um"]; + BTS->BSC [label="Abis"]; + BSC->MSC [label="A"]; + BTS->PCU [label="pcu_sock"]; + PCU->SGSN [label="Gb"]; + SGSN->GGSN [label="GTP"]; +} +---- + The PCU socket interface serves the following purposes: * to pass PCU relevant configuration from BTS to PCU -- cgit v1.2.3 From 8a1dfa0b7715312c3307527e87c2c58d69f3685f Mon Sep 17 00:00:00 2001 From: Philipp Date: Fri, 23 Dec 2016 10:26:33 +0100 Subject: Describe how to run multiple instances of osmo-nitb and osmo-bts Change-Id: I69adeef85adda6f08b31b7d176f51e16968c1435 --- doc/manuals/chapters/configuration.adoc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index b91d8ac3..980f835c 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -179,3 +179,32 @@ configuration file. De-activating power-ramping can be performed by setting the max-initial value to the nominal power. The default max-initial value is 23 dBm. + + +==== Running multiple instances + +It is possible to run multiple instances of `osmo-bts` on one and the same +machine, if the phy-interface is flexible enough to distinguish between +different phy hardware interfaces. + +Since usually a BTS instance runs in conjunction with a dedicated PCU instance, +the socket path between PCU and BTS has to be distinguished between the running +instances. It is possible to change the default socket path via VTY config: + +.Example: Personalize PCU socket path +---- +bts 0 + pcu-socket /tmp/pcu_bts_2 +---- + +It is also necessary to separate the VTY anc CTRL interfaces of the different +instances. The VTY, as well as the CTRL interface can be bound to a free IP +address from the loopback range: + +.Example: Binding VTY and CTRL interface to a specific IP address +---- +line vty + bind 127.0.0.2 +ctrl + bind 127.0.0.2 +---- -- cgit v1.2.3 From 3b835505bf8cae95fc226419ced59c237cf39ccb Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 8 Nov 2016 16:56:14 +0100 Subject: Sync DTX FSM with OsmoBTS code Change-Id: I050a07db99bc0038cfd2a9646a450f714653d804 --- doc/manuals/dtx.dot | 86 +++++++++++++++++++++++++++++------------------- doc/manuals/rtp-amr.adoc | 19 +++++++++-- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/doc/manuals/dtx.dot b/doc/manuals/dtx.dot index 1c60ee72..b9f0b5f2 100644 --- a/doc/manuals/dtx.dot +++ b/doc/manuals/dtx.dot @@ -1,43 +1,68 @@ digraph dtx_dl_amr_fsm { - node [shape = doublecircle] ST_VOICE ST_FACCH_V ST_FACCH ST_SID_U + node [shape = doublecircle] ST_VOICE ST_FACCH ST_U_NOINH node [shape = circle] // default state for non-DTX and DTX when SPEECH is in progress ST_VOICE -> ST_SID_F1 [ label = "E_SID_F" ] - ST_VOICE -> ST_SID_F1 [ label = "E_SID_U" ] + ST_VOICE -> ST_F1_INH_V [ label = "E_INHIB" ] + ST_VOICE -> ST_U_NOINH [ label = "E_SID_U" ] ST_VOICE -> ST_VOICE [ label = "E_VOICE" ] ST_VOICE -> ST_VOICE [ label = "E_FACCH" ] // SID-FIRST or SID-FIRST-P1 in case of AMR HR: start of silence period (might be interrupted in case of AMR HR) ST_SID_F1 -> ST_SID_F1 [ label = "E_SID_F" ] - ST_SID_F1 -> ST_SID_U [ label = "E_SID_U" ] - ST_SID_F1 -> ST_VOICE [ label = "E_VOICE" ] - ST_SID_F1 -> ST_ONSET_F [ label = "E_FACCH" ] - ST_SID_F1 -> ST_SID_F2 [ label = "E_COMPL" ] - ST_SID_F1 -> ST_F1_INH [ label = "E_INHIB" ] + ST_SID_F1 -> ST_U_NOINH [ label = "E_SID_U" ] + ST_SID_F1 -> ST_F1_INH_F [ label = "E_FACCH" ] + ST_SID_F1 -> ST_SID_F2 [ label = "E_FIRST" ] ST_SID_F1 -> ST_ONSET_V [ label = "E_ONSET" ] // SID-FIRST P2 (only for AMR HR): actual start of silence period in case of AMR HR - ST_SID_F2 -> ST_SID_U [ label = "E_SID_U" ] - ST_SID_F2 -> ST_VOICE [ label = "E_VOICE" ] + ST_SID_F2 -> ST_U_NOINH [ label = "E_COMPL" ] ST_SID_F2 -> ST_ONSET_F [ label = "E_FACCH" ] ST_SID_F2 -> ST_ONSET_V [ label = "E_ONSET" ] - // SID-FIRST Inhibited: incoming SPEECH or FACCH (only for AMR HR) - ST_F1_INH -> ST_VOICE [ label = "E_VOICE" ] - ST_F1_INH -> ST_FACCH_V [ label = "E_FACCH" ] + // SID-FIRST Inhibited: incoming SPEECH (only for AMR HR) + ST_F1_INH_V -> ST_F1_INH_V_REC [ label = "E_COMPL" ] - // SID-UPDATE Inhibited: incoming SPEECH or FACCH (only for AMR HR) - ST_U_INH -> ST_VOICE [ label = "E_VOICE" ] - ST_U_INH -> ST_FACCH [ label = "E_FACCH" ] + // SID-FIRST Inhibited: incoming FACCH frame (only for AMR HR) + ST_F1_INH_F -> ST_F1_INH_F_REC [ label = "E_COMPL" ] - // Silence period with periodic comfort noise data updates - ST_SID_U -> ST_ONSET_F [ label = "E_FACCH" ] + // SID-UPDATE Inhibited: incoming SPEECH (only for AMR HR) + ST_U_INH_V -> ST_U_INH_V_REC [ label = "E_COMPL" ] + + // SID-UPDATE Inhibited: incoming FACCH frame (only for AMR HR) + ST_U_INH_F -> ST_U_INH_F_REC [ label = "E_COMPL" ] + + // Silence period with periodic comfort noise data updates (no Inhibition) + ST_U_NOINH -> ST_ONSET_F [ label = "E_FACCH" ] + ST_U_NOINH -> ST_VOICE [ label = "E_VOICE" ] + ST_U_NOINH -> ST_U_NOINH [ label = "E_SID_U" ] + ST_U_NOINH -> ST_U_NOINH [ label = "E_SID_F" ] + ST_U_NOINH -> ST_ONSET_V [ label = "E_ONSET" ] + ST_U_NOINH -> ST_SID_U [ label = "E_COMPL" ] + + // SID-FIRST Inhibition recursion in progress: Inhibit itself was already sent, now have to send the voice that caused it + ST_F1_INH_V_REC -> ST_VOICE [ label = "E_COMPL" ] + ST_F1_INH_V_REC -> ST_VOICE [ label = "E_VOICE" ] + + // SID-FIRST Inhibition recursion in progress: Inhibit itself was already sent, now have to send the voice that caused it + ST_F1_INH_F_REC -> ST_FACCH [ label = "E_COMPL" ] + ST_F1_INH_F_REC -> ST_FACCH [ label = "E_VOICE" ] + + // SID-UPDATE Inhibition recursion in progress: Inhibit itself was already sent, now have to send the voice that caused it + ST_U_INH_V_REC -> ST_VOICE [ label = "E_COMPL" ] + ST_U_INH_V_REC -> ST_VOICE [ label = "E_VOICE" ] + + // SID-UPDATE Inhibition recursion in progress: Inhibit itself was already sent, now have to send the voice that caused it + ST_U_INH_F_REC -> ST_FACCH [ label = "E_COMPL" ] + ST_U_INH_F_REC -> ST_FACCH [ label = "E_VOICE" ] + + // Silence period with periodic comfort noise data updates (can be inhibited) + ST_SID_U -> ST_U_INH_F [ label = "E_FACCH" ] ST_SID_U -> ST_VOICE [ label = "E_VOICE" ] - ST_SID_U -> ST_U_INH [ label = "E_INHIB" ] - ST_SID_U -> ST_SID_U [ label = "E_SID_U" ] - ST_SID_U -> ST_SID_U [ label = "E_SID_F" ] - ST_SID_U -> ST_ONSET_V [ label = "E_ONSET" ] + ST_SID_U -> ST_U_INH_V [ label = "E_INHIB" ] + ST_SID_U -> ST_U_NOINH [ label = "E_SID_U" ] + ST_SID_U -> ST_U_NOINH [ label = "E_SID_F" ] // ONSET - end of silent period due to incoming SPEECH frame ST_ONSET_V -> ST_ONSET_V_REC [ label = "E_COMPL" ] @@ -45,21 +70,16 @@ digraph dtx_dl_amr_fsm { // ONSET - end of silent period due to incoming FACCH frame ST_ONSET_F -> ST_ONSET_F_REC [ label = "E_COMPL" ] - // ONSET recursion in progress: ONSET itself was already sent, now have to send the voice that caused it - ST_ONSET_V_REC -> ST_VOICE [ label = "E_COMPL" ] - // ONSET recursion in progress: ONSET itself was already sent, now have to send the data that caused it ST_ONSET_F_REC -> ST_FACCH [ label = "E_COMPL" ] - // FACCH sending state: SPEECH was observed before so once we're done FSM should get back to VOICE state - ST_FACCH_V -> ST_FACCH_V [ label = "E_FACCH" ] - ST_FACCH_V -> ST_VOICE [ label = "E_VOICE" ] - ST_FACCH_V -> ST_VOICE [ label = "E_SID_U" ] - ST_FACCH_V -> ST_SID_F1 [ label = "E_SID_F" ] + // ONSET recursion in progress: ONSET itself was already sent, now have to send the voice that caused it + ST_ONSET_V_REC -> ST_VOICE [ label = "E_COMPL" ] - // FACCH sending state: no SPEECH was observed before so once we're done FSM should get back to silent period via SID-FIRST - ST_FACCH -> ST_FACCH [ label = "E_FACCH" ] + // FACCH sending state ST_FACCH -> ST_VOICE [ label = "E_VOICE" ] - ST_FACCH -> ST_SID_F1 [ label = "E_SID_U" ] - ST_FACCH -> ST_SID_F1 [ label = "E_SID_F" ] + ST_FACCH -> ST_FACCH [ label = "E_FACCH" ] + ST_FACCH -> ST_FACCH [ label = "E_SID_U" ] + ST_FACCH -> ST_FACCH [ label = "E_SID_F" ] + ST_FACCH -> ST_SID_F1 [ label = "E_COMPL" ] } diff --git a/doc/manuals/rtp-amr.adoc b/doc/manuals/rtp-amr.adoc index f7eda112..982a5af3 100644 --- a/doc/manuals/rtp-amr.adoc +++ b/doc/manuals/rtp-amr.adoc @@ -1322,10 +1322,25 @@ There is FSM implementing all the necessary states and transitions for DTX DL. include::dtx.dot[] ---- -The idea is that each state corresponds to the particular message type which have to be send to L1 while state transition happens on incoming events like FACCH or Voice frames. There are 3 different classes of of events driving this FSM: +The idea is that each state corresponds to the particular message type which have to be send to L1 next while state transition happens on incoming events like FACCH or Voice frames. There are 3 different classes of of events driving this FSM: * Voice frame types: E_VOICE, E_SID_U, E_SID_F * Incoming FACCH: E_FACCH * Internal: E_ONSET, E_INHIB, E_COMPL -They represent different types of incoming RTP frames (Voice, SID UPDATE and SID FIRST correspondingly), incoming FACCH events or important events internal to DTX operations. The latter are Onset (interruption of silence period), Inhibition (of currently transmitted SID FIRST or UPDATE) and Completion (of silence initiation). \ No newline at end of file +They represent different types of incoming RTP frames (Voice, SID UPDATE and SID FIRST correspondingly), incoming FACCH events or important events internal to DTX operations. The latter are Onset (interruption of silence period), Inhibition (of currently transmitted SID FIRST or UPDATE) and Completion (of silence initiation). + +The double-circled states are "stationary" meaning that FSM can stay for longer periods in them. Other states are "transient" - the FSM have to switch away during next step. In practice this is implemented using E_COMPL signal which is issued in corresponding RTS handler or internal function (in case of SID First P1 -> P2 transition). + +The FSM states are grouped as follows: + +* ST_VOICE: talkspurt, normal voice transmission +* ST_FACCH: transmission of higher-priority FACCH frame, interrupting current DTX state +* ST_ONSET*: handling of Onset event (interruption of silence period) +* ST_SID_F*: silence initiation +* ST_*_REC: sending of 2nd event for L1 during the same FN +* ST_*_INH: handling of Inhibition event (interruption of transmission of previous event) + +The latter are specific to AMR HR where transmission of particular message by L1 takes longer so it can be aborted due to another incoming event. Note that for AMR FR only subset of this FSM is active (ST_SID_F2 and *INH states are never reached). This is implemented by signal emitting functions. + +Note that the FSM states describe only the situation when we got to send something to L1, the transmission of Empty frames suppressing the actual radio transmission is done by other code. -- cgit v1.2.3 From 7000ef5dea6b80e09507c0f021df7ee5a7978fcb Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 2 May 2017 13:49:34 +0200 Subject: OsmoBTS/chapters/configuration.adoc: Add bts index in example Change-Id: If13643cdfa59c50b6af8ab0657635fed2ca219f0 --- doc/manuals/chapters/configuration.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index 980f835c..dbc7a29e 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -136,7 +136,7 @@ node of the OsmoBTS VTY. ---- OsmoBTS> enable OsmoBTS# configure terminal -OsmoBTS(config)# bts +OsmoBTS(config)# bts 0 OsmoBTS(bts)# trx 0 OsmoBTS(trx)# gsmtap-sapi sdcch OsmoBTS(trx)# write <1> @@ -167,7 +167,7 @@ OsmoBTS VTY. ---- OsmoBTS> enable OsmoBTS# configure terminal -OsmoBTS(config)# bts +OsmoBTS(config)# bts 0 OsmoBTS(bts)# trx 0 OsmoBTS(trx)# power-ramp max-initial 5 dBm OsmoBTS(trx)# power-ramp step-size 1 dB -- cgit v1.2.3 From 683b775c7a956bcfdf8ecb6e71a178c3adb11553 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Fri, 26 May 2017 12:52:28 +0200 Subject: OsmoBTS: Update osmotrx ip to diff between local and remote Change Id of the code implementation: I0bd34b7b02c1a9b0c6f6f89f327b486e5620c8d5 Change-Id: Ia4c70b3b8436e2647fc35d579a302dfbf32a83f0 --- doc/manuals/chapters/bts-models.adoc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index 1c619d3c..40a86e2e 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -226,8 +226,14 @@ human-readable format to current VTY session. ===== `osmotrx ip HOST` -Set the IP address of the OsmoTRX transceiver to which we should connect -to. +Set the IP address for the OsmoTRX interface for both the local (OsmoBTS) and +remote (OsmoTRX) side of the UDP flows. This option has been deprecated by the +more detailed option `osmotrx ip (local|remote) A.B.C.D`. + +===== `osmotrx ip (local|remote) A.B.C.D` + +Set the IP address for the OsmoTRX interface for either the local (OsmoBTS) or +remote (OsmoTRX) side of the UDP flows. ===== `osmotrx base-port (local|remote) <0-65535>` -- cgit v1.2.3 From fa53c9eafe39bf9f010cc32355281aedc31c812b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 18 Jul 2017 15:21:59 +0200 Subject: rtp-amr: Describe requirement to recieve all PH-DATA.ind events Change-Id: I4a78b3398c36a8107fa1809ba9b89235980f0e4f --- doc/manuals/rtp-amr-docinfo.xml | 8 ++++ doc/manuals/rtp-amr.adoc | 86 ++++++++++++++++++++++++----------------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/doc/manuals/rtp-amr-docinfo.xml b/doc/manuals/rtp-amr-docinfo.xml index fe5d6813..3f4de8d9 100644 --- a/doc/manuals/rtp-amr-docinfo.xml +++ b/doc/manuals/rtp-amr-docinfo.xml @@ -15,6 +15,14 @@ FSM added + + 3 + July 2017 + PE + + Add section and update sequence charts to describe requirement to receive all PH-DATA.ind events + + diff --git a/doc/manuals/rtp-amr.adoc b/doc/manuals/rtp-amr.adoc index 982a5af3..5f0f803e 100644 --- a/doc/manuals/rtp-amr.adoc +++ b/doc/manuals/rtp-amr.adoc @@ -14,6 +14,22 @@ back-haul towards the MGW. === TCH/AFS Uplink (MS to Network) +==== TCH/AFS Uplink: Initial Assumptions + +When a call is established, the BTS expects PH-DATA.ind (TCH) events to be +triggered by BTS-PHY at regular intervals and none of them being lost, even if +the MS is not transmitting at that time due to DTX. This requirement is +important as upper layers rely on this timing to update the RTP source clock at +a correct pace. Given an event from BTS-PHY is lost, the RTP source clock will +drift and this may be seen as steady increase of delay over time from the +receiver point of view. + +In the case of Nutaq GSM PHY and API, option fBFILevel is set to a ridiculously +low value -200 to ensure all indications are notified to upper layers, even if +no meaningful payload is available at that time. In this case, an empty payload +is delivered from PHY-BTS to BTS, which updates the clock without sending any +RTP packet. + ==== TCH/AFS Uplink: During Talk-Spurt During a talk-spurt, the system behaves identical to a system without @@ -83,14 +99,14 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)", id="ULSU2"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; @@ -133,7 +149,7 @@ msc { ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; @@ -147,49 +163,49 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; @@ -242,14 +258,14 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)", id="ULSO2"]; ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of speech frame N)"]; ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 5 of speech frame N + sub-block 1 of speech frame N+1)"]; @@ -333,14 +349,14 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH frame)"]; ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH frame)"]; ms => phy [label="L1 burst (block 3 of SID_ONSET + sub-block 3 of FACCH frame)"]; ms => phy [label="L1 burst (block 4 of SID_ONSET + sub-block 4 of FACCH frame)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 5 of FACCH frame + sub-block 1 of SID First frame)"]; @@ -734,7 +750,7 @@ msc { ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; @@ -772,11 +788,11 @@ msc { ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; @@ -786,36 +802,36 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 5+6 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 7+8 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; @@ -864,17 +880,17 @@ msc { ms -x phy [label="Suppressed L1 burst"]; ms -x phy [label="Suppressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of speech frame N)"]; ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; @@ -916,7 +932,7 @@ msc { ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N+1 + sub-block 2 of speech frame N+2)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N+2 + sub-block 1 of speech frame N+3)"]; @@ -948,17 +964,17 @@ msc { ms => phy [label="L1 burst (sub-block 1+2 of SID_UPDATE)"]; ms => phy [label="L1 burst (sub-block 3+4 of SID_UPDATE)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (block 1 of SID_UPD_INH + sub-block 1 of speech frame N)", id="SFU1"]; ms => phy [label="L1 burst (block 2 of SID_UPD_INH + sub-block 2 of speech frame N)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N + sub-block 1 of speech frame N+1)"]; ms => phy [label="L1 burst (sub-block 4 of speech frame N + sub-block 2 of speech frame N+1)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3 of speech frame N+1 + sub-block 1 of speech frame N+2)"]; @@ -985,17 +1001,17 @@ msc { ms -x phy [label="Supressed L1 burst"]; ms -x phy [label="Supressed L1 burst"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (block 1 of SID_ONSET + sub-block 1 of FACCH/H)"]; ms => phy [label="L1 burst (block 2 of SID_ONSET + sub-block 2 of FACCH/H)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 3+4 of FACCH/H)"]; ms => phy [label="L1 burst (sub-block 5+6 of FACCH/H)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms => phy [label="L1 burst (sub-block 7 of FACCH/H + sub-block 1 of SID_FIRST_P1)"]; @@ -1007,7 +1023,7 @@ msc { ms => phy [label="L1 burst (sub-block 3 of SID_FIRST_P1 + block 1 of SID_FIRST_P2)"]; ms => phy [label="L1 burst (sub-block 4 of SID_FIRST_P1 + block 2 of SID_FIRST_P2)"]; - phy -x bts [label="No PH-DATA.ind sent[BFI]"]; + phy => bts [label="PH-DATA.ind with empty payload"]; bts -x mgw [label="Suppressed RTP frame"]; ms -x phy [label="Supressed L1 burst"]; -- cgit v1.2.3 From eaef0af3a28ae5451a89d86233c92d10dec1ca24 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 18 Jul 2017 15:23:12 +0200 Subject: rtp-amr: Fix typo and trailing whitespace Change-Id: I8efda2387e0e5e95700b070dab8f8dd427fa562d --- doc/manuals/rtp-amr.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/rtp-amr.adoc b/doc/manuals/rtp-amr.adoc index 5f0f803e..4da2e1b3 100644 --- a/doc/manuals/rtp-amr.adoc +++ b/doc/manuals/rtp-amr.adoc @@ -1,7 +1,7 @@ = AMR-RTP in Combination with DTX The purpose of this document is to describe the sometimes quite -intricate interactions between a MS, the BTS-PHY and the BTS softare +intricate interactions between a MS, the BTS-PHY and the BTS software in case of AMR (Adaptive Multi Rate) codec and DTX (Discontinuous Transmission). @@ -760,7 +760,7 @@ msc { } ---- -ULSF1:: Only SID_FIRST_P1 contains information so it must be the only one transmitted over RTP. +ULSF1:: Only SID_FIRST_P1 contains information so it must be the only one transmitted over RTP. NOTE:: It has been observed that not all phones transmit SID_FIRST_P2 so the PH-DATA.ind GsmL1_TchPlType_Amr_SidFirstP2 is not guaranteed to be sent to the BTS. -- cgit v1.2.3 From 2283831b647bfa04094115ef293081c8ee250d0b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 19 Jul 2017 19:17:18 +0200 Subject: update osmo-bts-virtual documentation, now that code is merged Change-Id: Icd8706d29ca0e96cb89b7736dbb62f9ce159382d --- doc/manuals/chapters/bts-models.adoc | 53 ++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index 40a86e2e..5e510092 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -381,13 +381,32 @@ This is a special BTS model used for research, simulation and testing. Rather than communicating over a wireless RF interface, the GSM Um messages are encapsulated over GSMTAP/UDP/IP. -At the time of writing, this functionality is not fully completed. It -is the idea to adopt the OsmocomBB MS-side GSM implementation to -interface with this virtual Um interface, so that many instances of -virtual MS can connect to some instances of OsmoBTS, testing MS, BTS, -BSC and core network functionality. +The Virtual Um interface (i.e. virtual radio layer) between OsmoBTS and +OsmocomBB allows us to run a complete GSM network with 1-N BTSs and 1-M +MSs without any actual radio hardware, which is of course excellent for +all kinds of testing scenarios. -=== `osmo-bts-trx` specific VTY commands +The Virtual Um layer is based on sending L2 frames (blocks) encapsulated +via GSMTAP UDP multicast packets. There are two separate multicast +groups, one for uplink and one for downlink. The multicast nature +simulates the shared medium and enables any simulated phone to receive +the signal from multiple BTSs via the downlink multicast group. + +In OsmoBTS, this is implemented via the `osmo-bts-virtual` BTS model. + +Setting up OsmoBTS in its `osmo-bts-virtual` flavor isn't really much +different from setting it up with real hardware. The amount of required +configuration at the BTS configuration file is (as always) very minimal, +as in the GSM network architecture provides almost all relevant +configuration to the BTS from the BSC. + +An example configuratin file is provided as part of the osmo-bts source +code: `doc/examples/virtual/osmobts-virtual.cfg` + +For more information see +http://osmocom.org/projects/cellular-infrastructure/wiki/Virtual_Um + +=== `osmo-bts-virtual` specific VTY commands For a auto-generated complete syntax reference of the VTY commands, please see the associated _OsmoBTS VTY reference manual_ @@ -401,12 +420,22 @@ commands. Configure the network device used for sending/receiving the virtual Um interface messages (e.g. `eth0`). -===== `virtual-um udp-port <0-65535>` +===== `virtual-um ms-udp-port <0-65535>` + +Configure the UDP port used for sending virtual Um +downlink messages towards the MS (default: GSMTAP 4729). + +===== `virtual-um ms-multicast-group GROUP` + +Configure the IP multicast group used for sending virtual +Um downlink messages towards the MS (default: 239.193.23.1) + +===== `virtual-um bts-udp-port <0-65535>` -Configure the UDP port used for sending/receiving the virtual Um -interface messages (default: GSMTAP 2775). +Configure the UDP port used for receiving virtual Um +uplink messages from the MS (default: GSMTAP 4729). -===== `virtual-um multicast-group GROUP` +===== `virtual-um bts-multicast-group GROUP` -Configure the IP multicast group used for sending/receiving the virtual -Um interface messages. +Configure the IP multicast group used for receiving virtual +Um uplink messages from the MS (default: 239.193.23.2) -- cgit v1.2.3 From ea9d5b9499793cdc920c1a5a238f8d4e61ae3945 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 31 Aug 2017 16:32:40 +0200 Subject: Allow easily disabling GFDL references All parts referencing GFDL can be easily disabled by removing the 'gfdl-enabled' attribute from the document. Change-Id: I2489726ad2e90301bceadfada926e31ae0f85986 --- doc/manuals/osmobts-abis.adoc | 2 ++ doc/manuals/osmobts-usermanual.adoc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/doc/manuals/osmobts-abis.adoc b/doc/manuals/osmobts-abis.adoc index 930cbfb2..1e02414d 100644 --- a/doc/manuals/osmobts-abis.adoc +++ b/doc/manuals/osmobts-abis.adoc @@ -1,3 +1,5 @@ +:gfdl-enabled: + OsmoBTS Abis Protocol Specification =================================== Neels Hofmeyr diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc index 4d47b1c3..d746d853 100644 --- a/doc/manuals/osmobts-usermanual.adoc +++ b/doc/manuals/osmobts-usermanual.adoc @@ -1,3 +1,5 @@ +:gfdl-enabled: + OsmoBTS User Manual =================== Harald Welte -- cgit v1.2.3 From 0a421119c89c9afb19965eaca7cda5faebab9906 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 19 Oct 2017 05:11:57 +0200 Subject: refactor Makefile build rules, don't use the FORCE The initial goal was to make sure we don't have overall FORCE rules causing unnecessary rebuilds -- annoying while writing documentation. As I looked through possible dependencies, I finally understood what's going on here. Remove code dup and nicely sort which belongs where in build/Makefile.*.inc. In each, describe in a top comment how to use it, and also unify how they are used: - Rename Makefile.inc to Makefile.docbook.inc and refactor - Add Makefile.vty-reference.inc - Add Makefile.common.inc Make sure that we accurately pick up all dependencies. Drop use of the macro called 'command', that silenced the actual command lines invoked and replaced them with short strings: it obscures what is actually going on and makes the Makefiles hard to read and understand. Each manual's makefile is greatly reduced to few definitions and a Makefile include, e.g. one for asciidoc, one for VTY reference. Move common/bsc_vty_additions.xml to OsmoBSC/vty/libbsc_vty_additions.xml, link from OsmoNITB. It applies only to OsmoBSC and OsmoNITB. Add a script that combines a VTY reference file with *all* additions files found in a manual's vty/ dir. Call this from Makefile.vty-reference.inc. Change-Id: I9758e04162a480e28c7dc83475b514cf7fd25ec0 --- doc/manuals/Makefile | 52 +++++++--------------------------------------------- 1 file changed, 7 insertions(+), 45 deletions(-) diff --git a/doc/manuals/Makefile b/doc/manuals/Makefile index 58df0e32..e1ff2147 100644 --- a/doc/manuals/Makefile +++ b/doc/manuals/Makefile @@ -1,50 +1,12 @@ -# XSL stylesheets downloaded from http://docbook.sourceforge.net/release/xsl/current/html/ -# Makefile from BitBake/OpenEmbedded manuals - -EXTRA_DEPS = gen-bts-vty-docbook - -topdir = . -bts_reference = $(topdir)/osmobts-vty-reference.xml -manuals = $(bts_reference) -# types = pdf txt rtf ps xhtml html man tex texi dvi -# types = pdf txt -types = $(docbooktotypes) -docbooktotypes = pdf -# htmlcssfile = -# htmlcss = - -TOPDIR := .. -ASCIIDOCS := osmobts-usermanual osmobts-abis rtp-amr +TOPDIR = .. +ASCIIDOC = osmobts-usermanual.adoc osmobts-abis.adoc rtp-amr.adoc include $(TOPDIR)/build/Makefile.asciidoc.inc -include $(TOPDIR)/build/Makefile.inc - -osmobts-abis.pdf: abis/*.adoc abis/*.msc osmobts-usermanual.pdf: chapters/*.adoc +osmobts-abis.pdf: abis/*.adoc abis/*.msc +rtp-amr.pdf: dtx.dot -clean: - -rm -rf $(cleanfiles) - -rm osmobts-abis__*.png - -rm osmobts-abis__*.svg - -rm rtp-amr__*.png - -rm rtp-amr__*.svg - -rm osmobts-usermanual__*.png - -rm osmobts-usermanual__*.svg - -rm osmobts-abis*.check - -rm osmobts-usermanual*.check +VTY_REFERENCE = osmobts-vty-reference.xml +include $(TOPDIR)/build/Makefile.vty-reference.inc -gen-bts-vty-docbook: FORCE - $(call command,xsltproc -o generated/combined1.xml \ - --stringparam with $(PWD)/../common/vty_additions.xml \ - $(MERGE_DOC) vty/bts_vty_reference.xml, \ - XSLTPROC,Merging Common VTY) - $(call command,xsltproc -o generated/combined2.xml \ - --stringparam with $(PWD)/../common/ns_vty_additions.xml \ - $(MERGE_DOC) generated/combined1.xml, \ - XSLTPROC,Merging Common NS VTY) - $(call command,xsltproc -o generated/combined3.xml \ - --stringparam with $(PWD)/vty/bts_vty_additions.xml \ - $(MERGE_DOC) generated/combined2.xml, \ - XSLTPROC,Merging BTS VTY) - $(call command,xsltproc ../vty_reference.xsl generated/combined3.xml > generated/docbook_vty.xml, \ - XSLTPROC,Converting BTS VTY to DocBook) +include $(TOPDIR)/build/Makefile.common.inc -- cgit v1.2.3 From 446f368fd015d07076815ab27e9c275c3a12131b Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 6 Mar 2018 14:45:09 +0100 Subject: OsmoBTS: bts-models: Add Lime Microsystems devices as supported osmo-trx Also take the chance to remove uneeded extra whitespace in surrounding text. Change-Id: I739e4dfba7c649a74cf67d6bbe6f74b22e7e24f0 --- doc/manuals/chapters/bts-models.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index 5e510092..fe06c040 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -182,7 +182,7 @@ Got message: SET_REPLY 1 trx.0.clock-correction success == `osmo-bts-trx` for OsmoTRX OsmoTRX is a C-language implementation of the GSM radio modem, -originally developed as the 'Transceiver' part of OpenBTS. This radio +originally developed as the 'Transceiver' part of OpenBTS. This radio modem offers an interface based on top of UDP streams. The OsmoBTS bts_model code for OsmoTRX is called @@ -190,10 +190,10 @@ The OsmoBTS bts_model code for OsmoTRX is called OsmoTRX, so both parts can be used together to implement a complete GSM BTS based on general-purpose computing SDR. -As OsmoTRX is general-purpose software running on top of Linux, it is -thus not tied to any specific physical hardware. At the time of this -writing, OsmoTRX supports a variety of Ettus USRP SDRs via the UHD -driver, as well as the Fairwaves UmTRX and derived products. +As OsmoTRX is general-purpose software running on top of Linux, it is thus not +tied to any specific physical hardware. At the time of this writing, OsmoTRX +supports a variety of Lime Microsystems and Ettus USRP SDRs via the UHD driver, +as well as the Fairwaves UmTRX and derived products. OsmoTRX is not a complete GSM PHY but 'just' the radio modem. This means that all of the Layer 1 functionality such as scheduling, -- cgit v1.2.3 From 035d209809410507b0da958e325da2b80d993c33 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 6 Mar 2018 17:13:13 +0100 Subject: Introduce chapter trx_if.adoc and add it to OsmoTRX and OsmoBTS This chapter defines the protocol used between osmo-trx and osmo-bts-trx. Most of the text comes originally from osmo-trx.git/README, as it's the only known documentation of the protocol other than the code itself. Change-Id: I56c418eef0f826ae1aadbed5b151fbed241c7885 --- doc/manuals/osmobts-usermanual.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/manuals/osmobts-usermanual.adoc b/doc/manuals/osmobts-usermanual.adoc index d746d853..07f88e28 100644 --- a/doc/manuals/osmobts-usermanual.adoc +++ b/doc/manuals/osmobts-usermanual.adoc @@ -26,6 +26,8 @@ include::chapters/bts-models.adoc[] include::chapters/architecture.adoc[] +include::../common/chapters/trx_if.adoc[] + include::../common/chapters/control_if.adoc[] include::../common/chapters/port_numbers.adoc[] @@ -35,4 +37,3 @@ include::../common/chapters/bibliography.adoc[] include::../common/chapters/glossary.adoc[] include::../common/chapters/gfdl.adoc[] - -- cgit v1.2.3 From 094b22ea82acc1297d38744c86c198d90c66e288 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 17 Mar 2018 14:15:38 +0100 Subject: vty-ref: Update URI of docbook 5.0 schema ... to match the /etc/xml/catalog file on debian (no "www" in hostname) Change-Id: Id9f3579c7f2bc3af13fe30b5268f249b6f59ed0d --- doc/manuals/osmobts-vty-reference.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manuals/osmobts-vty-reference.xml b/doc/manuals/osmobts-vty-reference.xml index 0d0454ab..f4048434 100644 --- a/doc/manuals/osmobts-vty-reference.xml +++ b/doc/manuals/osmobts-vty-reference.xml @@ -3,8 +3,8 @@ ex:ts=2:sw=42sts=2:et -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- --> - ]> -- cgit v1.2.3 From 9bcda3742dcab79663cc0faccb4d686ec7d61b05 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 5 Jul 2018 18:20:57 +0200 Subject: bts: Fix typo Change-Id: I47758acec07a587730552a9c46dc02976c807d9a --- doc/manuals/chapters/bts-models.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/chapters/bts-models.adoc b/doc/manuals/chapters/bts-models.adoc index fe06c040..4ae73c0b 100644 --- a/doc/manuals/chapters/bts-models.adoc +++ b/doc/manuals/chapters/bts-models.adoc @@ -6,7 +6,7 @@ _hardware-specific_ parts for each BTS model. The hardware specific parts are generally referred to as the _bts_model_ code. The common part includes the core BTS architecture as well as code for -implementing the external interfaces such Abis, control, PCU socket and +implementing the external interfaces such as Abis, control, PCU socket and GSMTAP. The bts_model parts include support for driving one particular -- cgit v1.2.3 From 473be4f89f9f582ba78203e602acafab4748d5c3 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Sun, 21 Oct 2018 16:58:14 +0200 Subject: OsmoBTS: Print VTY command in fixed-width font Surrounding with '@' didn't seem to yield the intended result, the charactars appeared in the compiled document. Change-Id: I66e7949fa4a6c2164bf9572a2beaf8ace169fa1c --- doc/manuals/chapters/interfaces.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/chapters/interfaces.adoc b/doc/manuals/chapters/interfaces.adoc index 127d4dc5..9fefa729 100644 --- a/doc/manuals/chapters/interfaces.adoc +++ b/doc/manuals/chapters/interfaces.adoc @@ -152,5 +152,5 @@ direct interface by which the PCU can exchange those primitives directly with the PHY. The default PCU socket interface name is `/tmp/pcu_sock`, but this can -be overridden by the @pcu-socket@ VTY command in the BTS configuration +be overridden by the `pcu-socket` VTY command in the BTS configuration VTY node. -- cgit v1.2.3 From b7eaf282dd60d20a9bbe7ff2309b0213c3f7e71f Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Sun, 21 Oct 2018 18:09:56 +0200 Subject: OsmoBTS: Fix typo Change-Id: I0a4c9f052f14816e88ed0a4a5fff9b3854da195a --- doc/manuals/chapters/configuration.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index dbc7a29e..558bd4ba 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -4,7 +4,7 @@ The role of the BTS is to handle the GSM radio interface. When the BTS application is starting, the A-bis OML connection is established towards the BSC. Almost all BTS configuration (such as ARFCN, channel configuration, transmit power, etc.) will be sent from the BSC to the -BTS via OML messages. After OML start-up has competed, the BSC will +BTS via OML messages. After OML start-up has completed, the BSC will instruct the BTS to establish the RSL connections. Given that most configuration is downloaded from the BSC into the BTS at -- cgit v1.2.3