tbf: Add GprsMs* argument to update() and use it in reuse_tbf

Since set_ms() is caled on the new DL TBF, the old DL TBF loses the
reference to the MS object. This will lead to a segfault, when
update() is called in reuse_tbf().

This commit adds an optional GprsMs* parameter to update() and uses it
for the slot allocation.

This fixes a TbfTest crash that would otherwise occur after applying
the next commit.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2015-07-03 12:38:59 +02:00
parent ac89a555fa
commit 9380f5d218
3 changed files with 11 additions and 5 deletions

View File

@ -263,18 +263,24 @@ void tbf_free(struct gprs_rlcmac_tbf *tbf)
talloc_free(tbf); talloc_free(tbf);
} }
int gprs_rlcmac_tbf::update() int gprs_rlcmac_tbf::update(GprsMs *ms_)
{ {
struct gprs_rlcmac_bts *bts_data = bts->bts_data(); struct gprs_rlcmac_bts *bts_data = bts->bts_data();
int rc; int rc = -EINVAL;
LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF update **********\n"); LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF update **********\n");
if (direction != GPRS_RLCMAC_DL_TBF) if (direction != GPRS_RLCMAC_DL_TBF)
return -EINVAL; return -EINVAL;
if (!ms_)
ms_ = ms();
if (!ms_)
return -EINVAL;
tbf_unlink_pdch(this); tbf_unlink_pdch(this);
rc = bts_data->alloc_algorithm(bts_data, ms(), this, bts_data->alloc_algorithm_curst, 0); rc = bts_data->alloc_algorithm(bts_data, ms_, this, bts_data->alloc_algorithm_curst, 0);
/* if no resource */ /* if no resource */
if (rc < 0) { if (rc < 0) {
LOGP(DRLCMAC, LOGL_ERROR, "No resource after update???\n"); LOGP(DRLCMAC, LOGL_ERROR, "No resource after update???\n");

View File

@ -131,7 +131,7 @@ struct gprs_rlcmac_tbf {
int rlcmac_diag(); int rlcmac_diag();
int update(); int update(GprsMs *ms = NULL);
void handle_timeout(); void handle_timeout();
void stop_timer(); void stop_timer();
void stop_t3191(); void stop_t3191();

View File

@ -869,7 +869,7 @@ void gprs_rlcmac_dl_tbf::reuse_tbf()
state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; state_flags &= GPRS_RLCMAC_FLAG_TO_MASK;
state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH);
update(); update(new_tbf->ms());
LOGP(DRLCMAC, LOGL_DEBUG, "%s Trigger dowlink assignment on PACCH, " LOGP(DRLCMAC, LOGL_DEBUG, "%s Trigger dowlink assignment on PACCH, "
"because another LLC PDU has arrived in between\n", "because another LLC PDU has arrived in between\n",