diff options
Diffstat (limited to 'src/tbf.cpp')
-rw-r--r-- | src/tbf.cpp | 79 |
1 files changed, 18 insertions, 61 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp index 3a1ac456..2fcb51c2 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -47,10 +47,11 @@ static inline void tbf_assign_imsi(struct gprs_rlcmac_tbf *tbf, strncpy(tbf->meas.imsi, imsi, sizeof(tbf->meas.imsi) - 1); } -static struct gprs_rlcmac_tbf *tbf_lookup_dl(const uint32_t tlli, const char *imsi) +static struct gprs_rlcmac_tbf *tbf_lookup_dl(BTS *bts, + const uint32_t tlli, const char *imsi) { /* TODO: look up by IMSI first, then tlli, then old_tlli */ - return tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF); + return bts->tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF); } static int tbf_append_data(struct gprs_rlcmac_tbf *tbf, @@ -121,7 +122,7 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts, /* 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" - tbf = tbf_by_tlli(tlli, GPRS_RLCMAC_UL_TBF); + tbf = bts->bts->tbf_by_tlli(tlli, GPRS_RLCMAC_UL_TBF); if (tbf && tbf->dir.ul.contention_resolution_done && !tbf->dir.ul.final_ack_sent) { use_trx = tbf->trx_no; @@ -196,7 +197,7 @@ int tbf_handle(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf; /* check for existing TBF */ - tbf = tbf_lookup_dl(tlli, imsi); + tbf = tbf_lookup_dl(bts->bts, tlli, imsi); if (tbf) { int rc = tbf_append_data(tbf, bts, ms_class, delay_csec, data, len); @@ -274,9 +275,9 @@ void tbf_free(struct gprs_rlcmac_tbf *tbf) gprs_rlcmac_rssi_rep(tbf); gprs_rlcmac_lost_rep(tbf); - debug_diagram(tbf->diag, "+---------------+"); - debug_diagram(tbf->diag, "| THE END |"); - debug_diagram(tbf->diag, "+---------------+"); + debug_diagram(tbf->bts, tbf->diag, "+---------------+"); + debug_diagram(tbf->bts, tbf->diag, "| THE END |"); + debug_diagram(tbf->bts, tbf->diag, "+---------------+"); LOGP(DRLCMAC, LOGL_INFO, "Free %s TBF=%d with TLLI=0x%08x.\n", (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL", tbf->tfi, tbf->tlli); @@ -315,7 +316,7 @@ int tbf_update(struct gprs_rlcmac_tbf *tbf) return -EINVAL; } - ul_tbf = tbf_by_tlli(tbf->tlli, GPRS_RLCMAC_UL_TBF); + ul_tbf = bts->bts->tbf_by_tlli(tbf->tlli, GPRS_RLCMAC_UL_TBF); tbf_unlink_pdch(tbf); rc = bts->alloc_algorithm(bts, ul_tbf, tbf, bts->alloc_algorithm_curst, 0); @@ -353,7 +354,7 @@ static const char *tbf_state_name[] = { void tbf_new_state(struct gprs_rlcmac_tbf *tbf, enum gprs_rlcmac_tbf_state state) { - debug_diagram(tbf->diag, "->%s", tbf_state_name[state]); + debug_diagram(tbf->bts, tbf->diag, "->%s", tbf_state_name[state]); LOGP(DRLCMAC, LOGL_DEBUG, "%s TBF=%d changes state from %s to %s\n", (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL", tbf->tfi, tbf_state_name[tbf->state], tbf_state_name[state]); @@ -415,50 +416,6 @@ struct gprs_rlcmac_tbf *tbf_by_tfi(struct gprs_rlcmac_bts *bts, return NULL; } -/* search for active downlink or uplink tbf */ -struct gprs_rlcmac_tbf *tbf_by_tlli(uint32_t tlli, - enum gprs_rlcmac_tbf_direction dir) -{ - struct gprs_rlcmac_tbf *tbf; - if (dir == GPRS_RLCMAC_UL_TBF) { - llist_for_each_entry(tbf, &gprs_rlcmac_ul_tbfs, list) { - if (tbf->state_is_not(GPRS_RLCMAC_RELEASING) - && tbf->tlli == tlli && tbf->tlli_valid) - return tbf; - } - } else { - llist_for_each_entry(tbf, &gprs_rlcmac_dl_tbfs, list) { - if (tbf->state_is_not(GPRS_RLCMAC_RELEASING) - && tbf->tlli == tlli) - return tbf; - } - } - return NULL; -} - -struct gprs_rlcmac_tbf *tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts) -{ - struct gprs_rlcmac_tbf *tbf; - - /* only one TBF can poll on specific TS/FN, because scheduler can only - * schedule one downlink control block (with polling) at a FN per TS */ - llist_for_each_entry(tbf, &gprs_rlcmac_ul_tbfs, list) { - if (tbf->state_is_not(GPRS_RLCMAC_RELEASING) - && tbf->poll_state == GPRS_RLCMAC_POLL_SCHED - && tbf->poll_fn == fn && tbf->trx_no == trx - && tbf->control_ts == ts) - return tbf; - } - llist_for_each_entry(tbf, &gprs_rlcmac_dl_tbfs, list) { - if (tbf->state_is_not(GPRS_RLCMAC_RELEASING) - && tbf->poll_state == GPRS_RLCMAC_POLL_SCHED - && tbf->poll_fn == fn && tbf->trx_no == trx - && tbf->control_ts == ts) - return tbf; - } - return NULL; -} - struct gprs_rlcmac_tbf *tbf_alloc(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *old_tbf, enum gprs_rlcmac_tbf_direction dir, uint8_t tfi, uint8_t trx, @@ -471,11 +428,11 @@ struct gprs_rlcmac_tbf *tbf_alloc(struct gprs_rlcmac_bts *bts, /* hunt for first free number in diagram */ int diagram_num; for (diagram_num = 0; ; diagram_num++) { - llist_for_each_entry(tbf, &gprs_rlcmac_ul_tbfs, list) { + llist_for_each_entry(tbf, &bts->ul_tbfs, list) { if (tbf->diag == diagram_num) goto next_diagram; } - llist_for_each_entry(tbf, &gprs_rlcmac_dl_tbfs, list) { + llist_for_each_entry(tbf, &bts->dl_tbfs, list) { if (tbf->diag == diagram_num) goto next_diagram; } @@ -533,14 +490,14 @@ next_diagram: INIT_LLIST_HEAD(&tbf->llc_queue); if (dir == GPRS_RLCMAC_UL_TBF) - llist_add(&tbf->list, &gprs_rlcmac_ul_tbfs); + llist_add(&tbf->list, &bts->ul_tbfs); else - llist_add(&tbf->list, &gprs_rlcmac_dl_tbfs); + llist_add(&tbf->list, &bts->dl_tbfs); - debug_diagram(tbf->diag, "+-----------------+"); - debug_diagram(tbf->diag, "|NEW %s TBF TFI=%2d|", + debug_diagram(bts->bts, tbf->diag, "+-----------------+"); + debug_diagram(bts->bts, tbf->diag, "|NEW %s TBF TFI=%2d|", (dir == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL", tfi); - debug_diagram(tbf->diag, "+-----------------+"); + debug_diagram(bts->bts, tbf->diag, "+-----------------+"); return tbf; } @@ -591,7 +548,7 @@ void tbf_timer_cb(void *_tbf) /* fall through */ case 3193: if (tbf->T == 3193) - debug_diagram(tbf->diag, "T3193 timeout"); + debug_diagram(tbf->bts, tbf->diag, "T3193 timeout"); LOGP(DRLCMAC, LOGL_DEBUG, "TBF will be freed due to timeout\n"); /* free TBF */ tbf_free(tbf); |