This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-net-gprs@lists.osmocom.org/.
sangamesh sajjan sangamesh.sajjan at radisys.comThis patch includes the changes for compression algorithm which decompress the received CRBB bitmap and corresponding modification of EPDAN handling --- src/decoding.cpp | 30 ++++--------- src/decoding.h | 10 ++++- src/egprs_rlc_compression.cpp | 96 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 23 deletions(-) diff --git a/src/decoding.cpp b/src/decoding.cpp index f2b548c..4535d1b 100644 --- a/src/decoding.cpp +++ b/src/decoding.cpp @@ -536,7 +536,6 @@ int Decoding::decode_egprs_acknack_bits(const EGPRS_AckNack_Desc_t *desc, bool have_bitmap; int implicitly_acked_blocks; int ssn = desc->STARTING_SEQUENCE_NUMBER; - int rc; if (desc->FINAL_ACK_INDICATION) return handle_final_ack(bits, bsn_begin, bsn_end, window); @@ -576,26 +575,15 @@ int Decoding::decode_egprs_acknack_bits(const EGPRS_AckNack_Desc_t *desc, if (crbb_len > 0) { int old_len = bits->cur_bit; - struct bitvec crbb; - - crbb.data = (uint8_t *)desc->CRBB; - crbb.data_len = sizeof(desc->CRBB); - crbb.cur_bit = desc->CRBB_LENGTH; - - rc = osmo_t4_decode(&crbb, desc->CRBB_STARTING_COLOR_CODE, - bits); - - if (rc < 0) { - LOGP(DRLCMACUL, LOGL_NOTICE, - "Failed to decode CRBB: " - "length %d, data '%s'\n", - desc->CRBB_LENGTH, - osmo_hexdump(crbb.data, crbb.data_len)); - /* We don't know the SSN offset for the URBB, - * return what we have so far and assume the - * bitmap has stopped here */ - goto aborted; - } + + LOGP(DRLCMACDL, LOGL_DEBUG, "Compress bitmap exist," + "CRBB LEN =%d and Starting color code =%d", + desc->CRBB_LENGTH, desc->CRBB_STARTING_COLOR_CODE); + + decompress_crbb(desc->CRBB_LENGTH, + desc->CRBB_STARTING_COLOR_CODE, + desc->CRBB, + bits); LOGP(DRLCMACDL, LOGL_DEBUG, "CRBB len: %d, decoded len: %d, cc: %d, crbb: '%s'\n", diff --git a/src/decoding.h b/src/decoding.h index 58ecd18..5989907 100644 --- a/src/decoding.h +++ b/src/decoding.h @@ -60,6 +60,12 @@ public: struct gprs_rlc_dl_window *window); static int decode_gprs_acknack_bits( const Ack_Nack_Description_t *desc, - bitvec *bits, int *bsn_begin, int *bsn_end, - gprs_rlc_dl_window *window); + bitvec * bits, int *bsn_begin, int *bsn_end, + gprs_rlc_dl_window * window); + static void decompress_crbb( + int8_t compress_bmap_len, + uint8_t clr_code_bit, + const uint8_t *orig_buf, + bitvec * dest + ); }; diff --git a/src/egprs_rlc_compression.cpp b/src/egprs_rlc_compression.cpp index 4c17a17..2e4dc05 100644 --- a/src/egprs_rlc_compression.cpp +++ b/src/egprs_rlc_compression.cpp @@ -218,3 +218,99 @@ const char *zero_run_len_code_list[MAX_CDWDTBL_LEN] = { "0000001110010", "0000001110011" }; + +int search_runlen( + Node *root, /* root of Ones or Zeros tree */ + const uint8_t *bmbuf, /* Received compressed bitmap buf */ + uint8_t bit_pos, /* the start bit pos to read codeword */ + uint8_t *len_codewd, /* length of codeword */ + uint16_t *rlen /* run length of Ones or Zeros */ + ) +{ + Node *iter; + uint8_t dir; + + iter = root; + *len_codewd = 0; + + while (iter->run_length == 0) { + if ((iter->left == NULL) && (iter->right == NULL)) + return -1; + + /* get the bit value at the bitpos and put it in right most of dir */ + dir = ((bmbuf[BITS_TO_BYTES(bit_pos)-1] + >>(7-(MOD8(bit_pos)))) & 0x01); + (bit_pos)++; + (*len_codewd)++; + + if (((dir&0x01) == 0) && (iter->left != NULL)) + iter = iter->left; + + else if (((dir&0x01) == 1) && (iter->right != NULL)) + iter = iter->right; + else + return -1; + } + (*rlen) = *(iter->run_length); + + return 1; +} /* search_runlen */ + +void Decoding::decompress_crbb( + int8_t compress_bmap_len, /* compressed bitmap length */ + uint8_t clr_code_bit, /* run length of Ones or Zeros */ + const uint8_t *orig_crbb_buf, /* received block crbb bitmap */ + bitvec * dest + ) +{ + + uint8_t bit_pos = 0; + uint8_t nbits = 0; /* number of bits of codeword */ + uint16_t run_length = 0; + uint16_t cbmaplen = 0; /* compressed bitmap part after decompression */ + unsigned wp = 0; + + egprs_compress *compress = egprs_compress::instance(); + + while (compress_bmap_len >= 0) { + if (clr_code_bit == 1) { + search_runlen(compress->ones_list, orig_crbb_buf, + bit_pos, &nbits, &run_length); + /*If run length > 64, need makeup and terminating code*/ + if (run_length < 64) + clr_code_bit = 0; + cbmaplen = cbmaplen + run_length; + /* put run length of Ones in uncompressed bitmap */ + while (run_length != 0) { + if (run_length > 8) { + bitvec_write_field(dest, wp, 0xff, 8); + run_length = run_length - 8; + } else { + bitvec_write_field(dest, wp, 0xff, + run_length); + run_length = 0; + } + } + } else { + search_runlen(compress->zeros_list, orig_crbb_buf, + bit_pos, &nbits, &run_length); + /*If run length > 64, need makeup and terminating code*/ + if (run_length < 64) + clr_code_bit = 1; + cbmaplen = cbmaplen + run_length; + /* put run length of Zeros in uncompressed bitmap */ + while (run_length != 0) { + if (run_length > 8) { + bitvec_write_field(dest, wp, 0x00, 8); + run_length = run_length - 8; + } else { + bitvec_write_field(dest, wp, 0x00, + run_length); + run_length = 0; + } + } + } + bit_pos = bit_pos + nbits; + compress_bmap_len = compress_bmap_len - nbits; + } +} /* Decompress_CRBB */ -- 1.7.9.5