diff options
-rw-r--r-- | src/tbf.cpp | 33 | ||||
-rw-r--r-- | src/tbf.h | 5 | ||||
-rw-r--r-- | tests/ms/MsTest.cpp | 22 |
3 files changed, 47 insertions, 13 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp index 2e6da026..9d4363fa 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -41,6 +41,11 @@ extern void *tall_pcu_ctx; static void tbf_timer_cb(void *_tbf); +gprs_rlcmac_tbf::gprs_rlcmac_tbf(gprs_rlcmac_tbf_direction dir) : + direction(dir) +{ +} + gprs_rlcmac_bts *gprs_rlcmac_tbf::bts_data() const { return bts->bts_data(); @@ -523,6 +528,17 @@ static int setup_tbf(struct gprs_rlcmac_tbf *tbf, struct gprs_rlcmac_bts *bts, return 0; } +gprs_rlcmac_ul_tbf::gprs_rlcmac_ul_tbf() : + gprs_rlcmac_tbf(GPRS_RLCMAC_UL_TBF) +{ +}; + +static int ul_tbf_dtor(struct gprs_rlcmac_ul_tbf *tbf) +{ + tbf->~gprs_rlcmac_ul_tbf(); + return 0; +} + struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms, int8_t use_trx, @@ -540,7 +556,8 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, if (!tbf) return NULL; - tbf->direction = GPRS_RLCMAC_UL_TBF; + talloc_set_destructor(tbf, ul_tbf_dtor); + new (tbf) gprs_rlcmac_ul_tbf(); if (!ms) ms = bts->bts->ms_alloc(ms_class); @@ -558,6 +575,17 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, return tbf; } +gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf() : + gprs_rlcmac_tbf(GPRS_RLCMAC_DL_TBF) +{ +}; + +static int dl_tbf_dtor(struct gprs_rlcmac_dl_tbf *tbf) +{ + tbf->~gprs_rlcmac_dl_tbf(); + return 0; +} + struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms, int8_t use_trx, uint8_t ms_class, uint8_t single_slot) @@ -574,7 +602,8 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, if (!tbf) return NULL; - tbf->direction = GPRS_RLCMAC_DL_TBF; + talloc_set_destructor(tbf, dl_tbf_dtor); + new (tbf) gprs_rlcmac_dl_tbf(); if (!ms) ms = bts->bts->ms_alloc(ms_class); @@ -110,6 +110,7 @@ struct llist_pods { prefetch(pos->member.list.next)) struct gprs_rlcmac_tbf { + gprs_rlcmac_tbf(gprs_rlcmac_tbf_direction dir); static void free_all(struct gprs_rlcmac_trx *trx); static void free_all(struct gprs_rlcmac_pdch *pdch); @@ -306,6 +307,8 @@ inline time_t gprs_rlcmac_tbf::created_ts() const } struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { + gprs_rlcmac_dl_tbf(); + void cleanup(); /* dispatch Unitdata.DL messages */ @@ -371,6 +374,8 @@ protected: }; struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf { + gprs_rlcmac_ul_tbf(); + struct msgb *create_ul_ack(uint32_t fn); /* blocks were acked */ diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp index 5a25d76f..7255da31 100644 --- a/tests/ms/MsTest.cpp +++ b/tests/ms/MsTest.cpp @@ -55,9 +55,9 @@ static void test_ms_state() OSMO_ASSERT(ms->is_idle()); dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf) gprs_rlcmac_dl_tbf(); ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); - ul_tbf->direction = GPRS_RLCMAC_UL_TBF; + new (ul_tbf) gprs_rlcmac_ul_tbf(); ms->attach_tbf(ul_tbf); OSMO_ASSERT(!ms->is_idle()); @@ -116,9 +116,9 @@ static void test_ms_callback() OSMO_ASSERT(ms->is_idle()); dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf) gprs_rlcmac_dl_tbf(); ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); - ul_tbf->direction = GPRS_RLCMAC_UL_TBF; + new (ul_tbf) gprs_rlcmac_ul_tbf(); OSMO_ASSERT(last_cb == UNKNOWN); @@ -186,11 +186,11 @@ static void test_ms_replace_tbf() was_idle = false; dl_tbf[0] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf[0]->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf[0]) gprs_rlcmac_dl_tbf(); dl_tbf[1] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf[1]->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf[1]) gprs_rlcmac_dl_tbf(); ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); - ul_tbf->direction = GPRS_RLCMAC_UL_TBF; + new (ul_tbf) gprs_rlcmac_ul_tbf(); ms->attach_tbf(dl_tbf[0]); OSMO_ASSERT(!ms->is_idle()); @@ -343,7 +343,7 @@ static void test_ms_storage() printf("=== start %s ===\n", __func__); ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); - ul_tbf->direction = GPRS_RLCMAC_UL_TBF; + new (ul_tbf) gprs_rlcmac_ul_tbf(); ms = store.get_ms(tlli + 0); OSMO_ASSERT(ms == NULL); @@ -434,9 +434,9 @@ static void test_ms_timeout() OSMO_ASSERT(ms->is_idle()); dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf) gprs_rlcmac_dl_tbf(); ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); - ul_tbf->direction = GPRS_RLCMAC_UL_TBF; + new (ul_tbf) gprs_rlcmac_ul_tbf(); OSMO_ASSERT(last_cb == UNKNOWN); @@ -492,7 +492,7 @@ static void test_ms_cs_selection() OSMO_ASSERT(ms->is_idle()); dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf); - dl_tbf->direction = GPRS_RLCMAC_DL_TBF; + new (dl_tbf) gprs_rlcmac_dl_tbf(); dl_tbf->set_ms(ms); OSMO_ASSERT(!ms->is_idle()); |