diff options
Diffstat (limited to 'tests/tbf/TbfTest.cpp')
-rw-r--r-- | tests/tbf/TbfTest.cpp | 197 |
1 files changed, 134 insertions, 63 deletions
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index 4838f0f..a9d2e8b 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -40,27 +40,41 @@ extern "C" { #include <errno.h> #define NUMBER_OF_TEST_CASE 4 #define NEW 1 +#define DELTA 1000 void *tall_pcu_ctx; int16_t spoof_mnc = 0, spoof_mcc = 0; - struct test_data { - int8_t crbb_len; - uint8_t cc ; - uint8_t data[23]; - uint8_t exp_data[40]; - int exp_len; - }test[4] = { { (int8_t)67, (uint8_t)1,{0x02, 0x0c, 0xa0, 0x30, 0xcb, 0x1a, 0x0c, 0xe3, 0x6c}, - {0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xdb}, (int)194}, - { (int8_t)40, (uint8_t)1,{0x53, 0x06, 0xc5, 0x40, 0x6d}, { 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03}, (int)182}, - { (int8_t)6, (uint8_t)1, {0x1c}, {0x80}, (int)1}, - { (int8_t)103,(uint8_t)1, {0x02, 0x0c, 0xe0, 0x41, 0xa0, 0x0c, 0x36, 0x0d, 0x03, - 0x71, 0xb0, 0x6e, 0x24}, {0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, - 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff} , - (int)288} }; +struct test_data { + int8_t crbb_len; + uint8_t cc ; + uint8_t data[23]; + uint8_t exp_data[40]; + int exp_len; +}test[4] = { { (int8_t)67, (uint8_t)1,{0x02, 0x0c, 0xa0, 0x30, 0xcb, 0x1a, 0x0c, 0xe3, 0x6c}, + {0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, + 0xdb}, (int)194}, + {(int8_t)40, (uint8_t)1, {0x53,0x06,0xc5,0x40,0x6d}, {0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x03}, (int)182}, + { (int8_t)8, (uint8_t)1, {0x02}, {0xff, 0xff, 0xff, 0xf8}, (int)29}, + { (int8_t)103,(uint8_t)1, {0x02, 0x0c, 0xe0, 0x41, 0xa0, 0x0c, 0x36, 0x0d, 0x03, + 0x71, 0xb0, 0x6e, 0x24}, {0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff} , + (int)288} }; +struct test_data1 { + int8_t crbb_len; + uint8_t cc; + uint8_t data[23]; + uint8_t exp_data[42]; + int exp_len; +} test1[3] = { {(int8_t)41, (uint8_t)1, {0xac,0x22,0x70,0xa3,0x03,0x80}, {0xff, 0xff, 0x80, 0x1f, 0xff, + 0xf8, 0x00, 0xff, 0xff, 0xe0, 0x00}, (int)87}, + {(int8_t)12, (uint8_t)1, {0x38, 0x40}, {0xff, 0xc0, 0x00}, (int)20}, + {(int8_t)16, (uint8_t)0, {0x0c, 0x93}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}, (int)197} }; + static void check_tbf(gprs_rlcmac_tbf *tbf) { OSMO_ASSERT(tbf); @@ -69,6 +83,7 @@ static void check_tbf(gprs_rlcmac_tbf *tbf) if (tbf->state_is(GPRS_RLCMAC_RELEASING)) OSMO_ASSERT(tbf->T != 0); } + static void send_ul_mac_block(BTS *the_bts, unsigned trx_no, unsigned ts_no, RlcMacUplink_t *ulreq, unsigned fn) { @@ -87,6 +102,7 @@ static void send_ul_mac_block(BTS *the_bts, unsigned trx_no, unsigned ts_no, pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no]; pdch->rcv_block(&buf[0], num_bytes, fn, &meas); } + static void send_control_ack(gprs_rlcmac_tbf *tbf) { RlcMacUplink_t ulreq = {0}; @@ -100,10 +116,12 @@ static void send_control_ack(gprs_rlcmac_tbf *tbf) send_ul_mac_block(tbf->bts, tbf->trx->trx_no, tbf->poll_ts, &ulreq, tbf->poll_fn); } + static unsigned fn2bn(unsigned fn) { return (fn % 52) / 4; } + static unsigned fn_add_blocks(unsigned fn, unsigned blocks) { unsigned bn = fn2bn(fn) + blocks; @@ -111,6 +129,7 @@ static unsigned fn_add_blocks(unsigned fn, unsigned blocks) fn += bn * 4 + bn / 3; return fn % 2715648; } + static void setup_bts(BTS *the_bts, uint8_t ts_no, uint8_t cs = 1) { gprs_rlcmac_bts *bts; @@ -122,6 +141,7 @@ static void setup_bts(BTS *the_bts, uint8_t ts_no, uint8_t cs = 1) trx = &bts->trx[0]; trx->pdch[ts_no].enable(); } + static void request_dl_rlc_block(struct gprs_rlcmac_bts *bts, uint8_t trx_no, uint8_t ts_no, uint16_t arfcn, uint32_t *fn, uint8_t *block_nr = NULL) @@ -133,6 +153,7 @@ static void request_dl_rlc_block(struct gprs_rlcmac_bts *bts, if (block_nr) *block_nr = bn; } + static void request_dl_rlc_block(struct gprs_rlcmac_tbf *tbf, uint32_t *fn, uint8_t *block_nr = NULL) { @@ -143,6 +164,7 @@ enum test_tbf_final_ack_mode { TEST_MODE_STANDARD, TEST_MODE_REVERSE_FREE }; + static gprs_rlcmac_ul_tbf *establish_ul_tbf_two_phase_spb_pdan(BTS *the_bts, uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta, uint8_t ms_class, uint8_t egprs_ms_class) @@ -167,6 +189,7 @@ static gprs_rlcmac_ul_tbf *establish_ul_tbf_two_phase_spb_pdan(BTS *the_bts, pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no]; pdch->rcv_block(&data_msg[0], 23, *fn, &meas); } + static gprs_rlcmac_dl_tbf *create_dl_tbf(BTS *the_bts, uint8_t ms_class, uint8_t egprs_ms_class, uint8_t *trx_no_) { @@ -186,6 +209,7 @@ static gprs_rlcmac_dl_tbf *create_dl_tbf(BTS *the_bts, uint8_t ms_class, *trx_no_ = trx_no; return dl_tbf; } + static gprs_rlcmac_dl_tbf *tbf_init(BTS *the_bts, int mcs) { @@ -214,6 +238,7 @@ static gprs_rlcmac_dl_tbf *tbf_init(BTS *the_bts, OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW)); return dl_tbf; } + static void establish_and_use_egprs_dl_tbf_pdan(BTS *the_bts, int mcs, int demanded_mcs) { @@ -290,20 +315,19 @@ void test_EPDAN_time_osmot4(int test_run, int verify) { LOGP(DRLCMACDL, LOGL_DEBUG, "\nMaster decoding osmo_t4"); int itr = 0; - long long int min_master = 0, max_master = 0, avg_master = 0 ; + long long int min_master = 0, max_master = 0, sum = 0, avg = 0; + float avg_master = 0; bitvec bits; struct bitvec data1; struct timeval t0, t1; - data1.data = test[itr].data; uint8_t bits_data[RLC_EGPRS_MAX_WS/8]; - - for (itr ; itr < NUMBER_OF_TEST_CASE ; itr++) { - int loop = 0, init_flag = 1; - avg_master = 0 ; + for (itr ; itr < NUMBER_OF_TEST_CASE ; itr++) { + int loop = 0, init_flag = 1, count = 0, first = 0, last = 0; + avg_master = 0 , min_master = 0 ,max_master = 0; while (loop++ < test_run) { data1.data_len = ((test[itr].crbb_len + 7)/8); data1.cur_bit = test[itr].crbb_len; - + data1.data = test[itr].data; bits.data = bits_data; bits.data_len = sizeof(bits_data); bits.cur_bit = 0; @@ -314,27 +338,39 @@ void test_EPDAN_time_osmot4(int test_run, int verify) gettimeofday(&t1, 0); long long elapsed = (t1.tv_sec-t0.tv_sec)*1000000LL + t1.tv_usec-t0.tv_usec; if (init_flag) { - min_master = elapsed; - max_master = elapsed; init_flag = 0 ; } if (verify) { if (check_result (bits, test[itr].exp_data, test[itr].exp_len) == 0) { LOGP(DRLCMACDL, LOGL_DEBUG, "Master decoding :Error\n"); - OSMO_ASSERT(0); + OSMO_ASSERT(0) ; } } - if (min_master >= elapsed) { + if (loop == 1) { + first = elapsed; + sum = elapsed; + avg = elapsed; min_master = elapsed; - } else { max_master = elapsed; + avg_master = elapsed; + } else { + if (loop == test_run-1) + last = elapsed; + if (elapsed > (avg+DELTA)) + count++;/*Count of abnormal values*/ + sum = sum + elapsed; + avg = sum / loop; + if (min_master > elapsed) + min_master = elapsed; + if (max_master < elapsed) + max_master = elapsed; + avg_master = avg_master + elapsed; } - avg_master = avg_master + elapsed; } avg_master = (avg_master / test_run); LOGP(DRLCMACDL, LOGL_DEBUG, - "\nTest case number :%d \nTime elapsed:\nmin = %Ld\n" - "max = %Ld\navg = %Ld\n", itr+1, min_master, max_master, avg_master) ; + "\nTest case number :%d \nTime elapsed:\nFirst = %d\tLast = %d\nmin = %Ld\n" + "max = %Ld\navg = %f\nabnormal value occurred %d\n", itr+1, first, last, min_master, max_master, avg_master,count) ; } } /* To check time taken to decode crbb by Tree based method @@ -343,55 +379,93 @@ void test_EPDAN_time_tree(int test_run, int verify) { LOGP (DRLCMACDL, LOGL_DEBUG, "Tree based decoding"); int itr = 0; - long long int min_tree = 0, max_tree = 0, avg_tree = 0; + long long int min_tree = 0, max_tree = 0, sum = 0, avg = 0; + float avg_tree = 0; bitvec bits; struct bitvec data1; - - for (itr ; itr < NUMBER_OF_TEST_CASE ; itr++) { - int loop = 0, init_flag = 1; - avg_tree = 0; - + for (itr ; itr < NUMBER_OF_TEST_CASE ; itr++) { + int loop = 0, init_flag = 1, first = 0, last = 0, count = 0; + avg_tree = 0 , min_tree = 0 , max_tree = 0; while (loop++ < test_run) { data1.data_len = ((test[itr].crbb_len + 7)/8); data1.cur_bit = test[itr].crbb_len; - struct timeval t0, t1; - data1.data = test[itr].data; uint8_t bits_data[RLC_EGPRS_MAX_WS/8]; - bits.data = bits_data; bits.data_len = sizeof(bits_data); bits.cur_bit = 0; gettimeofday(&t0, 0); Decoding::decompress_crbb(test[itr].crbb_len, test[itr].cc, test[itr].data, &bits); gettimeofday(&t1, 0); - long long elapsed = (t1.tv_sec-t0.tv_sec)*1000000LL + t1.tv_usec-t0.tv_usec; - - if (init_flag) { - min_tree = elapsed; - max_tree = elapsed; + if (init_flag) init_flag = 0; - } if (verify) { if (check_result(bits, test[itr].exp_data, test[itr].exp_len) == 0) { LOGP (DRLCMACDL, LOGL_DEBUG, "Tree based decoding :Error\n"); OSMO_ASSERT(0) ; } } - if (min_tree >= elapsed) { + if (loop == 1) { + first = elapsed; min_tree = elapsed; - }else { max_tree = elapsed; + sum = elapsed; + avg = elapsed; + avg_tree = elapsed; + } else { + if (loop == test_run-1) + last = elapsed; + if (elapsed > (avg+DELTA)) + count++; + sum = sum + elapsed; + avg = sum / loop; + if (min_tree > elapsed) + min_tree = elapsed; + if (max_tree < elapsed) + max_tree = elapsed; + avg_tree = avg_tree + elapsed; } - avg_tree = avg_tree + elapsed; - } + } avg_tree = (avg_tree / test_run); - LOGP(DRLCMACDL, LOGL_DEBUG, "\nTest case number :%d\nTime elapsed:\n" - "min = %Ld\nmax = %Ld\navg = %Ld\n", itr+1, min_tree, max_tree, avg_tree); + LOGP(DRLCMACDL, LOGL_DEBUG, "\nTest case number :%d\nTime elapsed:\nFirst = %d\tLast = %d\n" + "min = %Ld\nmax = %Ld\navg = %f\nabnormal value occurred %d\n", itr+1, first, last, min_tree, max_tree, avg_tree,count); } } +/*Functoin to check the test vectors*/ +void test_EPDAN_test_vector() +{ + + LOGP(DRLCMACDL, LOGL_DEBUG, "\nCompressed bitmap test vectors check\n"); + struct bitvec data1; + bitvec bits, bits1; + uint8_t bits_data[RLC_EGPRS_MAX_WS/8]; + int itr = 0; + for (itr ; itr < NUMBER_OF_TEST_CASE ; itr++) { + data1.data_len = ((test1[itr].crbb_len+7)/8); + data1.cur_bit = test1[itr].crbb_len; + data1.data = test1[itr].data; + bits.data = bits_data; + bits.data_len = sizeof(bits_data); + bits.cur_bit = 0; + + Decoding::decompress_crbb(test[itr].crbb_len, test[itr].cc, test[itr].data, &bits); + if (check_result(bits, test[itr].exp_data, test[itr].exp_len) == 0) + LOGP (DRLCMACDL, LOGL_DEBUG, "Tree based decoding :Error\n"); + else + LOGP (DRLCMACDL, LOGL_DEBUG, "Tree based decoding :Success\n"); + bits1.data = bits_data; + bits1.data_len = sizeof(bits_data); + bits1.cur_bit = 0; + osmo_t4_decode(&data1, test[itr].cc, &bits1); + if (check_result(bits1, test[itr].exp_data, test[itr].exp_len) == 0) + LOGP (DRLCMACDL, LOGL_DEBUG, "Exsiting decoding :Error\n"); + else + LOGP (DRLCMACDL, LOGL_DEBUG, "Existing decoding :Success\n"); + } +} + static void test_tbf_base() { printf("=== start %s ===\n", __func__); @@ -399,6 +473,7 @@ static void test_tbf_base() OSMO_ASSERT(GPRS_RLCMAC_UL_TBF == reverse(GPRS_RLCMAC_DL_TBF)); printf("=== end %s ===\n", __func__); } + static void test_tbf_tlli_update() { BTS the_bts; @@ -467,6 +542,7 @@ int pcu_sock_send(struct msgb *msg) { return 0; } + static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode) { BTS the_bts; @@ -1999,15 +2075,10 @@ static void test_tbf_egprs_dl() setup_bts(&the_bts, ts_no); bts->dl_tbf_idle_msec = 200; bts->egprs_enabled = 1; - for (i = 1; i <= 9; i++) establish_and_use_egprs_dl_tbf(&the_bts, i); - printf("=== end %s ===\n", __func__); } - - - static const struct log_info_cat default_categories[] = { {"DCSN1", "\033[1;31m", "Concrete Syntax Notation One (CSN1)", LOGL_INFO, 0}, {"DL1IF", "\033[1;32m", "GPRS PCU L1 interface (L1IF)", LOGL_DEBUG, 1}, @@ -2021,7 +2092,6 @@ static const struct log_info_cat default_categories[] = { {"DBSSGP","\033[1;34m", "GPRS BSS Gateway Protocol (BSSGP)", LOGL_INFO , 1}, {"DPCU", "\033[1;35m", "GPRS Packet Control Unit (PCU)", LOGL_NOTICE, 1}, }; - static int filter_fn(const struct log_context *ctx, struct log_target *tar) { @@ -2069,8 +2139,9 @@ int main(int argc, char **argv) test_tbf_ws(); test_tbf_egprs_two_phase(); test_tbf_egprs_dl(); - test_EPDAN_time_tree(10000, 0); - test_EPDAN_time_osmot4(10000, 0); + test_EPDAN_time_tree(10000, 1); + test_EPDAN_time_osmot4(10000, 1); + test_EPDAN_test_vector(); if (getenv("TALLOC_REPORT_FULL")) talloc_report_full(tall_pcu_ctx, stderr); return EXIT_SUCCESS; |