clean up timer definitions: introduce groups, move some T to X

Backwards compatibly, introduce timer groups in OsmoBSC, and move some
non-specified T timers to new X timers:

T993111 -> X3111
T993210 -> X3210
T999 -> X4

Why X4? because there already is an X3 used elsewhere in Osmocom, and I find
it less confusing if X-numbers don't repeat across programs. See
https://osmocom.org/projects/cellular-infrastructure/wiki/List_of_Timer_numbers

Drop unused timers from g_mgw_tdefs. Only X2427 has an actual effect.
(libosmo-mgcp-client recently moved T2427001 to X2427.)

Put libosmo-mgcp-client related timers to the 'mgw' group, like in osmo-msc.
This makes the MGCP timeout configurable for the first time.

Keep previous timer commands as DEFUN_HIDDEN, and also translate the moved T
timers to X timers on-the-fly. All previous VTY commands still work, and new
'timer [(net|mgw)] ...' commands are added. timer.vty shows this.

Remove the "_OPTIONAL" from the legacy "timer" and "show timer" commands, so
that they don't ambiguously overload the new "timer [(net|mgw)] ..." commands.

Related: OS#4539
Related: If097f52701fd81f29bcca1d252f4fb4fca8a04f7 (osmo-mgw)
Change-Id: I4beec47502afa193dee343869c4be55dc6a4b536
diff --git a/doc/lchan.msc b/doc/lchan.msc
index 9962c77..af9a59b 100644
--- a/doc/lchan.msc
+++ b/doc/lchan.msc
@@ -189,7 +189,7 @@
 	ms => lchan [label="RSL RF Channel Release Ack"];
 	|||;
 	--- [label="IF release_in_error"];
-	lchan abox lchan [label="LCHAN_ST_WAIT_\nAFTER_ERROR\n(timeout: T3111+2 s, T993111)"];
+	lchan abox lchan [label="LCHAN_ST_WAIT_\nAFTER_ERROR\n(timeout: T3111+2 s, X3111)"];
 	...;
 	lchan box lchan [label="timer expires"];
 	--- [label="END: release_in_error"];
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 5e2ceae..90ab8ea 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -894,6 +894,8 @@
 	time_t time;
 };
 
+extern struct osmo_tdef_group bsc_tdef_group[];
+
 struct gsm_network *gsm_network_init(void *ctx);
 
 struct gsm_bts *gsm_bts_num(const struct gsm_network *net, int num);
diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c
index b6ea59f..63e54ba 100644
--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c
+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c
@@ -90,8 +90,8 @@
 };
 
 struct osmo_tdef_state_timeout conn_fsm_timeouts[32] = {
-	[ST_WAIT_CC] = { .T = 993210 },
-	[ST_CLEARING] = { .T = 999 },
+	[ST_WAIT_CC] = { .T = -3210 },
+	[ST_CLEARING] = { .T = -4 },
 };
 
 /* Transition to a state, using the T timer defined in conn_fsm_timeouts.
@@ -330,7 +330,7 @@
 		}
 		gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);
 		if (conn->fi->state != ST_CLEARING)
-			osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, 999);
+			osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, -4);
 		return;
 	default:
 		OSMO_ASSERT(false);
@@ -350,7 +350,7 @@
 			   confirmed connection, then instead simply drop the connection */
 			LOGPFSML(fi, LOGL_INFO,
 				 "Connection confirmed but lchan was dropped previously, clearing conn\n");
-			osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, 999);
+			osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, -4);
 			gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);
 			break;
 		}
@@ -692,7 +692,7 @@
 			break;
 		default:
 			/* Ensure that the FSM is in ST_CLEARING. */
-			osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, 999);
+			osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, -4);
 			/* fall thru, omit an error log if already in ST_CLEARING */
 		case ST_CLEARING:
 			/* Request a Clear Command from the MSC. */
@@ -782,7 +782,7 @@
 			conn->lchan->release.is_csfb = ccd->is_csfb;
 		/* MSC tells us to cleanly shut down */
 		if (conn->fi->state != ST_CLEARING)
-			osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, 999);
+			osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, -4);
 		LOGPFSML(fi, LOGL_DEBUG, "Releasing all lchans (if any) after BSSMAP Clear Command\n");
 		gscon_release_lchans(conn, true, bsc_gsm48_rr_cause_from_gsm0808_cause(ccd->cause_0808));
 		/* FIXME: Release all terestrial resources in ST_CLEARING */
@@ -890,7 +890,7 @@
 	struct gsm_subscriber_connection *conn = fi->priv;
 
 	switch (fi->T) {
-	case 993210:
+	case -3210:
 		gscon_release_lchan(conn, conn->lchan, true, true, GSM48_RR_CAUSE_ABNORMAL_TIMER);
 
 		/* MSC has not responded/confirmed connection with CC, this
@@ -904,7 +904,7 @@
 		 * gscon_cleanup() above) */
 		osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REGULAR, NULL);
 		break;
-	case 999:
+	case -4:
 		/* The MSC has sent a BSSMAP Clear Command, we acknowledged that, but the conn was never
 		 * disconnected. */
 		LOGPFSML(fi, LOGL_ERROR, "Long after a BSSMAP Clear Command, the conn is still not"
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 32f6cc2..b3ea01f 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -1148,7 +1148,8 @@
 				gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
 	}
 
-	osmo_tdef_vty_write(vty, gsmnet->T_defs, " timer ");
+	/* Timer introspection commands (generic osmo_tdef API) */
+	osmo_tdef_vty_groups_write(vty, " ");
 
 	{
 		uint16_t meas_port;
@@ -5583,26 +5584,49 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(show_timer, show_timer_cmd,
-      "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
+static void legacy_timers(struct vty *vty, const char **T_arg)
+{
+	if (!strcmp((*T_arg), "T993111") || !strcmp((*T_arg), "t993111")) {
+		vty_out(vty, "%% Legacy: timer T993111 is now X3111%s", VTY_NEWLINE);
+		(*T_arg) = "X3111";
+	} else if (!strcmp((*T_arg), "T993210") || !strcmp((*T_arg), "t993210")) {
+		vty_out(vty, "%% Legacy: timer T993210 is now X3210%s", VTY_NEWLINE);
+		(*T_arg) = "X3210";
+	} else if (!strcmp((*T_arg), "T999") || !strcmp((*T_arg), "t999")) {
+		vty_out(vty, "%% Legacy: timer T999 is now X4%s", VTY_NEWLINE);
+		(*T_arg) = "X4";
+	}
+}
+
+/* LEGACY TIMER COMMAND. The proper commands are added by osmo_tdef_vty_groups_init(), using explicit timer group
+ * naming. The old groupless timer command accesses the 'net' group only, but is still available. */
+DEFUN_HIDDEN(show_timer, show_timer_cmd,
+      "show timer " OSMO_TDEF_VTY_ARG_T,
       SHOW_STR "Show timers\n"
       OSMO_TDEF_VTY_DOC_T)
 {
 	struct gsm_network *net = gsmnet_from_vty(vty);
-	const char *T_arg = argc > 0 ? argv[0] : NULL;
+	const char *T_arg = argv[0];
+	if (T_arg)
+		legacy_timers(vty, &T_arg);
 	return osmo_tdef_vty_show_cmd(vty, net->T_defs, T_arg, NULL);
 }
 
-DEFUN(cfg_net_timer, cfg_net_timer_cmd,
-      "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
+/* LEGACY TIMER COMMAND. The proper commands are added by osmo_tdef_vty_groups_init(), using explicit timer group
+ * naming. The old groupless timer command accesses the 'net' group only, but is still available. */
+DEFUN_HIDDEN(cfg_net_timer, cfg_net_timer_cmd,
+      "timer " OSMO_TDEF_VTY_ARG_T " " OSMO_TDEF_VTY_ARG_VAL_OPTIONAL,
       "Configure or show timers\n"
       OSMO_TDEF_VTY_DOC_SET)
 {
 	struct gsm_network *net = gsmnet_from_vty(vty);
+	const char *mod_argv[argc];
+	memcpy(mod_argv, argv, sizeof(mod_argv));
+	legacy_timers(vty, &mod_argv[0]);
 	/* If any arguments are missing, redirect to 'show' */
 	if (argc < 2)
-		return show_timer(self, vty, argc, argv);
-	return osmo_tdef_vty_set_cmd(vty, net->T_defs, argv);
+		return show_timer(self, vty, argc, mod_argv);
+	return osmo_tdef_vty_set_cmd(vty, net->T_defs, mod_argv);
 }
 
 DEFUN(cfg_net_allow_unusable_timeslots, cfg_net_allow_unusable_timeslots_cmd,
@@ -6563,6 +6587,9 @@
 	install_element(GSMNET_NODE, &cfg_net_timer_cmd);
 	install_element(GSMNET_NODE, &cfg_net_allow_unusable_timeslots_cmd);
 
+	/* Timer configuration commands (generic osmo_tdef API) */
+	osmo_tdef_vty_groups_init(GSMNET_NODE, bsc_tdef_group);
+
 	install_element_ve(&bsc_show_net_cmd);
 	install_element_ve(&show_bts_cmd);
 	install_element_ve(&show_bts_fail_rep_cmd);
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index 5f413ef..15f4984 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -216,7 +216,7 @@
 	[LCHAN_ST_WAIT_RLL_RTP_RELEASED]	= { .T=3109 },
 	[LCHAN_ST_WAIT_BEFORE_RF_RELEASE]	= { .T=3111 },
 	[LCHAN_ST_WAIT_RF_RELEASE_ACK]	= { .T=3111 },
-	[LCHAN_ST_WAIT_AFTER_ERROR]	= { .T=993111 },
+	[LCHAN_ST_WAIT_AFTER_ERROR]	= { .T=-3111 },
 };
 
 /* Transition to a state, using the T timer defined in lchan_fsm_timeouts.
diff --git a/src/osmo-bsc/net_init.c b/src/osmo-bsc/net_init.c
index 87b4d0b..4b79712 100644
--- a/src/osmo-bsc/net_init.c
+++ b/src/osmo-bsc/net_init.c
@@ -37,7 +37,6 @@
 	{ .T=3107, .default_val=5, .desc="(unused)" },
 	{ .T=3109, .default_val=5, .desc="RSL SACCH deactivation" },
 	{ .T=3111, .default_val=2, .desc="Wait time before RSL RF Channel Release" },
-	{ .T=993111, .default_val=4, .desc="Wait time after lchan was released in error (should be T3111 + 2s)" },
 	{ .T=3113, .default_val=7, .desc="Paging"},
 	{ .T=3115, .default_val=10, .desc="(unused)" },
 	{ .T=3117, .default_val=10, .desc="(unused)" },
@@ -46,14 +45,20 @@
 	{ .T=3141, .default_val=10, .desc="(unused)" },
 	{ .T=3212, .default_val=5, .unit=OSMO_TDEF_CUSTOM,
 		.desc="Periodic Location Update timer, sent to MS (1 = 6 minutes)" },
-	{ .T=993210, .default_val=20, .desc="After L3 Complete, wait for MSC to confirm" },
-	{ .T=999, .default_val=60, .desc="After Clear Request, wait for MSC to Clear Command (sanity)" },
+	{ .T=-4, .default_val=60, .desc="After Clear Request, wait for MSC to Clear Command (sanity)" },
+	{ .T=-3111, .default_val=4, .desc="Wait time after lchan was released in error (should be T3111 + 2s)" },
+	{ .T=-3210, .default_val=20, .desc="After L3 Complete, wait for MSC to confirm" },
 	{}
 };
 
 struct osmo_tdef g_mgw_tdefs[] = {
-	{ .T=-1, .default_val=4, .desc="MGCP response timeout" },
-	{ .T=-2, .default_val=30, .desc="RTP stream establishing timeout" },
+	{ .T=-2427, .default_val=5, .desc="timeout for MGCP response from MGW" },
+	{}
+};
+
+struct osmo_tdef_group bsc_tdef_group[] = {
+	{ .name = "net", .tdefs = gsm_network_T_defs, .desc = "GSM network" },
+	{ .name = "mgw", .tdefs = g_mgw_tdefs, .desc = "MGW (Media Gateway) interface" },
 	{}
 };
 
diff --git a/tests/timer.vty b/tests/timer.vty
index 05fccf1..fe2d2d8 100644
--- a/tests/timer.vty
+++ b/tests/timer.vty
@@ -1,62 +1,68 @@
 OsmoBSC> enable
 
 OsmoBSC# show timer
-T7 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Required to HO Command timeout (default: 10 s)
-T8 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Command to final Clear timeout (default: 10 s)
-T10 = 6 s	RR Assignment (default: 6 s)
-T101 = 10 s	inter-BSC/MSC Handover incoming, BSSMAP HO Request to HO Accept (default: 10 s)
-T3101 = 3 s	RR Immediate Assignment (default: 3 s)
-T3103 = 5 s	Handover (default: 5 s)
-T3105 = 100 ms	Physical Information (default: 100 ms)
-T3107 = 5 s	(unused) (default: 5 s)
-T3109 = 5 s	RSL SACCH deactivation (default: 5 s)
-T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
-T993111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
-T3113 = 7 s	Paging (default: 7 s)
-T3115 = 10 s	(unused) (default: 10 s)
-T3117 = 10 s	(unused) (default: 10 s)
-T3119 = 10 s	(unused) (default: 10 s)
-T3122 = 10 s	Wait time after RR Immediate Assignment Reject (default: 10 s)
-T3141 = 10 s	(unused) (default: 10 s)
-T3212 = 5	Periodic Location Update timer, sent to MS (1 = 6 minutes) (default: 5)
-T993210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
-T999 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+net: T7 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Required to HO Command timeout (default: 10 s)
+net: T8 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Command to final Clear timeout (default: 10 s)
+net: T10 = 6 s	RR Assignment (default: 6 s)
+net: T101 = 10 s	inter-BSC/MSC Handover incoming, BSSMAP HO Request to HO Accept (default: 10 s)
+net: T3101 = 3 s	RR Immediate Assignment (default: 3 s)
+net: T3103 = 5 s	Handover (default: 5 s)
+net: T3105 = 100 ms	Physical Information (default: 100 ms)
+net: T3107 = 5 s	(unused) (default: 5 s)
+net: T3109 = 5 s	RSL SACCH deactivation (default: 5 s)
+net: T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
+net: T3113 = 7 s	Paging (default: 7 s)
+net: T3115 = 10 s	(unused) (default: 10 s)
+net: T3117 = 10 s	(unused) (default: 10 s)
+net: T3119 = 10 s	(unused) (default: 10 s)
+net: T3122 = 10 s	Wait time after RR Immediate Assignment Reject (default: 10 s)
+net: T3141 = 10 s	(unused) (default: 10 s)
+net: T3212 = 5	Periodic Location Update timer, sent to MS (1 = 6 minutes) (default: 5)
+net: X4 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+net: X3111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 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)
 
 OsmoBSC# show timer T3111
 T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
 
 OsmoBSC# # specifically test legacy timers that are moved to X timers
 OsmoBSC# show timer T993111
-T993111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
+% Legacy: timer T993111 is now X3111
+X3111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
 OsmoBSC# show timer T993210
-T993210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
+% Legacy: timer T993210 is now X3210
+X3210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
 OsmoBSC# show timer T999
-T999 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+% Legacy: timer T999 is now X4
+X4 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
 
 OsmoBSC# configure terminal
 OsmoBSC(config)# network
 OsmoBSC(config-net)# timer
-T7 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Required to HO Command timeout (default: 10 s)
-T8 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Command to final Clear timeout (default: 10 s)
-T10 = 6 s	RR Assignment (default: 6 s)
-T101 = 10 s	inter-BSC/MSC Handover incoming, BSSMAP HO Request to HO Accept (default: 10 s)
-T3101 = 3 s	RR Immediate Assignment (default: 3 s)
-T3103 = 5 s	Handover (default: 5 s)
-T3105 = 100 ms	Physical Information (default: 100 ms)
-T3107 = 5 s	(unused) (default: 5 s)
-T3109 = 5 s	RSL SACCH deactivation (default: 5 s)
-T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
-T993111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
-T3113 = 7 s	Paging (default: 7 s)
-T3115 = 10 s	(unused) (default: 10 s)
-T3117 = 10 s	(unused) (default: 10 s)
-T3119 = 10 s	(unused) (default: 10 s)
-T3122 = 10 s	Wait time after RR Immediate Assignment Reject (default: 10 s)
-T3141 = 10 s	(unused) (default: 10 s)
-T3212 = 5	Periodic Location Update timer, sent to MS (1 = 6 minutes) (default: 5)
-T993210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
-T999 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+net: T7 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Required to HO Command timeout (default: 10 s)
+net: T8 = 10 s	inter-BSC/MSC Handover outgoing, BSSMAP HO Command to final Clear timeout (default: 10 s)
+net: T10 = 6 s	RR Assignment (default: 6 s)
+net: T101 = 10 s	inter-BSC/MSC Handover incoming, BSSMAP HO Request to HO Accept (default: 10 s)
+net: T3101 = 3 s	RR Immediate Assignment (default: 3 s)
+net: T3103 = 5 s	Handover (default: 5 s)
+net: T3105 = 100 ms	Physical Information (default: 100 ms)
+net: T3107 = 5 s	(unused) (default: 5 s)
+net: T3109 = 5 s	RSL SACCH deactivation (default: 5 s)
+net: T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
+net: T3113 = 7 s	Paging (default: 7 s)
+net: T3115 = 10 s	(unused) (default: 10 s)
+net: T3117 = 10 s	(unused) (default: 10 s)
+net: T3119 = 10 s	(unused) (default: 10 s)
+net: T3122 = 10 s	Wait time after RR Immediate Assignment Reject (default: 10 s)
+net: T3141 = 10 s	(unused) (default: 10 s)
+net: T3212 = 5	Periodic Location Update timer, sent to MS (1 = 6 minutes) (default: 5)
+net: X4 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+net: X3111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 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)
 
+OsmoBSC(config-net)# # Using the legacy 'timer Txxx' still works:
 OsmoBSC(config-net)# timer T3111
 T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
 OsmoBSC(config-net)# timer T3111 23
@@ -66,30 +72,65 @@
 OsmoBSC(config-net)# timer T3111
 T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
 
+OsmoBSC(config-net)# # Using the new timer group commands also works:
+OsmoBSC(config-net)# timer net T3111
+net: T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
+OsmoBSC(config-net)# timer net T3111 42
+OsmoBSC(config-net)# timer net T3111
+net: T3111 = 42 s	Wait time before RSL RF Channel Release (default: 2 s)
+OsmoBSC(config-net)# timer net T3111 default
+OsmoBSC(config-net)# timer net T3111
+net: T3111 = 2 s	Wait time before RSL RF Channel Release (default: 2 s)
+OsmoBSC(config-net)# timer mgw
+mgw: X2427 = 5 s	timeout for MGCP response from MGW (default: 5 s)
+OsmoBSC(config-net)# timer mgw X2427
+mgw: X2427 = 5 s	timeout for MGCP response from MGW (default: 5 s)
+OsmoBSC(config-net)# timer mgw X2427 42
+OsmoBSC(config-net)# timer mgw X2427
+mgw: X2427 = 42 s	timeout for MGCP response from MGW (default: 5 s)
+OsmoBSC(config-net)# timer mgw X2427 default
+OsmoBSC(config-net)# timer mgw X2427
+mgw: X2427 = 5 s	timeout for MGCP response from MGW (default: 5 s)
+
 OsmoBSC(config-net)# # specifically test legacy timers that are moved to X timers
 OsmoBSC(config-net)# timer T993111
-T993111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
+% Legacy: timer T993111 is now X3111
+X3111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
 OsmoBSC(config-net)# timer T993111 1
+% Legacy: timer T993111 is now X3111
 OsmoBSC(config-net)# timer T993111
-T993111 = 1 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
+% Legacy: timer T993111 is now X3111
+X3111 = 1 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
 OsmoBSC(config-net)# timer T993111 default
+% Legacy: timer T993111 is now X3111
 OsmoBSC(config-net)# timer T993111
-T993111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
+% Legacy: timer T993111 is now X3111
+X3111 = 4 s	Wait time after lchan was released in error (should be T3111 + 2s) (default: 4 s)
 
 OsmoBSC(config-net)# timer T993210
-T993210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
+% Legacy: timer T993210 is now X3210
+X3210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
 OsmoBSC(config-net)# timer T993210 2
+% Legacy: timer T993210 is now X3210
 OsmoBSC(config-net)# timer T993210
-T993210 = 2 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
+% Legacy: timer T993210 is now X3210
+X3210 = 2 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
 OsmoBSC(config-net)# timer T993210 default
+% Legacy: timer T993210 is now X3210
 OsmoBSC(config-net)# timer T993210
-T993210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
+% Legacy: timer T993210 is now X3210
+X3210 = 20 s	After L3 Complete, wait for MSC to confirm (default: 20 s)
 
 OsmoBSC(config-net)# timer T999
-T999 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+% Legacy: timer T999 is now X4
+X4 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
 OsmoBSC(config-net)# timer T999 3
+% Legacy: timer T999 is now X4
 OsmoBSC(config-net)# timer T999
-T999 = 3 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+% Legacy: timer T999 is now X4
+X4 = 3 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
 OsmoBSC(config-net)# timer T999 default
+% Legacy: timer T999 is now X4
 OsmoBSC(config-net)# timer T999
-T999 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)
+% Legacy: timer T999 is now X4
+X4 = 60 s	After Clear Request, wait for MSC to Clear Command (sanity) (default: 60 s)