aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2022-04-25 18:05:17 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2022-04-28 16:04:04 +0200
commitc9ac7cb91f584ed4921922e830166316a0bd49ba (patch)
treec0d10976ef4220b4b8ba2d9980ba7803c3e93a81
parent24567cfeed0ba9c0422e88f65cd1a9a489a197b6 (diff)
paging: Estimate available_slots based on BTS config when no CCCH Load Ind received
-rw-r--r--include/osmocom/bsc/paging.h2
-rw-r--r--src/osmo-bsc/abis_rsl.c3
-rw-r--r--src/osmo-bsc/paging.c28
3 files changed, 22 insertions, 11 deletions
diff --git a/include/osmocom/bsc/paging.h b/include/osmocom/bsc/paging.h
index 593529d5f..2102e0491 100644
--- a/include/osmocom/bsc/paging.h
+++ b/include/osmocom/bsc/paging.h
@@ -128,5 +128,7 @@ unsigned int paging_pending_requests_nr(struct gsm_bts *bts);
void paging_flush_bts(struct gsm_bts *bts, struct bsc_msc_data *msc);
void paging_flush_network(struct gsm_network *net, struct bsc_msc_data *msc);
+uint16_t paging_estimate_available_slots(struct gsm_bts *bts, unsigned int time_span_s);
+
int bsc_paging_start(struct bsc_paging_params *params);
#endif
diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c
index 627af11f2..bacfa641f 100644
--- a/src/osmo-bsc/abis_rsl.c
+++ b/src/osmo-bsc/abis_rsl.c
@@ -2341,8 +2341,7 @@ static int rsl_rx_ccch_load(struct msgb *msg)
case RSL_IE_PAGING_LOAD:
sd.pg_buf_space = rslh->data[1] << 8 | rslh->data[2];
if (is_ipaccess_bts(sign_link->trx->bts) && sd.pg_buf_space == UINT16_MAX) {
- /* paging load below configured threshold, use 50 as default */
- sd.pg_buf_space = 50;
+ sd.pg_buf_space = paging_estimate_available_slots(sd.bts, sd.bts->ccch_load_ind_period);
}
paging_update_buffer_space(sign_link->trx->bts, sd.pg_buf_space);
osmo_signal_dispatch(SS_CCCH, S_CCCH_PAGING_LOAD, &sd);
diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c
index c0649da36..5be7d81b6 100644
--- a/src/osmo-bsc/paging.c
+++ b/src/osmo-bsc/paging.c
@@ -119,11 +119,10 @@ static void paging_schedule_if_needed(struct gsm_bts_paging_state *paging_bts)
static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_bts);
static void paging_give_credit(void *data)
{
- struct gsm_bts_paging_state *paging_bts = data;
-
- LOG_BTS(paging_bts->bts, DPAG, LOGL_NOTICE, "No PCH LOAD IND, adding 20 slots)\n");
- paging_bts->available_slots = 20;
- paging_handle_pending_requests(paging_bts);
+ struct gsm_bts_paging_state *paging_bts_st = data;
+ struct gsm_bts *bts = paging_bts_st->bts;
+ paging_bts_st->available_slots = paging_estimate_available_slots(bts, bts->ccch_load_ind_period * 2);
+ paging_handle_pending_requests(paging_bts_st);
}
/*! count the number of free channels for given RSL channel type required
@@ -187,6 +186,7 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b
{
struct gsm_paging_request *request, *initial_request;
unsigned int num_paged = 0;
+ struct gsm_bts *bts = paging_bts->bts;
/*
* Determine if the pending_requests list is empty and
@@ -198,7 +198,7 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b
}
/* Skip paging if the bts is down. */
- if (!paging_bts->bts->oml_link)
+ if (!bts->oml_link)
goto sched_next_iter;
/* do while loop: Try send at most first MAX_PAGE_REQ_PER_ITER paging
@@ -217,7 +217,7 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b
* to zero and we do not get any messages.
*/
if (paging_bts->available_slots == 0) {
- osmo_timer_schedule(&paging_bts->credit_timer, 5, 0);
+ osmo_timer_schedule(&paging_bts->credit_timer, bts->ccch_load_ind_period * 2, 0);
return;
}
@@ -259,8 +259,7 @@ void paging_init(struct gsm_bts *bts)
{
bts->paging.bts = bts;
bts->paging.free_chans_need = -1;
- /* Large number, until we get a proper message */
- bts->paging.available_slots = 20;
+ bts->paging.available_slots = paging_estimate_available_slots(bts, bts->ccch_load_ind_period * 2);
INIT_LLIST_HEAD(&bts->paging.pending_requests);
osmo_timer_setup(&bts->paging.work_timer, paging_worker, &bts->paging);
osmo_timer_setup(&bts->paging.credit_timer, paging_give_credit, &bts->paging);
@@ -547,3 +546,14 @@ void paging_flush_network(struct gsm_network *net, struct bsc_msc_data *msc)
llist_for_each_entry(bts, &net->bts_list, list)
paging_flush_bts(bts, msc);
}
+
+/*! Estimate available_slots credit over a time period, used when below CCCH Load Indication Threshold */
+uint16_t paging_estimate_available_slots(struct gsm_bts *bts, unsigned int time_span_s)
+{
+ /* TODO: use gsm48_number_of_paging_subchannels() instead? */
+ unsigned int n_pag_blocks = gsm0502_get_n_pag_blocks(&bts->si_common.chan_desc);
+ uint16_t available_slots = n_pag_blocks * time_span_s * 1000000 / GSM51_MFRAME_DURATION_us;
+ LOG_BTS(bts, DPAG, LOGL_DEBUG, "Estimated %u paging available_slots over %u seconds\n",
+ available_slots, time_span_s);
+ return available_slots;
+}