Make BSSGP timing data configurable

Also: Deprecate/hide old respective VTY command,
while preserving backwards compatibility
for BSSGP timing data configuration.

Requires: libosmocore.git Ib3b22640a11eae152d66d62c0f47b953d80de945
Related: OS#5335
Change-Id: Id4779f033b5eb1742462d4efc28a0398645acfe6
This commit is contained in:
arehbein 2023-11-28 00:55:03 +01:00
parent e7bea02ee3
commit 6c2ff6ad47
7 changed files with 161 additions and 22 deletions

View File

@ -340,6 +340,18 @@ struct gsm_bts_model {
/* 3GPP TS 04.60 V8.27.0 (2005-09) */
#define GSM_RLCMACN3101_STRICT_LOWER_BOUND 8UL
#define GSM_BTS_TDEF_ID_BSSGP_T1 1
#define GSM_BTS_TDEF_ID_BSSGP_T2 2
#define GSM_BTS_TDEF_ID_BSSGP_T3 3
#define GSM_BTS_TDEF_ID_BSSGP_T4 4
#define GSM_BTS_TDEF_ID_BSSGP_T5 5
#define GSM_BTS_TDEF_ID_BSSGP_T1_BLOCK_RETRIES (-41)
#define GSM_BTS_TDEF_ID_BSSGP_T1_UNBLOCK_RETRIES (-42)
#define GSM_BTS_TDEF_ID_BSSGP_T2_RESET_RETRIES (-43)
#define GSM_BTS_TDEF_ID_BSSGP_T3_SUSPEND_RETRIES (-44)
#define GSM_BTS_TDEF_ID_BSSGP_T4_RESUME_RETRIES (-45)
#define GSM_BTS_TDEF_ID_BSSGP_T5_CAP_UPDATE_RETRIES (-46)
struct gsm_gprs_cell {
struct gsm_abis_mo mo;
uint16_t bvci;
@ -351,7 +363,7 @@ struct gsm_gprs_cell {
enum gsm_gprs_bts_tdef_groups {
OSMO_BSC_BTS_TDEF_GROUPS_RLC = 0,
OSMO_BSC_BTS_TDEF_GROUPS_NS,
/* TODO: Add additional groups here (BSSGP) */
OSMO_BSC_BTS_TDEF_GROUPS_BSSGP,
_NUM_OSMO_BSC_BTS_TDEF_GROUPS
};
extern struct osmo_tdef_group bts_gprs_timer_template_groups[_NUM_OSMO_BSC_BTS_TDEF_GROUPS + 1];

View File

@ -103,7 +103,8 @@ enum bsc_vty_cmd_attr {
#define BTS_VTY_RLC_DESC_STR "RLC (Radio Link Control)"
#define BTS_VTY_NS_STR "ns"
#define BTS_VTY_NS_DESC_STR "NS (Network Service)"
/* Add additional group strings for vty command generation here */
#define BTS_VTY_BSSGP_STR "bssgp"
#define BTS_VTY_BSSGP_DESC_STR "BSSGP (Base Station System GPRS Protocol)"
#define BTS_VTY_SHOW_TIMER_STR BTS_SHOW_TIMER_STR_NONEWLINE " & for this BTS\n"
/*! Defines for per-BTS string commands */

View File

@ -91,13 +91,40 @@ static struct osmo_tdef bts_gprs_ns_timer_templates[] = {
{}
};
static struct osmo_tdef bts_gprs_bssgp_timer_templates[] = {
{ .T = 1, .default_val = 3,
.max_val = UINT8_MAX, .desc = "T1 (3GPP TS 48.018): Guards the (un)blocking procedures" },
{ .T = GSM_BTS_TDEF_ID_BSSGP_T1_BLOCK_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for blocking procedures guarded by T1", .unit = OSMO_TDEF_CUSTOM },
{ .T = GSM_BTS_TDEF_ID_BSSGP_T1_UNBLOCK_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for unblocking procedures guarded by T1", .unit = OSMO_TDEF_CUSTOM },
{ .T = 2, .default_val = 3,
.max_val = UINT8_MAX, .desc = "T2 (3GPP TS 48.018): Guards the reset procedure"},
{ .T = GSM_BTS_TDEF_ID_BSSGP_T2_RESET_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for reset procedures guarded by T2", .unit = OSMO_TDEF_CUSTOM },
{ .T = 3, .default_val = 1000,
.max_val = UINT8_MAX * 100, .desc = "T3 (3GPP TS 48.018): Guards the suspend procedure", .unit = OSMO_TDEF_MS },
{ .T = GSM_BTS_TDEF_ID_BSSGP_T3_SUSPEND_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for suspend procedures guarded by T3", .unit = OSMO_TDEF_CUSTOM },
{ .T = 4, .default_val = 1000,
.max_val = UINT8_MAX * 100, .desc = "T4 (3GPP TS 48.018): Guards the resume procedure", .unit = OSMO_TDEF_MS },
{ .T = GSM_BTS_TDEF_ID_BSSGP_T4_RESUME_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for resume procedures guarded by T4", .unit = OSMO_TDEF_CUSTOM },
{ .T = 5, .default_val = 10, .max_val = UINT8_MAX,
.desc = "T5 (3GPP TS 48.018): Guards the Radio Access Capability Update procedure", .unit = OSMO_TDEF_CUSTOM },
{ .T = GSM_BTS_TDEF_ID_BSSGP_T5_CAP_UPDATE_RETRIES, .default_val = 3,
.max_val = UINT8_MAX, .desc = "Retries for capability update procedures guarded by T5", .unit = OSMO_TDEF_CUSTOM },
{}
};
/* This is only used by bts_vty.c to init the default values for the templates */
struct osmo_tdef_group bts_gprs_timer_template_groups[_NUM_OSMO_BSC_BTS_TDEF_GROUPS + 1] = {
[OSMO_BSC_BTS_TDEF_GROUPS_RLC] = {
.name = BTS_VTY_RLC_STR, .tdefs = bts_gprs_rlc_timer_templates, .desc = BTS_VTY_RLC_DESC_STR },
[OSMO_BSC_BTS_TDEF_GROUPS_NS] = {
.name = BTS_VTY_NS_STR, .tdefs = bts_gprs_ns_timer_templates, .desc = BTS_VTY_NS_DESC_STR },
/* Additional per-BTS timer groups here, set as above using 'enum gprs_bts_tdef_groups' */
[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP] = {
.name = BTS_VTY_BSSGP_STR, .tdefs = bts_gprs_bssgp_timer_templates, .desc = BTS_VTY_BSSGP_DESC_STR },
{}
};
@ -111,6 +138,10 @@ void bts_gprs_timer_groups_init(struct gsm_bts *bts)
/* Init per-BTS NS timers */
bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_NS].tdefs = talloc_memdup(bts, bts_gprs_ns_timer_templates, sizeof(bts_gprs_ns_timer_templates));
OSMO_ASSERT(bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_NS].tdefs);
/* Init per-BTS BSSGP timers */
bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP].tdefs =
talloc_memdup(bts, bts_gprs_bssgp_timer_templates, sizeof(bts_gprs_bssgp_timer_templates));
OSMO_ASSERT(bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP].tdefs);
}
/* Init default values for all per-BTS timer templates */

View File

@ -206,19 +206,20 @@ struct msgb *nanobts_gen_set_nse_attr(struct gsm_bts_sm *bts_sm)
};
msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_CFG, sizeof(ns_cfg), (const uint8_t *)&ns_cfg);
g = &bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP];
osmo_static_assert(ARRAY_SIZE(bts->gprs.cell.timer) == 11, cell_timer_array_wrong_size);
bssgp_cfg = (struct abis_nm_ipacc_att_bssgp_cfg){
.t1_s = bts->gprs.cell.timer[0],
.t1_blocking_retries = bts->gprs.cell.timer[1],
.t1_unblocking_retries = bts->gprs.cell.timer[2],
.t2_s = bts->gprs.cell.timer[3],
.t2_retries = bts->gprs.cell.timer[4],
.t3_100ms = bts->gprs.cell.timer[5],
.t3_retries = bts->gprs.cell.timer[6],
.t4_100ms = bts->gprs.cell.timer[7],
.t4_retries = bts->gprs.cell.timer[8],
.t5_s = bts->gprs.cell.timer[9],
.t5_retries = bts->gprs.cell.timer[10],
.t1_s = osmo_tdef_get(g->tdefs, 1, OSMO_TDEF_S, -1),
.t1_blocking_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T1_BLOCK_RETRIES, OSMO_TDEF_CUSTOM, -1),
.t1_unblocking_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T1_UNBLOCK_RETRIES, OSMO_TDEF_CUSTOM, -1),
.t2_s = osmo_tdef_get(g->tdefs, 2, OSMO_TDEF_S, -1),
.t2_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T2_RESET_RETRIES, OSMO_TDEF_CUSTOM, -1),
.t3_100ms = osmo_tdef_get(g->tdefs, 3, OSMO_TDEF_MS, -1)/100,
.t3_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T3_SUSPEND_RETRIES, OSMO_TDEF_CUSTOM, -1),
.t4_100ms = osmo_tdef_get(g->tdefs, 4, OSMO_TDEF_MS, -1)/100,
.t4_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T4_RESUME_RETRIES, OSMO_TDEF_CUSTOM, -1),
.t5_s = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T5, OSMO_TDEF_S, -1),
.t5_retries = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T5_CAP_UPDATE_RETRIES, OSMO_TDEF_CUSTOM, -1),
};
msgb_tl16v_put(msgb, NM_ATT_IPACC_BSSGP_CFG, sizeof(bssgp_cfg), (const uint8_t *)&bssgp_cfg);

