paging: Introduce VTY configurable X3113 (Maximum Paging Request Transmit Delay Threshold)

This allows configuring the maximum delay of paging requests to be
queued according to other parameters, such as MSC paging request
timeouts, etc.

Related: OS#5552
Change-Id: Ia556ef4e474e6a2d0d1618bab680a3330a3c062b
This commit is contained in:
Pau Espin 2022-11-28 12:13:24 +01:00
parent 8ff2931862
commit 671811f4fc
4 changed files with 25 additions and 9 deletions

View File

@ -53,6 +53,14 @@ enum bsc_paging_reason {
BSC_PAGING_FOR_LCS = 0x2,
};
/* OS#5552, OS#5553: Maximum allowed scheduling transmit delay in paging
* requests to be queued, in seconds. If calculated delay for requests to be
* queued goes over this threshold, they are discarded instead of inserted to
* the queue. This avoids keeping queueing requests which will be scheduled for
* transmission too late.
*/
#define PAGING_THRESHOLD_X3113_DEFAULT_SEC 60
struct bsc_paging_params {
enum bsc_paging_reason reason;
struct bsc_msc_data *msc;

View File

@ -26,6 +26,7 @@
#include <osmocom/bsc/chan_alloc.h>
#include <osmocom/bsc/neighbor_ident.h>
#include <osmocom/bsc/bts_setup_ramp.h>
#include <osmocom/bsc/paging.h>
static struct osmo_tdef gsm_network_T_defs[] = {
{ .T = 4, .default_val = 5, .desc = "Timeout to receive BSSMAP RESET ACKNOWLEDGE from the MSC" },
@ -74,6 +75,11 @@ static struct osmo_tdef gsm_network_T_defs[] = {
" keep remainders. See also X16, X17." },
{ .T = -25, .default_val = 5, .desc = "Timeout for initial user data after an MSC initiated an SCCP connection to the BSS" },
{ .T = -3111, .default_val = 4, .desc = "Wait time after lchan was released in error (should be T3111 + 2s)" },
{ .T = -3113, .default_val = PAGING_THRESHOLD_X3113_DEFAULT_SEC,
.desc = "Maximum Paging Request Transmit Delay Threshold: " \
"If the estimated transmit delay of the messages of the paging queue surpasses this threshold, new incoming "
"paging requests are discarded, hence limiting the size of the queue and maximum delay of its scheduled requests. "
"X3113 also serves as the upper boundary for dynamic T3113 when estimating the expected maximum delay to get a response" },
{ .T = -3210, .default_val = 20, .desc = "After L3 Complete, wait for MSC to confirm" },
{}
};

View File

@ -61,8 +61,6 @@ void *tall_paging_ctx = NULL;
/* How many paging requests to Tx on RSL at max before going back to main loop */
#define MAX_PAGE_REQ_PER_ITER 10
#define MAX_TX_DELAY_TIME_SEC 60
/* How often to attempt sending new paging requests (initial, not retrans): 250ms */
static const struct timespec initial_period = {
.tv_sec = 0,
@ -355,7 +353,7 @@ static unsigned int paging_estimate_delay_us(struct gsm_bts *bts, unsigned int n
unsigned int num_reqs_same_pgroup);
static unsigned int calculate_timer_3113(struct gsm_paging_request *req, unsigned int reqs_before,
unsigned int reqs_before_same_pgroup)
unsigned int reqs_before_same_pgroup, unsigned int max_dynamic_value)
{
unsigned int to_us, estimated_to, to;
struct gsm_bts *bts = req->bts;
@ -389,9 +387,9 @@ static unsigned int calculate_timer_3113(struct gsm_paging_request *req, unsigne
/* ceiling in seconds + extra time */
estimated_to = (to_us + 999999) / 1000000 + d->val;
/* upper bound: 60s (OS#5553) */
if (estimated_to > MAX_TX_DELAY_TIME_SEC)
to = MAX_TX_DELAY_TIME_SEC;
/* upper bound: see X3113, PAGING_THRESHOLD_X3113_DEFAULT_SEC */
if (estimated_to > max_dynamic_value)
to = max_dynamic_value;
else
to = estimated_to;
@ -414,14 +412,16 @@ static int _paging_request(const struct bsc_paging_params *params, struct gsm_bt
struct gsm_bts_paging_state *bts_entry = &bts->paging;
struct gsm_paging_request *req, *last_initial_req = NULL;
unsigned int t3113_timeout_s;
unsigned int x3113_s = osmo_tdef_get(bts->network->T_defs, -3113, OSMO_TDEF_S, -1);
unsigned int reqs_before = 0, reqs_before_same_pgroup = 0;
uint8_t pgroup = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
str_to_imsi(params->bsub->imsi));
rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_ATTEMPTED));
/* don't try to queue more requests than we can realistically handle within MAX_TX_DELAY_TIME_SEC seconds */
if (paging_pending_requests_nr(bts) > paging_estimate_available_slots(bts, MAX_TX_DELAY_TIME_SEC)) {
/* Don't try to queue more requests than we can realistically handle within X3113 seconds,
* see PAGING_THRESHOLD_X3113_DEFAULT_SEC. */
if (paging_pending_requests_nr(bts) > paging_estimate_available_slots(bts, x3113_s)) {
rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_OVERLOAD));
return -ENOSPC;
}
@ -484,7 +484,7 @@ static int _paging_request(const struct bsc_paging_params *params, struct gsm_bt
else/* Add in the middle of the list after last_initial_req */
__llist_add(&req->entry, &last_initial_req->entry, last_initial_req->entry.next);
t3113_timeout_s = calculate_timer_3113(req, reqs_before, reqs_before_same_pgroup);
t3113_timeout_s = calculate_timer_3113(req, reqs_before, reqs_before_same_pgroup, x3113_s);
osmo_timer_schedule(&req->T3113, t3113_timeout_s, 0);
/* Trigger scheduler if needed: */

View File

@ -35,6 +35,7 @@ net: X17 = 0 ms Rounding threshold for all_allocated:* rate counters: round up t
net: X18 = 60000 ms Forget-sum period for all_allocated:* rate counters: after this amount of idle time, forget internally cumulated time remainders. Zero to always keep remainders. See also X16, X17. (default: 60000 ms)
net: X25 = 5 s Timeout for initial user data after an MSC initiated an SCCP connection to the BSS (default: 5 s)
net: X3111 = 4 s Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
net: X3113 = 60 s Maximum Paging Request Transmit Delay Threshold: If the estimated transmit delay of the messages of the paging queue surpasses this threshold, new incoming paging requests are discarded, hence limiting the size of the queue and maximum delay of its scheduled requests. X3113 also serves as the upper boundary for dynamic T3113 when estimating the expected maximum delay to get a response (default: 60 s)
net: X3210 = 20 s After L3 Complete, wait for MSC to confirm (default: 20 s)
mgw: X2427 = 5 s timeout for MGCP response from MGW (default: 5 s)
@ -89,6 +90,7 @@ net: X17 = 0 ms Rounding threshold for all_allocated:* rate counters: round up t
net: X18 = 60000 ms Forget-sum period for all_allocated:* rate counters: after this amount of idle time, forget internally cumulated time remainders. Zero to always keep remainders. See also X16, X17. (default: 60000 ms)
net: X25 = 5 s Timeout for initial user data after an MSC initiated an SCCP connection to the BSS (default: 5 s)
net: X3111 = 4 s Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
net: X3113 = 60 s Maximum Paging Request Transmit Delay Threshold: If the estimated transmit delay of the messages of the paging queue surpasses this threshold, new incoming paging requests are discarded, hence limiting the size of the queue and maximum delay of its scheduled requests. X3113 also serves as the upper boundary for dynamic T3113 when estimating the expected maximum delay to get a response (default: 60 s)
net: X3210 = 20 s After L3 Complete, wait for MSC to confirm (default: 20 s)
mgw: X2427 = 5 s timeout for MGCP response from MGW (default: 5 s)