fixeria has submitted this change. (
https://gerrit.osmocom.org/c/osmo-bts/+/33934 )
Change subject: csd_v110_rtp_encode(): properly set E1/E2/E3 bits
......................................................................
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
---
M include/osmo-bts/lchan.h
M src/common/csd_v110.c
M tests/csd/csd_test.c
M tests/csd/csd_test.err
4 files changed, 64 insertions(+), 19 deletions(-)
Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h
index a0e99bf..05c395a 100644
--- a/include/osmo-bts/lchan.h
+++ b/include/osmo-bts/lchan.h
@@ -75,15 +75,17 @@
};
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 6800761..9fc7ad3 100644
--- a/src/common/csd_v110.c
+++ b/src/common/csd_v110.c
@@ -58,6 +58,21 @@
},
};
+/* 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 @@
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 16995b1..f24331d 100644
--- a/tests/csd/csd_test.c
+++ b/tests/csd/csd_test.c
@@ -37,6 +37,7 @@
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 @@
.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 @@
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 bc9747c..94505dc 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
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/33934
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I1a14597dff746cf975140b294400a2cc05badccd
Gerrit-Change-Number: 33934
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged