fixeria has submitted this change. (
https://gerrit.osmocom.org/c/osmo-bts/+/38751?usp=email )
Change subject: csd_v110: handle TCH/F14.4
......................................................................
csd_v110: handle TCH/F14.4
Thanks to the work done by Mychaela (see the related Change-IDs), we
can finally implement handling of TCH/F14.4 (both T and NT modes) for
osmo-bts-trx and osmo-bts-virtual.
This channel mode is special in a way that it employs a different
rate adaptation function RAA' (defined in 3GPP TS 48.020 chapter 11),
which converts between between 290-bit blocks used on Um and Abis-E1
interfaces (E-TRAU frames on the latter) and A-TRAU frames spoken
over the A interface.
The result of function RAA' in the Uplink direction is 320 bits,
which is equal to 4 x 80-bit V.110 frames, but actually carrying
8 x 36-bit packed frames. These 320 bits are then fed to the RA2
function, like we do for other CSD channel modes.
Change-Id: I3c3bef0bd2f72b8381597b5699e2060165b702a0
Depends: libosmo-abis.git I11fc1529f5be88fa778c7e05cb11eef58a389d40
Depends: libosmo-abis.git I1347a25ce97d5022502ee9112caded66315b09a4
Related: OS#6167
---
M TODO-RELEASE
M src/common/bts.c
M src/common/csd_v110.c
M src/osmo-bts-trx/main.c
M src/osmo-bts-virtual/main.c
M tests/csd/csd_test.c
M tests/csd/csd_test.err
7 files changed, 59 insertions(+), 11 deletions(-)
Approvals:
pespin: Looks good to me, but someone else must approve
fixeria: Looks good to me, approved
falconia: Looks good to me, but someone else must approve
Jenkins Builder: Verified
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 81aa834..ac45e9f 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,4 @@
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
libosmotrau >1.6.0 osmo_csd_ra2_{16k,8k}_{pack,unpack}() API
+libosmotrau >1.6.0 osmo_csd144_{to,from}_atrau_bits() API
diff --git a/src/common/bts.c b/src/common/bts.c
index 633e0d1..282d730 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -896,8 +896,8 @@
switch (bts->variant) {
case BTS_OSMO_TRX:
switch (cm->chan_rate) {
- /* TODO: RSL_CMOD_CSD_NT_14k5 */
- /* TODO: RSL_CMOD_CSD_T_14k4 */
+ case RSL_CMOD_CSD_NT_14k5:
+ case RSL_CMOD_CSD_T_14k4:
case RSL_CMOD_CSD_NT_12k0:
case RSL_CMOD_CSD_T_9k6:
if (cm->chan_rt != RSL_CMOD_CRT_TCH_Bm)
diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c
index 9bbc5fe..9ba3df3 100644
--- a/src/common/csd_v110.c
+++ b/src/common/csd_v110.c
@@ -30,13 +30,13 @@
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/isdn/v110.h>
#include <osmocom/trau/csd_ra2.h>
+#include <osmocom/trau/csd_raa_prime.h>
#include <osmo-bts/csd_v110.h>
#include <osmo-bts/lchan.h>
/* key is enum gsm48_chan_mode, so assuming a value in range 0..255 */
const struct csd_v110_lchan_desc csd_v110_lchan_desc[256] = {
-#if 0
[GSM48_CMODE_DATA_14k5] = {
/* TCH/F14.4: 8 * 36 + 2 bits every 20 ms (14.5 kbit/s) */
.num_frames = 8,
@@ -44,7 +44,6 @@
.num_other_bits = 2, /* M-bits */
.ra2_ir = 16,
},
-#endif
[GSM48_CMODE_DATA_12k0] = {
/* TCH/F9.6: 4 * 60 bits every 20 ms (12.0 kbit/s) */
.num_frames = 4,
@@ -92,6 +91,32 @@
if (OSMO_UNLIKELY(desc->num_frames == 0))
return -ENOTSUP;
+ /* TCH/F14.4 is special: RAA' function is employed */
+ if (lchan->tch_mode == GSM48_CMODE_DATA_14k5) {
+ /* 3GPP TS 44.021, section 10.3 "TCH/F14.4 channel coding"
+ * 3GPP TS 48.020, chapter 11 "THE RAA' FUNCTION" */
+ const ubit_t *m_bits = &data[0]; /* M-bits */
+ const ubit_t *d_bits = &data[2]; /* D-bits */
+ ubit_t c4, c5;
+
+ /* 3GPP TS 48.020, Table 3
+ * | C4 | Date Rate |
+ * | =1 | 14,4 kbit/s |
+ * | =0 | 14.4 kbit/s idle (IWF to BSS only) | */
+ c4 = 1;
+ /* 3GPP TS 48.020, Table 4
+ * | C5 | BSS to IWF FT | IWF to BSS UFE |
+ * | =1 | idle | framing error |
+ * | =0 | data | no framing error | */
+ c5 = 0;
+
+ /* Unless there is a bug, it's highly unlikely */
+ OSMO_ASSERT(data_len == CSD_V110_NUM_BITS(desc));
+
+ osmo_csd144_to_atrau_bits(&ra_bits[0], m_bits, d_bits, c4, c5);
+ goto ra1_ra2;
+ }
+
/* handle empty/incomplete Uplink frames gracefully */
if (OSMO_UNLIKELY(data_len < CSD_V110_NUM_BITS(desc))) {
/* encode N idle frames as per 3GPP TS 44.021, section 8.1.6 */
@@ -178,6 +203,18 @@
else /* desc->ra2_ir == 8 */
osmo_csd_ra2_8k_unpack(&ra_bits[0], &rtp[0], RFC4040_RTP_PLEN);
+ /* TCH/F14.4 is special: RAA' function is employed */
+ if (lchan->tch_mode == GSM48_CMODE_DATA_14k5) {
+ /* 3GPP TS 44.021, section 10.3 "TCH/F14.4 channel coding"
+ * 3GPP TS 48.020, chapter 11 "THE RAA' FUNCTION" */
+ ubit_t *m_bits = &data[0]; /* M-bits */
+ ubit_t *d_bits = &data[2]; /* D-bits */
+ int rc;
+
+ rc = osmo_csd144_from_atrau_bits(m_bits, d_bits, NULL, NULL, &ra_bits[0]);
+ return rc == 0 ? CSD_V110_NUM_BITS(desc) : rc;
+ }
+
/* RA1'/RA1: convert from an intermediate rate to radio rate */
for (unsigned int i = 0; i < desc->num_frames; i++) {
struct osmo_v110_decoded_frame df;
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index ddc4428..c870dfb 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -196,9 +196,6 @@
trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH
| NM_IPAC_MASK_CHANM_CSD_NT
| NM_IPAC_MASK_CHANM_CSD_T;
- /* TODO: missing rate adaptation for TCH/F14.4 (see OS#6167) */
- trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_T_14k4;
- trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_NT_14k4;
/* The nominal value for each TRX is later overwritten through VTY cmd
* 'nominal-tx-power' if present, otherwise through TRXC cmd NOMTXPOWER.
diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c
index 82becc3..932005c 100644
--- a/src/osmo-bts-virtual/main.c
+++ b/src/osmo-bts-virtual/main.c
@@ -99,9 +99,6 @@
trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH
| NM_IPAC_MASK_CHANM_CSD_NT
| NM_IPAC_MASK_CHANM_CSD_T;
- /* TODO: missing rate adaptation for TCH/F14.4 (see OS#6167) */
- trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_T_14k4;
- trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_NT_14k4;
return 0;
}
diff --git a/tests/csd/csd_test.c b/tests/csd/csd_test.c
index c46bbd9..ad78162 100644
--- a/tests/csd/csd_test.c
+++ b/tests/csd/csd_test.c
@@ -145,6 +145,10 @@
i, data_dec[i], data_enc[i]);
}
+ /* for TCH/F14.4, we always expect a valid block */
+ if (tc->tch_mode == GSM48_CMODE_DATA_14k5)
+ return;
+
fprintf(stderr, "[i] Testing '%s' (IDLE)\n", tc->name);
/* encode an idle RTP frame and print it */
diff --git a/tests/csd/csd_test.err b/tests/csd/csd_test.err
index 1d7a9cf..cb1eac2 100644
--- a/tests/csd/csd_test.err
+++ b/tests/csd/csd_test.err
@@ -1,4 +1,16 @@
-[i] Skipping 'TCH/F14.4' (not implemented)
+[i] Testing 'TCH/F14.4' (bitnum=290)
+[i] csd_v110_rtp_encode() returns 160
+ 3f 3f 3f 3f 3f 3f 3f 3f bf ff bf 7f bf bf bf bf
+ bf bf bf bf bf bf bf bf bf bf bf bf bf bf ff 7f
+ 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f
+ 7f bf bf bf bf bf bf bf bf bf bf bf bf bf bf bf
+ bf bf bf ff 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f
+ 7f 7f 7f 7f 7f 7f bf bf bf bf bf bf bf bf bf bf
+ bf bf bf bf bf bf bf bf ff 7f 7f 7f 7f 7f 7f 7f
+ 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f bf bf bf bf bf
+ bf bf bf bf bf bf bf bf bf bf bf bf bf ff 7f 7f
+ 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f
+[i] csd_v110_rtp_decode() returns 290
[i] Testing 'TCH/F9.6' (bitnum=240)
[i] csd_v110_rtp_encode() returns 160
3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/38751?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I3c3bef0bd2f72b8381597b5699e2060165b702a0
Gerrit-Change-Number: 38751
Gerrit-PatchSet: 5
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: falconia <falcon(a)freecalypso.org>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>