diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-08-26 04:11:25 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2023-08-26 04:11:33 +0700 |
commit | b33502a39b98c0015385253e5713e21970e3c32e (patch) | |
tree | 1c1f732c4229580037a0715dbfa9b53cdf34606c /src | |
parent | 183c0888648a8406ea962b3b7f0532456e0fdb2f (diff) |
csd_v110: handle empty/incomplete Uplink frames gracefully
Change-Id: I7cbf868df3ba5d390cea3d529eef26d18dbe55ab
Related: OS#1572
Diffstat (limited to 'src')
-rw-r--r-- | src/common/csd_v110.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c index 230a6a7d..5046d6e9 100644 --- a/src/common/csd_v110.c +++ b/src/common/csd_v110.c @@ -87,9 +87,14 @@ int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, if (OSMO_UNLIKELY(desc->num_blocks == 0)) return -ENOTSUP; - /* handle empty/incomplete frames gracefully */ - if (OSMO_UNLIKELY(data_len < (desc->num_blocks * desc->num_bits))) - return -ENODATA; + /* handle empty/incomplete Uplink frames gracefully */ + if (OSMO_UNLIKELY(data_len < (desc->num_blocks * 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++) + 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++) { @@ -117,6 +122,7 @@ int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, osmo_v110_encode_frame(&ra_bits[i * 80], 80, &df); } +ra1_ra2: /* RA1/RA2: convert from an intermediate rate to 64 kbit/s */ if (desc->num_blocks == 4) { /* 4 * 80 bits (16 kbit/s) => 2 bits per octet */ |