aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-08-26 04:11:25 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-08-26 04:11:33 +0700
commitb33502a39b98c0015385253e5713e21970e3c32e (patch)
tree1c1f732c4229580037a0715dbfa9b53cdf34606c /src
parent183c0888648a8406ea962b3b7f0532456e0fdb2f (diff)
csd_v110: handle empty/incomplete Uplink frames gracefully
Diffstat (limited to 'src')
-rw-r--r--src/common/csd_v110.c12
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 */