<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11119">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">make SCCP timers configurable<br><br>The previous hardcoded SCCP timers may cause SCCP connection releases, if the<br>peer is configured with far lower timers than libosmo-sccp. Testing with a<br>specific SCCPlite MSC, I experienced an iar of just over three minutes, meaning<br>that calls would be cut off by the MSC, since the osmo-bsc failed to send an<br>Inactivity Timer message until seven minutes have passed.<br><br>With this patch, SCCP timers are configurable by the user, with millisecond<br>resolution (or by second or minute, for convenience).<br><br>Define constant global default timers, and variable user-configurable timers<br>with each osmo_sccp_instance.<br><br>Add VTY UI to configure the timers. Users must call osmo_sccp_vty_init() to get<br>the sccp-timer config nodes under the 'cs7' node. Show the new UI in<br>ss7_asp_test.vty.<br><br>Note that even though this function is not new at all, until recently, all of<br>our SCCP users (osmo-bsc, osmo-msc, osmo-sgsn, osmo-hnbgw) failed to call<br>osmo_sccp_vty_init(), and thus also missed out on the various 'show' commands<br>defined in sccp_vty.c. In other words, to benefit from the timer<br>configurability, the patches to call osmo_sccp_vty_init() must first be merged<br>to the corresponding master branches.<br><br>If a 'sccp-timer' config command occurs, the cs7 instance must allocate an SCCP<br>instance in order to store the timer config. Do that by calling the recently<br>added osmo_ss7_ensure_sccp() function.<br><br>Hence remove the limitation that the SCCP instance must not be populated from<br>the "simple" setup function. If we want to configure SCCP timers beforehand,<br>there must be an SCCP instance for that, and there is no hard reason to require<br>a NULL SCCP instance, besides the desire to prevent this function from being<br>invoked twice.<br><br>Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/osmo_ss7_vty.c<br>M src/sccp_internal.h<br>M src/sccp_scoc.c<br>M src/sccp_user.c<br>M src/sccp_vty.c<br>M tests/vty/ss7_asp_test.vty<br>7 files changed, 385 insertions(+), 27 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/19/11119/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>index 34d5408..3bf5d77 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -9,6 +9,8 @@</span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/prim.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sccp/sccp_types.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> extern struct llist_head osmo_ss7_instances;</span><br><span> </span><br><span> struct osmo_ss7_instance;</span><br><span>diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c</span><br><span>index 14539b6..7ef58cf 100644</span><br><span>--- a/src/osmo_ss7_vty.c</span><br><span>+++ b/src/osmo_ss7_vty.c</span><br><span>@@ -41,6 +41,8 @@</span><br><span> #include <osmocom/sigtran/sccp_sap.h></span><br><span> #include "sccp_internal.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "sccp_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define XUA_VAR_STR      "(sua|m3ua|ipa)"</span><br><span> </span><br><span> #define XUA_VAR_HELP_STR              \</span><br><span>@@ -1658,6 +1660,9 @@</span><br><span> </span><br><span>        /* Append SCCP Addressbook */</span><br><span>        write_sccp_addressbook(vty, inst);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (inst->sccp)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_sccp_vty_write_cs7_node(vty, " ", inst->sccp);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/src/sccp_internal.h b/src/sccp_internal.h</span><br><span>index 651862f..000f0f7 100644</span><br><span>--- a/src/sccp_internal.h</span><br><span>+++ b/src/sccp_internal.h</span><br><span>@@ -7,6 +7,36 @@</span><br><span> </span><br><span> #define SCCP_STR "Signalling Connection Control Part\n"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Appendix C.4 of Q.714 */</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_sccp_timer {</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_SCCP_TIMER_CONN_EST,</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_SCCP_TIMER_IAS,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_TIMER_IAR,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_TIMER_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_TIMER_REPEAT_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_SCCP_TIMER_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_SCCP_TIMER_GUARD,</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_SCCP_TIMER_RESET,</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_SCCP_TIMER_REASSEMBLY,</span><br><span style="color: hsl(120, 100%, 40%);">+   /* This must remain the last item: */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_SCCP_TIMERS_COUNT</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%);">+struct osmo_sccp_timer_val {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t s;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t us;</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%);">+extern const struct osmo_sccp_timer_val osmo_sccp_timer_defaults[];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string osmo_sccp_timer_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *osmo_sccp_timer_name(enum osmo_sccp_timer val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(osmo_sccp_timer_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string osmo_sccp_timer_descriptions[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *osmo_sccp_timer_description(enum osmo_sccp_timer val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(osmo_sccp_timer_descriptions, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* an instance of the SCCP stack */</span><br><span> struct osmo_sccp_instance {</span><br><span>       /* entry in global list of ss7 instances */</span><br><span>@@ -23,6 +53,8 @@</span><br><span>      void *priv;</span><br><span> </span><br><span>      struct osmo_ss7_user ss7_user;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_sccp_timer_val timers[OSMO_SCCP_TIMERS_COUNT];</span><br><span> };</span><br><span> </span><br><span> struct osmo_sccp_user {</span><br><span>@@ -90,3 +122,9 @@</span><br><span> struct osmo_fsm sccp_scoc_fsm;</span><br><span> </span><br><span> void sccp_scoc_show_connections(struct vty *vty, struct osmo_sccp_instance *inst);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osmo_sccp_timer_val *osmo_sccp_timer_get(const struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    enum osmo_sccp_timer timer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   bool default_if_unset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst);</span><br><span>diff --git a/src/sccp_scoc.c b/src/sccp_scoc.c</span><br><span>index 1057be0..8138e43 100644</span><br><span>--- a/src/sccp_scoc.c</span><br><span>+++ b/src/sccp_scoc.c</span><br><span>@@ -64,20 +64,6 @@</span><br><span> #define S(x) (1 << (x))</span><br><span> #define SCU_MSGB_SIZE       1024</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Appendix C.4 of Q.714 (all in milliseconds) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define CONNECTION_TIMER       ( 1 * 60 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-#define TX_INACT_TIMER          ( 7 * 60 * 1000) /* RFC 3868 Ch. 8. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define RX_INACT_TIMER            (15 * 60 * 1000) /* RFC 3868 Ch. 8. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define RELEASE_TIMER             (     10 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-#define RELEASE_REP_TIMER       (     10 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-#define INT_TIMER               ( 1 * 60 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-#define GUARD_TIMER             (23 * 60 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-#define RESET_TIMER             (     10 * 1000)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* convert from single value in milliseconds to comma-separated</span><br><span style="color: hsl(0, 100%, 40%);">- * "seconds, microseconds" format we use in osmocom/core/timers.h */</span><br><span style="color: hsl(0, 100%, 40%);">-#define MSEC_TO_S_US(x)            (x/1000), ((x%1000)*1000)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /***********************************************************************</span><br><span>  * SCCP connection table</span><br><span>  ***********************************************************************/</span><br><span>@@ -235,6 +221,109 @@</span><br><span>  * Timer Handling</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Appendix C.4 of ITU-T Q.714 */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string osmo_sccp_timer_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        { OSMO_SCCP_TIMER_CONN_EST, "conn_est" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { OSMO_SCCP_TIMER_IAS, "ias" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { OSMO_SCCP_TIMER_IAR, "iar" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { OSMO_SCCP_TIMER_REL, "rel" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { OSMO_SCCP_TIMER_REPEAT_REL, "repeat_rel" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { OSMO_SCCP_TIMER_INT, "int" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { OSMO_SCCP_TIMER_GUARD, "guard" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { OSMO_SCCP_TIMER_RESET, "reset" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { OSMO_SCCP_TIMER_REASSEMBLY, "reassembly" },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Mostly pasted from Appendix C.4 of ITU-T Q.714 (05/2001) -- some of their descriptions are quite</span><br><span style="color: hsl(120, 100%, 40%);">+ * unintelligible out of context, for which we have our own description here. */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string osmo_sccp_timer_descriptions[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { OSMO_SCCP_TIMER_CONN_EST,</span><br><span style="color: hsl(120, 100%, 40%);">+     "Waiting for connection confirm message, 1 to 2 minutes" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { OSMO_SCCP_TIMER_IAS,</span><br><span style="color: hsl(120, 100%, 40%);">+          "Send keep-alive: on an idle connection, delay before sending an Idle Timer message,"</span><br><span style="color: hsl(120, 100%, 40%);">+       " 5 to 10 minutes" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { OSMO_SCCP_TIMER_IAR,</span><br><span style="color: hsl(120, 100%, 40%);">+          "Receive keep-alive: on an idle connection, delay until considering a connection as stale,"</span><br><span style="color: hsl(120, 100%, 40%);">+         " 11 to 21 minutes" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { OSMO_SCCP_TIMER_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+          "Waiting for release complete message, 10 to 20 seconds" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { OSMO_SCCP_TIMER_REPEAT_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+   "Waiting for release complete message; or to repeat sending released message after the initial"</span><br><span style="color: hsl(120, 100%, 40%);">+     " expiry, 10 to 20 seconds" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { OSMO_SCCP_TIMER_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+          "Waiting for release complete message; or to release connection resources, freeze the LRN and"</span><br><span style="color: hsl(120, 100%, 40%);">+      " alert a maintenance function after the initial expiry, extending to 1 minute" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { OSMO_SCCP_TIMER_GUARD,</span><br><span style="color: hsl(120, 100%, 40%);">+        "Waiting to resume normal procedure for temporary connection sections during the restart"</span><br><span style="color: hsl(120, 100%, 40%);">+   " procedure, 23 to 25 minutes" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { OSMO_SCCP_TIMER_RESET,</span><br><span style="color: hsl(120, 100%, 40%);">+        "Waiting to release temporary connection section or alert maintenance function after reset"</span><br><span style="color: hsl(120, 100%, 40%);">+         " request message is sent, 10 to 20 seconds" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { OSMO_SCCP_TIMER_REASSEMBLY,</span><br><span style="color: hsl(120, 100%, 40%);">+   "Waiting to receive all the segments of the remaining segments, single segmented message after"</span><br><span style="color: hsl(120, 100%, 40%);">+     " receiving the first segment, 10 to 20 seconds" },</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Appendix C.4 of ITU-T Q.714 */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osmo_sccp_timer_val osmo_sccp_timer_defaults[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_CONN_EST]      = { .s =  1 * 60, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_IAS]           = { .s =  7 * 60, }, /* RFC 3868 Ch. 8. */</span><br><span style="color: hsl(120, 100%, 40%);">+    [OSMO_SCCP_TIMER_IAR]           = { .s = 15 * 60, }, /* RFC 3868 Ch. 8. */</span><br><span style="color: hsl(120, 100%, 40%);">+    [OSMO_SCCP_TIMER_REL]           = { .s =      10, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_REPEAT_REL]    = { .s =      10, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_INT]           = { .s =  1 * 60, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_GUARD]         = { .s = 23 * 60, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_RESET]         = { .s =      10, },</span><br><span style="color: hsl(120, 100%, 40%);">+  [OSMO_SCCP_TIMER_REASSEMBLY]    = { .s =      10, },</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%);">+osmo_static_assert(ARRAY_SIZE(osmo_sccp_timer_defaults) == OSMO_SCCP_TIMERS_COUNT,</span><br><span style="color: hsl(120, 100%, 40%);">+                   assert_osmo_sccp_timers_count);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Look up an SCCP timer value as configured in the osmo_ss7_instance.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If no user defined value is set, return the global default from osmo_sccp_timer_defaults instead.</span><br><span style="color: hsl(120, 100%, 40%);">+ * However, if default_if_unset is passed false, return NULL in case there is no user defined setting, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * in case it is identical to the global default. */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osmo_sccp_timer_val *osmo_sccp_timer_get(const struct osmo_sccp_instance *inst,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   enum osmo_sccp_timer timer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   bool default_if_unset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct osmo_sccp_timer_val *val;</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct osmo_sccp_timer_val *def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(timer >= 0</span><br><span style="color: hsl(120, 100%, 40%);">+                 && timer < ARRAY_SIZE(inst->timers)</span><br><span style="color: hsl(120, 100%, 40%);">+             && timer < ARRAY_SIZE(osmo_sccp_timer_defaults));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    val = &inst->timers[timer];</span><br><span style="color: hsl(120, 100%, 40%);">+    def = &osmo_sccp_timer_defaults[timer];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Assert that all timer definitions have a sane global default */</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(def->s || def->us);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (val->s || val->us) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!default_if_unset && val->s == def->s && val->us == def->us)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          return val;</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%);">+   if (!default_if_unset)</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* If unset, use the global default. */</span><br><span style="color: hsl(120, 100%, 40%);">+       return def;</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%);">+static void sccp_timer_schedule(const struct sccp_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct osmo_timer_list *timer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                enum osmo_sccp_timer timer_name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct osmo_sccp_timer_val *val = osmo_sccp_timer_get(conn->inst, timer_name, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(timer, val->s, val->us);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* T(ias) has expired, send a COIT message to the peer */</span><br><span> static void tx_inact_tmr_cb(void *data)</span><br><span> {</span><br><span>@@ -280,13 +369,13 @@</span><br><span> /* Re-start the Tx inactivity timer */</span><br><span> static void conn_restart_tx_inact_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_schedule(&conn->t_ias, MSEC_TO_S_US(TX_INACT_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+       sccp_timer_schedule(conn, &conn->t_ias, OSMO_SCCP_TIMER_IAS);</span><br><span> }</span><br><span> </span><br><span> /* Re-start the Rx inactivity timer */</span><br><span> static void conn_restart_rx_inact_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_timer_schedule(&conn->t_iar, MSEC_TO_S_US(RX_INACT_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+       sccp_timer_schedule(conn, &conn->t_iar, OSMO_SCCP_TIMER_IAR);</span><br><span> }</span><br><span> </span><br><span> /* Re-start both Rx and Tx inactivity timers */</span><br><span>@@ -306,19 +395,19 @@</span><br><span> /* Start release timer T(rel) */</span><br><span> static void conn_start_rel_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&conn->t_rel, MSEC_TO_S_US(RELEASE_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+        sccp_timer_schedule(conn, &conn->t_rel, OSMO_SCCP_TIMER_REL);</span><br><span> }</span><br><span> </span><br><span> /* Start repeat release timer T(rep_rel) */</span><br><span> static void conn_start_rep_rel_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&conn->t_rep_rel, MSEC_TO_S_US(RELEASE_REP_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+        sccp_timer_schedule(conn, &conn->t_rep_rel, OSMO_SCCP_TIMER_REPEAT_REL);</span><br><span> }</span><br><span> </span><br><span> /* Start interval timer T(int) */</span><br><span> static void conn_start_int_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_schedule(&conn->t_int, MSEC_TO_S_US(INT_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp_timer_schedule(conn, &conn->t_int, OSMO_SCCP_TIMER_INT);</span><br><span> }</span><br><span> </span><br><span> /* Stop all release related timers: T(rel), T(int) and T(rep_rel) */</span><br><span>@@ -332,7 +421,7 @@</span><br><span> /* Start connect timer T(conn) */</span><br><span> static void conn_start_connect_timer(struct sccp_connection *conn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&conn->t_conn, MSEC_TO_S_US(CONNECTION_TIMER));</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp_timer_schedule(conn, &conn->t_conn, OSMO_SCCP_TIMER_CONN_EST);</span><br><span> }</span><br><span> </span><br><span> /* Stop connect timer T(conn) */</span><br><span>diff --git a/src/sccp_user.c b/src/sccp_user.c</span><br><span>index 020166d..793e08c 100644</span><br><span>--- a/src/sccp_user.c</span><br><span>+++ b/src/sccp_user.c</span><br><span>@@ -396,13 +396,6 @@</span><br><span>      LOGP(DLSCCP, LOGL_NOTICE, "%s: Using SS7 instance %u, pc:%s\n", name,</span><br><span>           ss7->cfg.id, osmo_ss7_pointcode_print(ss7, ss7->cfg.primary_pc));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* There must not be an existing SCCP istance, regarless if the simple</span><br><span style="color: hsl(0, 100%, 40%);">-   * client has created the SS7 instance or if it was already present.</span><br><span style="color: hsl(0, 100%, 40%);">-     * An already existing SCCP instance would be an indication that this</span><br><span style="color: hsl(0, 100%, 40%);">-    * function has been called twice with the same SS7 instance, which</span><br><span style="color: hsl(0, 100%, 40%);">-      * must not be the case! */</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(ss7->sccp == NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   /* Check if there is already an application server that matches</span><br><span>       * the protocol we intend to use. If not, we will create one. */</span><br><span>     as = osmo_ss7_as_find_by_proto(ss7, prot);</span><br><span>diff --git a/src/sccp_vty.c b/src/sccp_vty.c</span><br><span>index 2727ccc..ffe2cf2 100644</span><br><span>--- a/src/sccp_vty.c</span><br><span>+++ b/src/sccp_vty.c</span><br><span>@@ -140,9 +140,146 @@</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%);">+DEFUN(sccp_timer, sccp_timer_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      NULL, NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_ss7_instance *ss7 = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum osmo_sccp_timer timer = get_string_value(osmo_sccp_timer_names, argv[0]);</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 = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (timer < 0 || timer >= OSMO_SCCP_TIMERS_COUNT) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "%% Invalid timer: %s%s", argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</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%);">+   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 style="color: hsl(120, 100%, 40%);">+      osmo_ss7_ensure_sccp(ss7);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!ss7->sccp) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%% Error: cannot instantiate SCCP instance%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          return CMD_WARNING;</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->sccp->timers[timer] = set_val;</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</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%);">+static const char *osmo_sccp_timer_val_name(const struct osmo_sccp_timer_val *val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       static char buf[16];</span><br><span style="color: hsl(120, 100%, 40%);">+</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 s", 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 style="color: hsl(120, 100%, 40%);">+ return buf;</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%);">+static void gen_sccp_timer_cmd_strs()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *cmd_str = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *doc_str = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(sccp_timer_cmd.string == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(sccp_timer_cmd.doc == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_talloc_asprintf(tall_vty_ctx, cmd_str, "sccp-timer (");</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%);">+                        "Configure SCCP timer values, see ITU-T Q.714\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; osmo_sccp_timer_names[i].str; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct osmo_sccp_timer_val *def;</span><br><span style="color: hsl(120, 100%, 40%);">+                enum osmo_sccp_timer timer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         timer = osmo_sccp_timer_names[i].value;</span><br><span style="color: hsl(120, 100%, 40%);">+               def = &osmo_sccp_timer_defaults[timer];</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(timer >= 0 && timer < OSMO_SCCP_TIMERS_COUNT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_talloc_asprintf(tall_vty_ctx, cmd_str, "%s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                              i ? "|" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                                     osmo_sccp_timer_name(timer));</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_talloc_asprintf(tall_vty_ctx, doc_str, "%s (default: %s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                osmo_sccp_timer_description(timer),</span><br><span style="color: hsl(120, 100%, 40%);">+                                   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 style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_talloc_asprintf(tall_vty_ctx, cmd_str, ") <1-999999> (m|s|ms)");</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_talloc_asprintf(tall_vty_ctx, doc_str, "Timer value\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                      "Timer value unit: minutes\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "Timer value unit: seconds\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "Timer value unit: milliseconds\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sccp_timer_cmd.string = cmd_str;</span><br><span style="color: hsl(120, 100%, 40%);">+      sccp_timer_cmd.doc = doc_str;</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%);">+static void write_sccp_timers(struct vty *vty, const char *indent,</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct osmo_sccp_instance *inst, bool default_if_unset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < ARRAY_SIZE(inst->timers); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                const struct osmo_sccp_timer_val *val = osmo_sccp_timer_get(inst, i, default_if_unset);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!val)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "%ssccp-timer %s %s%s", indent, osmo_sccp_timer_name(i),</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_sccp_timer_val_name(val), VTY_NEWLINE);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    write_sccp_timers(vty, indent, inst, false);</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%);">+DEFUN(show_sccp_timers, show_sccp_timers_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show cs7 instance <0-15> sccp timers",</span><br><span style="color: hsl(120, 100%, 40%);">+       SHOW_STR CS7_STR INST_STR INST_STR</span><br><span style="color: hsl(120, 100%, 40%);">+    "Signaling Connection Control Part\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Show List of SCCP timers\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_ss7_instance *ss7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      ss7 = osmo_ss7_instance_find(id);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ss7) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "No SS7 instance %d found%s", id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</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%);">+   if (!ss7->sccp) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "SS7 instance %d has no SCCP initialized%s", id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_SUCCESS;</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%);">+   write_sccp_timers(vty, "", ss7->sccp, true);</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void osmo_sccp_vty_init(void)</span><br><span> {</span><br><span>       install_element_ve(&show_sccp_users_cmd);</span><br><span>        install_element_ve(&show_sccp_user_ssn_cmd);</span><br><span>     install_element_ve(&show_sccp_connections_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_sccp_timer_cmd_strs();</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element_ve(&show_sccp_timers_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(L_CS7_NODE, &sccp_timer_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 fee97b3..a679c66 100644</span><br><span>--- a/tests/vty/ss7_asp_test.vty</span><br><span>+++ b/tests/vty/ss7_asp_test.vty</span><br><span>@@ -8,6 +8,7 @@</span><br><span>   show cs7 instance <0-15> sccp users</span><br><span>   show cs7 instance <0-15> sccp ssn <0-65535></span><br><span>   show cs7 instance <0-15> sccp connections</span><br><span style="color: hsl(120, 100%, 40%);">+  show cs7 instance <0-15> sccp timers</span><br><span> ... !show cs7</span><br><span> </span><br><span> ss7_asp_vty_test> enable</span><br><span>@@ -21,6 +22,7 @@</span><br><span>   show cs7 instance <0-15> sccp users</span><br><span>   show cs7 instance <0-15> sccp ssn <0-65535></span><br><span>   show cs7 instance <0-15> sccp connections</span><br><span style="color: hsl(120, 100%, 40%);">+  show cs7 instance <0-15> sccp timers</span><br><span> ... !show cs7</span><br><span> </span><br><span> ss7_asp_vty_test# show ?</span><br><span>@@ -57,6 +59,7 @@</span><br><span>   users        Show List of SCCP Users registered</span><br><span>   ssn          Show List of SCCP Users registered</span><br><span>   connections  Show List of SCCP Users registered</span><br><span style="color: hsl(120, 100%, 40%);">+  timers       Show List of SCCP timers</span><br><span> </span><br><span> ss7_asp_vty_test# show cs7 instance 0 sccp ssn ?</span><br><span>   <0-65535></span><br><span>@@ -79,6 +82,7 @@</span><br><span>   no as NAME</span><br><span>   sccp-address NAME</span><br><span>   no sccp-address NAME</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>@@ -90,6 +94,7 @@</span><br><span>   no                 Negate a command or set its defaults</span><br><span>   as                 Configure an Application Server</span><br><span>   sccp-address       Create/Modify an SCCP addressbook entry</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp-timer         Configure SCCP timer values, see ITU-T Q.714</span><br><span> </span><br><span> ss7_asp_vty_test(config-cs7)# description ?</span><br><span>   TEXT  Text until the end of the line</span><br><span>@@ -354,3 +359,92 @@</span><br><span> AS Name      State        Context    Dpc           Si   Opc           Ssn Min   Max</span><br><span> ------------ ------------ ---------- ------------- ---- ------------- --- ----- -----</span><br><span> my-ass       AS_DOWN      0          3.2.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)# do show cs7 instance 0 sccp timers</span><br><span style="color: hsl(120, 100%, 40%);">+SS7 instance 0 has no SCCP initialized</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !sccp-timer</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 ias 5 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%);">+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 style="color: hsl(120, 100%, 40%);">+sccp-timer rel 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer repeat_rel 10 s</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 style="color: hsl(120, 100%, 40%);">+sccp-timer reset 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer reassembly 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !sccp-timer</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</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 ias 7 m</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%);">+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 style="color: hsl(120, 100%, 40%);">+sccp-timer rel 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer repeat_rel 10 s</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 style="color: hsl(120, 100%, 40%);">+sccp-timer reset 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+sccp-timer reassembly 10 s</span><br><span style="color: hsl(120, 100%, 40%);">+ss7_asp_vty_test(config-cs7)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !sccp-timer</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?</span><br><span style="color: hsl(120, 100%, 40%);">+  sccp-timer  Configure SCCP timer values, see ITU-T Q.714</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 ?</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 style="color: hsl(120, 100%, 40%);">+  rel         Waiting for release complete message, 10 to 20 seconds (default: 10 s)</span><br><span style="color: hsl(120, 100%, 40%);">+  repeat_rel  Waiting for release complete message; or to repeat sending released message after the initial expiry, 10 to 20 seconds (default: 10 s)</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 style="color: hsl(120, 100%, 40%);">+  reset       Waiting to release temporary connection section or alert maintenance function after reset request message is sent, 10 to 20 seconds (default: 10 s)</span><br><span style="color: hsl(120, 100%, 40%);">+  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 s)</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 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <1-999999>  Timer value</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: minutes</span><br><span style="color: hsl(120, 100%, 40%);">+  s   Timer value unit: seconds</span><br><span style="color: hsl(120, 100%, 40%);">+  ms  Timer value unit: milliseconds</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 s</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 s</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/11119">change 11119</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/11119"/><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: I28a7362aa838e648ecc9b26ee53dbcade81a9d65 </div>
<div style="display:none"> Gerrit-Change-Number: 11119 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>