diff --git a/doc/lchan.msc b/doc/lchan.msc index 9962c77a7..af9a59b52 100644 --- a/doc/lchan.msc +++ b/doc/lchan.msc @@ -189,7 +189,7 @@ msc { 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 5e2ceae69..90ab8eae7 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -894,6 +894,8 @@ struct gsm_bts_rejected { 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 b6ea59f48..63e54ba38 100644 --- a/src/osmo-bsc/bsc_subscr_conn_fsm.c +++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c @@ -90,8 +90,8 @@ static const struct value_string gscon_fsm_event_names[] = { }; 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 @@ static void gscon_fsm_init(struct osmo_fsm_inst *fi, uint32_t event, void *data) } 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 @@ static void gscon_fsm_wait_cc(struct osmo_fsm_inst *fi, uint32_t event, void *da 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 @@ void gscon_lchan_releasing(struct gsm_subscriber_connection *conn, struct gsm_lc 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 @@ static void gscon_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *d 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 @@ static int gscon_timer_cb(struct osmo_fsm_inst *fi) 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 @@ static int gscon_timer_cb(struct osmo_fsm_inst *fi) * 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 32f6cc224..b3ea01f50 100644 --- a/src/osmo-bsc/bsc_vty.c +++ b/src/osmo-bsc/bsc_vty.c @@ -1148,7 +1148,8 @@ static int config_write_net(struct vty *vty) 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 @@ DEFUN(cfg_net_meas_feed_scenario, cfg_net_meas_feed_scenario_cmd, 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 @@ int bsc_vty_init(struct gsm_network *network) 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 5f413efbb..15f49842c 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -216,7 +216,7 @@ struct osmo_tdef_state_timeout lchan_fsm_timeouts[32] = { [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 87b4d0b73..4b79712ce 100644 --- a/src/osmo-bsc/net_init.c +++ b/src/osmo-bsc/net_init.c @@ -37,7 +37,6 @@ static struct osmo_tdef gsm_network_T_defs[] = { { .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 @@ static struct osmo_tdef gsm_network_T_defs[] = { { .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 05fccf1df..fe2d2d8fc 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 default 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)