aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpravin <pravin.manoharan@radisys.com>2016-09-30 10:09:57 +0530
committerpravin <pravin.manoharan@radisys.com>2016-09-30 10:09:57 +0530
commitc73ae3130602626b1328ebeadffc5f07670949e1 (patch)
treea38cf9a14a1c43d02f0f1065894e6a2479539893
parent93605f3b4b4983e180e87151d1d535f47c0ae802 (diff)
Add compression support in EGPRS PUAN
This adds compression of bitmap in PUAN. The compressed bitmap is used only if the number of bits in the bitmap does not fit in the message and there is a gain after compression. Test case is updated for testing the compression with bitmaps of varying lengths.
-rw-r--r--src/egprs_rlc_compression.cpp286
-rw-r--r--src/egprs_rlc_compression.h11
-rw-r--r--src/encoding.cpp84
-rw-r--r--src/rlc.cpp26
-rw-r--r--src/rlc.h1
-rw-r--r--src/tbf.cpp5
-rw-r--r--src/tbf.h2
-rw-r--r--src/tbf_ul.cpp21
-rw-r--r--tests/tbf/TbfTest.err18
9 files changed, 443 insertions, 11 deletions
diff --git a/src/egprs_rlc_compression.cpp b/src/egprs_rlc_compression.cpp
index c1baaa9..cb4c652 100644
--- a/src/egprs_rlc_compression.cpp
+++ b/src/egprs_rlc_compression.cpp
@@ -72,6 +72,161 @@ void egprs_compress::build_codewords(egprs_compress_node *root, const char *cdwd
}
}
+/*
+ * Terminating codes for uninterrupted sequences of 0 and 1 up to 64 bit length
+ * according to TS 44.060 9.1.10
+ */
+static const unsigned t4_term[2][64] = {
+ {
+ 0b0000110111,
+ 0b10,
+ 0b11,
+ 0b010,
+ 0b011,
+ 0b0011,
+ 0b0010,
+ 0b00011,
+ 0b000101,
+ 0b000100,
+ 0b0000100,
+ 0b0000101,
+ 0b0000111,
+ 0b00000100,
+ 0b00000111,
+ 0b000011000,
+ 0b0000010111,
+ 0b0000011000,
+ 0b0000001000,
+ 0b00001100111,
+ 0b00001101000,
+ 0b00001101100,
+ 0b000000101100,
+ 0b000001011010,
+ 0b000001100110,
+ 0b000001100111
+ },
+ {
+ 0b00110101,
+ 0b000111,
+ 0b0111,
+ 0b1000,
+ 0b1011,
+ 0b1100,
+ 0b1110,
+ 0b1111,
+ 0b10011,
+ 0b10100,
+ 0b00111,
+ 0b01000,
+ 0b001000,
+ 0b000011,
+ 0b110100,
+ 0b110101,
+ 0b101010,
+ 0b101011,
+ 0b0100111,
+ 0b0001100,
+ 0b0001000,
+ 0b0010111,
+ 0b0000011,
+ 0b0000100,
+ 0b0101000,
+ 0b0101011,
+ 0b0010011,
+ 0b0100100,
+ 0b0011000,
+ 0b00000010,
+ 0b00000011,
+ 0b00011010,
+ 0b00011011,
+ 0b00010010,
+ 0b00010011,
+ 0b00010100,
+ 0b00010101,
+ 0b00010110,
+ 0b00010111,
+ 0b00101000,
+ 0b00101001,
+ 0b00101010,
+ 0b00101011,
+ 0b00101100,
+ 0b00101101,
+ 0b00000100,
+ 0b00000101,
+ 0b00001010,
+ 0b00001011,
+ 0b01010010,
+ 0b01010011,
+ 0b01010100,
+ 0b01010101,
+ 0b00100100,
+ 0b00100101,
+ 0b01011000,
+ 0b01011001,
+ 0b01011010,
+ 0b01011011,
+ 0b01001010,
+ 0b01001011,
+ 0b00110010,
+ 0b00110011,
+ 0b00110100
+ }
+};
+static const unsigned t4_term_length[2][64] = {
+ {10, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
+};
+
+static const unsigned t4_min_term_length[] = {2, 4};
+static const unsigned t4_min_make_up_length[] = {10, 5};
+
+static const unsigned t4_max_term_length[] = {12, 8};
+static const unsigned t4_max_make_up_length[] = {13, 9};
+
+static const unsigned t4_make_up_length[2][15] = {
+ {10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13},
+ {5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9}
+};
+
+static const unsigned t4_make_up_ind[15] = {64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960};
+
+static const unsigned t4_make_up[2][15] = {
+ {
+ 0b0000001111,
+ 0b000011001000,
+ 0b000011001001,
+ 0b000001011011,
+ 0b000000110011,
+ 0b000000110100,
+ 0b000000110101,
+ 0b0000001101100,
+ 0b0000001101101,
+ 0b0000001001010,
+ 0b0000001001011,
+ 0b0000001001100,
+ 0b0000001001101,
+ 0b0000001110010,
+ 0b0000001110011
+ },
+ {
+ 0b11011,
+ 0b10010,
+ 0b010111,
+ 0b0110111,
+ 0b00110110,
+ 0b00110111,
+ 0b01100100,
+ 0b01100101,
+ 0b01101000,
+ 0b01100111,
+ 0b011001100,
+ 0b011001101,
+ 0b011010010,
+ 0b011010011,
+ 0b011010100
+ }
+};
+
/* The code words for one run length and zero
* run length are described in table 9.1.10.1
* of 3gpp 44.060
@@ -342,3 +497,134 @@ void egprs_compress::decode_tree_init()
build_codewords(ones_list, one_run_len_code_list);
build_codewords(zeros_list, zero_run_len_code_list);
}
+void compress_bitmap(
+ uint16_t *run_len_cnt, /* cnt: run length count */
+ uint16_t *codewrd_bitmap, /* code word */
+ int16_t *codewrd_len, /* number of bits in the code word */
+ bitvec *crbb_vec, /* bitmap buffer to put code word in */
+ uint8_t clr_code)
+{
+ int i = 0;
+ unsigned writeIndex = crbb_vec->cur_bit;
+
+ *codewrd_bitmap = 0;
+ *codewrd_len = 0;
+ if ((*run_len_cnt) >= 64) {
+ for (i = 0; i < 15; i++) {
+ if (t4_make_up_ind[i] == *run_len_cnt) {
+ *codewrd_bitmap = t4_make_up[clr_code][i];
+ *codewrd_len = t4_make_up_length[clr_code][i];
+ }
+ }
+ } else {
+ *codewrd_bitmap = t4_term[clr_code][*run_len_cnt];
+ *codewrd_len = t4_term_length[clr_code][*run_len_cnt];
+ }
+ bitvec_write_field(crbb_vec, writeIndex, (*codewrd_bitmap), (*codewrd_len));
+}
+
+int osmo_t4_compress(struct bitvec *bv)
+{
+ uint8_t crbb_len = 0;
+ uint8_t uclen_crbb = 0;
+ uint8_t crbb_bitmap[127] = {'\0'};
+ uint8_t color_code = (bv->data[0] & 0x80)>>7;
+ struct bitvec crbb_vec;
+
+ crbb_vec.data = crbb_bitmap;
+ crbb_vec.cur_bit = 0;
+ crbb_vec.data_len = 127;
+ bv->data_len = bv->cur_bit;
+ bv->cur_bit = 0;
+ if (compress_rbb(bv, &crbb_vec, &uclen_crbb, 23*8)) {
+ memcpy(bv->data, crbb_bitmap, (crbb_len+7)/8);
+ bv->cur_bit = crbb_len;
+ bv->data_len = (crbb_len+7)/8;
+ return color_code;
+ }
+ else
+ printf("Encode faled\n");
+ return -1;
+}
+
+/*! \brief compression algorithm using T4 encoding
+ * the compressed bitmap's are copied in crbb_bitmap
+ * \param[in] rbb_vec bit vector to be encoded
+ * \return 1 if compression is success or 0 for failure
+ */
+int compress_rbb(
+ struct bitvec *urbb_vec,
+ struct bitvec *crbb_vec,
+ uint8_t *uclen_crbb, /* Uncompressed bitmap len in CRBB */
+ uint8_t max_bits) /* max remaining bits */
+{
+ bool run_len_bit;
+ int buflen = urbb_vec->cur_bit;
+ int total_bits = urbb_vec->cur_bit;
+ uint16_t rlen;
+ uint16_t temprl = 0;
+ uint16_t cbmap = 0; /* Compressed code word */
+ int16_t nbits; /* Length of code word */
+ uint16_t uclen = 0;
+ int16_t clen = 0;
+ uint8_t clr_code = 0;
+
+ urbb_vec->cur_bit = 0;
+ run_len_bit = (urbb_vec->data[0] & 0x80)>>7;
+ while (buflen > 0) {
+ temprl = 0;
+ /* Find Run length */
+ if (run_len_bit == 1)
+ rlen = bitvec_rl_curbit(urbb_vec, true, total_bits);
+ else
+ rlen = bitvec_rl_curbit(urbb_vec, false, total_bits);
+ buflen = buflen - rlen;
+ /* if rlen> 64 need 2 code words */
+ /*Compress the bits */
+ if (run_len_bit == 0) {
+ clr_code = 0;
+ if (rlen >= 64) {
+ temprl = (rlen/64)*64;
+ compress_bitmap(&temprl, &cbmap, &nbits,
+ crbb_vec, clr_code);
+ clen = clen + nbits;
+ }
+ temprl = MOD64(rlen);
+ compress_bitmap(&temprl, &cbmap, &nbits,
+ crbb_vec, clr_code);
+ /* next time the run length will be Ones */
+ run_len_bit = 1;
+ } else {
+ clr_code = 1;
+ if (rlen >= 64) {
+ temprl = (rlen/64)*64;
+ compress_bitmap(&temprl, &cbmap, &nbits,
+ crbb_vec, clr_code);
+ clen = clen + nbits;
+ }
+ temprl = MOD64(rlen);
+ compress_bitmap(&temprl, &cbmap, &nbits,
+ crbb_vec, clr_code);
+
+ /* next time the run length will be Zeros */
+ run_len_bit = 0;
+ }
+ uclen = uclen + (rlen);
+ clen = clen + nbits;
+ /*compressed bitmap exceeds the buffer space */
+ if (clen > max_bits) {
+ uclen = uclen - rlen;
+ clen = clen - nbits;
+ break;
+ }
+ }
+ crbb_vec->cur_bit = clen;
+ *uclen_crbb = uclen;
+ if (clen >= uclen)
+ /* No Gain is observed, So no need to compress */
+ return 0;
+ else
+ /* Add compressed bitmap to final buffer */
+ return 1;
+}
+
diff --git a/src/egprs_rlc_compression.h b/src/egprs_rlc_compression.h
index 4b6646e..06c75a3 100644
--- a/src/egprs_rlc_compression.h
+++ b/src/egprs_rlc_compression.h
@@ -6,6 +6,7 @@
#define BITS_TO_BYTES(X) (((X) ? (X)/8 : 0) + 1)
#define MOD8(X) ((X) & (0x07))
+#define MOD64(X) ((X + 64) & 0x3F)
typedef struct egprs_compress_node{
struct egprs_compress_node *left;
@@ -13,6 +14,16 @@ typedef struct egprs_compress_node{
int run_length;
} egprs_compress_node;
+int decompress_crbb(int8_t compress_bmap_len, uint8_t clr_code_bit,
+ const uint8_t *orig_buf, bitvec *dest);
+int osmo_t4_compress(struct bitvec *bv);
+int compress_rbb(
+ struct bitvec *urbb_vec,/*!< input bitvector to compress */
+ struct bitvec *crbb_vec, /*!< Compressed bitmap len */
+ uint8_t *uclen_crbb, /*!< Uncompressed bitmap len in CRBB */
+ uint8_t max_bits /*!< Maximum remaining bits */
+ );
+
/* Singleton to manage the EGPRS compression algorithm. */
class egprs_compress
{
diff --git a/src/encoding.cpp b/src/encoding.cpp
index dbf0248..b46ad4f 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -24,6 +24,7 @@
#include <bts.h>
#include <tbf.h>
#include <gprs_debug.h>
+#include <egprs_rlc_compression.h>
extern "C" {
#include <osmocom/gprs/protocol/gsm_04_60.h>
@@ -612,7 +613,8 @@ static void write_packet_ack_nack_desc_egprs(
gprs_rlc_ul_window *window, bool is_final)
{
int urbb_len = 0;
- int len;
+ uint8_t crbb_len = 0;
+ uint8_t len;
bool bow = true;
bool eow = true;
int ssn = window->mod_sns(window->v_q() + 1);
@@ -620,8 +622,17 @@ static void write_packet_ack_nack_desc_egprs(
int esn_crbb = window->mod_sns(ssn - 1);
/* Bit 0 at the end is mandatory Table 11.2.28.1 in 44.060 */
int rest_bits = dest->data_len * 8 - wp - 1;
+ uint8_t rbb[128] = {'\0'};
+ uint8_t iter = 0;
int is_compressed = 0;
+ int try_compression = 0;
+ uint8_t ucmp_bmplen;
+ uint8_t crbb_bitmap[23] = {'\0'};
+ bitvec ucmp_vec;
+ bitvec crbb_vec;
+ uint8_t uclen_crbb = 0;
bool len_coded = true;
+ uint8_t crbb_start_clr_code;
uint8_t i;
if (num_blocks > 0)
@@ -630,7 +641,35 @@ static void write_packet_ack_nack_desc_egprs(
if (num_blocks > window->ws())
num_blocks = window->ws();
- /* TODO Compression support */
+
+ if (num_blocks > rest_bits - 23 - 9) {
+ /* Try Compression as number of blocks does not fit */
+ try_compression = 1;
+ }
+ if (try_compression == 1) {
+ ucmp_bmplen = window->update_egprs_rbb(rbb);
+ ucmp_vec.data = rbb;
+ ucmp_vec.cur_bit = ucmp_bmplen;
+ ucmp_vec.data_len = 127;
+ crbb_vec.data = crbb_bitmap;
+ crbb_vec.cur_bit = 0;
+ crbb_vec.data_len = 127;
+ LOGP(DRLCMACUL, LOGL_DEBUG,
+ "rest_bits=%d uncompressed len %d and uncompressed bitmap = %s\n",
+ rest_bits, ucmp_bmplen,
+ osmo_hexdump(ucmp_vec.data, (ucmp_bmplen+7)/8));
+
+ is_compressed = compress_rbb(&ucmp_vec, /* Uncompressed bitmap*/
+ &crbb_vec, /*Compressed bitmap vector */
+ &uclen_crbb,
+ (rest_bits - 23 - 9));/* 9 bits for union + length */
+ LOGP(DRLCMACUL, LOGL_DEBUG,
+ "the ucmp len=%d uclen_crbb=%d num_blocks=%d crbb length %d, "
+ "and the CRBB bitmap = %s\n",
+ ucmp_bmplen, uclen_crbb, num_blocks, crbb_vec.cur_bit,
+ osmo_hexdump(crbb_bitmap, (crbb_vec.cur_bit+7)/8));
+ }
+
if (is_compressed == 0) {
/* Union bit takes 1 bit */
/* Other fields in descr for uncompresed bitmap takes 15 bits*/
@@ -650,7 +689,22 @@ static void write_packet_ack_nack_desc_egprs(
urbb_len = num_blocks;
len = urbb_len + 15;
} else {
- /* TODO Compressed bitmap */
+ if (num_blocks > uclen_crbb) {
+ eow = false;
+ urbb_len = num_blocks - uclen_crbb;
+ }
+ /* Union bit takes 1 bit */
+ /* Other fields in descr of compresed bitmap takes 23 bits*/
+ if (urbb_len > (rest_bits - crbb_len - 23 - 1)) {
+ eow = false;
+ len_coded = false;
+ urbb_len = rest_bits - crbb_len - 23 - 1;
+ } else if (urbb_len > (rest_bits - crbb_len - 23 - 9)) {
+ eow = false;
+ len_coded = false;
+ urbb_len = rest_bits - crbb_len - 23 - 9;
+ }
+ len = urbb_len + crbb_len + 23;
}
/* EGPRS Ack/Nack Description IE */
@@ -666,14 +720,32 @@ static void write_packet_ack_nack_desc_egprs(
bitvec_write_field(dest, wp, eow, 1); // END_OF_WINDOW
bitvec_write_field(dest, wp, ssn, 11); // STARTING_SEQUENCE_NUMBER
if (is_compressed) {
- /* TODO Add CRBB support */
- } else
+ bitvec_write_field(dest, wp, 1, 1); // CRBB_Exist
+ bitvec_write_field(dest, wp, crbb_len, 7); // CRBB_LENGTH
+ crbb_start_clr_code = (0x80 & crbb_bitmap[0])>>7;
+ bitvec_write_field(dest, wp, crbb_start_clr_code, 1); // CRBB_clr_code
+ LOGP(DRLCMACUL, LOGL_DEBUG,
+ "EGPRS CRBB, crbb_len = %d, crbb_start_clr_code = %d\n",
+ crbb_len, crbb_start_clr_code);
+ while (crbb_len != 0) {
+ if (crbb_len > 8) {
+ bitvec_write_field(dest, wp, crbb_bitmap[iter], 8);
+ crbb_len = crbb_len - 8;
+ iter++;
+ } else {
+ bitvec_write_field(dest, wp, crbb_bitmap[iter], crbb_len);
+ crbb_len = 0;
+ }
+ }
+ esn_crbb = window->mod_sns(esn_crbb + uclen_crbb);
+ } else {
bitvec_write_field(dest, wp, 0, 1); // CRBB_Exist
+ }
LOGP(DRLCMACUL, LOGL_DEBUG,
"EGPRS URBB, urbb len = %d, SSN = %d, ESN_CRBB = %d, "
"len present = %s,desc len = %d, "
"SNS = %d, WS = %d, V(Q) = %d, V(R) = %d%s%s\n",
- urbb_len, ssn, esn_crbb, len_coded ? "yes" : "No", len,
+ urbb_len, ssn, esn_crbb, len_coded ? "yes" : "No" ,len,
window->sns(), window->ws(), window->v_q(), window->v_r(),
bow ? ", BOW" : "", eow ? ", EOW" : "");
diff --git a/src/rlc.cpp b/src/rlc.cpp
index ee2635a..906f4cc 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -83,6 +83,32 @@ int gprs_rlc_dl_window::mark_for_resend()
return resend;
}
+/* Update the receive block bitmap */
+uint16_t gprs_rlc_ul_window::update_egprs_rbb(uint8_t *rbb)
+{
+ int i;
+ uint16_t bsn;
+ uint16_t bitmask = 0x80;
+ int8_t pos = 0;
+ int8_t bit_pos = 0;
+ for (i = 0, bsn = (v_q()+1); ((bsn < (v_r())) && (i < ws())); i++,
+ bsn = this->mod_sns(bsn + 1)) {
+ if (m_v_n.is_received(bsn)) {
+ rbb[pos] = rbb[pos] | bitmask;
+ } else {
+ rbb[pos] = rbb[pos] & (~bitmask);
+ }
+ bitmask = bitmask >> 1;
+ bit_pos++;
+ bit_pos = bit_pos % 8;
+ if(bit_pos == 0) {
+ pos++;
+ bitmask = 0x80;
+ }
+ }
+ return i;
+}
+
int gprs_rlc_dl_window::count_unacked()
{
uint16_t unacked = 0;
diff --git a/src/rlc.h b/src/rlc.h
index b693418..83b6815 100644
--- a/src/rlc.h
+++ b/src/rlc.h
@@ -347,6 +347,7 @@ struct gprs_rlc_ul_window: public gprs_rlc_window {
bool is_received(uint16_t bsn) const;
void update_rbb(char *rbb);
+ uint16_t update_egprs_rbb(uint8_t *rbb);
void raise_v_r_to(int moves);
void raise_v_r(const uint16_t bsn);
uint16_t raise_v_q();
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 97696cb..a0f174a 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -694,9 +694,7 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts,
if (egprs_ms_class > 0 && bts->egprs_enabled) {
tbf->enable_egprs();
tbf->m_window.set_sns(RLC_EGPRS_SNS);
- /* TODO: Allow bigger UL windows when CRBB encoding is supported */
- tbf->m_window.set_ws(RLC_EGPRS_MIN_WS);
- setup_egprs_mode(bts, ms);
+ setup_egprs_mode(bts, ms);
LOGP(DRLCMAC, LOGL_INFO, "Enabled EGPRS for %s, mode %s\n",
tbf->name(), GprsCodingScheme::modeName(ms->mode()));
}
@@ -708,6 +706,7 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts,
return NULL;
}
+ tbf->egprs_calc_ulwindow_size();
llist_add(&tbf->list(), &bts->bts->ul_tbfs());
tbf->bts->tbf_ul_created();
diff --git a/src/tbf.h b/src/tbf.h
index 3a6f42d..26a3c66 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -461,6 +461,8 @@ struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf {
struct gprs_rlc_data *block,
uint8_t *data, const uint8_t block_idx);
+ void egprs_calc_ulwindow_size();
+
/* Please note that all variables here will be reset when changing
* from WAIT RELEASE back to FLOW state (re-use of TBF).
* All states that need reset must be in this struct, so this is why
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index f67ffd7..6797632 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -29,6 +29,8 @@
#include <decoding.h>
#include <pcu_l1_if.h>
+#include "pcu_utils.h"
+
extern "C" {
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
@@ -517,3 +519,22 @@ egprs_rlc_ul_reseg_bsn_state gprs_rlcmac_ul_tbf::handle_egprs_ul_spb(
}
return assemble_status;
}
+
+void gprs_rlcmac_ul_tbf::egprs_calc_ulwindow_size()
+{
+ struct gprs_rlcmac_bts *bts_data = bts->bts_data();
+ unsigned int num_pdch = pcu_bitcount(ul_slots());
+ unsigned int ws = bts_data->ws_base + num_pdch * bts_data->ws_pdch;
+ ws = (ws / 32) * 32;
+ ws = OSMO_MAX(64, ws);
+
+ if (num_pdch == 1)
+ ws = OSMO_MIN(192, ws);
+ else
+ ws = OSMO_MIN(128 * num_pdch, ws);
+
+ LOGP(DRLCMAC, LOGL_INFO, "%s: Setting EGPRS window size to %d\n",
+ name(), ws);
+
+ m_window.set_ws(ws);
+}
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index 0c9c877..f0bd8c5 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -31,6 +31,7 @@ PDCH(TS 2, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 2
Attaching TBF to MS object, TLLI = 0x00002342, TBF = TBF(TFI=0 TLLI=0x00002342 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00002342 DIR=UL STATE=NULL): trx = 0, ul_slots = 04, dl_slots = 00
+TBF(TFI=0 TLLI=0x00002342 DIR=UL STATE=NULL): Setting EGPRS window size to 64
Modifying MS object, TLLI: 0x00000000 -> 0x00002342, already confirmed partly
The MS object cannot fully confirm an unexpected TLLI: 0x00004232, partly confirmed
Modifying MS object, TLLI: 0x00002342 -> 0x00004232, already confirmed partly
@@ -1561,6 +1562,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
Modifying MS object, TLLI = 0x00000000, TA 220 -> 7
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to FLOW
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW) starting timer 3169.
@@ -1645,6 +1647,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -1731,6 +1734,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -1871,6 +1875,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=NULL), 2 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=1 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf5667788, not yet confirmed
@@ -1944,6 +1949,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -2043,6 +2049,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0xf1223344, TBF = TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) starting timer 3169.
Change control TS to 7 until assinment is complete.
@@ -2123,6 +2130,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -2206,6 +2214,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
Modifying MS object, TLLI = 0x00000000, TA 220 -> 7
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to FLOW
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW) starting timer 3169.
@@ -2275,6 +2284,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL), 1 TBF
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -3415,6 +3425,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS),
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN EGPRS) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -3508,6 +3519,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS),
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN EGPRS) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -6271,6 +6283,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS),
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN EGPRS) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed
@@ -6320,7 +6333,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS): data_length=37, data=00 00 0
-- Frame 1 starts at offset 0, length=37, is_complete=0
- No gaps in received block, last block: BSN=1 CV=7
Encoding Ack/Nack for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS) (final=0)
- - EGPRS URBB, len = 0, SSN = 3, ESN_CRBB = 2, SNS = 2048, WS = 64, V(Q) = 2, V(R) = 2, BOW, EOW
+EGPRS URBB, urbb len = 0, SSN = 3, ESN_CRBB = 2, len present = yes,desc len = 15, SNS = 2048, WS = 64, V(Q) = 2, V(R) = 2, BOW, EOW
Uplink Ack/Nack bit count 98, max 184, message = 40 24 01 3f 3e 24 46 68 90 87 b0 06 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
Got RLC block, coding scheme: MCS-3, length: 42 (42))
UL data: 1d 20 40 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@@ -6333,7 +6346,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS): Got MCS-3 RLC data block: CV
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS): data_length=37, data=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- Raising V(R) to 5
Encoding Ack/Nack for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS) (final=0)
- - EGPRS URBB, len = 2, SSN = 3, ESN_CRBB = 2, SNS = 2048, WS = 64, V(Q) = 2, V(R) = 5, BOW, EOW
+EGPRS URBB, urbb len = 2, SSN = 3, ESN_CRBB = 2, len present = yes,desc len = 17, SNS = 2048, WS = 64, V(Q) = 2, V(R) = 5, BOW, EOW
Uplink Ack/Nack bit count 100, max 184, message = 40 24 01 3f 3e 24 46 68 90 88 b0 06 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
Got 'TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW EGPRS)', TA=7
Got MS: TLLI = 0xf1223344, TA = 7
@@ -6444,6 +6457,7 @@ PDCH(TS 7, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS),
- Setting Control TS 7
Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS)
Allocated TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): trx = 0, ul_slots = 80, dl_slots = 00
+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS): Setting EGPRS window size to 64
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) changes state from NULL to ASSIGN
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN EGPRS) starting timer 3169.
Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed