aboutsummaryrefslogtreecommitdiffstats
path: root/src/coding
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-12-08 02:52:12 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-12-08 03:27:23 +0700
commit93b8eb31532e8a9ab38066530ef4298a2f9a9ba0 (patch)
tree40d3329837739d41e11b18e887adbca562559a32 /src/coding
parentccf9aadc96be71ceafdd041dcfae3649b6171109 (diff)
coding: clarify the USF decoding for PDCH blocks
The USF (Uplink State Flag) field is present in the MAC header of all Downlink PDCH blocks. It is used by the network to indicate which MS can transmit on subsequent Uplink PDCH block(s). This field is of a high importance for the MS, thus the decoder API allows the caller to obtain USF value separately from the actual data bits. In the case of gsm0503_pdtch_decode(), if the 'usf_p' pointer is not NULL, the USF value would be assigned for CS2/CS3/CS4 (but not CS1) even if the CRC check fails (negative return value). A subsequent patch is to bring the CS1 in consistency with CS2/CS3/CS4. In the case of gsm0503_pdtch_egprs_decode(), decoding of the USF field separately from data bits is not implemented, and moreover the function itself cannot be used for decoding Downlink blocks. Change-Id: I43e8bfb4003f34766ace7c5c6080ca583ce5efbb
Diffstat (limited to 'src/coding')
-rw-r--r--src/coding/gsm0503_coding.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/coding/gsm0503_coding.c b/src/coding/gsm0503_coding.c
index 612e0ad0..5b78502a 100644
--- a/src/coding/gsm0503_coding.c
+++ b/src/coding/gsm0503_coding.c
@@ -921,7 +921,7 @@ static int egprs_decode_data(uint8_t *l2_data, const sbit_t *c,
* \param[out] l2_data caller-allocated buffer for L2 Frame
* \param[in] bursts burst input data as soft unpacked bits
* \param[in] nbits number of bits in \a bursts
- * \param usf_p unused argument ?!?
+ * \param usf_p Uplink State Flag, FIXME: not implemented
* \param[out] n_errors number of detected bit-errors
* \param[out] n_bits_total total number of decoded bits
* \returns number of bytes decoded; negative on error */
@@ -1010,7 +1010,7 @@ int gsm0503_pdtch_egprs_decode(uint8_t *l2_data, const sbit_t *bursts, uint16_t
/*! Decode GPRS PDTCH
* \param[out] l2_data caller-allocated buffer for L2 Frame
* \param[in] bursts burst input data as soft unpacked bits
- * \param[out] usf_p uplink stealing flag
+ * \param[out] usf_p Uplink State Flag, only relevant for DL blocks
* \param[out] n_errors number of detected bit-errors
* \param[out] n_bits_total total number of dcoded bits
* \returns number of bytes decoded; negative on error */
@@ -1061,6 +1061,7 @@ int gsm0503_pdtch_decode(uint8_t *l2_data, const sbit_t *bursts, uint8_t *usf_p,
osmo_conv_decode_ber(&gsm0503_cs2_np, cB,
conv, n_errors, n_bits_total);
+ /* 5.1.2.2 a) the three USF bits d(0),d(1),d(2) are precoded into six bits */
for (i = 0; i < 8; i++) {
for (j = 0, k = 0; j < 6; j++)
k += abs(((int)gsm0503_usf2six[i][j]) - ((int)conv[j]));
@@ -1096,6 +1097,7 @@ int gsm0503_pdtch_decode(uint8_t *l2_data, const sbit_t *bursts, uint8_t *usf_p,
osmo_conv_decode_ber(&gsm0503_cs3_np, cB,
conv, n_errors, n_bits_total);
+ /* 5.1.3.2 a) the three USF bits d(0),d(1),d(2) are precoded into six bits */
for (i = 0; i < 8; i++) {
for (j = 0, k = 0; j < 6; j++)
k += abs(((int)gsm0503_usf2six[i][j]) - ((int)conv[j]));
@@ -1124,6 +1126,7 @@ int gsm0503_pdtch_decode(uint8_t *l2_data, const sbit_t *bursts, uint8_t *usf_p,
for (i = 12; i < 456; i++)
conv[i] = (cB[i] < 0) ? 1 : 0;
+ /* 5.1.4.2 a) the three USF bits d(0),d(1),d(2) are precoded into twelve bits */
for (i = 0; i < 8; i++) {
for (j = 0, k = 0; j < 12; j++)
k += abs(((int)gsm0503_usf2twelve_sbit[i][j]) - ((int)cB[j]));