Free all MS TBFs when receiving GPRS Suspension Request

Otherwise the TBFs are kept, and hence PCU will continue reserving resources and
DL data queued will still be sent over the air, despite the MS not
listening anymore on the PDCH.

Change-Id: I4ae1c3706b2ed6e4d271cd16f7cd7f8937b84836
This commit is contained in:
Pau Espin 2020-09-22 15:57:37 +02:00
parent e3ef51ec06
commit bd9973a64f
1 changed files with 17 additions and 0 deletions

View File

@ -49,6 +49,8 @@ extern "C" {
#include <osmocom/pcu/pcuif_proto.h>
#include <bts.h>
#include <pdch.h>
#include <tbf_ul.h>
#include <tbf_dl.h>
// FIXME: move this, when changed from c++ to c.
extern "C" {
@ -730,7 +732,11 @@ static int pcu_rx_pag_req(struct gsm_pcu_if_pag_req *pag_req)
static int pcu_rx_susp_req(struct gsm_pcu_if_susp_req *susp_req)
{
BTS *bts = BTS::main_bts();
struct bssgp_bvc_ctx *bctx = gprs_bssgp_pcu_current_bctx();
GprsMs *ms;
struct gprs_rlcmac_dl_tbf *dl_tbf;
struct gprs_rlcmac_ul_tbf *ul_tbf;
struct gprs_ra_id ra_id;
gsm48_parse_ra(&ra_id, susp_req->ra_id);
@ -738,6 +744,17 @@ static int pcu_rx_susp_req(struct gsm_pcu_if_susp_req *susp_req)
LOGP(DL1IF, LOGL_INFO, "GPRS Suspend request received: TLLI=0x%08x RAI=%s\n",
susp_req->tlli, osmo_rai_name(&ra_id));
if ((ms = bts->ms_store().get_ms(susp_req->tlli))) {
/* We need to catch both pointers here since MS may become freed
after first tbf_free(dl_tbf) if only DL TBF was available */
dl_tbf = ms->dl_tbf();
ul_tbf = ms->ul_tbf();
if (dl_tbf)
tbf_free(dl_tbf);
if (ul_tbf)
tbf_free(ul_tbf);
}
if (!bctx)
return -1;