fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/35924?usp=email )
Change subject: csd_v110: use osmo_csd_chan_mode_rate_desc[] from libosmogsm ......................................................................
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;