aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-07-07 18:25:41 +0200
committerMax <msuraev@sysmocom.de>2017-08-14 15:50:47 +0200
commita10c39866b4b6e5515b1ceb35b15955226679eb3 (patch)
treee2a49b17bb798548b5e80cac97b619c449028ced /src
parent341dccd7e25f0987c80cfcba7605e07fe962c8a8 (diff)
Move DL assignment to TBF-DL
This function does not really belongs to BTS and it heavily relies on direct access to TBF-DL members anyway. Change-Id: I04584103018675a2f35cfb565473bfd81a208d7c Closes: OS#1540
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp34
-rw-r--r--src/bts.h2
-rw-r--r--src/tbf.cpp4
-rw-r--r--src/tbf.h1
-rw-r--r--src/tbf_dl.cpp36
5 files changed, 38 insertions, 39 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index a89e8812..0f675361 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -788,40 +788,6 @@ uint8_t BTS::is_single_block(uint16_t ra, enum ph_burst_type burst_type,
return sb;
}
-/* depending on the current TBF, we assign on PACCH or AGCH */
-void BTS::trigger_dl_ass(
- struct gprs_rlcmac_dl_tbf *dl_tbf,
- struct gprs_rlcmac_tbf *old_tbf)
-{
- /* stop pending timer */
- dl_tbf->stop_timer();
-
- /* check for downlink tbf: */
- if (old_tbf) {
- LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment on "
- "PACCH, because %s exists\n", tbf_name(old_tbf));
- old_tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS;
-
- old_tbf->was_releasing = old_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE);
-
- /* change state */
- dl_tbf->set_state(GPRS_RLCMAC_ASSIGN);
- if (!(dl_tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH)))
- dl_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
- /* start timer */
- tbf_timer_start(dl_tbf, 0, Tassign_pacch);
- } else {
- LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment for %s on PCH, no TBF exist (IMSI=%s)\n", tbf_name(dl_tbf), dl_tbf->imsi());
- dl_tbf->was_releasing = dl_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE);
- /* change state */
- dl_tbf->set_state(GPRS_RLCMAC_ASSIGN);
- dl_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH);
- /* send immediate assignment */
- dl_tbf->bts->snd_dl_ass(dl_tbf, 0, dl_tbf->imsi());
- dl_tbf->m_wait_confirm = 1;
- }
-}
-
void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi)
{
int plen;
diff --git a/src/bts.h b/src/bts.h
index cff0020a..1f1dae25 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -373,7 +373,6 @@ public:
int rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit,
enum ph_burst_type burst_type);
- void trigger_dl_ass(gprs_rlcmac_dl_tbf *tbf, gprs_rlcmac_tbf *old_tbf);
void snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi);
GprsMsStorage &ms_store();
@@ -501,7 +500,6 @@ private:
/* list of downlink TBFs */
LListHead<gprs_rlcmac_tbf> m_dl_tbfs;
-private:
/* disable copying to avoid slicing */
BTS(const BTS&);
BTS& operator=(const BTS&);
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 1ac33d7a..5b28d9b3 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -1011,7 +1011,7 @@ void gprs_rlcmac_tbf::handle_timeout()
dl_tbf->update();
- dl_tbf->bts->trigger_dl_ass(dl_tbf, dl_tbf);
+ dl_tbf->trigger_ass(dl_tbf);
} else
LOGP(DRLCMAC, LOGL_NOTICE, "%s Continue flow after "
"IMM.ASS confirm\n", tbf_name(dl_tbf));
@@ -1299,7 +1299,7 @@ int gprs_rlcmac_tbf::establish_dl_tbf_on_pacch()
LOGP(DRLCMAC, LOGL_DEBUG, "%s Trigger downlink assignment on PACCH\n",
tbf_name(this));
- bts->trigger_dl_ass(new_tbf, this);
+ new_tbf->trigger_ass(this);
return 0;
}
diff --git a/src/tbf.h b/src/tbf.h
index ecdf5f81..9cc70e6e 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -424,6 +424,7 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
int rcvd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb);
int rcvd_dl_ack(uint8_t final_ack, unsigned first_bsn, struct bitvec *rbb);
struct msgb *create_dl_acked_block(uint32_t fn, uint8_t ts);
+ void trigger_ass(struct gprs_rlcmac_tbf *old_tbf);
void clear_poll_timeout_flag();
bool handle_ack_nack();
void request_dl_ack();
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 505d4887..8ce13a72 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -165,7 +165,7 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts,
* we don't use old_downlink, so the possible uplink is used
* to trigger downlink assignment. if there is no uplink,
* AGCH is used. */
- dl_tbf->bts->trigger_dl_ass(dl_tbf, old_ul_tbf);
+ dl_tbf->trigger_ass(old_ul_tbf);
*tbf = dl_tbf;
return 0;
}
@@ -484,6 +484,40 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(uint32_t fn, uint8_t ts)
return create_dl_acked_block(fn, ts, bsn, bsn2);
}
+/* depending on the current TBF, we assign on PACCH or AGCH */
+void gprs_rlcmac_dl_tbf::trigger_ass(struct gprs_rlcmac_tbf *old_tbf)
+{
+ /* stop pending timer */
+ stop_timer();
+
+ /* check for downlink tbf: */
+ if (old_tbf) {
+ LOGP(DRLCMACDL, LOGL_DEBUG, "Send dowlink assignment on PACCH, because %s exists\n", tbf_name(old_tbf));
+ old_tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS;
+ old_tbf->was_releasing = old_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE);
+
+ /* change state */
+ set_state(GPRS_RLCMAC_ASSIGN);
+ if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH)))
+ state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
+
+ /* start timer */
+ tbf_timer_start(this, 0, Tassign_pacch);
+ } else {
+ LOGP(DRLCMACDL, LOGL_DEBUG, "Send dowlink assignment for %s on PCH, no TBF exist (IMSI=%s)\n",
+ tbf_name(this), imsi());
+ was_releasing = state_is(GPRS_RLCMAC_WAIT_RELEASE);
+
+ /* change state */
+ set_state(GPRS_RLCMAC_ASSIGN);
+ state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH);
+
+ /* send immediate assignment */
+ bts->snd_dl_ass(this, 0, imsi());
+ m_wait_confirm = 1;
+ }
+}
+
void gprs_rlcmac_dl_tbf::schedule_next_frame()
{
struct msgb *msg;