aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-12-11 13:25:12 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-12-11 13:25:12 +0100
commit3d409252b47fcf9a5e3005fecfeacd7fb7259ac5 (patch)
treef56fff4a41e78fe3f0cb370a65800dabd7b53aea
parent6695aabb5107dea108898d860aec388cba1e69a5 (diff)
edge: Use generic RLC UL handling for GPRS (TODO)
-rw-r--r--src/bts.cpp30
-rw-r--r--src/rlc.cpp25
2 files changed, 42 insertions, 13 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 70b69b80..914b5cae 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -1178,19 +1178,22 @@ int gprs_rlcmac_pdch::rcv_block_egprs(uint8_t *data, uint8_t len, uint32_t fn,
/* These are always data blocks, since EGPRS still uses CS-1 for
* control blocks (see 44.060, section 10.3, 1st par.)
*/
- if (!bts()->bts_data()->egprs_enabled) {
- LOGP(DRLCMACUL, LOGL_ERROR,
- "Got %s RLC block but EGPRS is not enabled\n",
- cs.name());
- return -EINVAL;
- }
+ if (cs.isEgprs()) {
+ if (!bts()->bts_data()->egprs_enabled) {
+ LOGP(DRLCMACUL, LOGL_ERROR,
+ "Got %s RLC block but EGPRS is not enabled\n",
+ cs.name());
+ return -EINVAL;
+ }
- if (!cs.isEgprsGmsk()) {
- LOGP(DRLCMACUL, LOGL_ERROR,
- "Got %s RLC block but EGPRS is not implemented for 8PSK yet\n",
- cs.name());
- bts()->decode_error();
- return -EINVAL;
+ if (!cs.isEgprsGmsk()) {
+ LOGP(DRLCMACUL, LOGL_ERROR,
+ "Got %s RLC block but EGPRS is not implemented "
+ "for 8PSK yet\n",
+ cs.name());
+ bts()->decode_error();
+ return -EINVAL;
+ }
}
rc = gprs_rlc_parse_ul_header_egprs(&rlc_dec, data, cs);
@@ -1237,7 +1240,8 @@ int gprs_rlcmac_pdch::rcv_block_gprs(uint8_t *data, uint8_t len, uint32_t fn,
switch (payload) {
case GPRS_RLCMAC_DATA_BLOCK:
- rc = rcv_data_block_acknowledged_gprs(data, len, meas);
+ rc = rcv_block_egprs(data, len, fn, meas, cs);
+ // rc = rcv_data_block_acknowledged_gprs(data, len, meas);
break;
case GPRS_RLCMAC_CONTROL_BLOCK:
block = bitvec_alloc(len);
diff --git a/src/rlc.cpp b/src/rlc.cpp
index 33013f09..33739cdb 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -238,6 +238,7 @@ int gprs_rlc_parse_ul_header_egprs(struct gprs_rlc_ul_header_egprs *rlc,
const uint8_t *data, GprsCodingScheme cs)
{
const struct gprs_rlc_ul_header_egprs_3 *egprs3;
+ const struct rlc_ul_header *gprs;
unsigned int e_ti_header;
unsigned int cur_bit = 0;
unsigned int data_len = 0;
@@ -247,6 +248,30 @@ int gprs_rlc_parse_ul_header_egprs(struct gprs_rlc_ul_header_egprs *rlc,
data_len = cs.maxDataBlockBytes();
switch(cs.headerTypeData()) {
+ case GprsCodingScheme::HEADER_GPRS_DATA:
+ gprs = static_cast<struct rlc_ul_header *>
+ ((void *)data);
+ rlc->r = gprs->r;
+ rlc->si = gprs->si;
+ rlc->tfi = gprs->tfi;
+ rlc->cps = 0;
+ rlc->rsb = 0;
+
+ rlc->num_data_blocks = 1;
+ rlc->block_info[0].cv = gprs->cv;
+ rlc->block_info[0].pi = gprs->pi;
+ rlc->block_info[0].bsn = gprs->bsn;
+ rlc->block_info[0].e = gprs->e;
+ rlc->block_info[0].ti = gprs->ti;
+ rlc->block_info[0].spb = 0;
+
+ cur_bit += 3 * 8;
+
+ rlc->data_offs_bits[0] = cur_bit;
+ rlc->block_info[0].data_len = data_len;
+ cur_bit += data_len * 8;
+
+ break;
case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3:
egprs3 = static_cast<struct gprs_rlc_ul_header_egprs_3 *>
((void *)data);