Change in libosmocore[master]: represent negative T-timers as Osmocom-specific X-timers

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Wed Mar 6 05:58:01 UTC 2019


Neels Hofmeyr has submitted this change and it was merged. ( https://gerrit.osmocom.org/12988 )

Change subject: represent negative T-timers as Osmocom-specific X-timers
......................................................................

represent negative T-timers as Osmocom-specific X-timers

fi->T values are int, i.e. can be negative. Do not log them as unsigned, but
define a distinct timer class "Xnnnn" for negative T values: i.e. for T == -1,
print "Timeout of X1" instead of "Timeout of T4294967295".

The negative T timer number space is useful to distinguish freely invented
timers from proper 3GPP defined T numbers. So far I was using numbers like
T993210 or T9999 for invented T, but X1, X2 etc. is a better solution. This way
we can make sure to not accidentally define an invented timer number that
actually collides with a proper 3GPP specified timer number that the author was
not aware of at the time of writing.

Add OSMO_T_FMT and OSMO_T_FMT_ARGS() macros as standardized timer number print
format. Use that in fsm.c, tdef_vty.c, and adjust vty tests accordingly.

Mention the two timer classes in various API docs and VTY online-docs.

Change-Id: I3a59457623da9309fbbda235fe18fadd1636bff6
---
M include/osmocom/core/fsm.h
M include/osmocom/core/tdef.h
M include/osmocom/vty/tdef_vty.h
M src/fsm.c
M src/vty/tdef_vty.c
M tests/tdef/tdef_vty_test_config_root.vty
M tests/tdef/tdef_vty_test_config_subnode.vty
7 files changed, 111 insertions(+), 52 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h
index ae1c857..13bfb33 100644
--- a/include/osmocom/core/fsm.h
+++ b/include/osmocom/core/fsm.h
@@ -194,6 +194,9 @@
 			    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 92b7159..c8d9053 100644
--- a/include/osmocom/core/tdef.h
+++ b/include/osmocom/core/tdef.h
@@ -54,6 +54,7 @@
  *                 { .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 @@
  * 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 @@
 /*! 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 f55239a..16d9498 100644
--- a/include/osmocom/vty/tdef_vty.h
+++ b/include/osmocom/vty/tdef_vty.h
@@ -35,7 +35,9 @@
 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 eb457a1..4876c04 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -108,8 +108,8 @@
 /*! 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 @@
 {
 	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 @@
 
 	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 @@
  *  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 @@
  *  \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 1c6af70..04c14b9 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 *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 @@
 	}
 
 	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 @@
 	}
 	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 @@
 			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 de2d48f..e7c96ca 100644
--- a/tests/tdef/tdef_vty_test_config_root.vty
+++ b/tests/tdef/tdef_vty_test_config_root.vty
@@ -9,7 +9,7 @@
   [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: 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: 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 @@
   [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: 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 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: 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: 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
 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: 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 @@
 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: 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: 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 50e5f59..2605f71 100644
--- a/tests/tdef/tdef_vty_test_config_subnode.vty
+++ b/tests/tdef/tdef_vty_test_config_subnode.vty
@@ -4,7 +4,7 @@
 ... !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 @@
 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 @@
 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 @@
 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 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 X23 42
+tdef_vty_test(config-net)# timer X23
+X23 = 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 -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 @@
 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

-- 
To view, visit https://gerrit.osmocom.org/12988
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I3a59457623da9309fbbda235fe18fadd1636bff6
Gerrit-Change-Number: 12988
Gerrit-PatchSet: 6
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder (1000002)
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Vadim Yanitskiy <axilirator at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190306/8d779ff9/attachment.html>


More information about the gerrit-log mailing list