fixeria has uploaded this change for review.

View Change

csd_v110: use osmo_csd_chan_mode_rate_desc[] from libosmogsm

Change-Id: I1e16a1f8142ff3cf0e26e16316fde4c42082ad54
Depends: libosmocore.git Ie230e09d496c9b791981d8ee04902fc9966ed6d7
Related: OS#1572
---
M include/osmo-bts/csd_v110.h
M src/common/csd_v110.c
M tests/csd/csd_test.c
3 files changed, 33 insertions(+), 60 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/24/35924/1
diff --git a/include/osmo-bts/csd_v110.h b/include/osmo-bts/csd_v110.h
index f6be0ae..b80f95d 100644
--- a/include/osmo-bts/csd_v110.h
+++ b/include/osmo-bts/csd_v110.h
@@ -5,18 +5,6 @@

struct gsm_lchan;

-struct csd_v110_frame_desc {
- uint16_t num_blocks;
- uint16_t num_bits;
-};
-
-struct csd_v110_lchan_desc {
- struct csd_v110_frame_desc fr;
- struct csd_v110_frame_desc hr;
-};
-
-extern const struct csd_v110_lchan_desc csd_v110_lchan_desc[256];
-
int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp,
const uint8_t *data, size_t data_len);
int csd_v110_rtp_decode(const struct gsm_lchan *lchan, uint8_t *data,
diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c
index 5046d6e..79cfe97 100644
--- a/src/common/csd_v110.c
+++ b/src/common/csd_v110.c
@@ -32,32 +32,6 @@
#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) */
- .fr = { .num_blocks = 1, .num_bits = 290 },
- },
-#endif
- [GSM48_CMODE_DATA_12k0] = {
- /* TCH/F9.6: 4 * 60 bits every 20 ms (12.0 kbit/s) */
- .fr = { .num_blocks = 4, .num_bits = 60 },
- },
- [GSM48_CMODE_DATA_6k0] = {
- /* TCH/F4.8: 2 * 60 bits every 20 ms (6.0 kbit/s) */
- .fr = { .num_blocks = 2, .num_bits = 60 },
- /* TCH/H4.8: 4 * 60 bits every 40 ms (6.0 kbit/s) */
- .hr = { .num_blocks = 4, .num_bits = 60 },
- },
- [GSM48_CMODE_DATA_3k6] = {
- /* TCH/F2.4: 2 * 36 bits every 20 ms (3.6 kbit/s) */
- .fr = { .num_blocks = 2, .num_bits = 36 },
- /* TCH/H2.4: 4 * 36 bits every 40 ms (3.6 kbit/s) */
- .hr = { .num_blocks = 4, .num_bits = 36 },
- },
-};
-
/* 3GPP TS 44.021, Figure 4: Coding of data rates (E1/E2/E3 bits) */
static const uint8_t e1e2e3_map[_LCHAN_CSD_M_NUM][3] = {
[LCHAN_CSD_M_T_600] = { 1, 0, 0 },
@@ -76,28 +50,28 @@
int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp,
const uint8_t *data, size_t data_len)
{
- const struct csd_v110_frame_desc *desc;
+ const struct osmo_csd_tch_block_desc *desc;
ubit_t ra_bits[80 * 4];

- OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc));
+ OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(osmo_csd_chan_mode_rate_desc));
if (lchan->type == GSM_LCHAN_TCH_F)
- desc = &csd_v110_lchan_desc[lchan->tch_mode].fr;
+ desc = &osmo_csd_chan_mode_rate_desc[lchan->tch_mode].fr;
else
- desc = &csd_v110_lchan_desc[lchan->tch_mode].hr;
- if (OSMO_UNLIKELY(desc->num_blocks == 0))
+ desc = &osmo_csd_chan_mode_rate_desc[lchan->tch_mode].hr;
+ if (OSMO_UNLIKELY(desc->num_frames == 0))
return -ENOTSUP;

