coding: Add BER-reporting RACH decode functions

For all other decode operations we report the BER, but not for the
RACH.  This results in osmo-bts-trx not being able to report BER
to the higher layers, which is possible on other BTS backends.

Let's close this gap by introducing gsm0503_rach_ext_decode_ber()
and gsm0503_rach_decode_ber() with the usual n_errors / n_bits_total
arguments.

Change-Id: I2b1926a37bde860dcfeb0d613eb55a71271928c5
This commit is contained in:
Harald Welte 2018-02-26 11:48:00 +01:00
parent 175a4ae93a
commit 6950b191e8
4 changed files with 54 additions and 8 deletions

View File

@ -68,8 +68,14 @@ int gsm0503_tch_ahs_decode(uint8_t *tch_data, const sbit_t *bursts, int odd,
int gsm0503_rach_ext_encode(ubit_t *burst, uint16_t ra, uint8_t bsic, bool is_11bit);
int gsm0503_rach_encode(ubit_t *burst, const uint8_t *ra, uint8_t bsic) OSMO_DEPRECATED("Use gsm0503_rach_ext_encode() instead");
int gsm0503_rach_decode(uint8_t *ra, const sbit_t *burst, uint8_t bsic);
int gsm0503_rach_ext_decode(uint16_t *ra, const sbit_t *burst, uint8_t bsic);
int gsm0503_rach_decode(uint8_t *ra, const sbit_t *burst, uint8_t bsic)
OSMO_DEPRECATED("Use gsm0503_rach_decode_ber() instead");
int gsm0503_rach_decode_ber(uint8_t *ra, const sbit_t *burst, uint8_t bsic,
int *n_errors, int *n_bits_total);
int gsm0503_rach_ext_decode(uint16_t *ra, const sbit_t *burst, uint8_t bsic)
OSMO_DEPRECATED("Use gsm0503_rach_ext_decode_ber() instead");
int gsm0503_rach_ext_decode_ber(uint16_t *ra, const sbit_t *burst, uint8_t bsic,
int *n_errors, int *n_bits_total);
int gsm0503_sch_encode(ubit_t *burst, const uint8_t *sb_info);
int gsm0503_sch_decode(uint8_t *sb_info, const sbit_t *burst);

View File

@ -2826,13 +2826,15 @@ static inline void rach_apply_bsic(ubit_t *d, uint8_t bsic, uint8_t start)
d[start + i] ^= ((bsic >> (5 - i)) & 1);
}
static inline int16_t rach_decode(const sbit_t *burst, uint8_t bsic, bool is_11bit)
static inline int16_t rach_decode_ber(const sbit_t *burst, uint8_t bsic, bool is_11bit,
int *n_errors, int *n_bits_total)
{
ubit_t conv[17];
uint8_t ra[2] = { 0 }, nbits = is_11bit ? 11 : 8;
int rv;
osmo_conv_decode(is_11bit ? &gsm0503_rach_ext : &gsm0503_rach, burst, conv);
osmo_conv_decode_ber(is_11bit ? &gsm0503_rach_ext : &gsm0503_rach, burst, conv,
n_errors, n_bits_total);
rach_apply_bsic(conv, bsic, nbits);
@ -2852,7 +2854,7 @@ static inline int16_t rach_decode(const sbit_t *burst, uint8_t bsic, bool is_11b
* \returns 0 on success; negative on error (e.g. CRC error) */
int gsm0503_rach_ext_decode(uint16_t *ra, const sbit_t *burst, uint8_t bsic)
{
int16_t r = rach_decode(burst, bsic, true);
int16_t r = rach_decode_ber(burst, bsic, true, NULL, NULL);
if (r < 0)
return r;
@ -2869,7 +2871,43 @@ int gsm0503_rach_ext_decode(uint16_t *ra, const sbit_t *burst, uint8_t bsic)
* \returns 0 on success; negative on error (e.g. CRC error) */
int gsm0503_rach_decode(uint8_t *ra, const sbit_t *burst, uint8_t bsic)
{
int16_t r = rach_decode(burst, bsic, false);
int16_t r = rach_decode_ber(burst, bsic, false, NULL, NULL);
if (r < 0)
return r;
*ra = r;
return 0;
}
/*! Decode the Extended (11-bit) RACH according to 3GPP TS 45.003
* \param[out] ra output buffer for RACH data
* \param[in] burst Input burst data
* \param[in] bsic BSIC used in this cell
* \param[out] n_errors Number of detected bit errors
* \param[out] n_bits_total Total number of bits
* \returns 0 on success; negative on error (e.g. CRC error) */
int gsm0503_rach_ext_decode_ber(uint16_t *ra, const sbit_t *burst, uint8_t bsic,
int *n_errors, int *n_bits_total)
{
int16_t r = rach_decode_ber(burst, bsic, true, n_errors, n_bits_total);
if (r < 0)
return r;
*ra = r;
return 0;
}
/*! Decode the (8-bit) RACH according to TS 05.03
* \param[out] ra output buffer for RACH data
* \param[in] burst Input burst data
* \param[in] bsic BSIC used in this cell
* \param[out] n_errors Number of detected bit errors
* \param[out] n_bits_total Total number of bits
* \returns 0 on success; negative on error (e.g. CRC error) */
int gsm0503_rach_decode_ber(uint8_t *ra, const sbit_t *burst, uint8_t bsic,
int *n_errors, int *n_bits_total)
{
int16_t r = rach_decode_ber(burst, bsic, false, n_errors, n_bits_total);
if (r < 0)
return r;

View File

@ -110,8 +110,10 @@ gsm0503_tch_ahs_encode;
gsm0503_tch_ahs_decode;
gsm0503_rach_ext_encode;
gsm0503_rach_ext_decode;
gsm0503_rach_ext_decode_ber;
gsm0503_rach_encode;
gsm0503_rach_decode;
gsm0503_rach_decode_ber;
gsm0503_sch_encode;
gsm0503_sch_decode;

View File

@ -123,7 +123,7 @@ static void test_rach(uint8_t bsic, uint8_t ra)
memset(bursts_s + 6, 0, 8);
/* Decode, correcting errors */
gsm0503_rach_decode(&result, bursts_s, bsic);
gsm0503_rach_decode_ber(&result, bursts_s, bsic, NULL, NULL);
printf("Decoded: %02x\n", result);
if (ra != result)
@ -153,7 +153,7 @@ static void test_rach_ext(uint8_t bsic, uint16_t ra)
memset(bursts_s + 9, 0, 8);
/* Decode, correcting errors */
gsm0503_rach_ext_decode(&result, bursts_s, bsic);
gsm0503_rach_ext_decode_ber(&result, bursts_s, bsic, NULL, NULL);
printf("Decoded: %02x\n", result);
if (ra != result)