Browse Source

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
changes/68/26168/3
Pau Espin 9 months ago committed by pespin
parent
commit
ef8a730f6d
  1. 1
      src/bts.cpp
  2. 1
      src/bts.h
  3. 6
      src/bts_pch_timer.c
  4. 1
      src/bts_pch_timer.h
  5. 5
      src/gprs_bssgp_pcu.c

1
src/bts.cpp

@ -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"},

1
src/bts.h

@ -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,

6
src/bts_pch_timer.c

@ -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;

1
src/bts_pch_timer.h

@ -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
}

5
src/gprs_bssgp_pcu.c

@ -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);

Loading…
Cancel
Save