/* handle empty/incomplete Uplink frames gracefully */
- if (OSMO_UNLIKELY(data_len < (desc->num_blocks * desc->num_bits))) {
+ if (OSMO_UNLIKELY(data_len < (desc->num_frames * desc->num_bits))) {
/* encode N idle frames as per 3GPP TS 44.021, section 8.1.6 */
memset(&ra_bits[0], 0x01, sizeof(ra_bits));
- for (unsigned int i = 0; i < desc->num_blocks; i++)
+ for (int i = 0; i < desc->num_frames; i++)
memset(&ra_bits[i * 80], 0x00, 8); /* alignment pattern */
goto ra1_ra2;
}

/* RA1'/RA1: convert from radio rate to an intermediate data rate */
- for (unsigned int i = 0; i < desc->num_blocks; i++) {
+ for (int i = 0; i < desc->num_frames; i++) {
struct osmo_v110_decoded_frame df;

/* convert a V.110 36-/60-bit frame to a V.110 80-bit frame */
@@ -124,7 +98,7 @@

ra1_ra2:
/* RA1/RA2: convert from an intermediate rate to 64 kbit/s */
- if (desc->num_blocks == 4) {
+ if (desc->num_frames == 4) {
/* 4 * 80 bits (16 kbit/s) => 2 bits per octet */
for (unsigned int i = 0, j = 0; i < RFC4040_RTP_PLEN; i++) {
rtp[i] = (0xff >> 2);
@@ -145,22 +119,22 @@
int csd_v110_rtp_decode(const struct gsm_lchan *lchan, uint8_t *data,
const uint8_t *rtp, size_t rtp_len)
{
- const struct csd_v110_frame_desc *desc;
+ const struct osmo_csd_tch_block_desc *desc;
ubit_t ra_bits[80 * 4];

- OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc));
+ OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(osmo_csd_chan_mode_rate_desc));
if (lchan->type == GSM_LCHAN_TCH_F)
- desc = &csd_v110_lchan_desc[lchan->tch_mode].fr;
+ desc = &osmo_csd_chan_mode_rate_desc[lchan->tch_mode].fr;
else
- desc = &csd_v110_lchan_desc[lchan->tch_mode].hr;
- if (OSMO_UNLIKELY(desc->num_blocks == 0))
+ desc = &osmo_csd_chan_mode_rate_desc[lchan->tch_mode].hr;
+ if (OSMO_UNLIKELY(desc->num_frames == 0))
return -ENOTSUP;

if (OSMO_UNLIKELY(rtp_len != RFC4040_RTP_PLEN))
return -EINVAL;

/* RA1/RA2: convert from 64 kbit/s to an intermediate rate */
- if (desc->num_blocks == 4) {
+ if (desc->num_frames == 4) {
/* 4 * 80 bits (16 kbit/s) => 2 bits per octet */
for (unsigned int i = 0, j = 0; i < RFC4040_RTP_PLEN; i++) {
ra_bits[j++] = (rtp[i] >> 7);
@@ -173,7 +147,7 @@
}

/* RA1'/RA1: convert from an intermediate rate to radio rate */
- for (unsigned int i = 0; i < desc->num_blocks; i++) {
+ for (int i = 0; i < desc->num_frames; i++) {
struct osmo_v110_decoded_frame df;

/* convert a V.110 80-bit frame to a V.110 36-/60-bit frame */
@@ -184,5 +158,5 @@
osmo_csd_3k6_encode_frame(&data[i * 36], 36, &df);
}

- return desc->num_blocks * desc->num_bits;
+ return desc->num_frames * desc->num_bits;
}
diff --git a/tests/csd/csd_test.c b/tests/csd/csd_test.c
index 466ff88..b1c03a1 100644
--- a/tests/csd/csd_test.c
+++ b/tests/csd/csd_test.c
@@ -81,21 +81,21 @@

static void exec_test_case(const struct test_case *tc)
{
- const struct csd_v110_frame_desc *desc;
+ const struct osmo_csd_tch_block_desc *desc;
uint8_t rtp[RFC4040_RTP_PLEN] = { 0 };
ubit_t data_enc[BBUF_MAX];
ubit_t data_dec[BBUF_MAX];
int rc;

/* obtain a V.110 frame description for the given channel type/rate */
- OSMO_ASSERT(tc->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc));
+ OSMO_ASSERT(tc->tch_mode < ARRAY_SIZE(osmo_csd_chan_mode_rate_desc));
if (tc->lchan_type == GSM_LCHAN_TCH_F)
- desc = &csd_v110_lchan_desc[tc->tch_mode].fr;
+ desc = &osmo_csd_chan_mode_rate_desc[tc->tch_mode].fr;
else
- desc = &csd_v110_lchan_desc[tc->tch_mode].hr;
+ desc = &osmo_csd_chan_mode_rate_desc[tc->tch_mode].hr;

/* total number of bits carried by a radio interface block */
- const unsigned int bit_num = desc->num_bits * desc->num_blocks;
+ const unsigned int bit_num = desc->num_bits * desc->num_frames;
if (bit_num == 0) {
fprintf(stderr, "[i] Skipping '%s' (not implemented)\n", tc->name);
return;

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

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