falconia has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-abis/+/37152?usp=email )
(
1 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: trau2rtp_hr16: change output format to RFC 5993 ......................................................................
trau2rtp_hr16: change output format to RFC 5993
Emitting RFC 5993 payload format instead of TS 101 318 brings Osmocom+E1 BSS into compliance with TS 48.103 (which requires RFC 5993 format at AoIP interface), and will also make it much easier to add optional support for TW-TS-002.
There are no backward compatibility issues: OsmoMGW E1 support currently works only for FR and EFR, not for HR.
Related: OS#6448 Change-Id: I0bcfdccbf4df5a5cd90a65525527f08107be2cf5 --- M src/trau/trau_rtp_conv.c 1 file changed, 43 insertions(+), 14 deletions(-)
Approvals: laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved
diff --git a/src/trau/trau_rtp_conv.c b/src/trau/trau_rtp_conv.c index 5e06273..b19d582 100644 --- a/src/trau/trau_rtp_conv.c +++ b/src/trau/trau_rtp_conv.c @@ -147,40 +147,51 @@
static const uint8_t rtp_hr_sid[14] = { 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-/*! Generate the 14 bytes ETSI TS 101 318 RTP payload for HR from a decoded 16k TRAU frame. - * Note that thsi differs from the IETF RFC5993 format. However, as OsmoBTS implements - * the TS 101 318 format, we also use the same format here. osmo-mgw can convert them. +/*! Generate an RFC 5993 RTP payload for HR from a decoded 16k TRAU frame. + * We previously emitted TS 101 318 format; however, RFC 5993 is the format + * specified in TS 48.103 for AoIP, it can also be extended with TRAU-UL-like + * capabilities with TW-TS-002, and we now support RFC 5993 output in OsmoBTS + * on all models. * \param[out] out caller-provided output buffer * \param[in] out_len length of out buffer in bytes * \param[in] tf input TRAU frame in decoded form * \returns number of bytes generated in 'out'; negative on error. */ static int trau2rtp_hr16(uint8_t *out, size_t out_len, const struct osmo_trau_frame *tf) { - unsigned int i; + enum osmo_gsm631_sid_class sidc;
if (tf->type != OSMO_TRAU16_FT_HR) return -EINVAL;
+ if (out_len < GSM_HR_BYTES_RTP_RFC5993) + return -ENOSPC; + /* HR Data Bits according to TS 48.061 Section 5.1.4.1.1 */
- if (tf->dir == OSMO_TRAU_DIR_UL && tf->c_bits[11]) /* C12: BFI */ + sidc = (tf->c_bits[12] << 1) | tf->c_bits[13]; + /* both C13 and C14 being set is invalid combination */ + if (sidc > OSMO_GSM631_SID_CLASS_VALID) goto bad_frame;
- if (out_len < GSM_HR_BYTES) - return -ENOSPC; + /* Plain RFC 5993 without TW-TS-002 extensions does not allow + * BFI or invalid SID packets. */ + if (tf->c_bits[11] || sidc == OSMO_GSM631_SID_CLASS_INVALID) + goto bad_frame; + + /* RFC 5993 Frame Type is equal to GSM 06.41 SID classification, + * restricted to just speech or valid SID per above. */ + out[0] = sidc << 4;
/* TS 101 318 Section 5.2: The order of occurrence of the codec parameters in the buffer is * the same as order of occurrence over the Abis as defined in annex B of ETS 300 969 * [which is 3GPP TS 46.020 */ - osmo_ubit2pbit(out, tf->d_bits, 112); + osmo_ubit2pbit(out + 1, tf->d_bits, 112);
- if (tf->c_bits[12] || tf->c_bits[13]) { - /* Generate SID frame as per TS 101 318 Section 5.2.2 */ - for (i = 0; i < sizeof(rtp_hr_sid); i++) - out[i] = out[i] | rtp_hr_sid[i]; - } + /* RFC 5993 requires SID frames to be perfect, error-free */ + if (sidc == OSMO_GSM631_SID_CLASS_VALID) + osmo_hr_sid_reset(out + 1);
- return GSM_HR_BYTES; + return GSM_HR_BYTES_RTP_RFC5993;
bad_frame: return 0;