aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp46
-rw-r--r--src/bts.h3
2 files changed, 27 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:
diff --git a/src/bts.h b/src/bts.h
index 8831aca8..ecbc0c93 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -33,6 +33,7 @@ extern "C" {
#include "sba.h"
#include "tbf.h"
#include "gprs_ms_storage.h"
+#include "gprs_coding_scheme.h"
#endif
#include <stdint.h>
@@ -63,6 +64,8 @@ struct gprs_rlcmac_pdch {
/* dispatching of messages */
int rcv_block(uint8_t *data, uint8_t len, uint32_t fn,
struct pcu_l1_meas *meas);
+ int rcv_block_gprs(uint8_t *data, uint32_t fn,
+ struct pcu_l1_meas *meas, GprsCodingScheme cs);
gprs_rlcmac_bts *bts_data() const;
BTS *bts() const;