<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>