View File

@ -1653,9 +1653,11 @@ DEFUN_ATTR(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
return CMD_SUCCESS;
}
/* If not zero, the tdef will store 'val * factor', where 'val' is the value read from vty (needed for backwards compat. with deprecated commands) */
struct tdef_data {
int tdef_id;
enum osmo_tdef_unit unit;
unsigned int factor;
};
/* Indices here correspond to those in gprs_ns_timer_str. Each row contains information for setting the respective tdef */
@ -1698,6 +1700,21 @@ DEFUN_ATTR_USRATTR(cfg_bts_gprs_ns_timer,
return CMD_SUCCESS;
}
/* Indices here correspond to those in gprs_bssgp_cfg_strs. Each row contains information for setting the respective tdef */
struct tdef_data gprs_bssgp_timer_tdef_data[11] = {
[0] = { .tdef_id = 1, .unit = OSMO_TDEF_S},
[1] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T1_BLOCK_RETRIES, .unit = OSMO_TDEF_CUSTOM },
[2] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T1_UNBLOCK_RETRIES, .unit = OSMO_TDEF_CUSTOM},
[3] = { .tdef_id = 2, .unit = OSMO_TDEF_S},
[4] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T2_RESET_RETRIES, .unit = OSMO_TDEF_CUSTOM},
[5] = { .tdef_id = 3, .unit = OSMO_TDEF_MS, .factor = 100 },
[6] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T3_SUSPEND_RETRIES, .unit = OSMO_TDEF_CUSTOM },
[7] = { .tdef_id = 4, .unit = OSMO_TDEF_MS, .factor = 100 },
[8] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T4_RESUME_RETRIES, .unit = OSMO_TDEF_CUSTOM },
[9] = { .tdef_id = 5, .unit = OSMO_TDEF_S },
[10] = { .tdef_id = GSM_BTS_TDEF_ID_BSSGP_T5_CAP_UPDATE_RETRIES, .unit = OSMO_TDEF_CUSTOM }
};
#define BSSGP_TIMERS "(blocking-timer|blocking-retries|unblocking-retries|reset-timer|reset-retries|suspend-timer|suspend-retries|resume-timer|resume-retries|capability-update-timer|capability-update-retries)"
#define BSSGP_TIMERS_HELP \
"Tbvc-block timeout\n" \
@ -1721,17 +1738,21 @@ DEFUN_USRATTR(cfg_bts_gprs_cell_timer,
BSSGP_TIMERS_HELP "Timer Value\n")
{
struct gsm_bts *bts = vty->index;
int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
/* TODO (BSSGP timer patch): If argument is one of BSSGP Timers strings, then translate to
* tdef index. Otherwise get tdef entry */
int val = atoi(argv[1]);
int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]), val = atoi(argv[1]);
const struct tdef_data *tdef_params;
const struct osmo_tdef_group *bts_bssgp = &bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP];
vty_out(vty, "This command is deprecated; use '%s' instead%s", cfg_gprs_timer_cmd.string, VTY_NEWLINE);
GPRS_CHECK_ENABLED(bts);
if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
if (idx < 0 || idx >= ARRAY_SIZE(gprs_bssgp_timer_tdef_data))
return CMD_WARNING;
tdef_params = &gprs_bssgp_timer_tdef_data[idx];
bts->gprs.cell.timer[idx] = val;
if (osmo_tdef_set(bts_bssgp->tdefs, tdef_params->tdef_id, val * tdef_params->factor ? : 1, tdef_params->unit) < 0)
return CMD_WARNING;
return CMD_SUCCESS;
}

