aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAravind Sirsikar <arvind.sirsikar@radisys.com>2016-09-15 17:24:49 +0530
committerAravind Sirsikar <arvind.sirsikar@radisys.com>2016-09-15 17:24:49 +0530
commit22a901905c9749b03fceccda4d550f3da799d524 (patch)
tree16ab25248b1dd773a7cf14c8f3aaaeaed7eb5a3b /src
parent3463bd4adc1598462560ed84da837d04d0e8e20c (diff)
EGPRS: Fix issue with row 4 of Table 10.4.14a.1 of 44.060 version 7.27.0 Release 7
row 4 of Table 10.4.14a.1 of Spec 44.060 version 7.27.0 Release 7. Says "The previous RLC data block contains a Upper Layer PDU, or a part of it, that fills precisely the previous data block and for which there is no length indicator in that RLC data block. The current RLC data block contains a Upper Layer PDU that either fills the current RLC data block precisely or continues in the next RLC data block." So when we receive block with 1st LI: value=0 and Value of E bit in the same octet as 1, we expect 2 chunks with 1st chunk as length as 0 and complete and 2nd chunk as length non zero. But with this bug we see only 1 chunk causing incorrect assembling This issue has been fixed in this patch. Related: OS#1811 Change-Id: I2cd0fca3ed28a553ede3f4b8a7d3267284dd2c9b
Diffstat (limited to 'src')
-rw-r--r--src/decoding.cpp7
-rw-r--r--src/tbf_ul.cpp16
2 files changed, 12 insertions, 11 deletions
diff --git a/src/decoding.cpp b/src/decoding.cpp
index 7c00ff71..3f5c4d27 100644
--- a/src/decoding.cpp
+++ b/src/decoding.cpp
@@ -67,14 +67,11 @@ static int parse_extensions_egprs(const uint8_t *data, unsigned int data_len,
"but no more chunks possible\n");
return -ENOSPC;
}
- if (li->li == 0 && num_chunks == 0 && li->e == 0) {
+ if (li->li == 0 && num_chunks == 0) {
/* TS 44.060, table 10.4.14a.1, row 2a */
+ /* TS 44.060, table 10.4.14a.1, row 4 */
chunks[num_chunks].length = 0;
chunks[num_chunks].is_complete = true;
- } else if (li->li == 0 && num_chunks == 0 && li->e == 1) {
- /* TS 44.060, table 10.4.14a.1, row 4 */
- chunks[num_chunks].length = LENGTH_TO_END;
- chunks[num_chunks].is_complete = is_last_block;
} else if (li->li == 127 && li->e == 1) {
/* TS 44.060, table 10.4.14a.1, row 3 & 5 */
/* only filling bytes left */
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 7e0732c8..f67ffd77 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -67,14 +67,18 @@ int gprs_rlcmac_ul_tbf::assemble_forward_llc(const gprs_rlc_data *_data)
for (i = 0; i < num_frames; i++) {
frame = frames + i;
- bts->rlc_ul_payload_bytes(frame->length);
+ if (frame->length) {
+ bts->rlc_ul_payload_bytes(frame->length);
- LOGP(DRLCMACUL, LOGL_DEBUG, "-- Frame %d starts at offset %d, "
- "length=%d, is_complete=%d\n",
- i + 1, frame->offset, frame->length, frame->is_complete);
+ LOGP(DRLCMACUL, LOGL_DEBUG, "-- Frame %d "
+ "starts at offset %d, "
+ "length=%d, is_complete=%d\n",
+ i + 1, frame->offset, frame->length,
+ frame->is_complete);
- m_llc.append_frame(data + frame->offset, frame->length);
- m_llc.consume(frame->length);
+ m_llc.append_frame(data + frame->offset, frame->length);
+ m_llc.consume(frame->length);
+ }
if (frame->is_complete) {
/* send frame to SGSN */