From bb6e4bb6769eb1fc7840e50d0b33126ba7574b29 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 26 Sep 2018 17:12:23 +0200 Subject: make SCCP timers configurable The previous hardcoded SCCP timers may cause SCCP connection releases, if the peer is configured with far lower timers than libosmo-sccp. Testing with a specific SCCPlite MSC, I experienced an iar of just over three minutes, meaning that calls would be cut off by the MSC, since the osmo-bsc failed to send an Inactivity Timer message until seven minutes have passed. With this patch, SCCP timers are configurable by the user. Define constant global default timers, and variable user-configurable timers with each osmo_sccp_instance. Add VTY UI to configure the timers. Users must call osmo_sccp_vty_init() to get the sccp-timer config nodes under the 'cs7' node. Show the new UI in ss7_asp_test.vty. Note that even though this function is not new at all, until recently, all of our SCCP users (osmo-bsc, osmo-msc, osmo-sgsn, osmo-hnbgw) failed to call osmo_sccp_vty_init(), and thus also missed out on the various 'show' commands defined in sccp_vty.c. In other words, to benefit from the timer configurability, the patches to call osmo_sccp_vty_init() must first be merged to the corresponding master branches. If a 'sccp-timer' config command occurs, the cs7 instance must allocate an SCCP instance in order to store the timer config. Do that by calling the recently added osmo_ss7_ensure_sccp() function. Hence 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 invoked twice. Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65 --- src/osmo_ss7_vty.c | 5 ++ src/sccp_internal.h | 38 +++++++++++++ src/sccp_scoc.c | 129 ++++++++++++++++++++++++++++++++++++++------- src/sccp_user.c | 7 --- src/sccp_vty.c | 116 ++++++++++++++++++++++++++++++++++++++++ tests/vty/ss7_asp_test.vty | 59 +++++++++++++++++++++ 6 files changed, 327 insertions(+), 27 deletions(-) diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c index 14539b6..7ef58cf 100644 --- a/src/osmo_ss7_vty.c +++ b/src/osmo_ss7_vty.c @@ -41,6 +41,8 @@ #include #include "sccp_internal.h" +#include "sccp_internal.h" + #define XUA_VAR_STR "(sua|m3ua|ipa)" #define XUA_VAR_HELP_STR \ @@ -1658,6 +1660,9 @@ static void write_one_cs7(struct vty *vty, struct osmo_ss7_instance *inst) /* Append SCCP Addressbook */ write_sccp_addressbook(vty, inst); + + if (inst->sccp) + osmo_sccp_vty_write_cs7_node(vty, " ", inst->sccp); } diff --git a/src/sccp_internal.h b/src/sccp_internal.h index 651862f..000f0f7 100644 --- a/src/sccp_internal.h +++ b/src/sccp_internal.h @@ -7,6 +7,36 @@ #define SCCP_STR "Signalling Connection Control Part\n" +/* 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; +}; + +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 */ @@ -23,6 +53,8 @@ struct osmo_sccp_instance { void *priv; struct osmo_ss7_user ss7_user; + + struct osmo_sccp_timer_val timers[OSMO_SCCP_TIMERS_COUNT]; }; struct osmo_sccp_user { @@ -90,3 +122,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_sccp_instance *inst, + enum osmo_sccp_timer timer, + bool default_if_unset); + +void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst); diff --git a/src/sccp_scoc.c b/src/sccp_scoc.c index 1057be0..8138e43 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_sccp_instance *inst, + 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(inst->timers) + && timer < ARRAY_SIZE(osmo_sccp_timer_defaults)); + + val = &inst->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, timer_name, true); + 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/src/sccp_vty.c b/src/sccp_vty.c index b11fec5..46afb49 100644 --- a/src/sccp_vty.c +++ b/src/sccp_vty.c @@ -141,9 +141,125 @@ DEFUN(show_sccp_connections, show_sccp_connections_cmd, return CMD_SUCCESS; } +/* sccp-timer <1-999999> + * (cmdstr and doc are dynamically generated from osmo_sccp_timer_names.) */ +DEFUN(sccp_timer, sccp_timer_cmd, + NULL, NULL) +{ + struct osmo_ss7_instance *ss7 = vty->index; + enum osmo_sccp_timer timer = get_string_value(osmo_sccp_timer_names, argv[0]); + struct osmo_sccp_timer_val set_val = { .s = atoi(argv[1]) }; + + if (timer < 0 || timer >= OSMO_SCCP_TIMERS_COUNT) { + vty_out(vty, "%% Invalid timer: %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + + osmo_ss7_ensure_sccp(ss7); + if (!ss7->sccp) { + vty_out(vty, "%% Error: cannot instantiate SCCP instance%s", VTY_NEWLINE); + return CMD_WARNING; + } + + ss7->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]; + + snprintf(buf, sizeof(buf), "%u", val->s); + return buf; +} + +static void gen_sccp_timer_cmd_strs(struct cmd_element *cmd) +{ + int i; + char *cmd_str = NULL; + char *doc_str = NULL; + + OSMO_ASSERT(cmd->string == NULL); + OSMO_ASSERT(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>"); + osmo_talloc_asprintf(tall_vty_ctx, doc_str, + "Timer value, in seconds\n"); + + cmd->string = cmd_str; + cmd->doc = doc_str; +} + +static void write_sccp_timers(struct vty *vty, const char *indent, + struct osmo_sccp_instance *inst, bool default_if_unset) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(inst->timers); i++) { + const struct osmo_sccp_timer_val *val = osmo_sccp_timer_get(inst, 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); + } +} + +void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst) +{ + write_sccp_timers(vty, indent, inst, false); +} + +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 *ss7; + + ss7 = osmo_ss7_instance_find(id); + if (!ss7) { + vty_out(vty, "No SS7 instance %d found%s", id, VTY_NEWLINE); + return CMD_WARNING; + } + + if (!ss7->sccp) { + vty_out(vty, "SS7 instance %d has no SCCP initialized%s", id, VTY_NEWLINE); + return CMD_SUCCESS; + } + + write_sccp_timers(vty, "", ss7->sccp, true); + return CMD_SUCCESS; +} + void osmo_sccp_vty_init(void) { install_element_ve(&show_sccp_users_cmd); install_element_ve(&show_sccp_user_ssn_cmd); install_element_ve(&show_sccp_connections_cmd); + + install_element_ve(&show_sccp_timers_cmd); + gen_sccp_timer_cmd_strs(&sccp_timer_cmd); + install_element(L_CS7_NODE, &sccp_timer_cmd); } diff --git a/tests/vty/ss7_asp_test.vty b/tests/vty/ss7_asp_test.vty index 05c7527..cb8dc85 100644 --- a/tests/vty/ss7_asp_test.vty +++ b/tests/vty/ss7_asp_test.vty @@ -8,6 +8,7 @@ ss7_asp_vty_test> list show cs7 instance <0-15> sccp users show cs7 instance <0-15> sccp ssn <0-65535> show cs7 instance <0-15> sccp connections + show cs7 instance <0-15> sccp timers ... !show cs7 ss7_asp_vty_test> enable @@ -21,6 +22,7 @@ ss7_asp_vty_test# list show cs7 instance <0-15> sccp users show cs7 instance <0-15> sccp ssn <0-65535> show cs7 instance <0-15> sccp connections + show cs7 instance <0-15> sccp timers ... !show cs7 ss7_asp_vty_test# show ? @@ -57,6 +59,7 @@ ss7_asp_vty_test# show cs7 instance 0 sccp ? users Show List of SCCP Users registered ssn Find an SCCP User registered for the given SSN connections Show List of active SCCP connections + timers Show List of SCCP timers ss7_asp_vty_test# show cs7 instance 0 sccp ssn ? <0-65535> Subsystem Number (SSN) @@ -79,6 +82,7 @@ ss7_asp_vty_test(config-cs7)# list no as NAME sccp-address NAME no sccp-address NAME + sccp-timer (conn_est|ias|iar|rel|repeat_rel|int|guard|reset|reassembly) <1-999999> ss7_asp_vty_test(config-cs7)# ? ... @@ -90,6 +94,7 @@ ss7_asp_vty_test(config-cs7)# ? no Negate a command or set its defaults as Configure an Application Server sccp-address Create/Modify an SCCP addressbook entry + sccp-timer Configure SCCP timer values, see ITU-T Q.714 ss7_asp_vty_test(config-cs7)# description ? TEXT Text until the end of the line @@ -354,3 +359,57 @@ 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 +SS7 instance 0 has no SCCP initialized + +ss7_asp_vty_test(config-cs7)# show running-config +... !sccp-timer + +ss7_asp_vty_test(config-cs7)# sccp-timer ias 5 +ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers +sccp-timer conn_est 60 +sccp-timer ias 5 +sccp-timer iar 900 +sccp-timer rel 10 +sccp-timer repeat_rel 10 +sccp-timer int 60 +sccp-timer guard 1380 +sccp-timer reset 10 +sccp-timer reassembly 10 +ss7_asp_vty_test(config-cs7)# show running-config +... !sccp-timer + sccp-timer ias 5 +... !sccp-timer + +ss7_asp_vty_test(config-cs7)# sccp-timer ias 420 +ss7_asp_vty_test(config-cs7)# do show cs7 instance 0 sccp timers +sccp-timer conn_est 60 +sccp-timer ias 420 +sccp-timer iar 900 +sccp-timer rel 10 +sccp-timer repeat_rel 10 +sccp-timer int 60 +sccp-timer guard 1380 +sccp-timer reset 10 +sccp-timer reassembly 10 +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: 60) + ias Send keep-alive: on an idle connection, delay before sending an Idle Timer message, 5 to 10 minutes (default: 420) + iar Receive keep-alive: on an idle connection, delay until considering a connection as stale, 11 to 21 minutes (default: 900) + rel Waiting for release complete message, 10 to 20 seconds (default: 10) + repeat_rel Waiting for release complete message; or to repeat sending released message after the initial expiry, 10 to 20 seconds (default: 10) + int Waiting for release complete message; or to release connection resources, freeze the LRN and alert a maintenance function after the initial expiry, extending to 1 minute (default: 60) + guard Waiting to resume normal procedure for temporary connection sections during the restart procedure, 23 to 25 minutes (default: 1380) + reset Waiting to release temporary connection section or alert maintenance function after reset request message is sent, 10 to 20 seconds (default: 10) + 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) + +ss7_asp_vty_test(config-cs7)# sccp-timer conn_est ? + <1-999999> Timer value, in seconds -- cgit v1.2.3