diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2016-02-01 20:59:04 +0100 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2016-02-02 17:06:39 +0100 |
commit | 205a943205ac2c65e14c012bac8c936a6a642c44 (patch) | |
tree | ef5dea7a10254403095d2e3fabdd484ad243c04b | |
parent | 0af43497702754d9ea8ebcb7aea979d12209fa71 (diff) |
WIP: Add state ASSIGNING (TODO)
entered when the assigment is really sent
Ticket: OW#????
Sponsored-by: On-Waves ehf
-rw-r--r-- | src/bts.cpp | 9 | ||||
-rw-r--r-- | src/tbf.cpp | 13 | ||||
-rw-r--r-- | src/tbf.h | 10 | ||||
-rw-r--r-- | tests/tbf/TbfTest.cpp | 2 |
4 files changed, 24 insertions, 10 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 5564a5e2..b0a40442 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -544,8 +544,11 @@ int BTS::rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta) m_bts.trx[trx_no].arfcn, ts_no, tsc, usf, 0, sb_fn, m_bts.alpha, m_bts.gamma, -1); - if (plen >= 0) + if (plen >= 0) { pcu_l1if_tx_agch(immediate_assignment, plen); + if (tbf) + tbf->set_state(GPRS_RLCMAC_ASSIGNING); + } bitvec_free(immediate_assignment); @@ -603,8 +606,10 @@ void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi) (tbf->pdch[ts]->last_rts_fn + 21216) % 2715648, tbf->ta(), tbf->trx->arfcn, ts, tbf->tsc(), 7, poll, tbf->poll_fn, m_bts.alpha, m_bts.gamma, -1); - if (plen >= 0) + if (plen >= 0) { pcu_l1if_tx_pch(immediate_assignment, plen, imsi); + tbf->set_state(GPRS_RLCMAC_ASSIGNING); + } bitvec_free(immediate_assignment); } diff --git a/src/tbf.cpp b/src/tbf.cpp index ff0af252..eaadc15b 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -394,6 +394,7 @@ int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf) const char *gprs_rlcmac_tbf::tbf_state_name[] = { "NULL", "ASSIGN", + "ASSIGNING", "FLOW", "FINISHED", "WAIT RELEASE", @@ -824,6 +825,12 @@ void gprs_rlcmac_tbf::handle_timeout() if ((state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH))) { if (state_is(GPRS_RLCMAC_ASSIGN)) { LOGP(DRLCMAC, LOGL_NOTICE, "%s releasing due to " + "PACCH assignment timeout (not yet sent).\n", + tbf_name(this)); + tbf_free(this); + return; + } else if (state_is(GPRS_RLCMAC_ASSIGNING)) { + LOGP(DRLCMAC, LOGL_NOTICE, "%s releasing due to " "PACCH assignment timeout.\n", tbf_name(this)); tbf_free(this); return; @@ -834,7 +841,7 @@ void gprs_rlcmac_tbf::handle_timeout() if ((state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH))) { gprs_rlcmac_dl_tbf *dl_tbf = as_dl_tbf(this); dl_tbf->m_wait_confirm = 0; - if (dl_tbf->state_is(GPRS_RLCMAC_ASSIGN)) { + if (dl_tbf->state_is(GPRS_RLCMAC_ASSIGNING)) { tbf_assign_control_ts(dl_tbf); if (!dl_tbf->upgrade_to_multislot) { @@ -995,6 +1002,8 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn, uint8_t ts) if (poll_ass_dl) { set_polling(new_poll_fn, ts); + if (new_dl_tbf->state_is(GPRS_RLCMAC_ASSIGN)) + new_dl_tbf->set_state(GPRS_RLCMAC_ASSIGNING); dl_ass_state = GPRS_RLCMAC_DL_ASS_WAIT_ACK; LOGP(DRLCMACDL, LOGL_INFO, "%s Scheduled DL Assignment polling on FN=%d, TS=%d\n", @@ -1067,6 +1076,8 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn, uint8_t ts) set_polling(new_poll_fn, ts); ul_ass_state = GPRS_RLCMAC_UL_ASS_WAIT_ACK; + if (new_tbf->state_is(GPRS_RLCMAC_ASSIGN)) + new_tbf->set_state(GPRS_RLCMAC_ASSIGNING); LOGP(DRLCMACDL, LOGL_INFO, "%s Scheduled UL Assignment polling on FN=%d, TS=%d\n", name(), poll_fn, poll_ts); @@ -43,7 +43,8 @@ class GprsMs; enum gprs_rlcmac_tbf_state { GPRS_RLCMAC_NULL = 0, /* new created TBF */ - GPRS_RLCMAC_ASSIGN, /* wait for downlink assignment */ + GPRS_RLCMAC_ASSIGN, /* wait for DL transmission */ + GPRS_RLCMAC_ASSIGNING, /* wait for confirmation */ GPRS_RLCMAC_FLOW, /* RLC/MAC flow, resource needed */ GPRS_RLCMAC_FINISHED, /* flow finished, wait for release */ GPRS_RLCMAC_WAIT_RELEASE,/* wait for release or restart of DL TBF */ @@ -231,7 +232,7 @@ protected: int set_tlli_from_ul(uint32_t new_tlli); void merge_and_clear_ms(GprsMs *old_ms); - static const char *tbf_state_name[6]; + static const char *tbf_state_name[7]; class GprsMs *m_ms; @@ -316,10 +317,7 @@ inline bool gprs_rlcmac_tbf::is_tfi_assigned() const { /* The TBF is established or has been assigned by a IMM.ASS for * download */ - return state > GPRS_RLCMAC_ASSIGN || - (direction == GPRS_RLCMAC_DL_TBF && - state == GPRS_RLCMAC_ASSIGN && - (state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH))); + return state > GPRS_RLCMAC_ASSIGN; } inline uint8_t gprs_rlcmac_tbf::tfi() const diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index 6b84fac1..56cd6f2a 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -1049,7 +1049,7 @@ static void test_tbf_dl_reuse() ms2 = the_bts.ms_by_tlli(tlli1); OSMO_ASSERT(ms2 == ms1); OSMO_ASSERT(ms2->dl_tbf()); - OSMO_ASSERT(ms2->dl_tbf()->state_is(GPRS_RLCMAC_ASSIGN)); + OSMO_ASSERT(ms2->dl_tbf()->state_is(GPRS_RLCMAC_ASSIGNING)); dl_tbf2 = ms2->dl_tbf(); |