fixeria has uploaded this change for review.

View Change

csd_v110: handle TCH/F14.4

Change-Id: I3c3bef0bd2f72b8381597b5699e2060165b702a0
Depends: libosmo-abis.git I11fc1529f5be88fa778c7e05cb11eef58a389d40
Depends: libosmo-abis.git I1347a25ce97d5022502ee9112caded66315b09a4
---
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
4 files changed, 43 insertions(+), 10 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/51/38751/1
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 f60624f..a1dde76 100644
--- a/src/common/csd_v110.c
+++ b/src/common/csd_v110.c
@@ -30,20 +30,19 @@
#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: 290 bits every 20 ms (14.5 kbit/s) */
.num_blocks = 1,
.num_bits = 290,
.ra2_ir = 16,
},
-#endif
[GSM48_CMODE_DATA_12k0] = {
/* TCH/F9.6: 4 * 60 bits every 20 ms (12.0 kbit/s) */
.num_blocks = 4,
@@ -91,6 +90,32 @@
if (OSMO_UNLIKELY(desc->num_blocks == 0))
return -ENOTSUP;

+ if (lchan->tch_mode == GSM48_CMODE_DATA_14k5) {
+ /* XXX: TCH/F14.4 is special: RAA' function
+ * 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;
+
+ if (OSMO_UNLIKELY(data_len < (desc->num_blocks * desc->num_bits)))
+ return -EINVAL; /* FIXME */
+
+ /* 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;
+
+ 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 < (desc->num_blocks * desc->num_bits))) {
/* encode N idle frames as per 3GPP TS 44.021, section 8.1.6 */
@@ -177,6 +202,20 @@
else /* desc->ra2_ir == 8 */
osmo_csd_ra2_8k_unpack(&ra_bits[0], &rtp[0], RFC4040_RTP_PLEN);

+ if (lchan->tch_mode == GSM48_CMODE_DATA_14k5) {
+ /* XXX: TCH/F14.4 is special: RAA' function
+ * 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]);
+ if (rc)
+ return rc;
+ return desc->num_blocks * desc->num_bits;
+ }
+
/* RA1'/RA1: convert from an intermediate rate to radio rate */
for (unsigned int i = 0; i < desc->num_blocks; 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;
}

To view, visit change 38751. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I3c3bef0bd2f72b8381597b5699e2060165b702a0
Gerrit-Change-Number: 38751
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>