diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-07-25 05:35:02 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-07-30 20:29:12 +0700 |
commit | ca418643b387bda2b7529445851900a3779573c8 (patch) | |
tree | 982c87d2b538ac5bf25b6bb6beb1659718eb612f | |
parent | d1f8f3429cc77361ade0176f801acd979d3c5ca1 (diff) |
csd_v110_rtp_encode(): properly set E1/E2/E3 bits
The E1/E2/E3 bits are set based on out-of-band knowledge of the
current user data rate. The actual bit values are defined in
3GPP TS 44.021, Figure 4 "Coding of data rates".
TODO: this is only valid for transparent services,
for non-transparent services see 3GPP TS 48.020.
TODO: lchan->csd_mode is never set to the actual CSD mode...
Change-Id: I1a14597dff746cf975140b294400a2cc05badccd
Related: OS#1572
-rw-r--r-- | include/osmo-bts/lchan.h | 4 | ||||
-rw-r--r-- | src/common/csd_v110.c | 21 | ||||
-rw-r--r-- | tests/csd/csd_test.c | 8 | ||||
-rw-r--r-- | tests/csd/csd_test.err | 32 |
4 files changed, 46 insertions, 19 deletions
diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h index a0e99bf3..05c395a3 100644 --- a/include/osmo-bts/lchan.h +++ b/include/osmo-bts/lchan.h @@ -75,15 +75,17 @@ struct amr_multirate_conf { }; enum lchan_csd_mode { - LCHAN_CSD_M_NT, + LCHAN_CSD_M_NT = 0, LCHAN_CSD_M_T_1200_75, LCHAN_CSD_M_T_600, LCHAN_CSD_M_T_1200, LCHAN_CSD_M_T_2400, + LCHAN_CSD_M_T_4800, LCHAN_CSD_M_T_9600, LCHAN_CSD_M_T_14400, LCHAN_CSD_M_T_29000, LCHAN_CSD_M_T_32000, + _LCHAN_CSD_M_NUM, }; /* State of the SAPIs in the lchan */ diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c index 6800761e..9fc7ad31 100644 --- a/src/common/csd_v110.c +++ b/src/common/csd_v110.c @@ -58,6 +58,21 @@ const struct csd_v110_lchan_desc csd_v110_lchan_desc[256] = { }, }; +/* 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 }, + [LCHAN_CSD_M_T_1200] = { 0, 1, 0 }, + [LCHAN_CSD_M_T_2400] = { 1, 1, 0 }, + [LCHAN_CSD_M_T_4800] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_9600] = { 0, 1, 1 }, +#if 0 + [LCHAN_CSD_M_T_19200] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_38400] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_14400] = { 1, 0, 1 }, + [LCHAN_CSD_M_T_28800] = { 1, 0, 1 }, +#endif +}; + int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, const uint8_t *data, size_t data_len) { @@ -86,8 +101,10 @@ int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, else /* desc->num_bits == 36 */ osmo_csd_3k6_decode_frame(&df, &data[i * 36], 36); - /* FIXME: E1 .. E3 must be set by out-of-band knowledge! */ - memset(&df.e_bits[0], 0, 3); + /* E1 .. E3 must set by out-of-band knowledge */ + df.e_bits[0] = e1e2e3_map[lchan->csd_mode][0]; + df.e_bits[1] = e1e2e3_map[lchan->csd_mode][1]; + df.e_bits[2] = e1e2e3_map[lchan->csd_mode][2]; osmo_v110_encode_frame(&ra_bits[i * 80], 80, &df); } diff --git a/tests/csd/csd_test.c b/tests/csd/csd_test.c index 16995b1b..f24331d3 100644 --- a/tests/csd/csd_test.c +++ b/tests/csd/csd_test.c @@ -37,6 +37,7 @@ struct test_case { const char *name; enum gsm_chan_t lchan_type; enum gsm48_chan_mode tch_mode; + enum lchan_csd_mode csd_mode; }; static const struct test_case tests[] = { @@ -44,31 +45,37 @@ static const struct test_case tests[] = { .name = "TCH/F14.4", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_14k5, + .csd_mode = LCHAN_CSD_M_T_14400, }, { .name = "TCH/F9.6", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_12k0, + .csd_mode = LCHAN_CSD_M_T_9600, }, { .name = "TCH/F4.8", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_6k0, + .csd_mode = LCHAN_CSD_M_T_4800, }, { .name = "TCH/H4.8", .lchan_type = GSM_LCHAN_TCH_H, .tch_mode = GSM48_CMODE_DATA_6k0, + .csd_mode = LCHAN_CSD_M_T_4800, }, { .name = "TCH/F2.4", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_3k6, + .csd_mode = LCHAN_CSD_M_T_2400, }, { .name = "TCH/H2.4", .lchan_type = GSM_LCHAN_TCH_H, .tch_mode = GSM48_CMODE_DATA_3k6, + .csd_mode = LCHAN_CSD_M_T_600, }, }; @@ -99,6 +106,7 @@ static void exec_test_case(const struct test_case *tc) struct gsm_lchan lchan = { .type = tc->lchan_type, .tch_mode = tc->tch_mode, + .csd_mode = tc->csd_mode, }; /* populate the data_enc[] buffer with some bits */ diff --git a/tests/csd/csd_test.err b/tests/csd/csd_test.err index bc9747cc..94505dc3 100644 --- a/tests/csd/csd_test.err +++ b/tests/csd/csd_test.err @@ -2,65 +2,65 @@ [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 - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f [i] csd_v110_rtp_decode() returns 240 [i] Testing 'TCH/F4.8' (bitnum=120) [i] csd_v110_rtp_encode() returns 160 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f - ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff ff 7f ff 7f ff 7f ff ff 7f ff ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f - ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff ff 7f ff 7f ff 7f ff ff 7f ff ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff [i] csd_v110_rtp_decode() returns 120 [i] Testing 'TCH/H4.8' (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 - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f [i] csd_v110_rtp_decode() returns 240 [i] Testing 'TCH/F2.4' (bitnum=72) [i] csd_v110_rtp_encode() returns 160 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff - ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff ff ff 7f 7f ff 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff - ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff ff ff 7f 7f ff 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff [i] csd_v110_rtp_decode() returns 72 [i] Testing 'TCH/H2.4' (bitnum=144) [i] csd_v110_rtp_encode() returns 160 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f - bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f - bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f - bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f - bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f [i] csd_v110_rtp_decode() returns 144 |