fixeria submitted this change.
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(-)
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 change 38751. To unsubscribe, or for help writing mail filters, visit settings.