aboutsummaryrefslogtreecommitdiffstats
path: root/src/bts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bts.cpp')
-rw-r--r--src/bts.cpp46
1 files changed, 24 insertions, 22 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 0e3e8f03..988d5f95 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -733,28 +733,6 @@ int gprs_rlcmac_pdch::rcv_data_block_acknowledged(uint8_t *data, uint8_t len,
struct gprs_rlcmac_ul_tbf *tbf;
struct rlc_ul_header *rh = (struct rlc_ul_header *)data;
- switch (len) {
- case 54:
- /* omitting spare bits */
- len = 53;
- break;
- case 40:
- /* omitting spare bits */
- len = 39;
- break;
- case 34:
- /* omitting spare bits */
- len = 33;
- break;
- case 23:
- break;
- default:
- bts()->decode_error();
- LOGP(DRLCMACUL, LOGL_ERROR, "Dropping data block with invalid"
- "length: %d)\n", len);
- return -EINVAL;
- }
-
/* find TBF inst from given TFI */
tbf = ul_tbf_by_tfi(rh->tfi);
if (!tbf) {
@@ -1166,9 +1144,33 @@ int gprs_rlcmac_pdch::rcv_control_block(
int gprs_rlcmac_pdch::rcv_block(uint8_t *data, uint8_t len, uint32_t fn,
struct pcu_l1_meas *meas)
{
+ GprsCodingScheme cs = GprsCodingScheme::getBySizeUL(len);
+ if (!cs) {
+ bts()->decode_error();
+ LOGP(DRLCMACUL, LOGL_ERROR, "Dropping data block with invalid"
+ "length: %d)\n", len);
+ return -EINVAL;
+ }
+
+ LOGP(DRLCMACUL, LOGL_DEBUG, "Got RLC block, coding scheme: %s, "
+ "length: %d (%d))\n", cs.name(), len, cs.maxBytesUL());
+
+ if (cs.isGprs())
+ return rcv_block_gprs(data, fn, meas, cs);
+
+ bts()->decode_error();
+ LOGP(DRLCMACUL, LOGL_ERROR, "Unsupported coding scheme %s\n",
+ cs.name());
+ return -EINVAL;
+}
+
+int gprs_rlcmac_pdch::rcv_block_gprs(uint8_t *data, uint32_t fn,
+ struct pcu_l1_meas *meas, GprsCodingScheme cs)
+{
unsigned payload = data[0] >> 6;
bitvec *block;
int rc = 0;
+ unsigned len = cs.maxBytesUL();
switch (payload) {
case GPRS_RLCMAC_DATA_BLOCK: