<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12988">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">represent negative T-timers as Osmocom-specific X-timers<br><br>fi->T values are int, i.e. can be negative. Do not log them as unsigned, but<br>define a distinct timer class "Xnnnn" for negative T values: i.e. for T == -1,<br>print "Timeout of X1" instead of "Timeout of T4294967295".<br><br>The negative T timer number space is useful to distinguish freely invented<br>timers from proper 3GPP defined T numbers. So far I was using numbers like<br>T993210 or T9999 for invented T, but X1, X2 etc. is a better solution. This way<br>we can make sure to not accidentally define an invented timer number that<br>actually collides with a proper 3GPP specified timer number that the author was<br>not aware of at the time of writing.<br><br>Add OSMO_T_FMT and OSMO_T_FMT_ARGS() macros as standardized timer number print<br>format. Use that in fsm.c, tdef_vty.c, and adjust vty tests accordingly.<br><br>Mention the two timer classes in various API docs and VTY online-docs.<br><br>Change-Id: I3a59457623da9309fbbda235fe18fadd1636bff6<br>---<br>M include/osmocom/core/fsm.h<br>M include/osmocom/core/tdef.h<br>M include/osmocom/vty/tdef_vty.h<br>M src/fsm.c<br>M src/vty/tdef_vty.c<br>M tests/tdef/tdef_vty_test_config_root.vty<br>M tests/tdef/tdef_vty_test_config_subnode.vty<br>7 files changed, 111 insertions(+), 52 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/fsm.h b/include/osmocom/core/fsm.h</span><br><span>index ae1c857..13bfb33 100644</span><br><span>--- a/include/osmocom/core/fsm.h</span><br><span>+++ b/include/osmocom/core/fsm.h</span><br><span>@@ -194,6 +194,9 @@</span><br><span>                      caller_file, caller_line, \</span><br><span>                          fmt, ## args)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_T_FMT "%c%u"</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_T_FMT_ARGS(T) ((T) >= 0 ? 'T' : 'X'), ((T) >= 0 ? T : -T)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osmo_fsm_register(struct osmo_fsm *fsm);</span><br><span> void osmo_fsm_unregister(struct osmo_fsm *fsm);</span><br><span> struct osmo_fsm *osmo_fsm_find_by_name(const char *name);</span><br><span>diff --git a/include/osmocom/core/tdef.h b/include/osmocom/core/tdef.h</span><br><span>index 92b7159..c8d9053 100644</span><br><span>--- a/include/osmocom/core/tdef.h</span><br><span>+++ b/include/osmocom/core/tdef.h</span><br><span>@@ -54,6 +54,7 @@</span><br><span>  *                 { .T=10, .default_val=6, .desc="RR Assignment" },</span><br><span>  *                 { .T=101, .default_val=10, .desc="inter-BSC Handover MT, HO Request to HO Accept" },</span><br><span>  *                 { .T=3101, .default_val=3, .desc="RR Immediate Assignment" },</span><br><span style="color: hsl(120, 100%, 40%);">+ *                 { .T=-23, .default_val=42, .desc="internal X23 timeout (contrived example)" },</span><br><span>  *                 {}</span><br><span>  *         };</span><br><span>  *</span><br><span>@@ -61,8 +62,10 @@</span><br><span>  * configuration sets user-defined values (see osmo_tdef_vty_init()).</span><br><span>  */</span><br><span> struct osmo_tdef {</span><br><span style="color: hsl(0, 100%, 40%);">-    /*! T1234 number; type corresponds to struct osmo_fsm_inst.T. Negative and zero T numbers are actually possible,</span><br><span style="color: hsl(0, 100%, 40%);">-         * but be aware that osmo_tdef_fsm_inst_state_chg() interprets T == 0 as "no timer". */</span><br><span style="color: hsl(120, 100%, 40%);">+     /*! T1234 or X1234 number, corresponding to struct osmo_fsm_inst::T.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Positive values for T are considered to be 3GPP spec compliant and appear in logging and VTY as "T1234",</span><br><span style="color: hsl(120, 100%, 40%);">+  * while negative values are considered to be Osmocom specific timers, represented in logging and VTY as</span><br><span style="color: hsl(120, 100%, 40%);">+       * "X1234". Be aware that osmo_tdef_fsm_inst_state_chg() interprets T == 0 as "state without timeout". */</span><br><span>        const int T;</span><br><span>         /*! Timeout duration (according to unit), default value; type corresponds to osmo_fsm_inst_state_chg()'s</span><br><span>          * timeout_secs argument. Note that osmo_fsm_inst_state_chg() clamps the range. */</span><br><span>@@ -98,7 +101,9 @@</span><br><span> /*! Using osmo_tdef for osmo_fsm_inst: array entry for a mapping of state numbers to timeout definitions.</span><br><span>  * For a usage example, see osmo_tdef_get_state_timeout() and test_tdef_state_timeout() in tdef_test.c. */</span><br><span> struct osmo_tdef_state_timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-  /*! Timer number to match struct osmo_tdef.T, and to pass to osmo_fsm_inst_state_chg(). */</span><br><span style="color: hsl(120, 100%, 40%);">+    /*! Timer number to match struct osmo_tdef.T, and to pass to osmo_fsm_inst_state_chg(). Positive values for T</span><br><span style="color: hsl(120, 100%, 40%);">+  * are considered to be 3GPP spec compliant and appear in logging and VTY as "T1234", while negative values are</span><br><span style="color: hsl(120, 100%, 40%);">+      * considered to be Osmocom specific timers, represented in logging and VTY as "X1234". */</span><br><span>         int T;</span><br><span>       /*! If true, call osmo_fsm_inst_state_chg_keep_timer().</span><br><span>       * If T == 0, keep previous T number, otherwise also set fi->T. */</span><br><span>diff --git a/include/osmocom/vty/tdef_vty.h b/include/osmocom/vty/tdef_vty.h</span><br><span>index f55239a..16d9498 100644</span><br><span>--- a/include/osmocom/vty/tdef_vty.h</span><br><span>+++ b/include/osmocom/vty/tdef_vty.h</span><br><span>@@ -35,7 +35,9 @@</span><br><span> struct osmo_tdef_group;</span><br><span> </span><br><span> #define OSMO_TDEF_VTY_ARG_T "TNNNN"</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSMO_TDEF_VTY_DOC_T "T-number, optionally preceded by 't' or 'T'.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_TDEF_VTY_DOC_T \</span><br><span style="color: hsl(120, 100%, 40%);">+   "T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234';" \</span><br><span style="color: hsl(120, 100%, 40%);">+ " Osmocom-specific timer number of the format: 'X1234' or 'x1234'.\n"</span><br><span> #define OSMO_TDEF_VTY_ARG_T_OPTIONAL "[" OSMO_TDEF_VTY_ARG_T "]"</span><br><span> </span><br><span> #define OSMO_TDEF_VTY_ARG_VAL "(<0-2147483647>|default)"</span><br><span>diff --git a/src/fsm.c b/src/fsm.c</span><br><span>index eb457a1..4876c04 100644</span><br><span>--- a/src/fsm.c</span><br><span>+++ b/src/fsm.c</span><br><span>@@ -108,8 +108,8 @@</span><br><span> /*! Enable or disable logging of timeout values for FSM instance state changes.</span><br><span>  *</span><br><span>  * By default, state changes are logged by state name only, omitting the timeout. When passing true, each state change</span><br><span style="color: hsl(0, 100%, 40%);">- * will also log the T number and the chosen timeout in seconds. osmo_fsm_inst_state_chg_keep_timer() will log remaining</span><br><span style="color: hsl(0, 100%, 40%);">- * timeout in millisecond precision.</span><br><span style="color: hsl(120, 100%, 40%);">+ * will also log the T number (or Osmocom-specific X number) and the chosen timeout in seconds.</span><br><span style="color: hsl(120, 100%, 40%);">+ * osmo_fsm_inst_state_chg_keep_timer() will log remaining timeout in millisecond precision.</span><br><span>  *</span><br><span>  * The default for this is false to reflect legacy behavior. Since various C tests that verify logging output already</span><br><span>  * existed prior to this option, keeping timeout logging off makes sure that they continue to pass. Particularly,</span><br><span>@@ -205,9 +205,9 @@</span><br><span> {</span><br><span>  struct osmo_fsm_inst *fi = data;</span><br><span>     struct osmo_fsm *fsm = fi->fsm;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint32_t T = fi->T;</span><br><span style="color: hsl(120, 100%, 40%);">+        int32_t T = fi->T;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       LOGPFSM(fi, "Timeout of T%u\n", fi->T);</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGPFSM(fi, "Timeout of " OSMO_T_FMT "\n", OSMO_T_FMT_ARGS(fi->T));</span><br><span> </span><br><span>       if (fsm->timer_cb) {</span><br><span>              int rc = fsm->timer_cb(fi);</span><br><span>@@ -482,13 +482,13 @@</span><br><span> </span><br><span>   if (fsm_log_timeouts) {</span><br><span>              if (keep_timer && fi->timer.active && (osmo_timer_remaining(&fi->timer, NULL, &remaining) == 0))</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPFSMSRC(fi, file, line, "State change to %s (keeping T%d, %ld.%03lds remaining)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPFSMSRC(fi, file, line, "State change to %s (keeping " OSMO_T_FMT ", %ld.%03lds remaining)\n",</span><br><span>                                   osmo_fsm_state_name(fsm, new_state),</span><br><span style="color: hsl(0, 100%, 40%);">-                            fi->T, remaining.tv_sec, remaining.tv_usec / 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+                                OSMO_T_FMT_ARGS(fi->T), remaining.tv_sec, remaining.tv_usec / 1000);</span><br><span>           else if (timeout_secs && !keep_timer)</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGPFSMSRC(fi, file, line, "State change to %s (T%d, %lus)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPFSMSRC(fi, file, line, "State change to %s (" OSMO_T_FMT ", %lus)\n",</span><br><span>                                   osmo_fsm_state_name(fsm, new_state),</span><br><span style="color: hsl(0, 100%, 40%);">-                            T, timeout_secs);</span><br><span style="color: hsl(120, 100%, 40%);">+                             OSMO_T_FMT_ARGS(T), timeout_secs);</span><br><span>                else</span><br><span>                         LOGPFSMSRC(fi, file, line, "State change to %s (no timeout)\n",</span><br><span>                               osmo_fsm_state_name(fsm, new_state));</span><br><span>@@ -535,6 +535,10 @@</span><br><span>  *  timer_cb. If passing timeout_secs == 0, it is recommended to also pass T ==</span><br><span>  *  0, so that fi->T is reset to 0 when no timeout is invoked.</span><br><span>  *</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Positive values for T are considered to be 3GPP spec compliant and appear in</span><br><span style="color: hsl(120, 100%, 40%);">+ *  logging and VTY as "T1234", while negative values are considered to be</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Osmocom specific timers, represented in logging and VTY as "X1234".</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span>  *  See also osmo_tdef_fsm_inst_state_chg() from the osmo_tdef API, which</span><br><span>  *  provides a unified way to configure and apply GSM style Tnnnn timers to FSM</span><br><span>  *  state transitions.</span><br><span>@@ -549,7 +553,9 @@</span><br><span>  *  \param[in] fi FSM instance whose state is to change</span><br><span>  *  \param[in] new_state The new state into which we should change</span><br><span>  *  \param[in] timeout_secs Timeout in seconds (if !=0), maximum-clamped to 2147483647 seconds.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] T Timer number (if \ref timeout_secs != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] T Timer number, where positive numbers are considered to be 3GPP spec compliant timer numbers and are</span><br><span style="color: hsl(120, 100%, 40%);">+ *               logged as "T1234", while negative numbers are considered Osmocom specific timer numbers logged as</span><br><span style="color: hsl(120, 100%, 40%);">+ *               "X1234".</span><br><span>  *  \param[in] file Calling source file (from osmo_fsm_inst_state_chg macro)</span><br><span>  *  \param[in] line Calling source line (from osmo_fsm_inst_state_chg macro)</span><br><span>  *  \returns 0 on success; negative on error</span><br><span>diff --git a/src/vty/tdef_vty.c b/src/vty/tdef_vty.c</span><br><span>index 1c6af70..04c14b9 100644</span><br><span>--- a/src/vty/tdef_vty.c</span><br><span>+++ b/src/vty/tdef_vty.c</span><br><span>@@ -31,6 +31,7 @@</span><br><span> #include <osmocom/vty/command.h></span><br><span> #include <osmocom/vty/tdef_vty.h></span><br><span> #include <osmocom/core/tdef.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span> </span><br><span> /*! \addtogroup Tdef_VTY</span><br><span>  *</span><br><span>@@ -40,7 +41,7 @@</span><br><span>  * \file tdef_vty.c</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Parse an argument like "T1234", "t1234" or "1234", as from OSMO_TDEF_VTY_ARG_T.</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Parse an argument like "1234", "T1234", "t1234", or "X1234", "x1234", as from OSMO_TDEF_VTY_ARG_T.</span><br><span>  * \param[in] vty  VTY context for vty_out() of error messages.</span><br><span>  * \param[in] tdefs  Array of timer definitions to look up T timer.</span><br><span>  * \param[in] T_str  Argument string. It is not validated, expected to be checked by VTY input.</span><br><span>@@ -53,6 +54,7 @@</span><br><span>        struct osmo_tdef *t;</span><br><span>         char *endptr;</span><br><span>        const char *T_nr_str;</span><br><span style="color: hsl(120, 100%, 40%);">+ int sign = 1;</span><br><span> </span><br><span>    if (!tdefs) {</span><br><span>                vty_out(vty, "%% Error: no timers found%s", VTY_NEWLINE);</span><br><span>@@ -60,20 +62,31 @@</span><br><span>    }</span><br><span> </span><br><span>        T_nr_str = T_str;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (T_nr_str[0] == 't' || T_nr_str[0] == 'T')</span><br><span style="color: hsl(120, 100%, 40%);">+ if (T_nr_str[0] == 't' || T_nr_str[0] == 'T') {</span><br><span style="color: hsl(120, 100%, 40%);">+               sign = 1;</span><br><span>            T_nr_str++;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (T_nr_str[0] == 'x' || T_nr_str[0] == 'X') {</span><br><span style="color: hsl(120, 100%, 40%);">+                T_nr_str++;</span><br><span style="color: hsl(120, 100%, 40%);">+           sign = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make sure to disallow any characters changing the signedness of the parsed int */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (T_nr_str[0] < '0' || T_nr_str[0] > '9') {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Invalid T timer argument (should be 'T1234' or 'X1234'): '%s'%s", T_str, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        errno = 0;</span><br><span>   l = strtol(T_nr_str, &endptr, 10);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (errno || *endptr || l > INT_MAX) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "%% No such timer: '%s'%s", T_str, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (errno || *endptr || l > INT_MAX || l < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "%% Invalid T timer argument (should be 'T1234' or 'X1234'): '%s'%s", T_str, VTY_NEWLINE);</span><br><span>            return NULL;</span><br><span>         }</span><br><span style="color: hsl(0, 100%, 40%);">-       T = l;</span><br><span style="color: hsl(120, 100%, 40%);">+        T = l * sign;</span><br><span> </span><br><span>    t = osmo_tdef_get_entry(tdefs, T);</span><br><span>   if (!t)</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "%% No such timer: T%d%s", T, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%% No such timer: " OSMO_T_FMT "%s", OSMO_T_FMT_ARGS(T), VTY_NEWLINE);</span><br><span>     return t;</span><br><span> }</span><br><span> </span><br><span>@@ -153,8 +166,8 @@</span><br><span>     }</span><br><span>    if (prefix_fmt)</span><br><span>              vty_out_va(vty, prefix_fmt, va);</span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out(vty, "T%d = %lu%s%s\t%s (default: %lu%s%s)%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                t->T, t->val,</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, OSMO_T_FMT " = %lu%s%s\t%s (default: %lu%s%s)%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_T_FMT_ARGS(t->T), t->val,</span><br><span>                 t->unit == OSMO_TDEF_CUSTOM ? "" : " ", t->unit == OSMO_TDEF_CUSTOM ? "" : osmo_tdef_unit_name(t->unit),</span><br><span>              t->desc, t->default_val,</span><br><span>               t->unit == OSMO_TDEF_CUSTOM ? "" : " ", t->unit == OSMO_TDEF_CUSTOM ? "" : osmo_tdef_unit_name(t->unit),</span><br><span>@@ -227,7 +240,7 @@</span><br><span>                        vty_out_va(vty, prefix_fmt, va);</span><br><span>                     va_end(va);</span><br><span>          }</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "T%d %lu%s", t->T, t->val, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, OSMO_T_FMT " %lu%s", OSMO_T_FMT_ARGS(t->T), t->val, VTY_NEWLINE);</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/tdef/tdef_vty_test_config_root.vty b/tests/tdef/tdef_vty_test_config_root.vty</span><br><span>index de2d48f..e7c96ca 100644</span><br><span>--- a/tests/tdef/tdef_vty_test_config_root.vty</span><br><span>+++ b/tests/tdef/tdef_vty_test_config_root.vty</span><br><span>@@ -9,7 +9,7 @@</span><br><span>   [software]  Typical software development cycle</span><br><span> </span><br><span> tdef_vty_test> show timer test ?</span><br><span style="color: hsl(0, 100%, 40%);">-  [TNNNN]  T-number, optionally preceded by 't' or 'T'.</span><br><span style="color: hsl(120, 100%, 40%);">+  [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'.</span><br><span> </span><br><span> tdef_vty_test> show timer</span><br><span> tea: T1 = 50 s      Water Boiling Timeout (default: 50 s)</span><br><span>@@ -21,7 +21,7 @@</span><br><span> test: T3 = 100 m   Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> software: T1 = 30 m    Write code (default: 30 m)</span><br><span> software: T2 = 20 ms      Hit segfault (default: 20 ms)</span><br><span> software: T3 = 480 m   Fix bugs (default: 480 m)</span><br><span>@@ -37,7 +37,7 @@</span><br><span> test: T3 = 100 m       Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> software: T1 = 30 m    Write code (default: 30 m)</span><br><span> software: T2 = 20 ms      Hit segfault (default: 20 ms)</span><br><span> software: T3 = 480 m   Fix bugs (default: 480 m)</span><br><span>@@ -66,7 +66,7 @@</span><br><span>   [default]         Set to default timer value</span><br><span> </span><br><span> tdef_vty_test(config)# timer test ?</span><br><span style="color: hsl(0, 100%, 40%);">-  [TNNNN]  T-number, optionally preceded by 't' or 'T'.</span><br><span style="color: hsl(120, 100%, 40%);">+  [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'.</span><br><span> </span><br><span> tdef_vty_test(config)# timer test t2 ?</span><br><span>   [<0-2147483647>]  New timer value</span><br><span>@@ -82,7 +82,7 @@</span><br><span> test: T3 = 100 m       Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> software: T1 = 30 m    Write code (default: 30 m)</span><br><span> software: T2 = 20 ms      Hit segfault (default: 20 ms)</span><br><span> software: T3 = 480 m   Fix bugs (default: 480 m)</span><br><span>@@ -108,8 +108,11 @@</span><br><span> tdef_vty_test(config)# do show timer tea T0</span><br><span> % No such timer: T0</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config)# do show timer tea X123</span><br><span style="color: hsl(120, 100%, 40%);">+% No such timer: X123</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> tdef_vty_test(config)# do show timer tea T-123</span><br><span style="color: hsl(0, 100%, 40%);">-% No such timer: T-123</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123'</span><br><span> </span><br><span> tdef_vty_test(config)# do show timer t</span><br><span> tea: T1 = 50 s  Water Boiling Timeout (default: 50 s)</span><br><span>@@ -121,7 +124,7 @@</span><br><span> test: T3 = 100 m Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test(config)# do show timer te</span><br><span> tea: T1 = 50 s  Water Boiling Timeout (default: 50 s)</span><br><span>@@ -133,7 +136,7 @@</span><br><span> test: T3 = 100 m Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test(config)# do show timer te T2</span><br><span> tea: T2 = 300 s      Tea brewing (default: 300 s)</span><br><span>@@ -152,8 +155,11 @@</span><br><span> tdef_vty_test(config)# timer tea T3</span><br><span> tea: T3 = 32 m    Let tea cool down before drinking (default: 5 m)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config)# timer tea X123 99</span><br><span style="color: hsl(120, 100%, 40%);">+% No such timer: X123</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> tdef_vty_test(config)# timer tea T-123 99</span><br><span style="color: hsl(0, 100%, 40%);">-% No such timer: T-123</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123'</span><br><span> </span><br><span> tdef_vty_test(config)# timer tea T0 0</span><br><span> % No such timer: T0</span><br><span>@@ -177,7 +183,7 @@</span><br><span> test: T3 = 100 m    Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test(config)# timer te T2</span><br><span> tea: T2 = 300 s      Tea brewing (default: 300 s)</span><br><span>@@ -209,8 +215,11 @@</span><br><span> tdef_vty_test(config)# do show timer software T99</span><br><span> % No such timer: T99</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config)# do show timer software X123123</span><br><span style="color: hsl(120, 100%, 40%);">+% No such timer: X123123</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> tdef_vty_test(config)# do show timer software T-123123</span><br><span style="color: hsl(0, 100%, 40%);">-% No such timer: T-123123</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-123123'</span><br><span> </span><br><span> tdef_vty_test(config)# do show timer software T0</span><br><span> % No such timer: T0</span><br><span>@@ -251,7 +260,7 @@</span><br><span> test: T3 = 100 m      Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> software: T1 = 13 m    Write code (default: 30 m)</span><br><span> software: T2 = 0 ms       Hit segfault (default: 20 ms)</span><br><span> software: T3 = 480 m   Fix bugs (default: 480 m)</span><br><span>@@ -266,7 +275,7 @@</span><br><span> test: T3 = 100 m     Testing a hundred minutes (default: 100 m)</span><br><span> test: T4 = 100    Testing a hundred potatoes (default: 100)</span><br><span> test: T2147483647 = 4294967295 m   Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-test: T-23 = 239471 s Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+test: X23 = 239471 s     Negative T number (default: 239471 s)</span><br><span> software: T1 = 13 m    Write code (default: 30 m)</span><br><span> software: T2 = 0 ms       Hit segfault (default: 20 ms)</span><br><span> software: T3 = 480 m   Fix bugs (default: 480 m)</span><br><span>diff --git a/tests/tdef/tdef_vty_test_config_subnode.vty b/tests/tdef/tdef_vty_test_config_subnode.vty</span><br><span>index 50e5f59..2605f71 100644</span><br><span>--- a/tests/tdef/tdef_vty_test_config_subnode.vty</span><br><span>+++ b/tests/tdef/tdef_vty_test_config_subnode.vty</span><br><span>@@ -4,7 +4,7 @@</span><br><span> ... !timer</span><br><span> </span><br><span> tdef_vty_test> show timer ?</span><br><span style="color: hsl(0, 100%, 40%);">-  [TNNNN]  T-number, optionally preceded by 't' or 'T'.</span><br><span style="color: hsl(120, 100%, 40%);">+  [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'.</span><br><span> </span><br><span> tdef_vty_test> show timer</span><br><span> T1 = 100 s  Testing a hundred seconds (default: 100 s)</span><br><span>@@ -12,7 +12,7 @@</span><br><span> T3 = 100 m    Testing a hundred minutes (default: 100 m)</span><br><span> T4 = 100  Testing a hundred potatoes (default: 100)</span><br><span> T2147483647 = 4294967295 m Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 239471 s       Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 239471 s   Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test> enable</span><br><span> tdef_vty_test# show timer</span><br><span>@@ -21,7 +21,7 @@</span><br><span> T3 = 100 m    Testing a hundred minutes (default: 100 m)</span><br><span> T4 = 100  Testing a hundred potatoes (default: 100)</span><br><span> T2147483647 = 4294967295 m Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 239471 s       Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 239471 s   Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test# configure terminal</span><br><span> tdef_vty_test(config)# show running-config</span><br><span>@@ -35,7 +35,7 @@</span><br><span> T3 = 100 m  Testing a hundred minutes (default: 100 m)</span><br><span> T4 = 100  Testing a hundred potatoes (default: 100)</span><br><span> T2147483647 = 4294967295 m Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 239471 s       Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 239471 s   Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test(config-net)# do show timer T3</span><br><span> T3 = 100 m  Testing a hundred minutes (default: 100 m)</span><br><span>@@ -73,17 +73,13 @@</span><br><span> tdef_vty_test(config-net)# timer T666 5</span><br><span> % No such timer: T666</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer T-23 42</span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer T-23</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 42 s        Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer X23 42</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer X23</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 42 s        Negative T number (default: 239471 s)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer t-23 43</span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer T-23</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 43 s       Negative T number (default: 239471 s)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer -23 44</span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer T-23</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 44 s    Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer x23 43</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer x23</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 43 s        Negative T number (default: 239471 s)</span><br><span> </span><br><span> tdef_vty_test(config-net)# do show timer</span><br><span> T1 = 9012345 s Testing a hundred seconds (default: 100 s)</span><br><span>@@ -91,17 +87,42 @@</span><br><span> T3 = 100 m  Testing a hundred minutes (default: 100 m)</span><br><span> T4 = 100  Testing a hundred potatoes (default: 100)</span><br><span> T2147483647 = 4294967295 m Very large (default: 4294967295 m)</span><br><span style="color: hsl(0, 100%, 40%);">-T-23 = 44 s   Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+X23 = 43 s       Negative T number (default: 239471 s)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer T-23 42</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-23'</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer T-23</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'T-23'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer t-23 42</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 't-23'</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer t-23</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 't-23'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer X-23 42</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'X-23'</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer X-23</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'X-23'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer x-23 42</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'x-23'</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer x-23</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): 'x-23'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer -23 42</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): '-23'</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer -23</span><br><span style="color: hsl(120, 100%, 40%);">+% Invalid T timer argument (should be 'T1234' or 'X1234'): '-23'</span><br><span> </span><br><span> tdef_vty_test(config-net)# show running-config</span><br><span> ... !timer</span><br><span> net</span><br><span>  timer T1 9012345</span><br><span style="color: hsl(0, 100%, 40%);">- timer T-23 44</span><br><span style="color: hsl(120, 100%, 40%);">+ timer X23 43</span><br><span> ... !timer</span><br><span> </span><br><span> tdef_vty_test(config-net)# timer T1 default</span><br><span style="color: hsl(0, 100%, 40%);">-tdef_vty_test(config-net)# timer T-23 default</span><br><span style="color: hsl(120, 100%, 40%);">+tdef_vty_test(config-net)# timer X23 default</span><br><span> </span><br><span> tdef_vty_test(config-net)# show running-config</span><br><span> ... !timer</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12988">change 12988</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12988"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I3a59457623da9309fbbda235fe18fadd1636bff6 </div>
<div style="display:none"> Gerrit-Change-Number: 12988 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>