diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-08-26 03:11:52 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-08-26 03:12:03 +0700 |
commit | 183c0888648a8406ea962b3b7f0532456e0fdb2f (patch) | |
tree | 40521ddfdd2cbea5848ba40e1a2ef536d790587c | |
parent | 37e639cb8fea7c00daff1cdba0241fbad05f2468 (diff) |
csd_v110: properly set E1/E2/E3 for non-transparent data
Change-Id: Ie38c12e462654cd9fe83a0420bc8ea8b476214b8
Related: OS#1572
-rw-r--r-- | src/common/csd_v110.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c index 8fa42291..230a6a7d 100644 --- a/src/common/csd_v110.c +++ b/src/common/csd_v110.c @@ -102,9 +102,17 @@ int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, osmo_csd_3k6_decode_frame(&df, &data[i * 36], 36); /* 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]; + if (lchan->csd_mode == LCHAN_CSD_M_NT) { + /* non-transparent: as per 3GPP TS 48.020, Table 7 */ + df.e_bits[0] = 0; /* E1: as per 15.1.2, shall be set to 0 (for BSS-MSC) */ + df.e_bits[1] = (i >> 1) & 0x01; /* E2: 0 for Q1/Q2, 1 for Q3/Q4 */ + df.e_bits[2] = (i >> 0) & 0x01; /* E3: 0 for Q1/Q3, 1 for Q2/Q4 */ + } else { + /* transparent: as per 3GPP TS 44.021, Figure 4 */ + df.e_bits[0] = e1e2e3_map[lchan->csd_mode][0]; /* E1 */ + df.e_bits[1] = e1e2e3_map[lchan->csd_mode][1]; /* E2 */ + df.e_bits[2] = e1e2e3_map[lchan->csd_mode][2]; /* E3 */ + } osmo_v110_encode_frame(&ra_bits[i * 80], 80, &df); } |