View File

@ -219,7 +219,20 @@ static int pcu_tx_info_ind(struct gsm_bts *bts)
/* Communicating TNS Alive/having it con->tdefs,igurable for backwards compatibility */
info_ind->nse_timer[5] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_TNS_ALIVE, OSMO_TDEF_S, -1);
info_ind->nse_timer[6] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_TNS_ALIVE_RETRIES, OSMO_TDEF_CUSTOM, -1);
memcpy(info_ind->cell_timer, bts->gprs.cell.timer, 11);
/* BSSGP */
g = &bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_BSSGP];
info_ind->cell_timer[0] = osmo_tdef_get(g->tdefs, 1, OSMO_TDEF_S, -1);
info_ind->cell_timer[1] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T1_BLOCK_RETRIES, OSMO_TDEF_CUSTOM, -1);
info_ind->cell_timer[2] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T1_UNBLOCK_RETRIES, OSMO_TDEF_CUSTOM, -1);
info_ind->cell_timer[3] = osmo_tdef_get(g->tdefs, 2, OSMO_TDEF_S, -1);
info_ind->cell_timer[4] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T2_RESET_RETRIES, OSMO_TDEF_CUSTOM, -1);
info_ind->cell_timer[5] = osmo_tdef_get(g->tdefs, 3, OSMO_TDEF_MS, -1);
info_ind->cell_timer[6] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T3_SUSPEND_RETRIES, OSMO_TDEF_CUSTOM, -1);
info_ind->cell_timer[7] = osmo_tdef_get(g->tdefs, 4, OSMO_TDEF_MS, -1);
info_ind->cell_timer[8] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T4_RESUME_RETRIES, OSMO_TDEF_CUSTOM, -1);
info_ind->cell_timer[9] = osmo_tdef_get(g->tdefs, 5, OSMO_TDEF_S, -1);
info_ind->cell_timer[10] = osmo_tdef_get(g->tdefs, GSM_BTS_TDEF_ID_BSSGP_T5_CAP_UPDATE_RETRIES, OSMO_TDEF_CUSTOM, -1);
/* cell attributes */
g = &bts->timer_groups[OSMO_BSC_BTS_TDEF_GROUPS_RLC];

