aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAravind Sirsikar <Arvind.sirsikar@radisys.com>2016-05-19 21:18:33 +0530
committerAravind Sirsikar <Arvind.sirsikar@radisys.com>2016-05-19 21:18:33 +0530
commitef12a45d46d43a9f41ce1d5cff9d7944203e30f8 (patch)
tree6761606cbb861985af8f4bf35800961dca37555b
parentbe3dc223f12f0a0405fbf82f3037f99b846cc161 (diff)
Add Header Type2 support in EGPRS UL
This patch will add support for MCS5,6 in EGPRS UL along with incorrect assert correction to let MCS 6 work.
-rw-r--r--src/decoding.cpp52
-rw-r--r--src/decoding.h4
-rw-r--r--src/tbf_ul.cpp2
3 files changed, 54 insertions, 4 deletions
diff --git a/src/decoding.cpp b/src/decoding.cpp
index 0c81b2a..2fb2428 100644
--- a/src/decoding.cpp
+++ b/src/decoding.cpp
@@ -352,9 +352,11 @@ int Decoding::rlc_parse_ul_data_header(struct gprs_rlc_data_info *rlc,
case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3 :
cur_bit = rlc_parse_ul_data_header_egprs_type_3(rlc, data, cs);
break;
- case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1:
- case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2:
- /* TODO: Support both header types */
+ case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2 :
+ cur_bit = rlc_parse_ul_data_header_egprs_type_2(rlc, data, cs);
+ break;
+ case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1 :
+ /* TODO: Support both header type 1 */
/* fall through */
default:
LOGP(DRLCMACDL, LOGL_ERROR,
@@ -408,6 +410,50 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_3(
return cur_bit;
}
+int Decoding::rlc_parse_ul_data_header_egprs_type_2(
+ struct gprs_rlc_data_info *rlc,
+ const uint8_t *data,
+ const GprsCodingScheme &cs)
+{
+ const struct gprs_rlc_ul_header_egprs_2 *egprs2;
+ unsigned int e_ti_header, offs, cur_bit = 0;
+ int punct, punct2, with_padding, cps;
+
+ egprs2 = static_cast < struct gprs_rlc_ul_header_egprs_2 * >
+ ((void *)data);
+
+ cps = (egprs2->cps_a << 0) | (egprs2->cps_b << 2);
+ gprs_rlc_mcs_cps_decode(cps, cs, &punct, &punct2, &with_padding);
+ gprs_rlc_data_info_init_ul(rlc, cs, with_padding);
+
+ rlc->r = egprs2->r;
+ rlc->si = egprs2->si;
+ rlc->tfi = (egprs2->tfi_a << 0) | (egprs2->tfi_b << 2);
+ rlc->cps = cps;
+ rlc->rsb = egprs2->rsb;
+
+ rlc->num_data_blocks = 1;
+ rlc->block_info[0].cv = egprs2->cv;
+ rlc->block_info[0].pi = egprs2->pi;
+ rlc->block_info[0].bsn =
+ (egprs2->bsn1_a << 0) | (egprs2->bsn1_b << 5);
+
+ cur_bit += rlc->data_offs_bits[0] - 2;
+
+ offs = rlc->data_offs_bits[0] / 8;
+ OSMO_ASSERT(rlc->data_offs_bits[0] % 8 == 7);
+
+ e_ti_header = (data[offs] & 0x60) >> 5;
+ rlc->block_info[0].e = !!(e_ti_header & 0x01);
+ rlc->block_info[0].ti = !!(e_ti_header & 0x02);
+ cur_bit += 2;
+
+ /* skip data area */
+ cur_bit += cs.maxDataBlockBytes() * 8;
+
+ return cur_bit;
+}
+
int Decoding::rlc_parse_ul_data_header_gprs(struct gprs_rlc_data_info *rlc,
const uint8_t *data, const GprsCodingScheme &cs)
{
diff --git a/src/decoding.h b/src/decoding.h
index 1043d67..8aaf36b 100644
--- a/src/decoding.h
+++ b/src/decoding.h
@@ -47,6 +47,10 @@ public:
struct gprs_rlc_data_info *rlc,
const uint8_t *data,
const GprsCodingScheme &cs);
+ static int rlc_parse_ul_data_header_egprs_type_2(
+ struct gprs_rlc_data_info *rlc,
+ const uint8_t *data,
+ const GprsCodingScheme &cs);
static int rlc_parse_ul_data_header_gprs(
struct gprs_rlc_data_info *rlc,
const uint8_t *data,
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 9e763f4..e01fa83 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -221,7 +221,7 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged(
block = m_rlc.block(rdbi->bsn);
block->block_info = *rdbi;
block->cs = rlc->cs;
- OSMO_ASSERT(rdbi->data_len < sizeof(block->block));
+ OSMO_ASSERT(rdbi->data_len <= sizeof(block->block));
rlc_data = &(block->block[0]);
/* TODO: Handle SPB != 0 -> Set length to 2*len, add offset if
* 2nd part. Note that resegmentation is currently disabled