aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-01 20:59:04 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-02 17:06:39 +0100
commit205a943205ac2c65e14c012bac8c936a6a642c44 (patch)
treeef5dea7a10254403095d2e3fabdd484ad243c04b
parent0af43497702754d9ea8ebcb7aea979d12209fa71 (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.cpp9
-rw-r--r--src/tbf.cpp13
-rw-r--r--src/tbf.h10
-rw-r--r--tests/tbf/TbfTest.cpp2
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);
diff --git a/src/tbf.h b/src/tbf.h
index 291b9900..be7dfe92 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -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();