diff --git a/src/bts.cpp b/src/bts.cpp index 9c0fea2..3f9b24a 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -1052,10 +1052,7 @@ int gprs_rlcmac_pdch::rcv_control_block( } else { ta = sba->ta; bts()->timing_advance()->remember(tlli, ta); -#warning "SBA deleted inline.. enforce capsulation" - bts()->sba_freed(); - llist_del(&sba->list); - talloc_free(sba); + bts()->sba()->free_sba(sba); } if (ul_control_block->u.Packet_Resource_Request.Exist_MS_Radio_Access_capability) ms_class = Decoding::get_ms_class_by_capability(&ul_control_block->u.Packet_Resource_Request.MS_Radio_Access_capability); @@ -1101,11 +1098,8 @@ int gprs_rlcmac_pdch::rcv_control_block( "block, but there is no resource request " "scheduled!\n"); } else { - #warning "SBA deleted inline.. enforce capsulation" bts()->timing_advance()->remember(ul_control_block->u.Packet_Measurement_Report.TLLI, sba->ta); - bts()->sba_freed(); - llist_del(&sba->list); - talloc_free(sba); + bts()->sba()->free_sba(sba); } gprs_rlcmac_meas_rep(&ul_control_block->u.Packet_Measurement_Report); break; diff --git a/src/sba.cpp b/src/sba.cpp index ddcbe52..6eec235 100644 --- a/src/sba.cpp +++ b/src/sba.cpp @@ -124,14 +124,18 @@ uint32_t SBAController::sched(uint8_t trx, uint8_t ts, uint32_t fn, uint8_t bloc int SBAController::timeout(struct gprs_rlcmac_sba *sba) { LOGP(DRLCMAC, LOGL_NOTICE, "Poll timeout for SBA\n"); - llist_del(&sba->list); m_bts.sba_timedout(); - m_bts.sba_freed(); - talloc_free(sba); - + free_sba(sba); return 0; } +void SBAController::free_sba(gprs_rlcmac_sba *sba) +{ + m_bts.sba_freed(); + llist_del(&sba->list); + talloc_free(sba); +} + void SBAController::free_resources(struct gprs_rlcmac_pdch *pdch) { struct gprs_rlcmac_sba *sba, *sba2; @@ -139,10 +143,7 @@ void SBAController::free_resources(struct gprs_rlcmac_pdch *pdch) const uint8_t ts_no = pdch->ts_no; llist_for_each_entry_safe(sba, sba2, &m_sbas, list) { - if (sba->trx_no == trx_no && sba->ts_no == ts_no) { - llist_del(&sba->list); - m_bts.sba_freed(); - talloc_free(sba); - } + if (sba->trx_no == trx_no && sba->ts_no == ts_no) + free_sba(sba); } } diff --git a/src/sba.h b/src/sba.h index 5709ad4..f39834a 100644 --- a/src/sba.h +++ b/src/sba.h @@ -61,6 +61,8 @@ public: int timeout(struct gprs_rlcmac_sba *sba); void free_resources(struct gprs_rlcmac_pdch *pdch); + void free_sba(gprs_rlcmac_sba *sba); + private: BTS &m_bts; llist_head m_sbas;