diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-12-11 13:25:12 +0100 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-12-11 13:25:12 +0100 |
commit | 3d409252b47fcf9a5e3005fecfeacd7fb7259ac5 (patch) | |
tree | f56fff4a41e78fe3f0cb370a65800dabd7b53aea | |
parent | 6695aabb5107dea108898d860aec388cba1e69a5 (diff) |
edge: Use generic RLC UL handling for GPRS (TODO)
-rw-r--r-- | src/bts.cpp | 30 | ||||
-rw-r--r-- | src/rlc.cpp | 25 |
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); |