fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/38751?usp=email )
Change subject: csd_v110: handle TCH/F14.4 ......................................................................
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; }