<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11130">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: SCCP timers: add optional units<br><br>Add VTY UI to optionally configure SCCP timers in millisecond unit, allowing<br>for less-than-a-second resolution, and in minute unit, allowing for convenience<br>to cut short the factor-of-60 calculations when thinking in minutes.<br><br>Also write back the config in the largest possible unit that doesn't lose timer<br>value precision.<br><br>Change-Id: I020d5dab19bc67e8444ed548db15b2a4d8871a9c<br>---<br>M src/sccp_vty.c<br>M tests/vty/ss7_asp_test.vty<br>2 files changed, 109 insertions(+), 25 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/30/11130/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/sccp_vty.c b/src/sccp_vty.c</span><br><span>index 46afb49..b251f58 100644</span><br><span>--- a/src/sccp_vty.c</span><br><span>+++ b/src/sccp_vty.c</span><br><span>@@ -142,19 +142,32 @@</span><br><span> }</span><br><span> </span><br><span> /* sccp-timer <name> <1-999999></span><br><span style="color: hsl(0, 100%, 40%);">- * (cmdstr and doc are dynamically generated from osmo_sccp_timer_names.) */</span><br><span style="color: hsl(120, 100%, 40%);">+ * (cmdstr and doc are dynamically generated from osmo_sccp_timer_names.)</span><br><span style="color: hsl(120, 100%, 40%);">+ * The VTY API does not allow passing optional choice args like [(a|b|c)], so there is a separate command</span><br><span style="color: hsl(120, 100%, 40%);">+ * for adding optional unit indicators. */</span><br><span> DEFUN(sccp_timer, sccp_timer_cmd,</span><br><span>       NULL, NULL)</span><br><span> {</span><br><span>     struct osmo_ss7_instance *ss7 = vty->index;</span><br><span>       enum osmo_sccp_timer timer = get_string_value(osmo_sccp_timer_names, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osmo_sccp_timer_val set_val = { .s = atoi(argv[1]) };</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_sccp_timer_val set_val = {};</span><br><span style="color: hsl(120, 100%, 40%);">+      int val = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *unit = argc > 2? argv[2] : "s";</span><br><span> </span><br><span>         if (timer < 0 || timer >= OSMO_SCCP_TIMERS_COUNT) {</span><br><span>            vty_out(vty, "%% Invalid timer: %s%s", argv[0], VTY_NEWLINE);</span><br><span>              return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!strcmp(unit, "m"))</span><br><span style="color: hsl(120, 100%, 40%);">+             set_val.s = val * 60;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (!strcmp(unit, "s"))</span><br><span style="color: hsl(120, 100%, 40%);">+                set_val.s = val;</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (!strcmp(unit, "ms")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             set_val.s = val / 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+               set_val.us = (val % 1000) * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     </span><br><span>     osmo_ss7_ensure_sccp(ss7);</span><br><span>   if (!ss7->sccp) {</span><br><span>                 vty_out(vty, "%% Error: cannot instantiate SCCP instance%s", VTY_NEWLINE);</span><br><span>@@ -165,15 +178,25 @@</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* sccp-timer <name> <1-999999> (m|s|ms)</span><br><span style="color: hsl(120, 100%, 40%);">+ * (cmdstr and doc are dynamically generated from osmo_sccp_timer_names.) */</span><br><span style="color: hsl(120, 100%, 40%);">+ALIAS(sccp_timer, sccp_timer_unit_cmd, NULL, NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const char *osmo_sccp_timer_val_name(const struct osmo_sccp_timer_val *val)</span><br><span> {</span><br><span>    static char buf[16];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        snprintf(buf, sizeof(buf), "%u", val->s);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (val->us) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t ms = val->us / 1000 + val->s * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+           snprintf(buf, sizeof(buf), "%u ms", ms);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (val->s % 60)</span><br><span style="color: hsl(120, 100%, 40%);">+            snprintf(buf, sizeof(buf), "%u", val->s);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, sizeof(buf), "%u m", val->s / 60);</span><br><span>        return buf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gen_sccp_timer_cmd_strs(struct cmd_element *cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+static void gen_sccp_timer_cmd_strs(struct cmd_element *cmd, bool with_units)</span><br><span> {</span><br><span>         int i;</span><br><span>       char *cmd_str = NULL;</span><br><span>@@ -200,11 +223,21 @@</span><br><span>                osmo_talloc_asprintf(tall_vty_ctx, doc_str, "%s (default: %s)\n",</span><br><span>                               osmo_sccp_timer_description(timer),</span><br><span>                                  osmo_sccp_timer_val_name(def));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     }</span><br><span> </span><br><span>        osmo_talloc_asprintf(tall_vty_ctx, cmd_str, ") <1-999999>");</span><br><span>         osmo_talloc_asprintf(tall_vty_ctx, doc_str,</span><br><span style="color: hsl(0, 100%, 40%);">-                          "Timer value, in seconds\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       "Timer value, in seconds unless a different unit keyword follows\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (with_units) {</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_talloc_asprintf(tall_vty_ctx, cmd_str, " (m|s|ms)");</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_talloc_asprintf(tall_vty_ctx, doc_str,</span><br><span style="color: hsl(120, 100%, 40%);">+                                "Timer value unit: supply value in minutes instead of seconds\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Timer value unit: supply value in seconds, which is also the default unit\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                               "Timer value unit: supply value in milliseconds instead of seconds\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span>        cmd->string = cmd_str;</span><br><span>    cmd->doc = doc_str;</span><br><span>@@ -260,6 +293,8 @@</span><br><span>         install_element_ve(&show_sccp_connections_cmd);</span><br><span> </span><br><span>      install_element_ve(&show_sccp_timers_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-  gen_sccp_timer_cmd_strs(&sccp_timer_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_sccp_timer_cmd_strs(&sccp_timer_cmd, false);</span><br><span style="color: hsl(120, 100%, 40%);">+  gen_sccp_timer_cmd_strs(&sccp_timer_unit_cmd, true);</span><br><span>     install_element(L_CS7_NODE, &sccp_timer_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(L_CS7_NODE, &sccp_timer_unit_cmd);</span><br><span> }</span><br><span>diff --git a/tests/vty/ss7_asp_test.vty b/tests/vty/ss7_asp_test.vty</span><br><span>index cb8dc85..d9b1d97 100644</span><br><span>--- a/tests/vty/ss7_asp_test.vty</span><br><span>+++ b/tests/vty/ss7_asp_test.vty</span><br><span>@@ -83,6 +83,7 @@</span><br><span>   sccp-address NAME</span><br><span>   no sccp-address NAME</span><br><span>   sccp-timer (conn_est|ias|iar|rel|repeat_rel|int|guard|reset|reassembly) <1-999999></span><br><span style="color: hsl(120, 100%, 40%);">+  sccp-timer (conn_est|ias|iar|rel|repeat_rel|int|guard|reset|reassembly) <1-999999> (m|s|ms)</span><br><span> </span><br><span> ss7_asp_vty_test(config-cs7)# ?</span><br><span> ...</span><br><span>@@ -367,31 +368,31 @@</span><br><span> ss7_asp_vty_test(config-cs7)# show running-config</span><br><span> ... !sccp-timer</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ss7_asp_vty_test(config-cs7)# sccp-timer ias 5</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# sccp-timer ias 5 ms</span><br><span> ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer conn_est 60</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer ias 5</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer iar 900</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer conn_est 1 m</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer ias 5 ms</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 15 m</span><br><span> sccp-timer rel 10</span><br><span> sccp-timer repeat_rel 10</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer int 60</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer guard 1380</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer int 1 m</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer guard 23 m</span><br><span> sccp-timer reset 10</span><br><span> sccp-timer reassembly 10</span><br><span> ss7_asp_vty_test(config-cs7)# show running-config</span><br><span> ... !sccp-timer</span><br><span style="color: hsl(0, 100%, 40%);">- sccp-timer ias 5</span><br><span style="color: hsl(120, 100%, 40%);">+ sccp-timer ias 5 ms</span><br><span> ... !sccp-timer</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ss7_asp_vty_test(config-cs7)# sccp-timer ias 420</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# sccp-timer ias 7 m</span><br><span> ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer conn_est 60</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer ias 420</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer iar 900</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer conn_est 1 m</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer ias 7 m</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 15 m</span><br><span> sccp-timer rel 10</span><br><span> sccp-timer repeat_rel 10</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer int 60</span><br><span style="color: hsl(0, 100%, 40%);">-sccp-timer guard 1380</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer int 1 m</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer guard 23 m</span><br><span> sccp-timer reset 10</span><br><span> sccp-timer reassembly 10</span><br><span> ss7_asp_vty_test(config-cs7)# show running-config</span><br><span>@@ -401,15 +402,63 @@</span><br><span>   sccp-timer  Configure SCCP timer values, see ITU-T Q.714</span><br><span> </span><br><span> ss7_asp_vty_test(config-cs7)# sccp-timer ?</span><br><span style="color: hsl(0, 100%, 40%);">-  conn_est    Waiting for connection confirm message, 1 to 2 minutes (default: 60)</span><br><span style="color: hsl(0, 100%, 40%);">-  ias         Send keep-alive: on an idle connection, delay before sending an Idle Timer message, 5 to 10 minutes (default: 420)</span><br><span style="color: hsl(0, 100%, 40%);">-  iar         Receive keep-alive: on an idle connection, delay until considering a connection as stale, 11 to 21 minutes (default: 900)</span><br><span style="color: hsl(120, 100%, 40%);">+  conn_est    Waiting for connection confirm message, 1 to 2 minutes (default: 1 m)</span><br><span style="color: hsl(120, 100%, 40%);">+  ias         Send keep-alive: on an idle connection, delay before sending an Idle Timer message, 5 to 10 minutes (default: 7 m)</span><br><span style="color: hsl(120, 100%, 40%);">+  iar         Receive keep-alive: on an idle connection, delay until considering a connection as stale, 11 to 21 minutes (default: 15 m)</span><br><span>   rel         Waiting for release complete message, 10 to 20 seconds (default: 10)</span><br><span>   repeat_rel  Waiting for release complete message; or to repeat sending released message after the initial expiry, 10 to 20 seconds (default: 10)</span><br><span style="color: hsl(0, 100%, 40%);">-  int         Waiting for release complete message; or to release connection resources, freeze the LRN and alert a maintenance function after the initial expiry, extending to 1 minute (default: 60)</span><br><span style="color: hsl(0, 100%, 40%);">-  guard       Waiting to resume normal procedure for temporary connection sections during the restart procedure, 23 to 25 minutes (default: 1380)</span><br><span style="color: hsl(120, 100%, 40%);">+  int         Waiting for release complete message; or to release connection resources, freeze the LRN and alert a maintenance function after the initial expiry, extending to 1 minute (default: 1 m)</span><br><span style="color: hsl(120, 100%, 40%);">+  guard       Waiting to resume normal procedure for temporary connection sections during the restart procedure, 23 to 25 minutes (default: 23 m)</span><br><span>   reset       Waiting to release temporary connection section or alert maintenance function after reset request message is sent, 10 to 20 seconds (default: 10)</span><br><span>   reassembly  Waiting to receive all the segments of the remaining segments, single segmented message after receiving the first segment, 10 to 20 seconds (default: 10)</span><br><span> </span><br><span> ss7_asp_vty_test(config-cs7)# sccp-timer conn_est ?</span><br><span style="color: hsl(0, 100%, 40%);">-  <1-999999>  Timer value, in seconds</span><br><span style="color: hsl(120, 100%, 40%);">+  <1-999999>  Timer value, in seconds unless a different unit keyword follows</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# sccp-timer conn_est 1 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  m     Timer value unit: supply value in minutes instead of seconds</span><br><span style="color: hsl(120, 100%, 40%);">+  s     Timer value unit: supply value in seconds, which is also the default unit</span><br><span style="color: hsl(120, 100%, 40%);">+  ms    Timer value unit: supply value in milliseconds instead of seconds</span><br><span style="color: hsl(120, 100%, 40%);">+  <cr>  </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 1 ms</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 1 ms</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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 1000 ms</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 60000 ms</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 1 m</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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 60500 ms</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 60500 ms</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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 65000 ms</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 65</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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 65</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 65</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%);">+ss7_asp_vty_test(config-cs7)# sccp-timer iar 180</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer iar 3 m</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11130">change 11130</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/11130"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I020d5dab19bc67e8444ed548db15b2a4d8871a9c </div>
<div style="display:none"> Gerrit-Change-Number: 11130 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>