summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/coding/gsm0503_coding.h10
-rw-r--r--src/coding/gsm0503_coding.c46
-rw-r--r--src/coding/libosmocoding.map2
-rw-r--r--tests/coding/coding_test.c4
4 files changed, 54 insertions, 8 deletions
diff --git a/include/osmocom/coding/gsm0503_coding.h b/include/osmocom/coding/gsm0503_coding.h
index 86610bac..98038f8f 100644
--- a/include/osmocom/coding/gsm0503_coding.h
+++ b/include/osmocom/coding/gsm0503_coding.h
@@ -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);
diff --git a/src/coding/gsm0503_coding.c b/src/coding/gsm0503_coding.c
index c94bca7e..215cc6dd 100644
--- a/src/coding/gsm0503_coding.c
+++ b/src/coding/gsm0503_coding.c
@@ -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;
diff --git a/src/coding/libosmocoding.map b/src/coding/libosmocoding.map
index 95953cf2..87b38864 100644
--- a/src/coding/libosmocoding.map
+++ b/src/coding/libosmocoding.map
@@ -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;
diff --git a/tests/coding/coding_test.c b/tests/coding/coding_test.c
index 660f51fd..7b4f2a56 100644
--- a/tests/coding/coding_test.c
+++ b/tests/coding/coding_test.c
@@ -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)