summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/fsm.h3
-rw-r--r--include/osmocom/core/tdef.h11
-rw-r--r--include/osmocom/vty/tdef_vty.h4
-rw-r--r--src/fsm.c24
-rw-r--r--src/vty/tdef_vty.c31
-rw-r--r--tests/tdef/tdef_vty_test_config_root.vty35
-rw-r--r--tests/tdef/tdef_vty_test_config_subnode.vty55
7 files changed, 111 insertions, 52 deletions
diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index ae1c8575..13bfb331 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -194,6 +194,9 @@ void osmo_fsm_log_timeouts(bool log_timeouts);
caller_file, caller_line, \
fmt, ## args)
+#define OSMO_T_FMT "%c%u"
+#define OSMO_T_FMT_ARGS(T) ((T) >= 0 ? 'T' : 'X'), ((T) >= 0 ? T : -T)
+
int osmo_fsm_register(struct osmo_fsm *fsm);
void osmo_fsm_unregister(struct osmo_fsm *fsm);
struct osmo_fsm *osmo_fsm_find_by_name(const char *name);
diff --git a/include/osmocom/core/tdef.h b/include/osmocom/core/tdef.h
index 92b71597..c8d9053d 100644
--- a/include/osmocom/core/tdef.h
+++ b/include/osmocom/core/tdef.h
@@ -54,6 +54,7 @@ static inline const char *osmo_tdef_unit_name(enum osmo_tdef_unit val)
* { .T=10, .default_val=6, .desc="RR Assignment" },
* { .T=101, .default_val=10, .desc="inter-BSC Handover MT, HO Request to HO Accept" },
* { .T=3101, .default_val=3, .desc="RR Immediate Assignment" },
+ * { .T=-23, .default_val=42, .desc="internal X23 timeout (contrived example)" },
* {}
* };
*
@@ -61,8 +62,10 @@ static inline const char *osmo_tdef_unit_name(enum osmo_tdef_unit val)
* configuration sets user-defined values (see osmo_tdef_vty_init()).
*/
struct osmo_tdef {
- /*! T1234 number; type corresponds to struct osmo_fsm_inst.T. Negative and zero T numbers are actually possible,
- * but be aware that osmo_tdef_fsm_inst_state_chg() interprets T == 0 as "no timer". */
+ /*! T1234 or X1234 number, corresponding to struct osmo_fsm_inst::T.
+ * Positive values for T are considered to be 3GPP spec compliant and appear in logging and VTY as "T1234",
+ * while negative values are considered to be Osmocom specific timers, represented in logging and VTY as
+ * "X1234". Be aware that osmo_tdef_fsm_inst_state_chg() interprets T == 0 as "state without timeout". */
const int T;
/*! Timeout duration (according to unit), default value; type corresponds to osmo_fsm_inst_state_chg()'s
* timeout_secs argument. Note that osmo_fsm_inst_state_chg() clamps the range. */
@@ -98,7 +101,9 @@ struct osmo_tdef *osmo_tdef_get_entry(struct osmo_tdef *tdefs, int T);
/*! Using osmo_tdef for osmo_fsm_inst: array entry for a mapping of state numbers to timeout definitions.
* For a usage example, see osmo_tdef_get_state_timeout() and test_tdef_state_timeout() in tdef_test.c. */
struct osmo_tdef_state_timeout {
- /*! Timer number to match struct osmo_tdef.T, and to pass to osmo_fsm_inst_state_chg(). */
+ /*! Timer number to match struct osmo_tdef.T, and to pass to osmo_fsm_inst_state_chg(). Positive values for T
+ * are considered to be 3GPP spec compliant and appear in logging and VTY as "T1234", while negative values are
+ * considered to be Osmocom specific timers, represented in logging and VTY as "X1234". */
int T;
/*! If true, call osmo_fsm_inst_state_chg_keep_timer().
* If T == 0, keep previous T number, otherwise also set fi->T. */
diff --git a/include/osmocom/vty/tdef_vty.h b/include/osmocom/vty/tdef_vty.h
index f55239ad..16d94981 100644
--- a/include/osmocom/vty/tdef_vty.h
+++ b/include/osmocom/vty/tdef_vty.h
@@ -35,7 +35,9 @@ struct osmo_tdef;
struct osmo_tdef_group;
#define OSMO_TDEF_VTY_ARG_T "TNNNN"
-#define OSMO_TDEF_VTY_DOC_T "T-number, optionally preceded by 't' or 'T'.\n"
+#define OSMO_TDEF_VTY_DOC_T \
+ "T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234';" \
+ " Osmocom-specific timer number of the format: 'X1234' or 'x1234'.\n"
#define OSMO_TDEF_VTY_ARG_T_OPTIONAL "[" OSMO_TDEF_VTY_ARG_T "]"
#define OSMO_TDEF_VTY_ARG_VAL "(<0-2147483647>|default)"
diff --git a/src/fsm.c b/src/fsm.c
index eb457a17..4876c04f 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -108,8 +108,8 @@ void osmo_fsm_log_addr(bool log_addr)
/*! Enable or disable logging of timeout values for FSM instance state changes.
*
* By default, state changes are logged by state name only, omitting the timeout. When passing true, each state change
- * will also log the T number and the chosen timeout in seconds. osmo_fsm_inst_state_chg_keep_timer() will log remaining
- * timeout in millisecond precision.
+ * will also log the T number (or Osmocom-specific X number) and the chosen timeout in seconds.
+ * osmo_fsm_inst_state_chg_keep_timer() will log remaining timeout in millisecond precision.
*
* The default for this is false to reflect legacy behavior. Since various C tests that verify logging output already
* existed prior to this option, keeping timeout logging off makes sure that they continue to pass. Particularly,
@@ -205,9 +205,9 @@ static void fsm_tmr_cb(void *data)
{
struct osmo_fsm_inst *fi = data;
struct osmo_fsm *fsm = fi->fsm;
- uint32_t T = fi->T;
+ int32_t T = fi->T;
- LOGPFSM(fi, "Timeout of T%u\n", fi->T);
+ LOGPFSM(fi, "Timeout of " OSMO_T_FMT "\n", OSMO_T_FMT_ARGS(fi->T));
if (fsm->timer_cb) {
int rc = fsm->timer_cb(fi);
@@ -482,13 +482,13 @@ static int state_chg(struct osmo_fsm_inst *fi, uint32_t new_state,
if (fsm_log_timeouts) {
if (keep_timer && fi->timer.active && (osmo_timer_remaining(&fi->timer, NULL, &remaining) == 0))
- LOGPFSMSRC(fi, file, line, "State change to %s (keeping T%d, %ld.%03lds remaining)\n",
+ LOGPFSMSRC(fi, file, line, "State change to %s (keeping " OSMO_T_FMT ", %ld.%03lds remaining)\n",
osmo_fsm_state_name(fsm, new_state),
- fi->T, remaining.tv_sec, remaining.tv_usec / 1000);
+ OSMO_T_FMT_ARGS(fi->T), remaining.tv_sec, remaining.tv_usec / 1000);
else if (timeout_secs && !keep_timer)
- LOGPFSMSRC(fi, file, line, "State change to %s (T%d, %lus)\n",
+ LOGPFSMSRC(fi, file, line, "State change to %s (" OSMO_T_FMT ", %lus)\n",
osmo_fsm_state_name(fsm, new_state),
- T, timeout_secs);
+ OSMO_T_FMT_ARGS(T), timeout_secs);
else
LOGPFSMSRC(fi, file, line, "State change to %s (no timeout)\n",
osmo_fsm_state_name(fsm, new_state));
@@ -535,6 +535,10 @@ static int state_chg(struct osmo_fsm_inst *fi, uint32_t new_state,
* timer_cb. If passing timeout_secs == 0, it is recommended to also pass T ==
* 0, so that fi->T is reset to 0 when no timeout is invoked.
*
+ * Positive values for T are considered to be 3GPP spec compliant and appear in
+ * logging and VTY as "T1234", while negative values are considered to be
+ * Osmocom specific timers, represented in logging and VTY as "X1234".
+ *
* See also osmo_tdef_fsm_inst_state_chg() from the osmo_tdef API, which
* provides a unified way to configure and apply GSM style Tnnnn timers to FSM
* state transitions.
@@ -549,7 +553,9 @@ static int state_chg(struct osmo_fsm_inst *fi, uint32_t new_state,
* \param[in] fi FSM instance whose state is to change
* \param[in] new_state The new state into which we should change
* \param[in] timeout_secs Timeout in seconds (if !=0), maximum-clamped to 2147483647 seconds.
- * \param[in] T Timer number (if \ref timeout_secs != 0)
+ * \param[in] T Timer number, where positive numbers are considered to be 3GPP spec compliant timer numbers and are
+ * logged as "T1234", while negative numbers are considered Osmocom specific timer numbers logged as
+ * "X1234".
* \param[in] file Calling source file (from osmo_fsm_inst_state_chg macro)
* \param[in] line Calling source line (from osmo_fsm_inst_state_chg macro)
* \returns 0 on success; negative on error
diff --git a/src/vty/tdef_vty.c b/src/vty/tdef_vty.c
index 1c6af70a..04c14b9c 100644
--- a/src/vty/tdef_vty.c
+++ b/src/vty/tdef_vty.c
@@ -31,6 +31,7 @@
#include <osmocom/vty/command.h>
#include <osmocom/vty/tdef_vty.h>
#include <osmocom/core/tdef.h>
+#include <osmocom/core/fsm.h>
/*! \addtogroup Tdef_VTY
*
@@ -40,7 +41,7 @@
* \file tdef_vty.c
*/
-/*! Parse an argument like "T1234", "t1234" or "1234", as from OSMO_TDEF_VTY_ARG_T.
+/*! Parse an argument like "1234", "T1234", "t1234", or "X1234", "x1234", as from OSMO_TDEF_VTY_ARG_T.
* \param[in] vty VTY context for vty_out() of error messages.
* \param[in] tdefs Array of timer definitions to look up T timer.
* \param[in] T_str Argument string. It is not validated, expected to be checked by VTY input.
@@ -53,6 +54,7 @@ struct osmo_tdef *osmo_tdef_vty_parse_T_arg(struct vty *vty, struct osmo_tdef *t
struct osmo_tdef *t;
char *endptr;
const char *T_nr_str;
+ int sign = 1;
if (!tdefs) {
vty_out(vty, "%% Error: no timers found%s", VTY_NEWLINE);
@@ -60,20 +62,31 @@ struct osmo_tdef *osmo_tdef_vty_parse_T_arg(struct vty *vty, struct osmo_tdef *t
}
T_nr_str = T_str;
- if (T_nr_str[0] == 't' || T_nr_str[0] == 'T')
+ if (T_nr_str[0] == 't' || T_nr_str[0] == 'T') {
+ sign = 1;
T_nr_str++;
+ } else if (T_nr_str[0] == 'x' || T_nr_str[0] == 'X') {
+ T_nr_str++;
+ sign = -1;
+ }
+
+ /* Make sure to disallow any characters changing the signedness of the parsed int */
+ if (T_nr_str[0] < '0' || T_nr_str[0] > '9') {
+ vty_out(vty, "%% Invalid T timer argument (should be 'T1234' or 'X1234'): '%s'%s", T_str, VTY_NEWLINE);
+ return NULL;
+ }
errno = 0;
l = strtol(T_nr_str, &endptr, 10);
- if (errno || *endptr || l > INT_MAX) {
- vty_out(vty, "%% No such timer: '%s'%s", T_str, VTY_NEWLINE);
+ if (errno || *endptr || l > INT_MAX || l < 0) {
+ vty_out(vty, "%% Invalid T timer argument (should be 'T1234' or 'X1234'): '%s'%s", T_str, VTY_NEWLINE);
return NULL;
}
- T = l;
+ T = l * sign;
t = osmo_tdef_get_entry(tdefs, T);
if (!t)
- vty_out(vty, "%% No such timer: T%d%s", T, VTY_NEWLINE);
+ vty_out(vty, "%% No such timer: " OSMO_T_FMT "%s", OSMO_T_FMT_ARGS(T), VTY_NEWLINE);
return t;
}
@@ -153,8 +166,8 @@ void osmo_tdef_vty_out_one_va(struct vty *vty, struct osmo_tdef *t, const char *
}
if (prefix_fmt)
vty_out_va(vty, prefix_fmt, va);
- vty_out(vty, "T%d = %lu%s%s\t%s (default: %lu%s%s)%s",
- t->T, t->val,
+ vty_out(vty, OSMO_T_FMT " = %lu%s%s\t%s (default: %lu%s%s)%s",
+ OSMO_T_FMT_ARGS(t->T), t->val,
t->unit == OSMO_TDEF_CUSTOM ? "" : " ", t->unit == OSMO_TDEF_CUSTOM ? "" : osmo_tdef_unit_name(t->unit),
t->desc, t->default_val,
t->unit == OSMO_TDEF_CUSTOM ? "" : " ", t->unit == OSMO_TDEF_CUSTOM ? "" : osmo_tdef_unit_name(t->unit),
@@ -227,7 +240,7 @@ void osmo_tdef_vty_write(struct vty *vty, struct osmo_tdef *tdefs, const char *p
vty_out_va(vty, prefix_fmt, va);
va_end(va);
}
- vty_out(vty, "T%d %lu%s", t->T, t->val, VTY_NEWLINE);
+ vty_out(vty, OSMO_T_FMT " %lu%s", OSMO_T_FMT_ARGS(t->T), t->val, VTY_NEWLINE);
}
}
diff --git a/tests/tdef/tdef_vty_test_config_root.vty b/tests/tdef/tdef_vty_test_config_root.vty
index de2d48f9..e7c96ca3 100644
--- a/tests/tdef/tdef_vty_test_config_root.vty
+++ b/tests/tdef/tdef_vty_test_config_root.vty
@@ -9,7 +9,7 @@ tdef_vty_test> show timer ?
[software] Typical software development cycle
tdef_vty_test> show timer test ?
- [TNNNN] T-number, optionally preceded by 't' or 'T'.
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
tdef_vty_test> show timer
tea: T1 = 50 s Water Boiling Timeout (default: 50 s)
@@ -21,7 +21,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
software: T1 = 30 m Write code (default: 30 m)
software: T2 = 20 ms Hit segfault (default: 20 ms)
software: T3 = 480 m Fix bugs (default: 480 m)
@@ -37,7 +37,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
software: T1 = 30 m Write code (default: 30 m)
software: T2 = 20 ms Hit segfault (default: 20 ms)
software: T3 = 480 m Fix bugs (default: 480 m)
@@ -66,7 +66,7 @@ tdef_vty_test(config)# timer sof T123 ?
[default] Set to default timer value
tdef_vty_test(config)# timer test ?
- [TNNNN] T-number, optionally preceded by 't' or 'T'.
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
tdef_vty_test(config)# timer test t2 ?
[<0-2147483647>] New timer value
@@ -82,7 +82,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
software: T1 = 30 m Write code (default: 30 m)
software: T2 = 20 ms Hit segfault (default: 20 ms)
software: T3 = 480 m Fix bugs (default: 480 m)
@@ -108,8 +108,11 @@ tdef_vty_test(config)# do show timer tea T5
tdef_vty_test(config)# do show timer tea T0
% No such timer: T0
+tdef_vty_test(config)# do show timer tea X123
+% No such timer: X123
+
tdef_vty_test(config)# do show timer tea T-123
-% No such timer: T-123
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123'
tdef_vty_test(config)# do show timer t
tea: T1 = 50 s Water Boiling Timeout (default: 50 s)
@@ -121,7 +124,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test(config)# do show timer te
tea: T1 = 50 s Water Boiling Timeout (default: 50 s)
@@ -133,7 +136,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test(config)# do show timer te T2
tea: T2 = 300 s Tea brewing (default: 300 s)
@@ -152,8 +155,11 @@ tdef_vty_test(config)# timer tea T3 32
tdef_vty_test(config)# timer tea T3
tea: T3 = 32 m Let tea cool down before drinking (default: 5 m)
+tdef_vty_test(config)# timer tea X123 99
+% No such timer: X123
+
tdef_vty_test(config)# timer tea T-123 99
-% No such timer: T-123
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123'
tdef_vty_test(config)# timer tea T0 0
% No such timer: T0
@@ -177,7 +183,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test(config)# timer te T2
tea: T2 = 300 s Tea brewing (default: 300 s)
@@ -209,8 +215,11 @@ software: T1 = 30 m Write code (default: 30 m)
tdef_vty_test(config)# do show timer software T99
% No such timer: T99
+tdef_vty_test(config)# do show timer software X123123
+% No such timer: X123123
+
tdef_vty_test(config)# do show timer software T-123123
-% No such timer: T-123123
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123123'
tdef_vty_test(config)# do show timer software T0
% No such timer: T0
@@ -251,7 +260,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
software: T1 = 13 m Write code (default: 30 m)
software: T2 = 0 ms Hit segfault (default: 20 ms)
software: T3 = 480 m Fix bugs (default: 480 m)
@@ -266,7 +275,7 @@ test: T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
test: T3 = 100 m Testing a hundred minutes (default: 100 m)
test: T4 = 100 Testing a hundred potatoes (default: 100)
test: T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-test: T-23 = 239471 s Negative T number (default: 239471 s)
+test: X23 = 239471 s Negative T number (default: 239471 s)
software: T1 = 13 m Write code (default: 30 m)
software: T2 = 0 ms Hit segfault (default: 20 ms)
software: T3 = 480 m Fix bugs (default: 480 m)
diff --git a/tests/tdef/tdef_vty_test_config_subnode.vty b/tests/tdef/tdef_vty_test_config_subnode.vty
index 50e5f590..2605f71d 100644
--- a/tests/tdef/tdef_vty_test_config_subnode.vty
+++ b/tests/tdef/tdef_vty_test_config_subnode.vty
@@ -4,7 +4,7 @@ tdef_vty_test> list
... !timer
tdef_vty_test> show timer ?
- [TNNNN] T-number, optionally preceded by 't' or 'T'.
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
tdef_vty_test> show timer
T1 = 100 s Testing a hundred seconds (default: 100 s)
@@ -12,7 +12,7 @@ T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
T3 = 100 m Testing a hundred minutes (default: 100 m)
T4 = 100 Testing a hundred potatoes (default: 100)
T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-T-23 = 239471 s Negative T number (default: 239471 s)
+X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test> enable
tdef_vty_test# show timer
@@ -21,7 +21,7 @@ T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
T3 = 100 m Testing a hundred minutes (default: 100 m)
T4 = 100 Testing a hundred potatoes (default: 100)
T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-T-23 = 239471 s Negative T number (default: 239471 s)
+X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test# configure terminal
tdef_vty_test(config)# show running-config
@@ -35,7 +35,7 @@ T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
T3 = 100 m Testing a hundred minutes (default: 100 m)
T4 = 100 Testing a hundred potatoes (default: 100)
T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-T-23 = 239471 s Negative T number (default: 239471 s)
+X23 = 239471 s Negative T number (default: 239471 s)
tdef_vty_test(config-net)# do show timer T3
T3 = 100 m Testing a hundred minutes (default: 100 m)
@@ -73,17 +73,13 @@ tdef_vty_test(config-net)# timer 666
tdef_vty_test(config-net)# timer T666 5
% No such timer: T666
-tdef_vty_test(config-net)# timer T-23 42
-tdef_vty_test(config-net)# timer T-23
-T-23 = 42 s Negative T number (default: 239471 s)
-
-tdef_vty_test(config-net)# timer t-23 43
-tdef_vty_test(config-net)# timer T-23
-T-23 = 43 s Negative T number (default: 239471 s)
+tdef_vty_test(config-net)# timer X23 42
+tdef_vty_test(config-net)# timer X23
+X23 = 42 s Negative T number (default: 239471 s)
-tdef_vty_test(config-net)# timer -23 44
-tdef_vty_test(config-net)# timer T-23
-T-23 = 44 s Negative T number (default: 239471 s)
+tdef_vty_test(config-net)# timer x23 43
+tdef_vty_test(config-net)# timer x23
+X23 = 43 s Negative T number (default: 239471 s)
tdef_vty_test(config-net)# do show timer
T1 = 9012345 s Testing a hundred seconds (default: 100 s)
@@ -91,17 +87,42 @@ T2 = 100 ms Testing a hundred milliseconds (default: 100 ms)
T3 = 100 m Testing a hundred minutes (default: 100 m)
T4 = 100 Testing a hundred potatoes (default: 100)
T2147483647 = 4294967295 m Very large (default: 4294967295 m)
-T-23 = 44 s Negative T number (default: 239471 s)
+X23 = 43 s Negative T number (default: 239471 s)
+
+tdef_vty_test(config-net)# timer T-23 42
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-23'
+tdef_vty_test(config-net)# timer T-23
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-23'
+
+tdef_vty_test(config-net)# timer t-23 42
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 't-23'
+tdef_vty_test(config-net)# timer t-23
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 't-23'
+
+tdef_vty_test(config-net)# timer X-23 42
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'X-23'
+tdef_vty_test(config-net)# timer X-23
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'X-23'
+
+tdef_vty_test(config-net)# timer x-23 42
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'x-23'
+tdef_vty_test(config-net)# timer x-23
+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'x-23'
+
+tdef_vty_test(config-net)# timer -23 42
+% Invalid T timer argument (should be 'T1234' or 'X1234'): '-23'
+tdef_vty_test(config-net)# timer -23
+% Invalid T timer argument (should be 'T1234' or 'X1234'): '-23'
tdef_vty_test(config-net)# show running-config
... !timer
net
timer T1 9012345
- timer T-23 44
+ timer X23 43
... !timer
tdef_vty_test(config-net)# timer T1 default
-tdef_vty_test(config-net)# timer T-23 default
+tdef_vty_test(config-net)# timer X23 default
tdef_vty_test(config-net)# show running-config
... !timer