bts_pch_timer: Avoid resend Paging Request over PCUIF if T3113 is armed

Let's avoid flooding the BTS and taking CCCH resources for no good
reason. If user configures everything correctly, the SGSN should not
attempt a retry after similar timer >= T3113.

Related: OS#5297
Change-Id: I2a77714648d16ccff2a340ce775e83dcc5ffe707
This commit is contained in:
Pau Espin 2021-11-08 19:19:25 +01:00 committed by pespin
parent 19b3392166
commit ef8a730f6d
5 changed files with 9 additions and 5 deletions

View File

@ -134,6 +134,7 @@ static const struct rate_ctr_desc bts_ctr_description[] = {
{ "llc:dl_bytes", "RLC encapsulated PDUs"},
{ "llc:ul_bytes", "full PDUs received "},
{ "pch:requests", "PCH requests sent "},
{ "pch:requests:already", "PCH requests on subscriber already being paged"},
{ "pch:requests:timeout", "PCH requests timeout "},
{ "rach:requests", "RACH requests received"},
{ "rach:requests:11bit", "11BIT_RACH requests received"},

View File

@ -126,6 +126,7 @@ enum {
CTR_LLC_DL_BYTES,
CTR_LLC_UL_BYTES,
CTR_PCH_REQUESTS,
CTR_PCH_REQUESTS_ALREADY,
CTR_PCH_REQUESTS_TIMEDOUT,
CTR_RACH_REQUESTS,
CTR_RACH_REQUESTS_11BIT,

View File

@ -41,7 +41,7 @@ static struct bts_pch_timer *bts_pch_timer_get_by_ptmsi(struct gprs_rlcmac_bts *
return NULL;
}
static struct bts_pch_timer *bts_pch_timer_get_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi)
struct bts_pch_timer *bts_pch_timer_get_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi)
{
struct bts_pch_timer *p;
@ -77,10 +77,6 @@ void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_i
struct bts_pch_timer *p;
struct osmo_tdef *tdef;
/* We already have a timer running for this IMSI */
if (bts_pch_timer_get_by_imsi(bts, imsi))
return;
p = talloc_zero(bts, struct bts_pch_timer);
llist_add_tail(&p->entry, &bts->pch_timer);
p->bts = bts;

View File

@ -42,6 +42,7 @@ void bts_pch_timer_start(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_i
const char *imsi);
void bts_pch_timer_stop(struct gprs_rlcmac_bts *bts, const struct GprsMs *ms);
void bts_pch_timer_stop_all(struct gprs_rlcmac_bts *bts);
struct bts_pch_timer *bts_pch_timer_get_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi);
#ifdef __cplusplus
}

View File

@ -320,6 +320,11 @@ static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed
/* FIXME: look if MS is attached a specific BTS and then only page on that one? */
llist_for_each_entry(bts, &the_pcu->bts_list, list) {
if (bts_pch_timer_get_by_imsi(bts, mi_imsi.imsi)) {
LOGP(DBSSGP, LOGL_INFO, "PS-Paging request already pending for IMSI=%s\n", mi_imsi.imsi);
bts_do_rate_ctr_inc(bts, CTR_PCH_REQUESTS_ALREADY);
continue;
}
if (gprs_rlcmac_paging_request(bts, &paging_mi, pgroup) < 0)
continue;
bts_pch_timer_start(bts, &paging_mi, mi_imsi.imsi);