View File

@ -82,6 +82,30 @@ ns: X24 = 3 Reset procedure retries (default: 3, range: [0 .. 255])
ns: X25 = 30 s Tns-test: Periodicity of the NS-VC test procedure (default: 30 s, range: [0 .. 255])
ns: X26 = 3 s Tns-alive: Guards the NS-VC test procedure (default: 3 s, range: [0 .. 255])
ns: X27 = 10 NS-ALIVE-RETRIES: Retries for the the NS-VC test procedure (default: 10, range: [0 .. 255])
bssgp: T1 = 3 s T1 (3GPP TS 48.018): Guards the (un)blocking procedures (default: 3 s, range: [0 .. 255])
bssgp: X41 = 3 Retries for blocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: X42 = 3 Retries for unblocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: T2 = 3 s T2 (3GPP TS 48.018): Guards the reset procedure (default: 3 s, range: [0 .. 255])
bssgp: X43 = 3 Retries for reset procedures guarded by T2 (default: 3, range: [0 .. 255])
bssgp: T3 = 1000 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X44 = 3 Retries for suspend procedures guarded by T3 (default: 3, range: [0 .. 255])
bssgp: T4 = 1000 ms T4 (3GPP TS 48.018): Guards the resume procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X45 = 3 Retries for resume procedures guarded by T4 (default: 3, range: [0 .. 255])
bssgp: T5 = 10 T5 (3GPP TS 48.018): Guards the Radio Access Capability Update procedure (default: 10, range: [0 .. 255])
bssgp: X46 = 3 Retries for capability update procedures guarded by T5 (default: 3, range: [0 .. 255])
OsmoBSC(config-net-bts)# gprs show timer bssgp
bssgp: T1 = 3 s T1 (3GPP TS 48.018): Guards the (un)blocking procedures (default: 3 s, range: [0 .. 255])
bssgp: X41 = 3 Retries for blocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: X42 = 3 Retries for unblocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: T2 = 3 s T2 (3GPP TS 48.018): Guards the reset procedure (default: 3 s, range: [0 .. 255])
bssgp: X43 = 3 Retries for reset procedures guarded by T2 (default: 3, range: [0 .. 255])
bssgp: T3 = 1000 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X44 = 3 Retries for suspend procedures guarded by T3 (default: 3, range: [0 .. 255])
bssgp: T4 = 1000 ms T4 (3GPP TS 48.018): Guards the resume procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X45 = 3 Retries for resume procedures guarded by T4 (default: 3, range: [0 .. 255])
bssgp: T5 = 10 T5 (3GPP TS 48.018): Guards the Radio Access Capability Update procedure (default: 10, range: [0 .. 255])
bssgp: X46 = 3 Retries for capability update procedures guarded by T5 (default: 3, range: [0 .. 255])
OsmoBSC(config-net-bts)# gprs show timer rlc X3101
rlc: X3101 = 10 N3101: Maximum USFs without response from the MS (default: 10, range: [9 .. 255])
@ -107,6 +131,17 @@ ns: X24 = 3 Reset procedure retries (default: 3, range: [0 .. 255])
ns: X25 = 30 s Tns-test: Periodicity of the NS-VC test procedure (default: 30 s, range: [0 .. 255])
ns: X26 = 3 s Tns-alive: Guards the NS-VC test procedure (default: 3 s, range: [0 .. 255])
ns: X27 = 10 NS-ALIVE-RETRIES: Retries for the the NS-VC test procedure (default: 10, range: [0 .. 255])
bssgp: T1 = 3 s T1 (3GPP TS 48.018): Guards the (un)blocking procedures (default: 3 s, range: [0 .. 255])
bssgp: X41 = 3 Retries for blocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: X42 = 3 Retries for unblocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: T2 = 3 s T2 (3GPP TS 48.018): Guards the reset procedure (default: 3 s, range: [0 .. 255])
bssgp: X43 = 3 Retries for reset procedures guarded by T2 (default: 3, range: [0 .. 255])
bssgp: T3 = 1000 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X44 = 3 Retries for suspend procedures guarded by T3 (default: 3, range: [0 .. 255])
bssgp: T4 = 1000 ms T4 (3GPP TS 48.018): Guards the resume procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X45 = 3 Retries for resume procedures guarded by T4 (default: 3, range: [0 .. 255])
bssgp: T5 = 10 T5 (3GPP TS 48.018): Guards the Radio Access Capability Update procedure (default: 10, range: [0 .. 255])
bssgp: X46 = 3 Retries for capability update procedures guarded by T5 (default: 3, range: [0 .. 255])
OsmoBSC(config-net-bts)# gprs timer ns
ns: X21 = 3 s Tns-block: Guards the blocking and unblocking procedures (default: 3 s, range: [0 .. 255])
@ -156,6 +191,31 @@ OsmoBSC(config-net-bts)# gprs timer ns X21 19
OsmoBSC(config-net-bts)# gprs timer ns X21
ns: X21 = 19 s Tns-block: Guards the blocking and unblocking procedures (default: 3 s, range: [0 .. 255])
OsmoBSC(config-net-bts)# gprs timer bssgp X46 31
OsmoBSC(config-net-bts)# gprs timer bssgp X46
bssgp: X46 = 31 Retries for capability update procedures guarded by T5 (default: 3, range: [0 .. 255])
OsmoBSC(config-net-bts)# gprs timer bssgp
bssgp: T1 = 3 s T1 (3GPP TS 48.018): Guards the (un)blocking procedures (default: 3 s, range: [0 .. 255])
bssgp: X41 = 3 Retries for blocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: X42 = 3 Retries for unblocking procedures guarded by T1 (default: 3, range: [0 .. 255])
bssgp: T2 = 3 s T2 (3GPP TS 48.018): Guards the reset procedure (default: 3 s, range: [0 .. 255])
bssgp: X43 = 3 Retries for reset procedures guarded by T2 (default: 3, range: [0 .. 255])
bssgp: T3 = 1000 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X44 = 3 Retries for suspend procedures guarded by T3 (default: 3, range: [0 .. 255])
bssgp: T4 = 1000 ms T4 (3GPP TS 48.018): Guards the resume procedure (default: 1000 ms, range: [0 .. 25500])
bssgp: X45 = 3 Retries for resume procedures guarded by T4 (default: 3, range: [0 .. 255])
bssgp: T5 = 10 T5 (3GPP TS 48.018): Guards the Radio Access Capability Update procedure (default: 10, range: [0 .. 255])
bssgp: X46 = 31 Retries for capability update procedures guarded by T5 (default: 3, range: [0 .. 255])
OsmoBSC(config-net-bts)# ### Test legacy compatibility (unit conversion)
OsmoBSC(config-net-bts)# gprs mode gprs
OsmoBSC(config-net-bts)# gprs cell timer suspend-timer 255
This command is deprecated; use 'gprs timer [(rlc|ns|bssgp)] [TNNNN] [(<0-2147483647>|default)]' instead
OsmoBSC(config-net-bts)# gprs timer bssgp T3
bssgp: T3 = 25500 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])
OsmoBSC(config-net-bts)# exit
OsmoBSC(config-net)# exit
OsmoBSC(config)# exit
OsmoBSC(config-net)# bts 0
OsmoBSC(config-net-bts)# gprs timer bssgp T3 25500
OsmoBSC(config-net-bts)# gprs timer bssgp T3
bssgp: T3 = 25500 ms T3 (3GPP TS 48.018): Guards the suspend procedure (default: 1000 ms, range: [0 .. 25500])