aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-10-16 17:55:57 +0200
committerIvan Kluchnikov <kluchnikovi@gmail.com>2013-10-28 12:52:59 +0400
commit455613076aee24a70fb96ed858aac05b7241462f (patch)
treeecdd0488f11f9aff8e2514e2749226b15b9f2739 /src
parent4f6a4e5d6db39d2bb9825cf213165a07eb0e8ea8 (diff)
tbf: Move many routines related to the tbf from gprs_rlcmac to tbf.c
Diffstat (limited to 'src')
-rw-r--r--src/gprs_rlcmac.cpp153
-rw-r--r--src/tbf.cpp153
2 files changed, 153 insertions, 153 deletions
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index 3dab44f..d33dc8c 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -888,159 +888,6 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts,
return 0;
}
-static void tbf_unlink_pdch(struct gprs_rlcmac_tbf *tbf)
-{
- struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
- struct gprs_rlcmac_pdch *pdch;
- int ts;
-
- if (tbf->direction == GPRS_RLCMAC_UL_TBF) {
- bts->trx[tbf->trx].ul_tbf[tbf->tfi] = NULL;
- for (ts = 0; ts < 8; ts++) {
- pdch = tbf->pdch[ts];
- if (pdch)
- pdch->ul_tbf[tbf->tfi] = NULL;
- tbf->pdch[ts] = NULL;
- }
- } else {
- bts->trx[tbf->trx].dl_tbf[tbf->tfi] = NULL;
- for (ts = 0; ts < 8; ts++) {
- pdch = tbf->pdch[ts];
- if (pdch)
- pdch->dl_tbf[tbf->tfi] = NULL;
- tbf->pdch[ts] = NULL;
- }
- }
-}
-
-void tbf_free(struct gprs_rlcmac_tbf *tbf)
-{
- struct msgb *msg;
-
- /* Give final measurement report */
- gprs_rlcmac_rssi_rep(tbf);
- gprs_rlcmac_lost_rep(tbf);
-
- debug_diagram(tbf->diag, "+---------------+");
- debug_diagram(tbf->diag, "| THE END |");
- debug_diagram(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);
- if (tbf->ul_ass_state != GPRS_RLCMAC_UL_ASS_NONE)
- LOGP(DRLCMAC, LOGL_ERROR, "Software error: Pending uplink "
- "assignment. This may not happen, because the "
- "assignment message never gets transmitted. Please "
- "be shure not to free in this state. PLEASE FIX!\n");
- if (tbf->dl_ass_state != GPRS_RLCMAC_DL_ASS_NONE)
- LOGP(DRLCMAC, LOGL_ERROR, "Software error: Pending downlink "
- "assignment. This may not happen, because the "
- "assignment message never gets transmitted. Please "
- "be shure not to free in this state. PLEASE FIX!\n");
- tbf_timer_stop(tbf);
- while ((msg = msgb_dequeue(&tbf->llc_queue)))
- msgb_free(msg);
- tbf_unlink_pdch(tbf);
- llist_del(&tbf->list);
- LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF ends here **********\n");
- talloc_free(tbf);
-}
-
-int tbf_update(struct gprs_rlcmac_tbf *tbf)
-{
- struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
- struct gprs_rlcmac_tbf *ul_tbf = NULL;
- int rc;
-
- LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF update **********\n");
-
- if (tbf->direction != GPRS_RLCMAC_DL_TBF)
- return -EINVAL;
-
- if (!tbf->ms_class) {
- LOGP(DRLCMAC, LOGL_DEBUG, "- Cannot update, no class\n");
- return -EINVAL;
- }
-
- ul_tbf = 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);
- /* if no ressource */
- if (rc < 0) {
- LOGP(DRLCMAC, LOGL_ERROR, "No ressource after update???\n");
- return -rc;
- }
-
- return 0;
-}
-
-int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf)
-{
- if (tbf->control_ts == 0xff)
- LOGP(DRLCMAC, LOGL_INFO, "- Setting Control TS %d\n",
- tbf->first_common_ts);
- else if (tbf->control_ts != tbf->first_common_ts)
- LOGP(DRLCMAC, LOGL_INFO, "- Changing Control TS %d\n",
- tbf->first_common_ts);
- tbf->control_ts = tbf->first_common_ts;
-
- return 0;
-}
-
-
-const char *tbf_state_name[] = {
- "NULL",
- "ASSIGN",
- "FLOW",
- "FINISHED",
- "WAIT RELEASE",
- "RELEASING",
-};
-
-void tbf_new_state(struct gprs_rlcmac_tbf *tbf,
- enum gprs_rlcmac_tbf_state state)
-{
- debug_diagram(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]);
- tbf->state = state;
-}
-
-void tbf_timer_start(struct gprs_rlcmac_tbf *tbf, unsigned int T,
- unsigned int seconds, unsigned int microseconds)
-{
- if (!osmo_timer_pending(&tbf->timer))
- LOGP(DRLCMAC, LOGL_DEBUG, "Starting %s TBF=%d timer %u.\n",
- (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
- tbf->tfi, T);
- else
- LOGP(DRLCMAC, LOGL_DEBUG, "Restarting %s TBF=%d timer %u "
- "while old timer %u pending \n",
- (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
- tbf->tfi, T, tbf->T);
-
- tbf->T = T;
- tbf->num_T_exp = 0;
-
- /* Tunning timers can be safely re-scheduled. */
- tbf->timer.data = tbf;
- tbf->timer.cb = &tbf_timer_cb;
-
- osmo_timer_schedule(&tbf->timer, seconds, microseconds);
-}
-
-void tbf_timer_stop(struct gprs_rlcmac_tbf *tbf)
-{
- if (osmo_timer_pending(&tbf->timer)) {
- LOGP(DRLCMAC, LOGL_DEBUG, "Stopping %s TBF=%d timer %u.\n",
- (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
- tbf->tfi, tbf->T);
- osmo_timer_del(&tbf->timer);
- }
-}
-
/* starting time for assigning single slot
* This offset must be a multiple of 13. */
#define AGCH_START_OFFSET 52
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 4bb42a7..b93d0f1 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -25,6 +25,7 @@
extern "C" {
#include <osmocom/core/msgb.h>
+#include <osmocom/core/talloc.h>
}
#include <errno.h>
@@ -238,6 +239,158 @@ struct gprs_rlcmac_tbf *tbf_alloc_ul(struct gprs_rlcmac_bts *bts,
return tbf;
}
+static void tbf_unlink_pdch(struct gprs_rlcmac_tbf *tbf)
+{
+ struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
+ struct gprs_rlcmac_pdch *pdch;
+ int ts;
+
+ if (tbf->direction == GPRS_RLCMAC_UL_TBF) {
+ bts->trx[tbf->trx].ul_tbf[tbf->tfi] = NULL;
+ for (ts = 0; ts < 8; ts++) {
+ pdch = tbf->pdch[ts];
+ if (pdch)
+ pdch->ul_tbf[tbf->tfi] = NULL;
+ tbf->pdch[ts] = NULL;
+ }
+ } else {
+ bts->trx[tbf->trx].dl_tbf[tbf->tfi] = NULL;
+ for (ts = 0; ts < 8; ts++) {
+ pdch = tbf->pdch[ts];
+ if (pdch)
+ pdch->dl_tbf[tbf->tfi] = NULL;
+ tbf->pdch[ts] = NULL;
+ }
+ }
+}
+
+void tbf_free(struct gprs_rlcmac_tbf *tbf)
+{
+ struct msgb *msg;
+
+ /* Give final measurement report */
+ gprs_rlcmac_rssi_rep(tbf);
+ gprs_rlcmac_lost_rep(tbf);
+
+ debug_diagram(tbf->diag, "+---------------+");
+ debug_diagram(tbf->diag, "| THE END |");
+ debug_diagram(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);
+ if (tbf->ul_ass_state != GPRS_RLCMAC_UL_ASS_NONE)
+ LOGP(DRLCMAC, LOGL_ERROR, "Software error: Pending uplink "
+ "assignment. This may not happen, because the "
+ "assignment message never gets transmitted. Please "
+ "be shure not to free in this state. PLEASE FIX!\n");
+ if (tbf->dl_ass_state != GPRS_RLCMAC_DL_ASS_NONE)
+ LOGP(DRLCMAC, LOGL_ERROR, "Software error: Pending downlink "
+ "assignment. This may not happen, because the "
+ "assignment message never gets transmitted. Please "
+ "be shure not to free in this state. PLEASE FIX!\n");
+ tbf_timer_stop(tbf);
+ while ((msg = msgb_dequeue(&tbf->llc_queue)))
+ msgb_free(msg);
+ tbf_unlink_pdch(tbf);
+ llist_del(&tbf->list);
+ LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF ends here **********\n");
+ talloc_free(tbf);
+}
+
+int tbf_update(struct gprs_rlcmac_tbf *tbf)
+{
+ struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
+ struct gprs_rlcmac_tbf *ul_tbf = NULL;
+ int rc;
+
+ LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF update **********\n");
+
+ if (tbf->direction != GPRS_RLCMAC_DL_TBF)
+ return -EINVAL;
+
+ if (!tbf->ms_class) {
+ LOGP(DRLCMAC, LOGL_DEBUG, "- Cannot update, no class\n");
+ return -EINVAL;
+ }
+
+ ul_tbf = 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);
+ /* if no ressource */
+ if (rc < 0) {
+ LOGP(DRLCMAC, LOGL_ERROR, "No ressource after update???\n");
+ return -rc;
+ }
+
+ return 0;
+}
+
+int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf)
+{
+ if (tbf->control_ts == 0xff)
+ LOGP(DRLCMAC, LOGL_INFO, "- Setting Control TS %d\n",
+ tbf->first_common_ts);
+ else if (tbf->control_ts != tbf->first_common_ts)
+ LOGP(DRLCMAC, LOGL_INFO, "- Changing Control TS %d\n",
+ tbf->first_common_ts);
+ tbf->control_ts = tbf->first_common_ts;
+
+ return 0;
+}
+
+static const char *tbf_state_name[] = {
+ "NULL",
+ "ASSIGN",
+ "FLOW",
+ "FINISHED",
+ "WAIT RELEASE",
+ "RELEASING",
+};
+
+void tbf_new_state(struct gprs_rlcmac_tbf *tbf,
+ enum gprs_rlcmac_tbf_state state)
+{
+ debug_diagram(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]);
+ tbf->state = state;
+}
+
+void tbf_timer_start(struct gprs_rlcmac_tbf *tbf, unsigned int T,
+ unsigned int seconds, unsigned int microseconds)
+{
+ if (!osmo_timer_pending(&tbf->timer))
+ LOGP(DRLCMAC, LOGL_DEBUG, "Starting %s TBF=%d timer %u.\n",
+ (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
+ tbf->tfi, T);
+ else
+ LOGP(DRLCMAC, LOGL_DEBUG, "Restarting %s TBF=%d timer %u "
+ "while old timer %u pending \n",
+ (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
+ tbf->tfi, T, tbf->T);
+
+ tbf->T = T;
+ tbf->num_T_exp = 0;
+
+ /* Tunning timers can be safely re-scheduled. */
+ tbf->timer.data = tbf;
+ tbf->timer.cb = &tbf_timer_cb;
+
+ osmo_timer_schedule(&tbf->timer, seconds, microseconds);
+}
+
+void tbf_timer_stop(struct gprs_rlcmac_tbf *tbf)
+{
+ if (osmo_timer_pending(&tbf->timer)) {
+ LOGP(DRLCMAC, LOGL_DEBUG, "Stopping %s TBF=%d timer %u.\n",
+ (tbf->direction == GPRS_RLCMAC_UL_TBF) ? "UL" : "DL",
+ tbf->tfi, tbf->T);
+ osmo_timer_del(&tbf->timer);
+ }
+}
+
void gprs_rlcmac_tbf::free_all(struct gprs_rlcmac_trx *trx)
{
for (uint8_t tfi = 0; tfi < 32; tfi++) {