diff options
-rw-r--r-- | src/bts.cpp | 20 | ||||
-rw-r--r-- | src/encoding.cpp | 4 | ||||
-rw-r--r-- | src/gprs_ms.cpp | 13 | ||||
-rw-r--r-- | src/gprs_ms.h | 9 | ||||
-rw-r--r-- | src/tbf.cpp | 32 | ||||
-rw-r--r-- | src/tbf.h | 6 | ||||
-rw-r--r-- | src/tbf_dl.cpp | 25 | ||||
-rw-r--r-- | tests/tbf/TbfTest.cpp | 29 | ||||
-rw-r--r-- | tests/tbf/TbfTest.err | 41 |
9 files changed, 93 insertions, 86 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 6bcfea0d..010b8e88 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -438,7 +438,7 @@ int BTS::rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta) /* FIXME: send reject */ return -EBUSY; } - tbf->ta = qta >> 2; + tbf->set_ta(qta >> 2); tbf->set_state(GPRS_RLCMAC_FLOW); tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); tbf_timer_start(tbf, 3169, m_bts.t3169, 0); @@ -461,7 +461,7 @@ int BTS::rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta) m_bts.alpha, m_bts.gamma, -1); else plen = Encoding::write_immediate_assignment(&m_bts, immediate_assignment, 0, ra, - Fn, tbf->ta, tbf->trx->arfcn, tbf->first_ts, tbf->tsc(), + Fn, tbf->ta(), tbf->trx->arfcn, tbf->first_ts, tbf->tsc(), tbf->tfi(), tbf->m_usf[tbf->first_ts], 0, 0, 0, 0, m_bts.alpha, m_bts.gamma, -1); pcu_l1if_tx_agch(immediate_assignment, plen); @@ -486,8 +486,6 @@ void BTS::trigger_dl_ass( old_tbf->was_releasing = old_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE); - /* use TA from old TBF */ - dl_tbf->ta = old_tbf->ta; /* change state */ dl_tbf->set_state(GPRS_RLCMAC_ASSIGN); dl_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH); @@ -515,7 +513,7 @@ void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi) /* use request reference that has maximum distance to current time, * so the assignment will not conflict with possible RACH requests. */ plen = Encoding::write_immediate_assignment(&m_bts, immediate_assignment, 1, 125, - (tbf->pdch[tbf->first_ts]->last_rts_fn + 21216) % 2715648, tbf->ta, + (tbf->pdch[tbf->first_ts]->last_rts_fn + 21216) % 2715648, tbf->ta(), tbf->trx->arfcn, tbf->first_ts, tbf->tsc(), tbf->tfi(), 0, tbf->tlli(), poll, tbf->poll_fn, 0, m_bts.alpha, m_bts.gamma, -1); pcu_l1if_tx_pch(immediate_assignment, plen, imsi); @@ -836,7 +834,7 @@ void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_n /* This call will register the new TBF with the MS on success */ tbf_alloc_ul(bts_data(), tbf->trx->trx_no, tbf->ms_class, - tbf->tlli(), tbf->ta, tbf); + tbf->tlli(), tbf->ta(), tbf); /* schedule uplink assignment */ tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS; @@ -846,14 +844,13 @@ void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_n void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, uint32_t fn) { struct gprs_rlcmac_sba *sba; - int rc; if (request->ID.UnionType) { struct gprs_rlcmac_ul_tbf *ul_tbf = NULL; struct gprs_rlcmac_dl_tbf *dl_tbf = NULL; uint32_t tlli = request->ID.u.TLLI; uint8_t ms_class = 0; - uint8_t ta; + uint8_t ta = 0; GprsMs *ms = bts()->ms_by_tlli(tlli); /* Keep the ms, even if it gets idle temporarily */ @@ -862,6 +859,7 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, if (ms) { ul_tbf = ms->ul_tbf(); dl_tbf = ms->dl_tbf(); + ta = ms->ta(); } if (ul_tbf) { @@ -890,14 +888,8 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, "in packet resource request of single " "block, but there is no resource request " "scheduled!\n"); - rc = bts()->timing_advance()->recall(tlli); - if (rc >= 0) - ta = rc; - else - ta = 0; } else { ta = sba->ta; - bts()->timing_advance()->remember(tlli, ta); bts()->sba()->free_sba(sba); } if (request->Exist_MS_Radio_Access_capability) diff --git a/src/encoding.cpp b/src/encoding.cpp index ffd61080..167bfd4c 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -195,7 +195,7 @@ void Encoding::write_packet_uplink_assignment( bitvec_write_field(dest, wp,bts->initial_cs_ul-1, 2); // CHANNEL_CODING_COMMAND bitvec_write_field(dest, wp,0x1,1); // TLLI_BLOCK_CHANNEL_CODING bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on - bitvec_write_field(dest, wp,tbf->ta,6); // TIMING_ADVANCE_VALUE + bitvec_write_field(dest, wp,tbf->ta(),6); // TIMING_ADVANCE_VALUE if (ta_idx < 0) { bitvec_write_field(dest, wp,0x0,1); // switch TIMING_ADVANCE_INDEX = off } else { @@ -275,7 +275,7 @@ void Encoding::write_packet_downlink_assignment(RlcMacDownlink_t * block, uint8_ } block->u.Packet_Downlink_Assignment.Packet_Timing_Advance.Exist_TIMING_ADVANCE_VALUE = 0x1; // TIMING_ADVANCE_VALUE = on - block->u.Packet_Downlink_Assignment.Packet_Timing_Advance.TIMING_ADVANCE_VALUE = tbf->ta; // TIMING_ADVANCE_VALUE + block->u.Packet_Downlink_Assignment.Packet_Timing_Advance.TIMING_ADVANCE_VALUE = tbf->ta(); // TIMING_ADVANCE_VALUE if (ta_idx < 0) { block->u.Packet_Downlink_Assignment.Packet_Timing_Advance.Exist_IndexAndtimeSlot = 0x0; // TIMING_ADVANCE_INDEX = off } else { diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp index c2320a29..d6520c31 100644 --- a/src/gprs_ms.cpp +++ b/src/gprs_ms.cpp @@ -60,6 +60,7 @@ GprsMs::GprsMs(uint32_t tlli) : m_tlli(tlli), m_new_ul_tlli(0), m_new_dl_tlli(0), + m_ta(0), m_is_idle(true), m_ref(0), m_list(this) @@ -263,3 +264,15 @@ void GprsMs::set_imsi(const char *imsi) m_imsi[sizeof(m_imsi) - 1] = '\0'; } +void GprsMs::set_ta(uint8_t ta_) +{ + if (ta_ == m_ta) + return; + + LOGP(DRLCMAC, LOGL_INFO, + "Modifying MS object, TLLI = 0x%08x, TA %d -> %d\n", + tlli(), m_ta, ta_); + + m_ta = ta_; +} + diff --git a/src/gprs_ms.h b/src/gprs_ms.h index 7f8af414..9c3acb4f 100644 --- a/src/gprs_ms.h +++ b/src/gprs_ms.h @@ -59,6 +59,9 @@ public: const char *imsi() const; void set_imsi(const char *imsi); + uint8_t ta() const; + void set_ta(uint8_t ta); + void attach_tbf(gprs_rlcmac_tbf *tbf); void attach_ul_tbf(gprs_rlcmac_ul_tbf *tbf); void attach_dl_tbf(gprs_rlcmac_dl_tbf *tbf); @@ -88,6 +91,7 @@ private: /* store IMSI for look-up and PCH retransmission */ char m_imsi[16]; + uint8_t m_ta; bool m_is_idle; int m_ref; @@ -111,3 +115,8 @@ inline const char *GprsMs::imsi() const { return m_imsi; } + +inline uint8_t GprsMs::ta() const +{ + return m_ta; +} diff --git a/src/tbf.cpp b/src/tbf.cpp index ac0cdf3f..53f1ae13 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -89,13 +89,32 @@ void gprs_rlcmac_tbf::assign_imsi(const char *imsi_) m_ms->set_imsi(imsi_); } +uint8_t gprs_rlcmac_tbf::ta() const +{ + return m_ms ? m_ms->ta() : m_ta; +} + +void gprs_rlcmac_tbf::set_ta(uint8_t ta) +{ + if (ms()) + ms()->set_ta(ta); + + m_ta = ta; +} + void gprs_rlcmac_tbf::set_ms(GprsMs *ms) { if (m_ms == ms) return; - if (m_ms) + if (m_ms) { + /* Save the TA locally. This will also be called, if the MS + * object detaches itself from the TBF, for instance if + * attach_tbf() is called */ + m_ta = m_ms->ta(); + m_ms->detach_tbf(this); + } m_ms = ms; @@ -110,6 +129,9 @@ void gprs_rlcmac_tbf::update_ms(uint32_t tlli, enum gprs_rlcmac_tbf_direction di if (!new_ms) new_ms = bts->ms_store().create_ms(tlli, dir); + if (dir == GPRS_RLCMAC_UL_TBF) + new_ms->set_ta(m_ta); + set_ms(new_ms); return; } @@ -144,11 +166,13 @@ gprs_rlcmac_ul_tbf *tbf_alloc_ul(struct gprs_rlcmac_bts *bts, return NULL; } tbf->m_contention_resolution_done = 1; - tbf->ta = ta; /* use current TA */ tbf->set_state(GPRS_RLCMAC_ASSIGN); tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH); tbf_timer_start(tbf, 3169, bts->t3169, 0); tbf->update_ms(tlli, GPRS_RLCMAC_UL_TBF); + OSMO_ASSERT(tbf->ms()); + + tbf->ms()->set_ta(ta); return tbf; } @@ -786,8 +810,6 @@ void gprs_rlcmac_tbf::free_all(struct gprs_rlcmac_pdch *pdch) void gprs_rlcmac_tbf::update_tlli(uint32_t tlli) { - /* update the timing advance for the new tlli */ - bts->timing_advance()->update(0, tlli, ta); } int gprs_rlcmac_tbf::extract_tlli(const uint8_t *data, const size_t len) @@ -843,8 +865,6 @@ int gprs_rlcmac_tbf::extract_tlli(const uint8_t *data, const size_t len) tbf_free(ul_tbf); ul_tbf = NULL; } - /* store current timing advance */ - bts->timing_advance()->remember(tlli(), ta); return 1; } @@ -149,6 +149,8 @@ struct gprs_rlcmac_tbf { const char *imsi() const; void assign_imsi(const char *imsi); + uint8_t ta() const; + void set_ta(uint8_t); time_t created_ts() const; @@ -165,7 +167,6 @@ struct gprs_rlcmac_tbf { uint8_t control_ts; /* timeslot control messages and polling */ uint8_t ms_class; struct gprs_rlcmac_pdch *pdch[8]; /* list of PDCHs allocated to TBF */ - uint16_t ta; gprs_llc m_llc; @@ -225,6 +226,9 @@ protected: static const char *tbf_state_name[6]; class GprsMs *m_ms; + + /* Field to take the TA value if no MS is associated */ + uint8_t m_ta; private: mutable char m_name_buf[60]; }; diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index edaf2987..2289e3f0 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -151,42 +151,30 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts, const uint8_t ms_class, const uint8_t *data, const uint16_t len) { - uint8_t trx, ta, ss; + uint8_t trx, ss; int8_t use_trx; + uint16_t ta = 0; struct gprs_rlcmac_ul_tbf *ul_tbf = NULL, *old_ul_tbf; struct gprs_rlcmac_dl_tbf *dl_tbf = NULL; int8_t tfi; /* must be signed */ - int rc; GprsMs *ms; /* check for uplink data, so we copy our informations */ #warning "Do the same look up for IMSI, TLLI and OLD_TLLI" #warning "Refactor the below lines... into a new method" ms = bts->bts->ms_store().get_ms(tlli, tlli_old, imsi); - if (ms) + if (ms) { ul_tbf = ms->ul_tbf(); + ta = ms->ta(); + } if (ul_tbf && ul_tbf->m_contention_resolution_done && !ul_tbf->m_final_ack_sent) { use_trx = ul_tbf->trx->trx_no; - ta = ul_tbf->ta; ss = 0; old_ul_tbf = ul_tbf; } else { use_trx = -1; - /* we already have an uplink TBF, so we use that TA */ - if (ul_tbf) - ta = ul_tbf->ta; - else { - /* recall TA */ - rc = bts->bts->timing_advance()->recall(tlli); - if (rc < 0) { - LOGP(DRLCMAC, LOGL_NOTICE, "TA unknown" - ", assuming 0\n"); - ta = 0; - } else - ta = rc; - } ss = 1; /* PCH assignment only allows one timeslot */ old_ul_tbf = NULL; } @@ -205,8 +193,8 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts, bts->bts->llc_dropped_frame(); return -EBUSY; } - dl_tbf->ta = ta; dl_tbf->update_ms(tlli, GPRS_RLCMAC_DL_TBF); + dl_tbf->ms()->set_ta(ta); LOGP(DRLCMAC, LOGL_DEBUG, "%s [DOWNLINK] START\n", tbf_name(dl_tbf)); @@ -801,7 +789,6 @@ void gprs_rlcmac_dl_tbf::reuse_tbf(const uint8_t *data, const uint16_t len) } new_tbf->set_ms(ms()); - new_tbf->ta = ta; /* Copy over all data to the new TBF */ new_tbf->m_llc.put_frame(data, len); diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index e25f3447..2184b324 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -78,8 +78,7 @@ static void test_tbf_tlli_update() 0, 0, 0); dl_tbf->update_tlli(0x2342); dl_tbf->update_ms(0x2342, GPRS_RLCMAC_DL_TBF); - dl_tbf->ta = 4; - the_bts.timing_advance()->remember(0x2342, dl_tbf->ta); + dl_tbf->set_ta(4); gprs_rlcmac_tbf *ul_tbf = tbf_alloc_ul_tbf(the_bts.bts_data(), dl_tbf, 0, @@ -114,7 +113,17 @@ static void test_tbf_tlli_update() ms_new = the_bts.ms_by_tlli(0x2342); OSMO_ASSERT(ms_new == NULL); - OSMO_ASSERT(the_bts.timing_advance()->recall(0x4232) == 4); + ms_new = the_bts.ms_by_tlli(0x4232); + OSMO_ASSERT(ms_new != NULL); + OSMO_ASSERT(ms_new->ta() == 4); + + OSMO_ASSERT(ul_tbf->ta() == 4); + OSMO_ASSERT(dl_tbf->ta() == 4); + + ul_tbf->set_ta(6); + + OSMO_ASSERT(ul_tbf->ta() == 6); + OSMO_ASSERT(dl_tbf->ta() == 6); } static uint8_t llc_data[200]; @@ -439,9 +448,9 @@ static void test_tbf_single_phase() OSMO_ASSERT(ul_tbf != NULL); fprintf(stderr, "Got '%s', TA=%d\n", - ul_tbf->name(), ul_tbf->ta); + ul_tbf->name(), ul_tbf->ta()); - OSMO_ASSERT(ul_tbf->ta == qta / 4); + OSMO_ASSERT(ul_tbf->ta() == qta / 4); uint8_t data_msg[23] = { 0x00, /* GPRS_RLCMAC_DATA_BLOCK << 6 */ @@ -455,7 +464,8 @@ static void test_tbf_single_phase() ms = the_bts.ms_by_tlli(0xf1223344); OSMO_ASSERT(ms != NULL); - fprintf(stderr, "Got MS: TLLI = 0x%08x\n", ms->tlli()); + 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__); } @@ -515,9 +525,9 @@ static void test_tbf_two_phase() OSMO_ASSERT(ul_tbf != NULL); fprintf(stderr, "Got '%s', TA=%d\n", - ul_tbf->name(), ul_tbf->ta); + ul_tbf->name(), ul_tbf->ta()); - OSMO_ASSERT(ul_tbf->ta == qta / 4); + OSMO_ASSERT(ul_tbf->ta() == qta / 4); /* send packet uplink assignment */ rts_fn += 52; @@ -535,7 +545,8 @@ static void test_tbf_two_phase() ms = the_bts.ms_by_tlli(0xf1223344); OSMO_ASSERT(ms != NULL); - fprintf(stderr, "Got MS: TLLI = 0x%08x\n", ms->tlli()); + 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__); } diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err index 20b1a724..d919b89a 100644 --- a/tests/tbf/TbfTest.err +++ b/tests/tbf/TbfTest.err @@ -8,6 +8,7 @@ Slot Allocation (Algorithm A) for class 0 Creating MS object, TLLI = 0x00000000 The MS object cannot fully confirm an unexpected TLLI: 0x00002342, partly confirmed Attaching TBF to MS object, TLLI = 0x00002342, TBF = TBF(TFI=0 TLLI=0x00002342 DIR=DL STATE=NULL) +Modifying MS object, TLLI = 0x00002342, TA 0 -> 4 ********** TBF starts here ********** Allocating UL TBF: TFI=0 TRX=0 MS_CLASS=0 Slot Allocation (Algorithm A) for class 0 @@ -19,6 +20,7 @@ Attaching TBF to MS object, TLLI = 0x00002342, TBF = TBF(TFI=0 TLLI=0x00002342 D 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 +Modifying MS object, TLLI = 0x00004232, TA 4 -> 6 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=0. ********** TBF starts here ********** @@ -425,7 +427,6 @@ TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW) Software error: Pending downlink as Detaching TBF from MS object, TLLI = 0xf1000001, TBF = TBF(TFI=0 TLLI=0xf1000001 DIR=DL STATE=FLOW) Destroying MS object, TLLI = 0xf1000001 ********** TBF ends here ********** -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=0. ********** TBF starts here ********** @@ -446,7 +447,6 @@ Send dowlink assignment for TBF(TFI=0 TLLI=0xc0000000 DIR=DL STATE=NULL) on PCH, TBF(TFI=0 TLLI=0xc0000000 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=0 TLLI=0xc0000000 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 30 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 08 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=1. ********** TBF starts here ********** @@ -467,7 +467,6 @@ Send dowlink assignment for TBF(TFI=1 TLLI=0xc0000001 DIR=DL STATE=NULL) on PCH, TBF(TFI=1 TLLI=0xc0000001 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=1 TLLI=0xc0000001 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 31 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 18 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=2. ********** TBF starts here ********** @@ -488,7 +487,6 @@ Send dowlink assignment for TBF(TFI=2 TLLI=0xc0000002 DIR=DL STATE=NULL) on PCH, TBF(TFI=2 TLLI=0xc0000002 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=2 TLLI=0xc0000002 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 32 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 28 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=3. ********** TBF starts here ********** @@ -509,7 +507,6 @@ Send dowlink assignment for TBF(TFI=3 TLLI=0xc0000003 DIR=DL STATE=NULL) on PCH, TBF(TFI=3 TLLI=0xc0000003 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=3 TLLI=0xc0000003 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 33 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 38 c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=4. ********** TBF starts here ********** @@ -530,7 +527,6 @@ Send dowlink assignment for TBF(TFI=4 TLLI=0xc0000004 DIR=DL STATE=NULL) on PCH, TBF(TFI=4 TLLI=0xc0000004 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=4 TLLI=0xc0000004 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 34 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 49 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=5. ********** TBF starts here ********** @@ -551,7 +547,6 @@ Send dowlink assignment for TBF(TFI=5 TLLI=0xc0000005 DIR=DL STATE=NULL) on PCH, TBF(TFI=5 TLLI=0xc0000005 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=5 TLLI=0xc0000005 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 35 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 59 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=6. ********** TBF starts here ********** @@ -572,7 +567,6 @@ Send dowlink assignment for TBF(TFI=6 TLLI=0xc0000006 DIR=DL STATE=NULL) on PCH, TBF(TFI=6 TLLI=0xc0000006 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=6 TLLI=0xc0000006 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 36 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 69 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=7. ********** TBF starts here ********** @@ -593,7 +587,6 @@ Send dowlink assignment for TBF(TFI=7 TLLI=0xc0000007 DIR=DL STATE=NULL) on PCH, TBF(TFI=7 TLLI=0xc0000007 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=7 TLLI=0xc0000007 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 37 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 79 c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=8. ********** TBF starts here ********** @@ -614,7 +607,6 @@ Send dowlink assignment for TBF(TFI=8 TLLI=0xc0000008 DIR=DL STATE=NULL) on PCH, TBF(TFI=8 TLLI=0xc0000008 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=8 TLLI=0xc0000008 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 38 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 8a 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=9. ********** TBF starts here ********** @@ -635,7 +627,6 @@ Send dowlink assignment for TBF(TFI=9 TLLI=0xc0000009 DIR=DL STATE=NULL) on PCH, TBF(TFI=9 TLLI=0xc0000009 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=9 TLLI=0xc0000009 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 30 39 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 9a 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=10. ********** TBF starts here ********** @@ -656,7 +647,6 @@ Send dowlink assignment for TBF(TFI=10 TLLI=0xc000000a DIR=DL STATE=NULL) on PCH TBF(TFI=10 TLLI=0xc000000a DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=10 TLLI=0xc000000a DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 30 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 aa 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=11. ********** TBF starts here ********** @@ -677,7 +667,6 @@ Send dowlink assignment for TBF(TFI=11 TLLI=0xc000000b DIR=DL STATE=NULL) on PCH TBF(TFI=11 TLLI=0xc000000b DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=11 TLLI=0xc000000b DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 31 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 ba c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=12. ********** TBF starts here ********** @@ -698,7 +687,6 @@ Send dowlink assignment for TBF(TFI=12 TLLI=0xc000000c DIR=DL STATE=NULL) on PCH TBF(TFI=12 TLLI=0xc000000c DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=12 TLLI=0xc000000c DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 32 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 cb 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=13. ********** TBF starts here ********** @@ -719,7 +707,6 @@ Send dowlink assignment for TBF(TFI=13 TLLI=0xc000000d DIR=DL STATE=NULL) on PCH TBF(TFI=13 TLLI=0xc000000d DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=13 TLLI=0xc000000d DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 33 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 db 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=14. ********** TBF starts here ********** @@ -740,7 +727,6 @@ Send dowlink assignment for TBF(TFI=14 TLLI=0xc000000e DIR=DL STATE=NULL) on PCH TBF(TFI=14 TLLI=0xc000000e DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=14 TLLI=0xc000000e DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 34 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 eb 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=15. ********** TBF starts here ********** @@ -761,7 +747,6 @@ Send dowlink assignment for TBF(TFI=15 TLLI=0xc000000f DIR=DL STATE=NULL) on PCH TBF(TFI=15 TLLI=0xc000000f DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=15 TLLI=0xc000000f DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 35 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 00 fb c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=16. ********** TBF starts here ********** @@ -782,7 +767,6 @@ Send dowlink assignment for TBF(TFI=16 TLLI=0xc0000010 DIR=DL STATE=NULL) on PCH TBF(TFI=16 TLLI=0xc0000010 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=16 TLLI=0xc0000010 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 36 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 0c 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=17. ********** TBF starts here ********** @@ -803,7 +787,6 @@ Send dowlink assignment for TBF(TFI=17 TLLI=0xc0000011 DIR=DL STATE=NULL) on PCH TBF(TFI=17 TLLI=0xc0000011 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=17 TLLI=0xc0000011 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 37 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 1c 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=18. ********** TBF starts here ********** @@ -824,7 +807,6 @@ Send dowlink assignment for TBF(TFI=18 TLLI=0xc0000012 DIR=DL STATE=NULL) on PCH TBF(TFI=18 TLLI=0xc0000012 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=18 TLLI=0xc0000012 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 38 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 2c 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=19. ********** TBF starts here ********** @@ -845,7 +827,6 @@ Send dowlink assignment for TBF(TFI=19 TLLI=0xc0000013 DIR=DL STATE=NULL) on PCH TBF(TFI=19 TLLI=0xc0000013 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=19 TLLI=0xc0000013 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 31 39 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 3c c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=20. ********** TBF starts here ********** @@ -866,7 +847,6 @@ Send dowlink assignment for TBF(TFI=20 TLLI=0xc0000014 DIR=DL STATE=NULL) on PCH TBF(TFI=20 TLLI=0xc0000014 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=20 TLLI=0xc0000014 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 30 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 4d 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=21. ********** TBF starts here ********** @@ -887,7 +867,6 @@ Send dowlink assignment for TBF(TFI=21 TLLI=0xc0000015 DIR=DL STATE=NULL) on PCH TBF(TFI=21 TLLI=0xc0000015 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=21 TLLI=0xc0000015 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 31 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 5d 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=22. ********** TBF starts here ********** @@ -908,7 +887,6 @@ Send dowlink assignment for TBF(TFI=22 TLLI=0xc0000016 DIR=DL STATE=NULL) on PCH TBF(TFI=22 TLLI=0xc0000016 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=22 TLLI=0xc0000016 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 32 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 6d 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=23. ********** TBF starts here ********** @@ -929,7 +907,6 @@ Send dowlink assignment for TBF(TFI=23 TLLI=0xc0000017 DIR=DL STATE=NULL) on PCH TBF(TFI=23 TLLI=0xc0000017 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=23 TLLI=0xc0000017 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 33 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 7d c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=24. ********** TBF starts here ********** @@ -950,7 +927,6 @@ Send dowlink assignment for TBF(TFI=24 TLLI=0xc0000018 DIR=DL STATE=NULL) on PCH TBF(TFI=24 TLLI=0xc0000018 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=24 TLLI=0xc0000018 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 34 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 8e 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=25. ********** TBF starts here ********** @@ -971,7 +947,6 @@ Send dowlink assignment for TBF(TFI=25 TLLI=0xc0000019 DIR=DL STATE=NULL) on PCH TBF(TFI=25 TLLI=0xc0000019 DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=25 TLLI=0xc0000019 DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 35 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 9e 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=26. ********** TBF starts here ********** @@ -992,7 +967,6 @@ Send dowlink assignment for TBF(TFI=26 TLLI=0xc000001a DIR=DL STATE=NULL) on PCH TBF(TFI=26 TLLI=0xc000001a DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=26 TLLI=0xc000001a DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 36 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 ae 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=27. ********** TBF starts here ********** @@ -1013,7 +987,6 @@ Send dowlink assignment for TBF(TFI=27 TLLI=0xc000001b DIR=DL STATE=NULL) on PCH TBF(TFI=27 TLLI=0xc000001b DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=27 TLLI=0xc000001b DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 37 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 be c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=28. ********** TBF starts here ********** @@ -1034,7 +1007,6 @@ Send dowlink assignment for TBF(TFI=28 TLLI=0xc000001c DIR=DL STATE=NULL) on PCH TBF(TFI=28 TLLI=0xc000001c DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=28 TLLI=0xc000001c DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 38 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 cf 00 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=29. ********** TBF starts here ********** @@ -1055,7 +1027,6 @@ Send dowlink assignment for TBF(TFI=29 TLLI=0xc000001d DIR=DL STATE=NULL) on PCH TBF(TFI=29 TLLI=0xc000001d DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=29 TLLI=0xc000001d DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 32 39 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 df 40 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=30. ********** TBF starts here ********** @@ -1076,7 +1047,6 @@ Send dowlink assignment for TBF(TFI=30 TLLI=0xc000001e DIR=DL STATE=NULL) on PCH TBF(TFI=30 TLLI=0xc000001e DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=30 TLLI=0xc000001e DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 33 30 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 ef 80 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 Found TFI=31. ********** TBF starts here ********** @@ -1097,7 +1067,6 @@ Send dowlink assignment for TBF(TFI=31 TLLI=0xc000001f DIR=DL STATE=NULL) on PCH TBF(TFI=31 TLLI=0xc000001f DIR=DL STATE=NULL) changes state from NULL to ASSIGN TX: START TBF(TFI=31 TLLI=0xc000001f DIR=DL STATE=ASSIGN) Immediate Assignment Downlink (PCH) Sending data request: trx=0 ts=0 sapi=3 arfcn=0 fn=0 block=0 data=30 33 31 2d 06 3f 30 0c 00 00 7d 80 00 00 00 dc 00 00 01 ff c0 23 2b 2b 2b 2b -TA unknown, assuming 0 Searching for first unallocated TFI: TRX=0 first TS=4 No TFI available. No PDCH resource @@ -1129,6 +1098,7 @@ Got 'TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=FLOW)', TA=7 UL DATA TFI=0 received (V(Q)=0 .. V(R)=0) Creating MS object, TLLI = 0x00000000 Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed +Modifying MS object, TLLI = 0xf1223344, TA 0 -> 7 Attaching TBF to MS object, TLLI = 0xf1223344, TBF = TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Decoded premier TLLI=0xf1223344 of UL DATA TFI=0. TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) restarting timer 3169 while old timer 3169 pending @@ -1147,7 +1117,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 MS: TLLI = 0xf1223344 +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: MS requests single block allocation @@ -1179,6 +1149,7 @@ TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=ASSIGN) starting timer 3169. Creating MS object, TLLI = 0x00000000 Modifying MS object, UL TLLI: 0x00000000 -> 0xf1223344, not yet confirmed Attaching TBF to MS object, TLLI = 0xf1223344, TBF = TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN) +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 TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=ASSIGN)s start Packet Uplink Assignment (PACCH) @@ -1197,4 +1168,4 @@ 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 MS: TLLI = 0xf1223344 +Got MS: TLLI = 0xf1223344, TA = 7 |