summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-09-26 17:12:23 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2018-09-27 01:25:37 +0200
commit84e1a045f530085e25cbd4cc2768c71ec952a404 (patch)
tree53797fad565a33ac7ec486405a7217f26686befd
parent00cad77feedd1963bad9a3c67ad8e3388e73b505 (diff)
make SCCP timers configurableneels/sccp_timers
Remove the limitation that the SCCP instance must not be populated from the "simple" setup function. If we want to configure SCCP timers beforehand, there must be an SCCP instance for that, and there is no hard reason to require a NULL SCCP instance besides the desire to prevent this function from being invocated twice. Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65
-rw-r--r--include/osmocom/sccp/sccp_types.h20
-rw-r--r--include/osmocom/sigtran/osmo_ss7.h3
-rw-r--r--src/osmo_ss7_vty.c129
-rw-r--r--src/sccp_internal.h16
-rw-r--r--src/sccp_scoc.c129
-rw-r--r--src/sccp_user.c7
-rw-r--r--tests/vty/ss7_asp_test.vty98
7 files changed, 375 insertions, 27 deletions
diff --git a/include/osmocom/sccp/sccp_types.h b/include/osmocom/sccp/sccp_types.h
index ab7f74f..c783298 100644
--- a/include/osmocom/sccp/sccp_types.h
+++ b/include/osmocom/sccp/sccp_types.h
@@ -440,4 +440,24 @@ struct sccp_proto_err {
uint8_t error_cause;
};
+/* Appendix C.4 of Q.714 */
+enum osmo_sccp_timer {
+ OSMO_SCCP_TIMER_CONN_EST,
+ OSMO_SCCP_TIMER_IAS,
+ OSMO_SCCP_TIMER_IAR,
+ OSMO_SCCP_TIMER_REL,
+ OSMO_SCCP_TIMER_REPEAT_REL,
+ OSMO_SCCP_TIMER_INT,
+ OSMO_SCCP_TIMER_GUARD,
+ OSMO_SCCP_TIMER_RESET,
+ OSMO_SCCP_TIMER_REASSEMBLY,
+ /* This must remain the last item: */
+ OSMO_SCCP_TIMERS_COUNT
+};
+
+struct osmo_sccp_timer_val {
+ uint32_t s;
+ uint32_t us;
+};
+
#endif
diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h
index 34d5408..c8e5c92 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -9,6 +9,8 @@
#include <osmocom/core/msgb.h>
#include <osmocom/core/prim.h>
+#include <osmocom/sccp/sccp_types.h>
+
extern struct llist_head osmo_ss7_instances;
struct osmo_ss7_instance;
@@ -99,6 +101,7 @@ struct osmo_ss7_instance {
struct osmo_ss7_pc_fmt pc_fmt;
bool permit_dyn_rkm_alloc;
struct llist_head sccp_address_book;
+ struct osmo_sccp_timer_val sccp_timers[OSMO_SCCP_TIMERS_COUNT];
} cfg;
};
diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c
index 14539b6..eeb4d54 100644
--- a/src/osmo_ss7_vty.c
+++ b/src/osmo_ss7_vty.c
@@ -41,6 +41,8 @@
#include <osmocom/sigtran/sccp_sap.h>
#include "sccp_internal.h"
+#include "sccp_internal.h"
+
#define XUA_VAR_STR "(sua|m3ua|ipa)"
#define XUA_VAR_HELP_STR \
@@ -1595,6 +1597,127 @@ DEFUN(cs7_sccpaddr_gt_digits, cs7_sccpaddr_gt_digits_cmd,
}
/***********************************************************************
+ * SCCP timers
+ ***********************************************************************/
+
+/* sccp-timer <name> <1-999999> (m|s|ms)
+ * (cmdstr and doc are dynamically generated from osmo_sccp_timer_names.) */
+DEFUN(sccp_timer, sccp_timer_cmd,
+ NULL, NULL)
+{
+ struct osmo_ss7_instance *inst = vty->index;
+ enum osmo_sccp_timer timer = get_string_value(osmo_sccp_timer_names, argv[0]);
+ struct osmo_sccp_timer_val set_val = {};
+ int val = atoi(argv[1]);
+ const char *unit = argv[2];
+
+ if (timer < 0 || timer >= OSMO_SCCP_TIMERS_COUNT) {
+ vty_out(vty, "%% Invalid timer: %s%s", argv[0], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ if (!strcmp(unit, "m"))
+ set_val.s = val * 60;
+ else if (!strcmp(unit, "s"))
+ set_val.s = val;
+ else if (!strcmp(unit, "ms")) {
+ set_val.s = val / 1000;
+ set_val.us = (val % 1000) * 1000;
+ }
+
+ inst->cfg.sccp_timers[timer] = set_val;
+ return CMD_SUCCESS;
+}
+
+static const char *osmo_sccp_timer_val_name(const struct osmo_sccp_timer_val *val)
+{
+ static char buf[16];
+
+ if (val->us) {
+ uint32_t ms = val->us / 1000 + val->s * 1000;
+ snprintf(buf, sizeof(buf), "%u ms", ms);
+ } else if (val->s % 60)
+ snprintf(buf, sizeof(buf), "%u s", val->s);
+ else
+ snprintf(buf, sizeof(buf), "%u m", val->s / 60);
+ return buf;
+}
+
+static void gen_sccp_timer_cmd_strs()
+{
+ int i;
+ char *cmd_str = NULL;
+ char *doc_str = NULL;
+
+ OSMO_ASSERT(sccp_timer_cmd.string == NULL);
+ OSMO_ASSERT(sccp_timer_cmd.doc == NULL);
+
+ osmo_talloc_asprintf(tall_vty_ctx, cmd_str, "sccp-timer (");
+ osmo_talloc_asprintf(tall_vty_ctx, doc_str,
+ "Configure SCCP timer values, see ITU-T Q.714\n");
+
+ for (i = 0; osmo_sccp_timer_names[i].str; i++) {
+ const struct osmo_sccp_timer_val *def;
+ enum osmo_sccp_timer timer;
+
+ timer = osmo_sccp_timer_names[i].value;
+ def = &osmo_sccp_timer_defaults[timer];
+ OSMO_ASSERT(timer >= 0 && timer < OSMO_SCCP_TIMERS_COUNT);
+
+ osmo_talloc_asprintf(tall_vty_ctx, cmd_str, "%s%s",
+ i ? "|" : "",
+ osmo_sccp_timer_name(timer));
+ osmo_talloc_asprintf(tall_vty_ctx, doc_str, "%s (default: %s)\n",
+ osmo_sccp_timer_description(timer),
+ osmo_sccp_timer_val_name(def));
+
+
+ }
+
+ osmo_talloc_asprintf(tall_vty_ctx, cmd_str, ") <1-999999> (m|s|ms)");
+ osmo_talloc_asprintf(tall_vty_ctx, doc_str, "Timer value\n"
+ "Timer value unit: minutes\n"
+ "Timer value unit: seconds\n"
+ "Timer value unit: milliseconds\n");
+
+ sccp_timer_cmd.string = cmd_str;
+ sccp_timer_cmd.doc = doc_str;
+}
+
+static void write_sccp_timers(struct vty *vty, const char *indent,
+ struct osmo_ss7_instance *ss7, bool default_if_unset)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(ss7->cfg.sccp_timers); i++) {
+ const struct osmo_sccp_timer_val *val = osmo_sccp_timer_get(ss7, i, default_if_unset);
+ if (!val)
+ continue;
+ vty_out(vty, "%ssccp-timer %s %s%s", indent, osmo_sccp_timer_name(i),
+ osmo_sccp_timer_val_name(val), VTY_NEWLINE);
+ }
+}
+
+DEFUN(show_sccp_timers, show_sccp_timers_cmd,
+ "show cs7 instance <0-15> sccp timers",
+ SHOW_STR CS7_STR INST_STR INST_STR
+ "Signaling Connection Control Part\n"
+ "Show List of SCCP timers\n")
+{
+ int id = atoi(argv[0]);
+ struct osmo_ss7_instance *inst;
+
+ inst = osmo_ss7_instance_find(id);
+ if (!inst) {
+ vty_out(vty, "No SS7 instance %d found%s", id, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ write_sccp_timers(vty, "", inst, true);
+ return CMD_SUCCESS;
+}
+
+/***********************************************************************
* Common
***********************************************************************/
@@ -1658,6 +1781,8 @@ static void write_one_cs7(struct vty *vty, struct osmo_ss7_instance *inst)
/* Append SCCP Addressbook */
write_sccp_addressbook(vty, inst);
+
+ write_sccp_timers(vty, " ", inst, false);
}
@@ -1777,6 +1902,10 @@ static void vty_init_shared(void *ctx)
install_element(L_CS7_NODE, &cs7_pc_delimiter_cmd);
install_element(L_CS7_NODE, &cs7_permit_dyn_rkm_cmd);
+ gen_sccp_timer_cmd_strs();
+ install_element_ve(&show_sccp_timers_cmd);
+ install_element(L_CS7_NODE, &sccp_timer_cmd);
+
install_node(&asp_node, NULL);
install_element_ve(&show_cs7_asp_cmd);
install_element(L_CS7_NODE, &cs7_asp_cmd);
diff --git a/src/sccp_internal.h b/src/sccp_internal.h
index 651862f..d47a945 100644
--- a/src/sccp_internal.h
+++ b/src/sccp_internal.h
@@ -7,6 +7,16 @@
#define SCCP_STR "Signalling Connection Control Part\n"
+extern const struct osmo_sccp_timer_val osmo_sccp_timer_defaults[];
+
+extern const struct value_string osmo_sccp_timer_names[];
+static inline const char *osmo_sccp_timer_name(enum osmo_sccp_timer val)
+{ return get_value_string(osmo_sccp_timer_names, val); }
+
+extern const struct value_string osmo_sccp_timer_descriptions[];
+static inline const char *osmo_sccp_timer_description(enum osmo_sccp_timer val)
+{ return get_value_string(osmo_sccp_timer_descriptions, val); }
+
/* an instance of the SCCP stack */
struct osmo_sccp_instance {
/* entry in global list of ss7 instances */
@@ -90,3 +100,9 @@ struct msgb *sccp_msgb_alloc(const char *name);
struct osmo_fsm sccp_scoc_fsm;
void sccp_scoc_show_connections(struct vty *vty, struct osmo_sccp_instance *inst);
+
+const struct osmo_sccp_timer_val *osmo_sccp_timer_get(const struct osmo_ss7_instance *ss7,
+ enum osmo_sccp_timer timer,
+ bool default_if_unset);
+
+void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_ss7_instance *ss7);
diff --git a/src/sccp_scoc.c b/src/sccp_scoc.c
index 41f8166..76378ee 100644
--- a/src/sccp_scoc.c
+++ b/src/sccp_scoc.c
@@ -64,20 +64,6 @@
#define S(x) (1 << (x))
#define SCU_MSGB_SIZE 1024
-/* Appendix C.4 of Q.714 (all in milliseconds) */
-#define CONNECTION_TIMER ( 1 * 60 * 1000)
-#define TX_INACT_TIMER ( 7 * 60 * 1000) /* RFC 3868 Ch. 8. */
-#define RX_INACT_TIMER (15 * 60 * 1000) /* RFC 3868 Ch. 8. */
-#define RELEASE_TIMER ( 10 * 1000)
-#define RELEASE_REP_TIMER ( 10 * 1000)
-#define INT_TIMER ( 1 * 60 * 1000)
-#define GUARD_TIMER (23 * 60 * 1000)
-#define RESET_TIMER ( 10 * 1000)
-
-/* convert from single value in milliseconds to comma-separated
- * "seconds, microseconds" format we use in osmocom/core/timers.h */
-#define MSEC_TO_S_US(x) (x/1000), ((x%1000)*1000)
-
/***********************************************************************
* SCCP connection table
***********************************************************************/
@@ -235,6 +221,109 @@ static const struct osmo_prim_event_map scu_scoc_event_map[] = {
* Timer Handling
***********************************************************************/
+/* Appendix C.4 of ITU-T Q.714 */
+const struct value_string osmo_sccp_timer_names[] = {
+ { OSMO_SCCP_TIMER_CONN_EST, "conn_est" },
+ { OSMO_SCCP_TIMER_IAS, "ias" },
+ { OSMO_SCCP_TIMER_IAR, "iar" },
+ { OSMO_SCCP_TIMER_REL, "rel" },
+ { OSMO_SCCP_TIMER_REPEAT_REL, "repeat_rel" },
+ { OSMO_SCCP_TIMER_INT, "int" },
+ { OSMO_SCCP_TIMER_GUARD, "guard" },
+ { OSMO_SCCP_TIMER_RESET, "reset" },
+ { OSMO_SCCP_TIMER_REASSEMBLY, "reassembly" },
+ {}
+};
+
+/* Mostly pasted from Appendix C.4 of ITU-T Q.714 (05/2001) -- some of their descriptions are quite
+ * unintelligible out of context, for which we have our own description here. */
+const struct value_string osmo_sccp_timer_descriptions[] = {
+ { OSMO_SCCP_TIMER_CONN_EST,
+ "Waiting for connection confirm message, 1 to 2 minutes" },
+ { OSMO_SCCP_TIMER_IAS,
+ "Send keep-alive: on an idle connection, delay before sending an Idle Timer message,"
+ " 5 to 10 minutes" },
+ { OSMO_SCCP_TIMER_IAR,
+ "Receive keep-alive: on an idle connection, delay until considering a connection as stale,"
+ " 11 to 21 minutes" },
+ { OSMO_SCCP_TIMER_REL,
+ "Waiting for release complete message, 10 to 20 seconds" },
+ { OSMO_SCCP_TIMER_REPEAT_REL,
+ "Waiting for release complete message; or to repeat sending released message after the initial"
+ " expiry, 10 to 20 seconds" },
+ { OSMO_SCCP_TIMER_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" },
+ { OSMO_SCCP_TIMER_GUARD,
+ "Waiting to resume normal procedure for temporary connection sections during the restart"
+ " procedure, 23 to 25 minutes" },
+ { OSMO_SCCP_TIMER_RESET,
+ "Waiting to release temporary connection section or alert maintenance function after reset"
+ " request message is sent, 10 to 20 seconds" },
+ { OSMO_SCCP_TIMER_REASSEMBLY,
+ "Waiting to receive all the segments of the remaining segments, single segmented message after"
+ " receiving the first segment, 10 to 20 seconds" },
+ {}
+};
+
+/* Appendix C.4 of ITU-T Q.714 */
+const struct osmo_sccp_timer_val osmo_sccp_timer_defaults[] = {
+ [OSMO_SCCP_TIMER_CONN_EST] = { .s = 1 * 60, },
+ [OSMO_SCCP_TIMER_IAS] = { .s = 7 * 60, }, /* RFC 3868 Ch. 8. */
+ [OSMO_SCCP_TIMER_IAR] = { .s = 15 * 60, }, /* RFC 3868 Ch. 8. */
+ [OSMO_SCCP_TIMER_REL] = { .s = 10, },
+ [OSMO_SCCP_TIMER_REPEAT_REL] = { .s = 10, },
+ [OSMO_SCCP_TIMER_INT] = { .s = 1 * 60, },
+ [OSMO_SCCP_TIMER_GUARD] = { .s = 23 * 60, },
+ [OSMO_SCCP_TIMER_RESET] = { .s = 10, },
+ [OSMO_SCCP_TIMER_REASSEMBLY] = { .s = 10, },
+};
+
+osmo_static_assert(ARRAY_SIZE(osmo_sccp_timer_defaults) == OSMO_SCCP_TIMERS_COUNT,
+ assert_osmo_sccp_timers_count);
+
+/* Look up an SCCP timer value as configured in the osmo_ss7_instance.
+ * If no user defined value is set, return the global default from osmo_sccp_timer_defaults instead.
+ * However, if default_if_unset is passed false, return NULL in case there is no user defined setting, or
+ * in case it is identical to the global default. */
+const struct osmo_sccp_timer_val *osmo_sccp_timer_get(const struct osmo_ss7_instance *ss7,
+ enum osmo_sccp_timer timer,
+ bool default_if_unset)
+{
+ const struct osmo_sccp_timer_val *val;
+ const struct osmo_sccp_timer_val *def;
+
+ OSMO_ASSERT(timer >= 0
+ && timer < ARRAY_SIZE(ss7->cfg.sccp_timers)
+ && timer < ARRAY_SIZE(osmo_sccp_timer_defaults));
+
+ val = &ss7->cfg.sccp_timers[timer];
+ def = &osmo_sccp_timer_defaults[timer];
+
+ /* Assert that all timer definitions have a sane global default */
+ OSMO_ASSERT(def->s || def->us);
+
+ if (val->s || val->us) {
+ if (!default_if_unset && val->s == def->s && val->us == def->us)
+ return NULL;
+ return val;
+ }
+
+ if (!default_if_unset)
+ return NULL;
+
+ /* If unset, use the global default. */
+ return def;
+}
+
+static void sccp_timer_schedule(const struct sccp_connection *conn,
+ struct osmo_timer_list *timer,
+ enum osmo_sccp_timer timer_name)
+{
+ const struct osmo_sccp_timer_val *val = osmo_sccp_timer_get(conn->inst->ss7, timer_name, false);
+ osmo_timer_schedule(timer, val->s, val->us);
+}
+
/* T(ias) has expired, send a COIT message to the peer */
static void tx_inact_tmr_cb(void *data)
{
@@ -280,13 +369,13 @@ static void conn_tmr_cb(void *data)
/* Re-start the Tx inactivity timer */
static void conn_restart_tx_inact_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_ias, MSEC_TO_S_US(TX_INACT_TIMER));
+ sccp_timer_schedule(conn, &conn->t_ias, OSMO_SCCP_TIMER_IAS);
}
/* Re-start the Rx inactivity timer */
static void conn_restart_rx_inact_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_iar, MSEC_TO_S_US(RX_INACT_TIMER));
+ sccp_timer_schedule(conn, &conn->t_iar, OSMO_SCCP_TIMER_IAR);
}
/* Re-start both Rx and Tx inactivity timers */
@@ -306,19 +395,19 @@ static void conn_stop_inact_timers(struct sccp_connection *conn)
/* Start release timer T(rel) */
static void conn_start_rel_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_rel, MSEC_TO_S_US(RELEASE_TIMER));
+ sccp_timer_schedule(conn, &conn->t_rel, OSMO_SCCP_TIMER_REL);
}
/* Start repeat release timer T(rep_rel) */
static void conn_start_rep_rel_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_rep_rel, MSEC_TO_S_US(RELEASE_REP_TIMER));
+ sccp_timer_schedule(conn, &conn->t_rep_rel, OSMO_SCCP_TIMER_REPEAT_REL);
}
/* Start interval timer T(int) */
static void conn_start_int_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_int, MSEC_TO_S_US(INT_TIMER));
+ sccp_timer_schedule(conn, &conn->t_int, OSMO_SCCP_TIMER_INT);
}
/* Stop all release related timers: T(rel), T(int) and T(rep_rel) */
@@ -332,7 +421,7 @@ static void conn_stop_release_timers(struct sccp_connection *conn)
/* Start connect timer T(conn) */
static void conn_start_connect_timer(struct sccp_connection *conn)
{
- osmo_timer_schedule(&conn->t_conn, MSEC_TO_S_US(CONNECTION_TIMER));
+ sccp_timer_schedule(conn, &conn->t_conn, OSMO_SCCP_TIMER_CONN_EST);
}
/* Stop connect timer T(conn) */
diff --git a/src/sccp_user.c b/src/sccp_user.c
index 020166d..793e08c 100644
--- a/src/sccp_user.c
+++ b/src/sccp_user.c
@@ -396,13 +396,6 @@ osmo_sccp_simple_client_on_ss7_id(void *ctx, uint32_t ss7_id, const char *name,
LOGP(DLSCCP, LOGL_NOTICE, "%s: Using SS7 instance %u, pc:%s\n", name,
ss7->cfg.id, osmo_ss7_pointcode_print(ss7, ss7->cfg.primary_pc));
- /* There must not be an existing SCCP istance, regarless if the simple
- * client has created the SS7 instance or if it was already present.
- * An already existing SCCP instance would be an indication that this
- * function has been called twice with the same SS7 instance, which
- * must not be the case! */
- OSMO_ASSERT(ss7->sccp == NULL);
-
/* Check if there is already an application server that matches
* the protocol we intend to use. If not, we will create one. */
as = osmo_ss7_as_find_by_proto(ss7, prot);
diff --git a/tests/vty/ss7_asp_test.vty b/tests/vty/ss7_asp_test.vty
index fee97b3..3a0eb06 100644
--- a/tests/vty/ss7_asp_test.vty
+++ b/tests/vty/ss7_asp_test.vty
@@ -354,3 +354,101 @@ ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 as all
AS Name State Context Dpc Si Opc Ssn Min Max
------------ ------------ ---------- ------------- ---- ------------- --- ----- -----
my-ass AS_DOWN 0 3.2.1
+
+
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+sccp-timer conn_est 1 m
+sccp-timer ias 7 m
+sccp-timer iar 15 m
+sccp-timer rel 10 s
+sccp-timer repeat_rel 10 s
+sccp-timer int 1 m
+sccp-timer guard 23 m
+sccp-timer reset 10 s
+sccp-timer reassembly 10 s
+
+ss7_asp_vty_test(config-cs7)# show running-config
+... !sccp-timer
+
+ss7_asp_vty_test(config-cs7)# sccp-timer ias 5 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+sccp-timer conn_est 1 m
+sccp-timer ias 5 ms
+sccp-timer iar 15 m
+sccp-timer rel 10 s
+sccp-timer repeat_rel 10 s
+sccp-timer int 1 m
+sccp-timer guard 23 m
+sccp-timer reset 10 s
+sccp-timer reassembly 10 s
+ss7_asp_vty_test(config-cs7)# show running-config
+... !sccp-timer
+cs7 instance 0
+ sccp-timer ias 5 ms
+... !sccp-timer
+
+ss7_asp_vty_test(config-cs7)# sccp-timer ias 7 m
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+sccp-timer conn_est 1 m
+sccp-timer ias 7 m
+sccp-timer iar 15 m
+sccp-timer rel 10 s
+sccp-timer repeat_rel 10 s
+sccp-timer int 1 m
+sccp-timer guard 23 m
+sccp-timer reset 10 s
+sccp-timer reassembly 10 s
+ss7_asp_vty_test(config-cs7)# show running-config
+... !sccp-timer
+
+ss7_asp_vty_test(config-cs7)# sccp-timer?
+ sccp-timer Configure SCCP timer values, see ITU-T Q.714
+
+ss7_asp_vty_test(config-cs7)# sccp-timer ?
+ conn_est Waiting for connection confirm message, 1 to 2 minutes (default: 1 m)
+ ias Send keep-alive: on an idle connection, delay before sending an Idle Timer message, 5 to 10 minutes (default: 7 m)
+ iar Receive keep-alive: on an idle connection, delay until considering a connection as stale, 11 to 21 minutes (default: 15 m)
+ rel Waiting for release complete message, 10 to 20 seconds (default: 10 s)
+ repeat_rel Waiting for release complete message; or to repeat sending released message after the initial expiry, 10 to 20 seconds (default: 10 s)
+ 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)
+ guard Waiting to resume normal procedure for temporary connection sections during the restart procedure, 23 to 25 minutes (default: 23 m)
+ reset Waiting to release temporary connection section or alert maintenance function after reset request message is sent, 10 to 20 seconds (default: 10 s)
+ 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)
+
+ss7_asp_vty_test(config-cs7)# sccp-timer conn_est ?
+ <1-999999> Timer value
+
+ss7_asp_vty_test(config-cs7)# sccp-timer conn_est 1 ?
+ m Timer value unit: minutes
+ s Timer value unit: seconds
+ ms Timer value unit: milliseconds
+
+ss7_asp_vty_test(config-cs7)# sccp-timer iar 1 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+...
+sccp-timer iar 1 ms
+...
+
+ss7_asp_vty_test(config-cs7)# sccp-timer iar 1000 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+...
+sccp-timer iar 1 s
+...
+
+ss7_asp_vty_test(config-cs7)# sccp-timer iar 60000 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+...
+sccp-timer iar 1 m
+...
+
+ss7_asp_vty_test(config-cs7)# sccp-timer iar 60500 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+...
+sccp-timer iar 60500 ms
+...
+
+ss7_asp_vty_test(config-cs7)# sccp-timer iar 65000 ms
+ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers
+...
+sccp-timer iar 65 s
+...