diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-26 20:27:44 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-30 21:24:11 +0100 |
commit | 24c1a5ba29998d4293f7337a195a664d1845f673 (patch) | |
tree | 02ffa68de69ea2242d48c14f0847771feb1f1250 /src | |
parent | 42de18f347fe72bedf39a2498bc0f40db78d3468 (diff) |
bts: Move gprs_rlcmac_trigger_downlink_assignment into BTS
Diffstat (limited to 'src')
-rw-r--r-- | src/bts.cpp | 38 | ||||
-rw-r--r-- | src/bts.h | 1 | ||||
-rw-r--r-- | src/gprs_rlcmac.h | 4 | ||||
-rw-r--r-- | src/gprs_rlcmac_data.cpp | 41 | ||||
-rw-r--r-- | src/tbf.cpp | 4 |
5 files changed, 42 insertions, 46 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 8bb0f26e..9fd4fc3e 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -331,6 +331,44 @@ int BTS::rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn) return 0; } +/* depending on the current TBF, we assign on PACCH or AGCH */ +void BTS::trigger_dl_ass( + struct gprs_rlcmac_tbf *tbf, + struct gprs_rlcmac_tbf *old_tbf, const char *imsi) +{ + /* stop pending timer */ + tbf->stop_timer(); + + /* check for downlink tbf: */ + if (old_tbf) { + LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment on " + "PACCH, because %s TBF=%d exists for TLLI=0x%08x\n", + (old_tbf->direction == GPRS_RLCMAC_UL_TBF) + ? "UL" : "DL", old_tbf->tfi, old_tbf->tlli); + old_tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS; + /* use TA from old TBF */ + tbf->ta = old_tbf->ta; + /* change state */ + tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN); + tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH); + /* start timer */ + tbf_timer_start(tbf, 0, Tassign_pacch); + } else { + LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment for TBF=%d on PCH, no TBF exist (IMSI=%s)\n", tbf->tfi, imsi); + if (!imsi || strlen(imsi) < 3) { + LOGP(DRLCMAC, LOGL_ERROR, "No valid IMSI!\n"); + return; + } + /* change state */ + tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN); + tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); + strncpy(tbf->dir.dl.imsi, imsi, sizeof(tbf->dir.dl.imsi)); + /* send immediate assignment */ + tbf->bts->snd_dl_ass(tbf, 0, imsi); + tbf->dir.dl.wait_confirm = 1; + } +} + void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi) { int plen; @@ -170,6 +170,7 @@ public: int rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn); + void trigger_dl_ass(gprs_rlcmac_tbf *tbf, gprs_rlcmac_tbf *old_tbf, const char *imsi); void snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi); private: diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h index 6184a515..80673792 100644 --- a/src/gprs_rlcmac.h +++ b/src/gprs_rlcmac.h @@ -102,10 +102,6 @@ struct msgb *gprs_rlcmac_send_packet_uplink_assignment( struct msgb *gprs_rlcmac_send_packet_downlink_assignment( struct gprs_rlcmac_tbf *tbf, uint32_t fn); -void gprs_rlcmac_trigger_downlink_assignment( - struct gprs_rlcmac_tbf *tbf, - struct gprs_rlcmac_tbf *old_tbf, const char *imsi); - int gprs_rlcmac_downlink_ack( struct gprs_rlcmac_tbf *tbf, uint8_t final, uint8_t ssn, uint8_t *rbb); diff --git a/src/gprs_rlcmac_data.cpp b/src/gprs_rlcmac_data.cpp index 27e51d0e..004ac93f 100644 --- a/src/gprs_rlcmac_data.cpp +++ b/src/gprs_rlcmac_data.cpp @@ -722,8 +722,7 @@ int gprs_rlcmac_downlink_ack( tbf->state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; /* keep TO flags */ tbf->state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); tbf->update(); - gprs_rlcmac_trigger_downlink_assignment(tbf, tbf, NULL); - + tbf->bts->trigger_dl_ass(tbf, tbf, NULL); return 0; } @@ -819,41 +818,3 @@ struct msgb *gprs_rlcmac_send_packet_downlink_assignment( return msg; } -/* depending on the current TBF, we assign on PACCH or AGCH */ -void gprs_rlcmac_trigger_downlink_assignment( - struct gprs_rlcmac_tbf *tbf, - struct gprs_rlcmac_tbf *old_tbf, const char *imsi) -{ - /* stop pending timer */ - tbf->stop_timer(); - - /* check for downlink tbf: */ - if (old_tbf) { - LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment on " - "PACCH, because %s TBF=%d exists for TLLI=0x%08x\n", - (old_tbf->direction == GPRS_RLCMAC_UL_TBF) - ? "UL" : "DL", old_tbf->tfi, old_tbf->tlli); - old_tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS; - /* use TA from old TBF */ - tbf->ta = old_tbf->ta; - /* change state */ - tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN); - tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH); - /* start timer */ - tbf_timer_start(tbf, 0, Tassign_pacch); - } else { - LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment for TBF=%d on PCH, no TBF exist (IMSI=%s)\n", tbf->tfi, imsi); - if (!imsi || strlen(imsi) < 3) { - LOGP(DRLCMAC, LOGL_ERROR, "No valid IMSI!\n"); - return; - } - /* change state */ - tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN); - tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); - strncpy(tbf->dir.dl.imsi, imsi, sizeof(tbf->dir.dl.imsi)); - /* send immediate assignment */ - tbf->bts->snd_dl_ass(tbf, 0, imsi); - tbf->dir.dl.wait_confirm = 1; - } -} - diff --git a/src/tbf.cpp b/src/tbf.cpp index 73b8b1c8..f8e1dcb4 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -86,7 +86,7 @@ static int tbf_append_data(struct gprs_rlcmac_tbf *tbf, tbf->state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); tbf_update_ms_class(tbf, ms_class); tbf->update(); - gprs_rlcmac_trigger_downlink_assignment(tbf, tbf, NULL); + tbf->bts->trigger_dl_ass(tbf, tbf, NULL); } else { /* the TBF exists, so we must write it in the queue * we prepend lifetime in front of PDU */ @@ -192,7 +192,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. */ - gprs_rlcmac_trigger_downlink_assignment(tbf, old_tbf, imsi); + tbf->bts->trigger_dl_ass(tbf, old_tbf, imsi); /* store IMSI for debugging purpose. TODO: it is more than debugging */ tbf_assign_imsi(tbf, imsi); |