diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/tbf/TbfTest.cpp | 145 | ||||
-rw-r--r-- | tests/tbf/TbfTest.err | 6 |
2 files changed, 95 insertions, 56 deletions
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index 865081bd..f3b749fe 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -188,14 +188,25 @@ static gprs_rlcmac_dl_tbf *create_dl_tbf(BTS *the_bts, uint8_t ms_class, return dl_tbf; } +static unsigned fn2bn(unsigned fn) +{ + return (fn % 52) / 4; +} + +static unsigned fn_add_blocks(unsigned fn, unsigned blocks) +{ + unsigned bn = fn2bn(fn) + blocks; + fn = fn - (fn % 52); + fn += bn * 4 + bn / 3; + return fn % 2715648; +} + static void send_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) { gprs_rlcmac_rcv_rts_block(bts, trx_no, ts_no, 0, *fn, *block_nr); - *fn += 4; - if ((*fn % 13) == 12) - *fn += 1; + *fn = fn_add_blocks(*fn, 1); *block_nr += 1; } @@ -515,64 +526,52 @@ static void test_tbf_dl_llc_loss() gprs_bssgp_destroy(); } -static void test_tbf_single_phase() +static gprs_rlcmac_ul_tbf *establish_ul_tbf_single_phase(BTS *the_bts, + uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta) { - BTS the_bts; GprsMs *ms; - int ts_no = 7; - uint32_t fn = 2654167; /* 17,25,9 */ - uint16_t qta = 31; - uint8_t trx_no = 0; int tfi = 0; gprs_rlcmac_ul_tbf *ul_tbf; + uint8_t trx_no = 0; struct gprs_rlcmac_pdch *pdch; struct pcu_l1_meas meas; - printf("=== start %s ===\n", __func__); + tfi = the_bts->tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1); - setup_bts(&the_bts, ts_no); - tfi = the_bts.tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1); - - the_bts.rcv_rach(0x03, fn, qta); + the_bts->rcv_rach(0x03, *fn, qta); - ul_tbf = the_bts.ul_tbf_by_tfi(tfi, trx_no, ts_no); + ul_tbf = the_bts->ul_tbf_by_tfi(tfi, trx_no, ts_no); OSMO_ASSERT(ul_tbf != NULL); - fprintf(stderr, "Got '%s', TA=%d\n", - ul_tbf->name(), ul_tbf->ta()); - OSMO_ASSERT(ul_tbf->ta() == qta / 4); uint8_t data_msg[23] = { 0x00, /* GPRS_RLCMAC_DATA_BLOCK << 6 */ uint8_t(1 | (tfi << 2)), uint8_t(1), /* BSN:7, E:1 */ - 0xf1, 0x22, 0x33, 0x44, /* TLLI */ + uint8_t(tlli >> 24), uint8_t(tlli >> 16), + uint8_t(tlli >> 8), uint8_t(tlli), /* TLLI */ }; - pdch = &the_bts.bts_data()->trx[trx_no].pdch[ts_no]; - pdch->rcv_block(&data_msg[0], sizeof(data_msg), fn, &meas); + pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no]; + pdch->rcv_block(&data_msg[0], sizeof(data_msg), *fn, &meas); - ms = the_bts.ms_by_tlli(0xf1223344); + ms = the_bts->ms_by_tlli(tlli); OSMO_ASSERT(ms != NULL); - fprintf(stderr, "Got MS: TLLI = 0x%08x, TA = %d\n", ms->tlli(), ms->ta()); - OSMO_ASSERT(ms->ta() == qta/4); - printf("=== end %s ===\n", __func__); + return ul_tbf; } -static void test_tbf_two_phase() +static gprs_rlcmac_ul_tbf *establish_ul_tbf_two_phase(BTS *the_bts, + uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta, + uint8_t ms_class) { - BTS the_bts; GprsMs *ms; - int ts_no = 7; - uint32_t rach_fn = 2654167; /* 17,25,9 */ - uint32_t rts_fn = 2654218; - uint8_t rts_bn = 8; - uint16_t qta = 31; + uint32_t rach_fn = *fn - 51; + uint32_t sba_fn = *fn + 52; + uint8_t rts_bn = fn2bn(*fn); uint8_t trx_no = 0; int tfi = 0; - const uint32_t tlli = 0xf1223344; gprs_rlcmac_ul_tbf *ul_tbf; struct gprs_rlcmac_pdch *pdch; gprs_rlcmac_bts *bts; @@ -583,19 +582,16 @@ static void test_tbf_two_phase() struct pcu_l1_meas meas; meas.set_rssi(31); - printf("=== start %s ===\n", __func__); - - setup_bts(&the_bts, ts_no, 4); - bts = the_bts.bts_data(); + bts = the_bts->bts_data(); /* needed to set last_rts_fn in the PDCH object */ - send_rlc_block(bts, trx_no, ts_no, 0, &rts_fn, &rts_bn); + send_rlc_block(bts, trx_no, ts_no, 0, fn, &rts_bn); /* simulate RACH, this sends an Immediate Assignment Uplink on the AGCH */ - the_bts.rcv_rach(0x73, rach_fn, qta); + the_bts->rcv_rach(0x73, rach_fn, qta); /* get next free TFI */ - tfi = the_bts.tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1); + tfi = the_bts->tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1); /* fake a resource request */ rlc_block = bitvec_alloc(23); @@ -610,22 +606,18 @@ static void test_tbf_two_phase() OSMO_ASSERT(size_t(num_bytes) < sizeof(buf)); bitvec_free(rlc_block); - pdch = &the_bts.bts_data()->trx[trx_no].pdch[ts_no]; - pdch->rcv_block(&buf[0], num_bytes, 2654270, &meas); + pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no]; + pdch->rcv_block(&buf[0], num_bytes, sba_fn, &meas); /* check the TBF */ - ul_tbf = the_bts.ul_tbf_by_tfi(tfi, trx_no, ts_no); + ul_tbf = the_bts->ul_tbf_by_tfi(tfi, trx_no, ts_no); OSMO_ASSERT(ul_tbf != NULL); - - fprintf(stderr, "Got '%s', TA=%d, CS=%d\n", - ul_tbf->name(), ul_tbf->ta(), ul_tbf->current_cs()); - OSMO_ASSERT(ul_tbf->ta() == qta / 4); /* send packet uplink assignment */ - rts_fn += 52; - rts_bn += 12; - send_rlc_block(bts, trx_no, ts_no, 0, &rts_fn, &rts_bn); + *fn = sba_fn; + rts_bn = fn2bn(*fn); + send_rlc_block(bts, trx_no, ts_no, 0, fn, &rts_bn); /* send fake data */ uint8_t data_msg[23] = { @@ -634,12 +626,59 @@ static void test_tbf_two_phase() uint8_t(1), /* BSN:7, E:1 */ }; - pdch->rcv_block(&data_msg[0], sizeof(data_msg), rts_fn, &meas); + pdch->rcv_block(&data_msg[0], sizeof(data_msg), *fn, &meas); - ms = the_bts.ms_by_tlli(0xf1223344); + ms = the_bts->ms_by_tlli(tlli); OSMO_ASSERT(ms != NULL); - fprintf(stderr, "Got MS: TLLI = 0x%08x, TA = %d\n", ms->tlli(), ms->ta()); OSMO_ASSERT(ms->ta() == qta/4); + OSMO_ASSERT(ms->ul_tbf() == ul_tbf); + + return ul_tbf; +} + +static void test_tbf_single_phase() +{ + BTS the_bts; + int ts_no = 7; + uint32_t fn = 2654167; /* 17,25,9 */ + uint32_t tlli = 0xf1223344; + uint16_t qta = 31; + gprs_rlcmac_ul_tbf *ul_tbf; + GprsMs *ms; + + printf("=== start %s ===\n", __func__); + + setup_bts(&the_bts, ts_no); + + ul_tbf = establish_ul_tbf_single_phase(&the_bts, ts_no, tlli, &fn, qta); + + ms = ul_tbf->ms(); + fprintf(stderr, "Got '%s', TA=%d\n", ul_tbf->name(), ul_tbf->ta()); + fprintf(stderr, "Got MS: TLLI = 0x%08x, TA = %d\n", ms->tlli(), ms->ta()); + + printf("=== end %s ===\n", __func__); +} + +static void test_tbf_two_phase() +{ + BTS the_bts; + int ts_no = 7; + uint32_t fn = 2654218; + uint16_t qta = 31; + uint32_t tlli = 0xf1223344; + uint8_t ms_class = 1; + gprs_rlcmac_ul_tbf *ul_tbf; + GprsMs *ms; + + printf("=== start %s ===\n", __func__); + + setup_bts(&the_bts, ts_no, 4); + + ul_tbf = establish_ul_tbf_two_phase(&the_bts, ts_no, tlli, &fn, qta, ms_class); + + ms = ul_tbf->ms(); + fprintf(stderr, "Got '%s', TA=%d\n", ul_tbf->name(), ul_tbf->ta()); + fprintf(stderr, "Got MS: TLLI = 0x%08x, TA = %d\n", ms->tlli(), ms->ta()); printf("=== end %s ===\n", __func__); } diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err index 57fd22dc..c34d6a03 100644 --- a/tests/tbf/TbfTest.err +++ b/tests/tbf/TbfTest.err @@ -1388,7 +1388,6 @@ TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW) [UPLINK] START TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW) RX: [PCU <- BTS] RACH qbit-ta=31 ra=0x03, Fn=2654167 (17,25,9) TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW) TX: START Immediate Assignment Uplink (AGCH) Sending data request: trx=0 ts=0 sapi=2 arfcn=0 fn=0 block=0 data=2d 06 3f 10 0f 00 00 03 8b 29 07 00 c8 00 10 0b 2b 2b 2b 2b 2b 2b 2b -Got 'TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW)', TA=7 UL DATA TFI=0 received (V(Q)=0 .. V(R)=0) Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed Decoded premier TLLI=0xf1223344 of UL DATA TFI=0. @@ -1408,6 +1407,7 @@ No bctx TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) changes state from FLOW to FINISHED - Scheduling Ack/Nack, because TLLI is included. - Scheduling Ack/Nack, because last block has CV==0. +Got 'TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED)', TA=7 Got MS: TLLI = 0xf1223344, TA = 7 Sending data request: trx=0 ts=7 sapi=5 arfcn=0 fn=2654218 block=8 data=47 94 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b MS requests UL TBF on RACH, so we provide one: @@ -1442,12 +1442,11 @@ TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169. Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed Modifying MS object, TLLI = 0xf1223344, TA 0 -> 7 Change control TS to 7 until assinment is complete. -Got 'TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN)', TA=7, CS=4 TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN)s start Packet Uplink Assignment (PACCH) +++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++ ------------------------- TX : Packet Uplink Assignment ------------------------- Scheduling control message at RTS for TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) (TRX=0, TS=7) -Sending data request: trx=0 ts=7 sapi=5 arfcn=0 fn=2654275 block=21 data=4f 28 5e 24 46 68 8f 1d 00 00 88 00 08 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +Sending data request: trx=0 ts=7 sapi=5 arfcn=0 fn=2654270 block=8 data=4f 28 5e 24 46 68 8f 1d 00 00 88 00 08 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b UL DATA TFI=0 received (V(Q)=0 .. V(R)=0) TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) restarting timer 3169 while old timer 3169 pending - BSN 0 storing in window (0..63) @@ -1459,4 +1458,5 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) restarting timer 3169 while old t TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) complete UL frame that fits precisely in last block: len=20 LLC [PCU -> SGSN] TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) len=20 No bctx +Got 'TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN)', TA=7 Got MS: TLLI = 0xf1223344, TA = 7 |