From 03e3e52790056d62bf6eb9d9d67ee0548bab9d24 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 3 Sep 2010 16:17:26 -0400 Subject: [PATCH 001/493] sofia contact changes sangoma media gateway banner --- src/mod/endpoints/mod_sofia/mod_sofia.c | 89 +++++++++++++++++++++++++ src/switch_core.c | 16 ++++- 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 58308225ff..df88106262 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3300,6 +3300,7 @@ SWITCH_STANDARD_API(sofia_contact_function) char *p; sofia_profile_t *profile = NULL; const char *exclude_contact = NULL; + const char *user_replacement = NULL; char *reply = "error/facility_not_subscribed"; if (!cmd) { @@ -3310,6 +3311,7 @@ SWITCH_STANDARD_API(sofia_contact_function) if (session) { switch_channel_t *channel = switch_core_session_get_channel(session); exclude_contact = switch_channel_get_variable(channel, "sip_exclude_contact"); + user_replacement = switch_channel_get_variable(channel, "sip_contact_user_replacement"); } @@ -3388,6 +3390,93 @@ SWITCH_STANDARD_API(sofia_contact_function) reply = "error/user_not_registered"; } + if (user_replacement) { + int urlcount = 0; + int copyerr = 0; + char *newreply = NULL; + char *urlstart = NULL; + char *newptr = NULL; + char *bufend = NULL; + char *str = reply; + switch_size_t copysize = 0; + switch_size_t replacesize = strlen(user_replacement); + switch_size_t allocsize = 0; + + /* first pass to count how many URLs we have */ + while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { + urlcount++; + str = urlstart + 4; + } + + if (!urlcount) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no sip URLs found to replace the user\n"); + copyerr++; + goto copydone; + } + + /* this allocates a bit more than needed but better safe than sorry doing more funky math */ + allocsize = strlen(reply) + (urlcount * replacesize); + newreply = switch_core_session_alloc(session, allocsize); + if (!newreply) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no buffer space available for replacement\n"); + copyerr++; + goto copydone; + } + + /* get a working pointer to the new reply */ + newptr = newreply; + + /* pointer to the end of the allocated buffer for safety checks */ + bufend = newreply + allocsize - 1; + *bufend = 0; + + /* go thru all the urls and replace the user part */ + str = reply; + while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { + + /* found an URL, copy up to the start of the url */ + copysize = ( urlstart - str ) + 4; + + /* double check boundaries before copying anything at all (this should not happen) */ + if ((newptr + copysize + replacesize) >= bufend) { + copyerr++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough!\n"); + break; + } + + /* copy the original contact string except for the user */ + memcpy(newptr, str, copysize); + newptr += copysize; + + /* copy the user replacement */ + memcpy(newptr, user_replacement, replacesize); + newptr += replacesize; + + /* skip the original user part */ + str = strchr(urlstart, '@'); + if (!str) { + copyerr++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): not host part found for contact\n"); + break; + } + /* continue searching for the next sip: URL */ + } + +copydone: + if (!copyerr) { + /* copy the remaining reply string */ + copysize = strlen(str); + if ((newptr + copysize) >= bufend) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough, close, but not enough!\n"); + } else { + strcpy(newptr, str); + reply = newreply; + } + } else { + reply = "error/replacement error"; + } + } + stream->write_function(stream, "%s", reply); reply = NULL; diff --git a/src/switch_core.c b/src/switch_core.c index 4bfc02e655..7fd000a2bd 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1539,7 +1539,7 @@ static void switch_load_core_config(const char *file) SWITCH_DECLARE(const char *) switch_core_banner(void) { - +#if 0 return ("\n" " _____ ______ _____ _____ ____ _ _ \n" " | ___| __ ___ ___/ ___\\ \\ / /_ _|_ _/ ___| | | | \n" @@ -1552,6 +1552,20 @@ SWITCH_DECLARE(const char *) switch_core_banner(void) "* FreeSWITCH (http://www.freeswitch.org) *\n" "* Paypal Donations Appreciated: paypal@freeswitch.org *\n" "* Brought to you by ClueCon http://www.cluecon.com/ *\n" "************************************************************\n" "\n"); +#else + return ( +"\n _____ ___ ___ _ _ _____ _ \n" +"/ ___| | \\/ | | (_) | __ \\ | | \n" +"\\ `--. __ _ _ __ __ _ ___ _ __ ___ __ _ | . . | ___ __| |_ __ _ | | \\/ __ _| |_ _____ ____ _ _ _ \n" +" `--. \\/ _` | '_ \\ / _` |/ _ \\| '_ ` _ \\ / _` | | |\\/| |/ _ \\/ _` | |/ _` | | | __ / _` | __|/ _ \\ \\ /\\ / / _` | | | |\n" +"/\\__/ / (_| | | | | (_| | (_) | | | | | | (_| | | | | | __/ (_| | | (_| | | |_\\ \\ (_| | |_| __/\\ V V / (_| | |_| |\n" +"\\____/ \\__,_|_| |_|\\__, |\\___/|_| |_| |_|\\__,_| \\_| |_/\\___|\\__,_|_|\\__,_| \\____/\\__,_|\\__|\\___| \\_/\\_/ \\__,_|\\__, |\n" +" __/ | __/ |\n" +" |___/ |___/ \n" + "************************************************************\n" + "* Powered by: FreeSWITCH (http://www.freeswitch.org) *\n" + "************************************************************\n" "\n"); +#endif } From 970a3755f319547fd509c1fb4142d06c9885a44e Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 3 Sep 2010 16:52:25 -0400 Subject: [PATCH 002/493] test --- src/switch_profile.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/switch_profile.c b/src/switch_profile.c index f1c2247979..17c1dc1214 100644 --- a/src/switch_profile.c +++ b/src/switch_profile.c @@ -280,6 +280,7 @@ SWITCH_DECLARE(void) switch_delete_profile_timer(switch_profile_timer_t **p) if (!p) return; #ifdef __linux__ + test close((*p)->procfd); #endif free(*p); From 59221a32b93f000d1a0f5036621ac680bc927fa2 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 7 Sep 2010 14:04:52 -0400 Subject: [PATCH 003/493] change versioning information --- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 +- src/switch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index aa2149503a..ab94a00df1 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -88,7 +88,7 @@ typedef struct private_object private_object_t; #define MULTICAST_EVENT "multicast::event" #define SOFIA_REPLACES_HEADER "_sofia_replaces_" -#define SOFIA_USER_AGENT "FreeSWITCH-mod_sofia/" SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO "-" SWITCH_VERSION_REVISION +#define SOFIA_USER_AGENT "SangomaMediaGateway/" SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO "-" SWITCH_VERSION_REVISION #define SOFIA_CHAT_PROTO "sip" #define SOFIA_MULTIPART_PREFIX "sip_mp_" #define SOFIA_MULTIPART_PREFIX_T "~sip_mp_" diff --git a/src/switch.c b/src/switch.c index b59097ac89..e4865757b2 100644 --- a/src/switch.c +++ b/src/switch.c @@ -469,7 +469,7 @@ int main(int argc, char *argv[]) } if (local_argv[x] && !strcmp(local_argv[x], "-version")) { - fprintf(stdout, "FreeSWITCH version: %s\n", SWITCH_VERSION_FULL); + fprintf(stdout, "Sangoma Media Gateway Version: %s\n", SWITCH_VERSION_FULL); return 0; known_opt++; } From 0ecaf2eba2aa8eb1226acebf5f2b54f342759393 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 7 Sep 2010 14:53:17 -0400 Subject: [PATCH 004/493] doh! --- src/switch_profile.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/switch_profile.c b/src/switch_profile.c index 17c1dc1214..f1c2247979 100644 --- a/src/switch_profile.c +++ b/src/switch_profile.c @@ -280,7 +280,6 @@ SWITCH_DECLARE(void) switch_delete_profile_timer(switch_profile_timer_t **p) if (!p) return; #ifdef __linux__ - test close((*p)->procfd); #endif free(*p); From 6f9ae9bd7a46c7ce4b0952c05a263eb31749fbd7 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 7 Sep 2010 15:21:20 -0400 Subject: [PATCH 005/493] more renaming --- src/mod/applications/mod_commands/mod_commands.c | 2 +- src/switch_console.c | 2 +- src/switch_core.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index e1eb2a6b6a..6900c5dc4a 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -73,7 +73,7 @@ SWITCH_STANDARD_API(shutdown_function) SWITCH_STANDARD_API(version_function) { - stream->write_function(stream, "FreeSWITCH Version %s\n", SWITCH_VERSION_FULL); + stream->write_function(stream, "Sangoma Media Gateway Version %s\n", SWITCH_VERSION_FULL); return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_console.c b/src/switch_console.c index 30d1d97fed..60c8ca9345 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -975,7 +975,7 @@ static unsigned char console_f12key(EditLine * el, int ch) char *prompt(EditLine * e) { if (*prompt_str == '\0') { - switch_snprintf(prompt_str, sizeof(prompt_str), "freeswitch@%s> ", hostname); + switch_snprintf(prompt_str, sizeof(prompt_str), "sangoma-media-gateway@%s> ", hostname); } return prompt_str; diff --git a/src/switch_core.c b/src/switch_core.c index 7fd000a2bd..dd12aef908 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1627,7 +1627,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, - "\nFreeSWITCH Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, + "\nSangoma Media Gateway Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, switch_core_session_limit(0), switch_core_sessions_per_second(0), switch_test_flag((&runtime), SCF_USE_SQL) ? "Enabled" : "Disabled"); From 6d4c1b7d1a1a58d541504697088cd8afe3c86df5 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 10 Sep 2010 13:37:33 -0400 Subject: [PATCH 006/493] freetdm: remove iterator free log --- libs/freetdm/src/ftdm_io.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index c774e61901..47d6936c54 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -3603,7 +3603,9 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter) return iter; case FTDM_ITERATOR_CHANS: ftdm_assert_return(iter->pvt.chaniter.index, NULL, "channel iterator index cannot be zero!\n"); - ftdm_assert_return(iter->pvt.chaniter.index <= iter->pvt.chaniter.span->chan_count, NULL, "channel iterator index bigger than span chan count!\n"); + if (iter->pvt.chaniter.index == iter->pvt.chaniter.span->chan_count) { + return NULL; + } iter->pvt.chaniter.index++; return iter; default: @@ -3651,7 +3653,6 @@ FT_DECLARE(ftdm_status_t) ftdm_iterator_free(ftdm_iterator_t *iter) } ftdm_assert_return(iter->type, FTDM_FAIL, "Cannot free invalid iterator\n"); - ftdm_log(FTDM_LOG_DEBUG, "Freeing iterator %p\n", iter); ftdm_safe_free(iter); return FTDM_SUCCESS; From 700fab4c821e980536638fbc704097277fc4976b Mon Sep 17 00:00:00 2001 From: Konrad Hammel Date: Fri, 10 Sep 2010 15:34:13 -0400 Subject: [PATCH 007/493] freetdm: ss7 - switching back to sending RSC rather then GRS at start --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index b5fe619446..70a1a05440 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1249,7 +1249,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) /* throw the pause flag */ sngss7_set_flag(sngss7_info, FLAG_INFID_PAUSED); - +#if 0 /* throw the grp reset flag */ sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX); if (x == 1) { @@ -1257,7 +1257,10 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) sngss7_span->tx_grs.circuit = sngss7_info->circuit->id; sngss7_span->tx_grs.range = span->chan_count -1; } - +#else + /* throw the channel into reset */ + sngss7_set_flag(sngss7_info, FLAG_RESET_TX); +#endif /* throw the channel to suspend */ ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); From 4aac01cfc46913a4ed5d7c3cdcc6d47e6f511f12 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 13 Sep 2010 15:04:55 -0400 Subject: [PATCH 008/493] fs_cli rebranding --- libs/esl/fs_cli.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 91836b7aec..60dd8d8012 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -8,6 +8,7 @@ #include #define CMD_BUFLEN 1024 +#define PROMPT_PREFIX "sangoma-media-gateway" #ifdef WIN32 #define strdup(src) _strdup(src) @@ -811,17 +812,10 @@ static void print_banner(FILE *stream) fprintf(stream, - " _____ ____ ____ _ ___ \n" - " | ___/ ___| / ___| | |_ _| \n" - " | |_ \\___ \\ | | | | | | \n" - " | _| ___) | | |___| |___ | | \n" - " |_| |____/ \\____|_____|___| \n" "\n" "*******************************************************\n" - "* Anthony Minessale II, Ken Rice, Michael Jerris *\n" - "* FreeSWITCH (http://www.freeswitch.org) *\n" - "* Paypal Donations Appreciated: paypal@freeswitch.org *\n" - "* Brought to you by ClueCon http://www.cluecon.com/ *\n" + "* Sangoma Media Gateway *\n" + "* Powered by FreeSWITCH (http://www.freeswitch.org) *\n" "*******************************************************\n" "\n" "Type /help to see a list of commands\n\n\n" @@ -968,13 +962,13 @@ int main(int argc, char *argv[]) int rv = 0; #ifndef WIN32 - char hfile[512] = "/etc/fs_cli_history"; - char cfile[512] = "/etc/fs_cli.conf"; - char dft_cfile[512] = "/etc/fs_cli.conf"; + char hfile[512] = "/etc/smg_cli_history"; + char cfile[512] = "/etc/smg_cli.conf"; + char dft_cfile[512] = "/etc/smg_cli.conf"; #else - char hfile[512] = "fs_cli_history"; - char cfile[512] = "fs_cli.conf"; - char dft_cfile[512] = "fs_cli.conf"; + char hfile[512] = "smg_cli_history"; + char cfile[512] = "smg_cli.conf"; + char dft_cfile[512] = "smg_cli.conf"; #endif char *home = getenv("HOME"); /* Vars for optargs */ @@ -1018,8 +1012,8 @@ int main(int argc, char *argv[]) if (home) { - snprintf(hfile, sizeof(hfile), "%s/.fs_cli_history", home); - snprintf(cfile, sizeof(cfile), "%s/.fs_cli_conf", home); + snprintf(hfile, sizeof(hfile), "%s/.smg_cli_history", home); + snprintf(cfile, sizeof(cfile), "%s/.smg_cli_conf", home); } signal(SIGINT, handle_SIGINT); @@ -1189,12 +1183,12 @@ int main(int argc, char *argv[]) if (argv_host) { if (argv_port && profile->port != 8021) { - snprintf(prompt_str, sizeof(prompt_str), "freeswitch@%s:%u@%s> ", profile->host, profile->port, profile->name); + snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s:%u@%s> ", profile->host, profile->port, profile->name); } else { - snprintf(prompt_str, sizeof(prompt_str), "freeswitch@%s@%s> ", profile->host, profile->name); + snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s@%s> ", profile->host, profile->name); } } else { - snprintf(prompt_str, sizeof(prompt_str), "freeswitch@%s> ", profile->name); + snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s> ", profile->name); } connect: @@ -1320,7 +1314,7 @@ int main(int argc, char *argv[]) print_banner(stdout); - esl_log(ESL_LOG_INFO, "FS CLI Ready.\nenter /help for a list of commands.\n"); + esl_log(ESL_LOG_INFO, "Sangoma Media Gateway CLI Ready.\nenter /help for a list of commands.\n"); printf("%s\n", handle.last_sr_reply); while (running > 0) { From 5a49352a0b79efbb12b3ffd69c1dd9e3302ea488 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 13 Sep 2010 15:15:36 -0400 Subject: [PATCH 009/493] add -base option to modify the base directory --- src/switch.c | 19 ++++++++++++++++++- src/switch_core.c | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/switch.c b/src/switch.c index e4865757b2..ae38ab5fb8 100644 --- a/src/switch.c +++ b/src/switch.c @@ -48,7 +48,7 @@ #include "private/switch_core_pvt.h" /* pid filename: Stores the process id of the freeswitch process */ -#define PIDFILE "freeswitch.pid" +#define PIDFILE "sangoma-media-gateway.pid" static char *pfile = PIDFILE; @@ -346,6 +346,7 @@ int main(int argc, char *argv[]) "\t-stop -- stop freeswitch\n" "\t-nc -- do not output to a console and background\n" "\t-c -- output to a console and stay in the foreground\n" + "\t-base [basedir] -- specify an alternate base dir\n" "\t-conf [confdir] -- specify an alternate config dir\n" "\t-log [logdir] -- specify an alternate log dir\n" "\t-run [rundir] -- specify an alternate run dir\n" @@ -578,6 +579,22 @@ int main(int argc, char *argv[]) known_opt++; } + if (local_argv[x] && !strcmp(local_argv[x], "-base")) { + x++; + if (local_argv[x] && strlen(local_argv[x])) { + SWITCH_GLOBAL_dirs.base_dir = (char *) malloc(strlen(local_argv[x]) + 1); + if (!SWITCH_GLOBAL_dirs.base_dir) { + fprintf(stderr, "Allocation error\n"); + return 255; + } + strcpy(SWITCH_GLOBAL_dirs.base_dir, local_argv[x]); + } else { + fprintf(stderr, "When using -base you must specify a base directory\n"); + return 255; + } + known_opt++; + } + if (local_argv[x] && !strcmp(local_argv[x], "-log")) { x++; if (local_argv[x] && strlen(local_argv[x])) { diff --git a/src/switch_core.c b/src/switch_core.c index dd12aef908..9a4a967447 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -447,6 +447,9 @@ SWITCH_DECLARE(void) switch_core_set_globals(void) base_dir[(lastbacklash - base_dir)] = '\0'; #else char base_dir[1024] = SWITCH_PREFIX_DIR; + if (SWITCH_GLOBAL_dirs.base_dir) { + snprintf(base_dir, sizeof(base_dir), "%s", SWITCH_GLOBAL_dirs.base_dir); + } #endif if (!SWITCH_GLOBAL_dirs.base_dir && (SWITCH_GLOBAL_dirs.base_dir = (char *) malloc(BUFSIZE))) { @@ -1296,6 +1299,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc switch_find_local_ip(guess_ip, sizeof(guess_ip), NULL, AF_INET6); switch_core_set_variable("local_ip_v6", guess_ip); switch_core_set_variable("base_dir", SWITCH_GLOBAL_dirs.base_dir); + switch_core_set_variable("base_logdir", SWITCH_GLOBAL_dirs.log_dir); switch_core_set_variable("recordings_dir", SWITCH_GLOBAL_dirs.recordings_dir); switch_core_set_variable("sound_prefix", SWITCH_GLOBAL_dirs.sounds_dir); switch_core_set_variable("sounds_dir", SWITCH_GLOBAL_dirs.sounds_dir); From 4cabfdbd6b131d26de3cbbea75097beae7c55209 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 13 Sep 2010 15:41:03 -0400 Subject: [PATCH 010/493] do not create some directories automagically --- src/switch_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/switch_core.c b/src/switch_core.c index 9a4a967447..9df50a6eab 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1258,12 +1258,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc switch_dir_make_recursive(SWITCH_GLOBAL_dirs.log_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.run_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.db_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); +#if 0 switch_dir_make_recursive(SWITCH_GLOBAL_dirs.script_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.htdocs_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.grammar_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.recordings_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.sounds_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); switch_dir_make_recursive(SWITCH_GLOBAL_dirs.temp_dir, SWITCH_DEFAULT_DIR_PERMS, runtime.memory_pool); +#endif switch_mutex_init(&runtime.uuid_mutex, SWITCH_MUTEX_NESTED, runtime.memory_pool); From 613e08d352d65bff137ac865e681cb1efc001dd0 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 14 Sep 2010 14:01:22 -0400 Subject: [PATCH 011/493] Increased SQLLEN to 1024*1024 --- src/switch_core_sqldb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index 3a5e0bb6e2..b170b6a4ad 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -35,7 +35,7 @@ #include #include "private/switch_core_pvt.h" -#define SQLLEN 32768 +#define SQLLEN 1024*1024 static struct { switch_cache_db_handle_t *event_db; From 284e30317082da1cddb0f3e4519bc59b3b7709da Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 17 Sep 2010 18:43:50 -0400 Subject: [PATCH 012/493] add switch wrapping support for apr_stat --- src/include/switch_apr.h | 120 +++++++++++++++++++++++++++++++++++++++ src/switch_apr.c | 12 ++++ 2 files changed, 132 insertions(+) diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index f82b81a7f8..84fcb61004 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -647,12 +647,99 @@ SWITCH_DECLARE(switch_status_t) switch_queue_trypush(switch_queue_t *queue, void * @{ */ +/** File types. */ +typedef enum { + SWITCH_NOFILE = 0, /**< no file type determined */ + SWITCH_REG, /**< a regular file */ + SWITCH_DIR, /**< a directory */ + SWITCH_CHR, /**< a character device */ + SWITCH_BLK, /**< a block device */ + SWITCH_PIPE, /**< a FIFO / pipe */ + SWITCH_LNK, /**< a symbolic link */ + SWITCH_SOCK, /**< a [unix domain] socket */ + SWITCH_UNKFILE = 127 /**< a file of some other unknown type */ +} switch_filetype_e; + + /** Structure for referencing files. */ typedef struct apr_file_t switch_file_t; typedef int32_t switch_fileperms_t; typedef int switch_seek_where_t; +/** + * Structure for determining user ownership. + */ +#ifdef WIN32 +typedef PSID switch_uid_t; +#else +typedef uid_t switch_uid_t; +#endif + +/** + * Structure for determining group ownership. + */ +#ifdef WIN32 +typedef PSID switch_gid_t; +#else +typedef gid_t switch_gid_t; +#endif + +#ifdef WIN32 + typedef uint32_t switch_dev_t; + typedef uint64_t switch_ino_t; +#else + typedef ino_t switch_ino_t; + typedef dev_t switch_dev_t; +#endif + typedef off_t switch_off_t; + +/** + * Structure for referencing file information + */ +//typedef struct apr_stat_t switch_finfo_t; +typedef struct { + /** Allocates memory and closes lingering handles in the specified pool */ + switch_memory_pool_t *pool; + /** The bitmask describing valid fields of this switch_finfo_t structure + * including all available 'wanted' fields and potentially more */ + int32_t valid; + /** The access permissions of the file. Mimics Unix access rights. */ + switch_fileperms_t protection; + /** The type of file. One of APR_REG, APR_DIR, APR_CHR, APR_BLK, APR_PIPE, + * APR_LNK or APR_SOCK. If the type is undetermined, the value is APR_NOFILE. + * If the type cannot be determined, the value is APR_UNKFILE. + */ + switch_filetype_e filetype; + /** The user id that owns the file */ + switch_uid_t user; + /** The group id that owns the file */ + switch_gid_t group; + /** The inode of the file. */ + switch_ino_t inode; + /** The id of the device the file is on. */ + switch_dev_t device; + /** The number of hard links to the file. */ + int32_t nlink; + /** The size of the file */ + switch_off_t size; + /** The storage size consumed by the file */ + switch_off_t csize; + /** The time the file was last accessed */ + switch_time_t atime; + /** The time the file was last modified */ + switch_time_t mtime; + /** The time the file was created, or the inode was last changed */ + switch_time_t ctime; + /** The pathname of the file (possibly unrooted) */ + const char *fname; + /** The file's name (no path) in filesystem case */ + const char *name; + /** The file's handle, if accessed (can be submitted to apr_duphandle) */ + switch_file_t *filehand; +} switch_finfo_t; + + /** * @defgroup apr_file_seek_flags File Seek Flags * @{ @@ -739,6 +826,37 @@ SWITCH_DECLARE(switch_status_t) switch_queue_trypush(switch_queue_t *queue, void #define SWITCH_FOPEN_LARGEFILE 0x04000 /**< Platform dependent flag to enable large file support */ /** @} */ +/** + * @defgroup switch_file_stat flags + * @ingroup switch_file_io + * @{ + */ +#define SWITCH_FINFO_LINK 0x00000001 /**< Stat the link not the file itself if it is a link */ +#define SWITCH_FINFO_MTIME 0x00000010 /**< Modification Time */ +#define SWITCH_FINFO_CTIME 0x00000020 /**< Creation or inode-changed time */ +#define SWITCH_FINFO_ATIME 0x00000040 /**< Access Time */ +#define SWITCH_FINFO_SIZE 0x00000100 /**< Size of the file */ +#define SWITCH_FINFO_CSIZE 0x00000200 /**< Storage size consumed by the file */ +#define SWITCH_FINFO_DEV 0x00001000 /**< Device */ +#define SWITCH_FINFO_INODE 0x00002000 /**< Inode */ +#define SWITCH_FINFO_NLINK 0x00004000 /**< Number of links */ +#define SWITCH_FINFO_TYPE 0x00008000 /**< Type */ +#define SWITCH_FINFO_USER 0x00010000 /**< User */ +#define SWITCH_FINFO_GROUP 0x00020000 /**< Group */ +#define SWITCH_FINFO_UPROT 0x00100000 /**< User protection bits */ +#define SWITCH_FINFO_GPROT 0x00200000 /**< Group protection bits */ +#define SWITCH_FINFO_WPROT 0x00400000 /**< World protection bits */ +#define SWITCH_FINFO_ICASE 0x01000000 /**< if dev is case insensitive */ +#define SWITCH_FINFO_NAME 0x02000000 /**< ->name in proper case */ + +#define SWITCH_FINFO_MIN 0x00008170 /**< type, mtime, ctime, atime, size */ +#define SWITCH_FINFO_IDENT 0x00003000 /**< dev and inode */ +#define SWITCH_FINFO_OWNER 0x00030000 /**< user and group */ +#define SWITCH_FINFO_PROT 0x00700000 /**< all protections */ +#define SWITCH_FINFO_NORM 0x0073b170 /**< an atomic unix apr_stat() */ +#define SWITCH_FINFO_DIRENT 0x02000000 /**< an atomic unix apr_dir_read() */ +/** @} */ + /** * Open the specified file. * @param newf The opened file descriptor. @@ -782,6 +900,8 @@ SWITCH_DECLARE(switch_status_t) switch_file_seek(switch_file_t *thefile, switch_ SWITCH_DECLARE(switch_status_t) switch_file_copy(const char *from_path, const char *to_path, switch_fileperms_t perms, switch_memory_pool_t *pool); +SWITCH_DECLARE(switch_status_t) switch_file_stat(switch_finfo_t *finfo, const char *fname, int32_t wanted, switch_memory_pool_t *pool); + /** * Close the specified file. * @param thefile The file descriptor to close. diff --git a/src/switch_apr.c b/src/switch_apr.c index bdff179b4a..b0f736720f 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -416,6 +416,18 @@ SWITCH_DECLARE(switch_status_t) switch_file_copy(const char *from_path, const ch return apr_file_copy(from_path, to_path, perms, pool); } +SWITCH_DECLARE(switch_status_t) switch_file_stat(switch_finfo_t *finfo, const char *fname, int32_t wanted, switch_memory_pool_t *pool) +{ + apr_status_t status; + apr_finfo_t aprinfo; + if (sizeof(*finfo) != sizeof(aprinfo)) { + return SWITCH_STATUS_MEMERR; + } + status = apr_stat(&aprinfo, fname, wanted, pool); + memcpy(finfo, &aprinfo, sizeof(*finfo)); + return status; +} + SWITCH_DECLARE(switch_status_t) switch_file_close(switch_file_t *thefile) { From b106d590bcad3976a30fc358c81ecc6e650484ec Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 17 Sep 2010 18:46:09 -0400 Subject: [PATCH 013/493] add support for deleting old logfiles (maxfilecount parameter for mod_logfile) --- src/mod/loggers/mod_logfile/mod_logfile.c | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/mod/loggers/mod_logfile/mod_logfile.c b/src/mod/loggers/mod_logfile/mod_logfile.c index 8cdaf9615a..77fcfe09bd 100644 --- a/src/mod/loggers/mod_logfile/mod_logfile.c +++ b/src/mod/loggers/mod_logfile/mod_logfile.c @@ -53,6 +53,7 @@ struct logfile_profile { char *name; switch_size_t log_size; /* keep the log size in check for rotation */ switch_size_t roll_size; /* the size that we want to rotate the file at */ + uint32_t max_file_count; /* Max number of log files */ char *logfile; switch_file_t *log_afd; switch_hash_t *log_hash; @@ -114,6 +115,8 @@ static switch_status_t mod_logfile_openlogfile(logfile_profile_t *profile, switc static switch_status_t mod_logfile_rotate(logfile_profile_t *profile) { unsigned int i = 0; + unsigned int fcount = 0; + const char *fname = NULL; char *filename = NULL; switch_status_t stat = 0; int64_t offset = 0; @@ -121,6 +124,15 @@ static switch_status_t mod_logfile_rotate(logfile_profile_t *profile) switch_time_exp_t tm; char date[80] = ""; switch_size_t retsize; + char *dend = NULL; + char *hay = NULL; + switch_dir_t *dirhandle = NULL; + switch_time_t wtime = 0; + char dirname[128]; + char filebuf[128]; + char fullfile[512]; + char filetodelete[128]; + switch_finfo_t statinfo; switch_status_t status = SWITCH_STATUS_SUCCESS; switch_mutex_lock(globals.mutex); @@ -157,6 +169,54 @@ static switch_status_t mod_logfile_rotate(logfile_profile_t *profile) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "New log started.\n"); + if (profile->max_file_count) { + switch_copy_string(dirname, profile->logfile, sizeof(dirname)); + dend = strstr(dirname, SWITCH_PATH_SEPARATOR); + if (dend) { + dend++; + while ((hay = strstr(dend, SWITCH_PATH_SEPARATOR))) { + hay += strlen(SWITCH_PATH_SEPARATOR); + dend = hay; + } + *dend = '\0'; +scanning: + status = switch_dir_open(&dirhandle, dirname, pool); + if (status != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open directory: %s\n", dirname); + goto end; + } + + wtime = switch_time_now(); + while ((fname = switch_dir_next_file(dirhandle, filebuf, sizeof(filebuf)))) { + memset(&statinfo, 0, sizeof(statinfo)); + snprintf(fullfile, sizeof(fullfile), "%s%s", dirname, fname); + if (strstr(fullfile, profile->logfile)) { + if (switch_file_stat(&statinfo, fullfile, SWITCH_FINFO_CTIME, pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to stat file %s\n", fullfile); + continue; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "File: %s has stat %llu, size = %llu\n", fullfile, (unsigned long long)statinfo.ctime, (unsigned long long)statinfo.size); + if (statinfo.ctime < wtime) { + switch_copy_string(filetodelete, fullfile, sizeof(filetodelete)); + wtime = statinfo.ctime; + } + fcount++; + } + } + if (fcount > profile->max_file_count) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting old logfile: %s\n", filetodelete); + switch_file_remove(filetodelete, pool); + fcount--; + } + switch_dir_close(dirhandle); + if (fcount > profile->max_file_count) { + goto scanning; + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "No separator %s found in %s\n", SWITCH_PATH_SEPARATOR, dirname); + } + } + end: if (pool) { @@ -271,6 +331,11 @@ static switch_status_t load_profile(switch_xml_t xml) if (new_profile->roll_size < 0) { new_profile->roll_size = 0; } + } else if (!strcmp(var, "maxfilecount")) { + new_profile->max_file_count = atoi(val); + if (new_profile->max_file_count < 1) { + new_profile->max_file_count = 1; + } } else if (!strcmp(var, "uuid") && switch_true(val)) { new_profile->log_uuid = SWITCH_TRUE; } From 85f405703d1fdd8d32d73eb2ba09a91b4bc6e199 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 28 Sep 2010 10:47:16 -0400 Subject: [PATCH 014/493] freetdm: stop scheduler but do not destroy it until the very end --- libs/freetdm/src/ftdm_io.c | 19 ++++++++----------- libs/freetdm/src/ftdm_sched.c | 18 ++++++++++++++++++ libs/freetdm/src/include/private/ftdm_sched.h | 3 +++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 299106f599..79d55c4d16 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -4932,16 +4932,19 @@ FT_DECLARE(uint32_t) ftdm_running(void) FT_DECLARE(ftdm_status_t) ftdm_global_destroy(void) { ftdm_span_t *sp; - uint32_t sanity = 100; time_end(); + /* many freetdm event loops rely on this variable to decide when to stop, do this first */ globals.running = 0; - ftdm_sched_destroy(&globals.timingsched); + /* stop the scheduling thread */ + ftdm_free_sched_stop(); + /* stop the cpu monitor thread */ ftdm_cpu_monitor_stop(); + /* now destroy channels and spans */ globals.span_index = 0; ftdm_span_close_all(); @@ -4966,18 +4969,12 @@ FT_DECLARE(ftdm_status_t) ftdm_global_destroy(void) globals.spans = NULL; ftdm_mutex_unlock(globals.span_mutex); + /* destroy signaling and io modules */ ftdm_unload_modules(); - while (ftdm_free_sched_running() && --sanity) { - ftdm_log(FTDM_LOG_DEBUG, "Waiting for schedule thread to finish\n"); - ftdm_sleep(100); - } - - if (!sanity) { - ftdm_log(FTDM_LOG_CRIT, "schedule thread did not stop running, we may crash on shutdown\n"); - } - + /* finally destroy the globals */ ftdm_mutex_lock(globals.mutex); + ftdm_sched_destroy(&globals.timingsched); hashtable_destroy(globals.interface_hash); hashtable_destroy(globals.module_hash); hashtable_destroy(globals.span_hash); diff --git a/libs/freetdm/src/ftdm_sched.c b/libs/freetdm/src/ftdm_sched.c index be21696d71..47df7d973c 100644 --- a/libs/freetdm/src/ftdm_sched.c +++ b/libs/freetdm/src/ftdm_sched.c @@ -176,6 +176,24 @@ FT_DECLARE(ftdm_bool_t) ftdm_free_sched_running(void) return sched_globals.running; } +FT_DECLARE(ftdm_bool_t) ftdm_free_sched_stop(void) +{ + /* currently we really dont stop the thread here, we rely on freetdm being shutdown and ftdm_running() to be false + * so the scheduling thread dies and we just wait for it here */ + uint32_t sanity = 100; + while (ftdm_free_sched_running() && --sanity) { + ftdm_log(FTDM_LOG_DEBUG, "Waiting for main schedule thread to finish\n"); + ftdm_sleep(100); + } + + if (!sanity) { + ftdm_log(FTDM_LOG_CRIT, "schedule thread did not stop running, we may crash on shutdown\n"); + return FTDM_FALSE; + } + + return FTDM_TRUE; +} + FT_DECLARE(ftdm_status_t) ftdm_sched_create(ftdm_sched_t **sched, const char *name) { ftdm_sched_t *newsched = NULL; diff --git a/libs/freetdm/src/include/private/ftdm_sched.h b/libs/freetdm/src/include/private/ftdm_sched.h index 9a222896f5..c1818d8bb5 100644 --- a/libs/freetdm/src/include/private/ftdm_sched.h +++ b/libs/freetdm/src/include/private/ftdm_sched.h @@ -95,6 +95,9 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_global_init(void); /*! \brief Checks if the main scheduling thread is running */ FT_DECLARE(ftdm_bool_t) ftdm_free_sched_running(void); +/*! \brief Stop the main scheduling thread (if running) */ +FT_DECLARE(ftdm_bool_t) ftdm_free_sched_stop(void); + #ifdef __cplusplus } #endif From a165917a3d7c5d9d6981c39b6bb1f4440dd053d0 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 30 Sep 2010 08:04:45 -0700 Subject: [PATCH 015/493] Fix for structure size mismatch in switch_file_stat --- src/include/switch_apr.h | 2 +- src/switch_apr.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index 84fcb61004..b049c05d40 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -692,7 +692,7 @@ typedef gid_t switch_gid_t; typedef ino_t switch_ino_t; typedef dev_t switch_dev_t; #endif - typedef off_t switch_off_t; + typedef off64_t switch_off_t; /** * Structure for referencing file information diff --git a/src/switch_apr.c b/src/switch_apr.c index b0f736720f..9a46b112c6 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -421,6 +421,7 @@ SWITCH_DECLARE(switch_status_t) switch_file_stat(switch_finfo_t *finfo, const ch apr_status_t status; apr_finfo_t aprinfo; if (sizeof(*finfo) != sizeof(aprinfo)) { + fprintf(stderr, "Error:structure file mismatch switch_finfo_t:%u apr_finfo_t:%u\n", sizeof(*finfo), sizeof(aprinfo)); return SWITCH_STATUS_MEMERR; } status = apr_stat(&aprinfo, fname, wanted, pool); From 8c4cc6d95bbc6a48dc96d15ede069c861c020fe5 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 30 Sep 2010 13:49:40 -0400 Subject: [PATCH 016/493] Fix for compilation issue, introduced in previous commit --- src/switch_apr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_apr.c b/src/switch_apr.c index 9a46b112c6..bc1af4678b 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -421,7 +421,7 @@ SWITCH_DECLARE(switch_status_t) switch_file_stat(switch_finfo_t *finfo, const ch apr_status_t status; apr_finfo_t aprinfo; if (sizeof(*finfo) != sizeof(aprinfo)) { - fprintf(stderr, "Error:structure file mismatch switch_finfo_t:%u apr_finfo_t:%u\n", sizeof(*finfo), sizeof(aprinfo)); + fprintf(stderr, "Error:structure file mismatch switch_finfo_t:%zd apr_finfo_t:%zd\n", sizeof(*finfo), sizeof(aprinfo)); return SWITCH_STATUS_MEMERR; } status = apr_stat(&aprinfo, fname, wanted, pool); From a00f7ccd9428bc24144048c5cca24334557baf25 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 30 Sep 2010 14:50:02 -0700 Subject: [PATCH 017/493] Fix for compilation error --- src/switch_apr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_apr.c b/src/switch_apr.c index 9a46b112c6..bc1af4678b 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -421,7 +421,7 @@ SWITCH_DECLARE(switch_status_t) switch_file_stat(switch_finfo_t *finfo, const ch apr_status_t status; apr_finfo_t aprinfo; if (sizeof(*finfo) != sizeof(aprinfo)) { - fprintf(stderr, "Error:structure file mismatch switch_finfo_t:%u apr_finfo_t:%u\n", sizeof(*finfo), sizeof(aprinfo)); + fprintf(stderr, "Error:structure file mismatch switch_finfo_t:%zd apr_finfo_t:%zd\n", sizeof(*finfo), sizeof(aprinfo)); return SWITCH_STATUS_MEMERR; } status = apr_stat(&aprinfo, fname, wanted, pool); From 63533ed0ae6f46973756fedebeb65619d2cdf339 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 30 Sep 2010 11:41:47 -0400 Subject: [PATCH 018/493] Fix for not handling a call state Fix for MSN on BRI --- .../ftmod_sangoma_isdn/ftmod_sangoma_isdn.c | 15 ++++-- .../ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 7 ++- .../ftmod_sangoma_isdn_cfg.c | 18 +++++++ .../ftmod_sangoma_isdn_stack_hndl.c | 54 +++++++++++++++---- .../ftmod_sangoma_isdn_stack_rcv.c | 2 +- .../ftmod_sangoma_isdn_support.c | 6 ++- 6 files changed, 83 insertions(+), 19 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c index 08f340dc83..0ed5902153 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c @@ -726,7 +726,7 @@ static FIO_SPAN_SET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_set_span_sig_status) } static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span) -{ +{ ftdm_log(FTDM_LOG_INFO,"Starting span %s:%u.\n",span->name,span->span_id); if (sng_isdn_stack_start(span) != FTDM_SUCCESS) { ftdm_log(FTDM_LOG_CRIT, "Failed to start span %s\n", span->name); @@ -747,9 +747,11 @@ static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span) } static ftdm_status_t ftdm_sangoma_isdn_stop(ftdm_span_t *span) -{ +{ ftdm_iterator_t *chaniter = NULL; ftdm_iterator_t *curr = NULL; + unsigned i; + sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data; ftdm_log(FTDM_LOG_INFO, "Stopping span %s\n", span->name); /* throw the STOP_THREAD flag to signal monitor thread stop */ @@ -772,8 +774,13 @@ static ftdm_status_t ftdm_sangoma_isdn_stop(ftdm_span_t *span) } ftdm_iterator_free(chaniter); - ftdm_sched_destroy(&((sngisdn_span_data_t*)span->signal_data)->sched); - ftdm_queue_destroy(&((sngisdn_span_data_t*)span->signal_data)->event_queue); + ftdm_sched_destroy(&signal_data->sched); + ftdm_queue_destroy(&signal_data->event_queue); + for (i = 0 ; i < signal_data->num_local_numbers ; i++) { + if (signal_data->local_numbers[i] != NULL) { + ftdm_safe_free(signal_data->local_numbers[i]); + } + } ftdm_safe_free(span->signal_data); ftdm_log(FTDM_LOG_DEBUG, "Finished stopping span %s\n", span->name); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index ae6c0d92f7..bc928354a7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -55,6 +55,7 @@ #define NUM_BRI_CHANNELS_PER_SPAN 2 #define SNGISDN_EVENT_QUEUE_SIZE 100 #define SNGISDN_EVENT_POLL_RATE 100 +#define SNGISDN_NUM_LOCAL_NUMBERS 8 /* TODO: rename all *_cc_* to *_an_* */ @@ -161,7 +162,7 @@ typedef struct sngisdn_chan_data { /* Span specific data */ typedef struct sngisdn_span_data { - ftdm_span_t *ftdm_span; + ftdm_span_t *ftdm_span; uint8_t link_id; uint8_t switchtype; uint8_t signalling; /* SNGISDN_SIGNALING_CPE or SNGISDN_SIGNALING_NET */ @@ -175,7 +176,9 @@ typedef struct sngisdn_span_data { uint8_t setup_arb; uint8_t facility; int8_t facility_timeout; - ftdm_sched_t *sched; + uint8_t num_local_numbers; + char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS]; + ftdm_sched_t *sched; ftdm_queue_t *event_queue; } sngisdn_span_data_t; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c index 361b389f96..64d7a2403f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c @@ -36,9 +36,23 @@ ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span); ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span); +ftdm_status_t add_local_number(const char* val, ftdm_span_t *span); extern ftdm_sngisdn_data_t g_sngisdn_data; +ftdm_status_t add_local_number(const char* val, ftdm_span_t *span) +{ + sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data; + + if (signal_data->num_local_numbers >= SNGISDN_NUM_LOCAL_NUMBERS) { + ftdm_log(FTDM_LOG_ERROR, "%s: Maximum number of local-numbers exceeded (max:%d)\n", span->name, SNGISDN_NUM_LOCAL_NUMBERS); + return FTDM_FAIL; + } + + signal_data->local_numbers[signal_data->num_local_numbers++] = ftdm_strdup(val); + return FTDM_SUCCESS; +} + ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span) { unsigned i; @@ -253,6 +267,10 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_ ftdm_span_set_bearer_capability(val, &span->default_caller_data.bearer_capability); } else if (!strcasecmp(var, "outbound-bearer_layer1")) { ftdm_span_set_bearer_layer1(val, &span->default_caller_data.bearer_layer1); + } else if (!strcasecmp(var, "local-number")) { + if (add_local_number(val, span) != FTDM_SUCCESS) { + return FTDM_FAIL; + } } else if (!strcasecmp(var, "facility-timeout")) { signal_data->facility_timeout = atoi(val); if (signal_data->facility_timeout < 0) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c index b7af8e98c5..827647f1f6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c @@ -43,7 +43,7 @@ extern ftdm_status_t cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Displ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) { ISDN_FUNC_TRACE_ENTER(__FUNCTION__); - + unsigned i; int16_t suId = sngisdn_event->suId; uint32_t suInstId = sngisdn_event->suInstId; uint32_t spInstId = sngisdn_event->spInstId; @@ -57,7 +57,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) ftdm_assert(!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE), "State change flag pending\n"); ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_DEBUG, "Processing SETUP (suId:%u suInstId:%u spInstId:%u)\n", suId, suInstId, spInstId); - + switch (ftdmchan->state) { case FTDM_CHANNEL_STATE_DOWN: /* Proper state to receive a SETUP */ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE) || @@ -80,11 +80,35 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) sngisdn_info->suInstId = get_unique_suInstId(suId); sngisdn_info->spInstId = spInstId; + if (conEvnt->cdPtyNmb.eh.pres && signal_data->num_local_numbers) { + uint8_t local_number_matched = 0; + for (i = 0 ; i < signal_data->num_local_numbers ; i++) { + if (!strcmp(signal_data->local_numbers[i], (char*)conEvnt->cdPtyNmb.nmbDigits.val)) { + local_number_matched++; + break; + } + } + if (!local_number_matched) { + ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Received SETUP, but local-number %s does not match - ignoring\n", conEvnt->cdPtyNmb.nmbDigits.val); + /* Special case to tell the stack to clear all internal resources about this call. We will no receive any event for this call after sending disconnect request */ + ftdmchan->caller_data.hangup_cause = IN_CCNORTTODEST; + ftdm_sched_timer(signal_data->sched, "delayed_disconnect", 1, sngisdn_delayed_disconnect, (void*) sngisdn_info, NULL); + return; + } + } + /* If this is a glared call that was previously saved, we moved all the info to the current call, so clear the glared saved data */ if (sngisdn_info->glare.spInstId == spInstId) { clear_call_glare_data(sngisdn_info); - } + } + + + if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) { + if (signal_data->signalling == SNGISDN_SIGNALING_NET) { + sngisdn_info->ces = ces; + } + } ftdm_mutex_lock(g_sngisdn_data.ccs[suId].mutex); g_sngisdn_data.ccs[suId].active_suInstIds[sngisdn_info->suInstId] = sngisdn_info; @@ -92,11 +116,6 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND); - if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP && - signal_data->signalling == SNGISDN_SIGNALING_NET) { - sngisdn_info->ces = ces; - } - /* try to open the channel */ if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to open channel"); @@ -122,14 +141,13 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) ftdmchan->caller_data.bearer_layer1 = sngisdn_get_infoTranCap_from_stack(conEvnt->bearCap[0].usrInfoLyr1Prot.val); ftdmchan->caller_data.bearer_capability = sngisdn_get_infoTranCap_from_stack(conEvnt->bearCap[0].infoTranCap.val); } - + if (signal_data->switchtype == SNGISDN_SWITCH_NI2) { if (conEvnt->shift11.eh.pres && conEvnt->ni2OctStr.eh.pres) { if (conEvnt->ni2OctStr.str.len == 4 && conEvnt->ni2OctStr.str.val[0] == 0x37) { snprintf(ftdmchan->caller_data.aniII, 5, "%.2d", conEvnt->ni2OctStr.str.val[3]); } } - if (signal_data->facility == SNGISDN_OPT_TRUE && conEvnt->facilityStr.eh.pres) { /* Verify whether the Caller Name will come in a subsequent FACILITY message */ @@ -260,6 +278,10 @@ void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event) case FTDM_CHANNEL_STATE_DIALING: ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); break; + case FTDM_CHANNEL_STATE_HANGUP_COMPLETE: + case FTDM_CHANNEL_STATE_HANGUP: + /* Race condition, we just hung up the call - ignore this message */ + break; default: ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Processing CONNECT/CONNECT ACK in an invalid state (%s)\n", ftdm_channel_state2str(ftdmchan->state)); @@ -274,7 +296,7 @@ void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event) /* do nothing */ break; case FTDM_CHANNEL_STATE_HANGUP_COMPLETE: - /* We just hung up an incoming call right after we sent a CONNECT so ignore this message */ + /* Race condition, We just hung up an incoming call right after we sent a CONNECT - ignore this message */ break; default: ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Processing CONNECT/CONNECT ACK in an invalid state (%s)\n", ftdm_channel_state2str(ftdmchan->state)); @@ -923,6 +945,16 @@ void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event) break; } break; + case 12: /* We received a disconnect indication */ + switch (ftdmchan->state) { + case FTDM_CHANNEL_STATE_TERMINATING: + /* We are already waiting for user app to handle the disconnect, do nothing */ + break; + default: + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Don't know how to handle incompatible state. remote call state:%d our state:%s\n", call_state, ftdm_channel_state2str(ftdmchan->state)); + break; + } + break; case 22: switch (ftdmchan->state) { case FTDM_CHANNEL_STATE_UP: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c index 791c6b7d8c..9bf60537fe 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c @@ -706,7 +706,7 @@ void sngisdn_rcv_q931_ind(InMngmt *status) ftdm_span_t *ftdmspan; sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[status->t.usta.suId]; if (!signal_data) { - ftdm_log(FTDM_LOG_INFO, "Received q921 status on unconfigured span (lnkNmb:%d)\n", status->t.usta.suId); + ftdm_log(FTDM_LOG_INFO, "Received q931 status on unconfigured span (lnkNmb:%d)\n", status->t.usta.suId); return; } ftdmspan = signal_data->ftdm_span; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c index db22fe5ce8..691e3104c0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c @@ -424,11 +424,15 @@ void sngisdn_delayed_disconnect(void* p_sngisdn_info) sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data; ftdm_mutex_lock(ftdmchan->mutex); - if (ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) { + if (ftdmchan->caller_data.hangup_cause == IN_CCNORTTODEST || ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) { ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Sending delayed DISCONNECT (suId:%d suInstId:%u spInstId:%u)\n", signal_data->cc_id, sngisdn_info->glare.spInstId, sngisdn_info->glare.suInstId); sngisdn_snd_disconnect(ftdmchan); + if (ftdmchan->caller_data.hangup_cause == IN_CCNORTTODEST) { + ftdm_channel_t *close_chan = ftdmchan; + ftdm_channel_close(&close_chan); + } } ftdm_mutex_unlock(ftdmchan->mutex); From 4a9edf679fd0bc21655c43a111974309036fa0c4 Mon Sep 17 00:00:00 2001 From: Konrad Hammel Date: Thu, 10 Feb 2011 16:26:40 -0500 Subject: [PATCH 019/493] bug fix for mod_sofia, sofia_contact_user_replacement was off by 1 when replacing the dialed number causing it to not copy anything --- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 8f1a374aa4..8e31e13864 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3588,7 +3588,7 @@ SWITCH_STANDARD_API(sofia_contact_function) newptr = newreply; /* pointer to the end of the allocated buffer for safety checks */ - bufend = newreply + allocsize - 1; + bufend = newreply + allocsize; *bufend = 0; /* go thru all the urls and replace the user part */ From 94e6bcfd2be07308c91da7ac15ea226059a05614 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 28 Feb 2011 16:36:28 -0500 Subject: [PATCH 020/493] mod_sofia: fix bugzilla 6341 - dialplan not replacing user in contact string --- src/mod/endpoints/mod_sofia/mod_sofia.c | 184 ++++++++++++------------ 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 5ce681880c..82f4c2ca02 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3552,97 +3552,6 @@ SWITCH_STANDARD_API(sofia_contact_function) } } - if (user_replacement) { - int urlcount = 0; - int copyerr = 0; - char *newreply = NULL; - char *urlstart = NULL; - char *newptr = NULL; - char *bufend = NULL; - char *str = reply; - switch_size_t copysize = 0; - switch_size_t replacesize = strlen(user_replacement); - switch_size_t allocsize = 0; - - /* first pass to count how many URLs we have */ - while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { - urlcount++; - str = urlstart + 4; - } - - if (!urlcount) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no sip URLs found to replace the user\n"); - copyerr++; - goto copydone; - } - - /* this allocates a bit more than needed but better safe than sorry doing more funky math */ - allocsize = strlen(reply) + (urlcount * replacesize); - newreply = switch_core_session_alloc(session, allocsize); - if (!newreply) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no buffer space available for replacement\n"); - copyerr++; - goto copydone; - } - - /* get a working pointer to the new reply */ - newptr = newreply; - - /* pointer to the end of the allocated buffer for safety checks */ - bufend = newreply + allocsize; - *bufend = 0; - - /* go thru all the urls and replace the user part */ - str = reply; - while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { - - /* found an URL, copy up to the start of the url */ - copysize = ( urlstart - str ) + 4; - - /* double check boundaries before copying anything at all (this should not happen) */ - if ((newptr + copysize + replacesize) >= bufend) { - copyerr++; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough!\n"); - break; - } - - /* copy the original contact string except for the user */ - memcpy(newptr, str, copysize); - newptr += copysize; - - /* copy the user replacement */ - memcpy(newptr, user_replacement, replacesize); - newptr += replacesize; - - /* skip the original user part */ - str = strchr(urlstart, '@'); - if (!str) { - copyerr++; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): not host part found for contact\n"); - break; - } - /* continue searching for the next sip: URL */ - } - -copydone: - if (!copyerr) { - /* copy the remaining reply string */ - copysize = strlen(str); - if ((newptr + copysize) >= bufend) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough, close, but not enough!\n"); - } else { - strcpy(newptr, str); - reply = newreply; - } - } else { - reply = "error/replacement error"; - } - } - - stream->write_function(stream, "%s", reply); - reply = NULL; - - switch_safe_free(mystream.data); } switch_mutex_unlock(mod_sofia_globals.hash_mutex); @@ -3650,6 +3559,99 @@ copydone: reply = (char *) mystream.data; + if (user_replacement) { + int urlcount = 0; + int copyerr = 0; + char *newreply = NULL; + char *urlstart = NULL; + char *newptr = NULL; + char *bufend = NULL; + char *str = reply; + switch_size_t copysize = 0; + switch_size_t replacesize = strlen(user_replacement); + switch_size_t allocsize = 0; + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "sofia_contact(): trying to replace %s in %s\n", + user_replacement, str); + + /* first pass to count how many URLs we have */ + while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { + urlcount++; + str = urlstart + 4; + } + + if (!urlcount) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no sip URLs found to replace the user\n"); + copyerr++; + goto copydone; + } + + /* this allocates a bit more than needed but better safe than sorry doing more funky math */ + allocsize = strlen(reply) + (urlcount * replacesize); + newreply = switch_core_session_alloc(session, allocsize); + if (!newreply) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): no buffer space available for replacement\n"); + copyerr++; + goto copydone; + } + + /* get a working pointer to the new reply */ + newptr = newreply; + + /* pointer to the end of the allocated buffer for safety checks */ + bufend = newreply + allocsize; + *bufend = 0; + + /* go thru all the urls and replace the user part */ + str = reply; + while ((urlstart = strcasestr(str, "sip:")) || (urlstart = strcasestr(str, "sips:"))) { + + /* found an URL, copy up to the start of the url */ + copysize = ( urlstart - str ) + 4; + + /* double check boundaries before copying anything at all (this should not happen) */ + if ((newptr + copysize + replacesize) >= bufend) { + copyerr++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough!\n"); + break; + } + + /* copy the original contact string except for the user */ + memcpy(newptr, str, copysize); + newptr += copysize; + + /* copy the user replacement */ + memcpy(newptr, user_replacement, replacesize); + newptr += replacesize; + + /* skip the original user part */ + str = strchr(urlstart, '@'); + if (!str) { + copyerr++; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): not host part found for contact\n"); + break; + } + /* continue searching for the next sip: URL */ + } + +copydone: + if (!copyerr) { + /* copy the remaining reply string */ + copysize = strlen(str); + if ((newptr + copysize) >= bufend) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "sofia_contact(): wow buffer was not big enough, close, but not enough!\n"); + } else { + strcpy(newptr, str); + reply = newreply; + goto end; + } + } else { + /* on error, we do nothing and just default to the original stream returned (mystream.data) */ + } + } + + reply = (char *) mystream.data; + end: if (zstr(reply)) { From 6692a70c52db01b1206cc153a0967226f18cb310 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 1 Mar 2011 12:31:35 -0500 Subject: [PATCH 021/493] set default smg event socket port to 8821 instead of 8021 which is for FreeSWITCH event socket --- libs/esl/fs_cli.c | 6 +++--- libs/esl/fs_cli.conf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 5a52c63085..749c8df167 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -1040,7 +1040,7 @@ int main(int argc, char *argv[]) strncpy(internal_profile.host, "127.0.0.1", sizeof(internal_profile.host)); strncpy(internal_profile.pass, "ClueCon", sizeof(internal_profile.pass)); strncpy(internal_profile.name, "internal", sizeof(internal_profile.name)); - internal_profile.port = 8021; + internal_profile.port = 8821; set_fn_keys(&internal_profile); @@ -1139,7 +1139,7 @@ int main(int argc, char *argv[]) esl_set_string(profiles[pcount].name, cur_cat); esl_set_string(profiles[pcount].host, "localhost"); esl_set_string(profiles[pcount].pass, "ClueCon"); - profiles[pcount].port = 8021; + profiles[pcount].port = 8821; set_fn_keys(&profiles[pcount]); esl_log(ESL_LOG_DEBUG, "Found Profile [%s]\n", profiles[pcount].name); pcount++; @@ -1218,7 +1218,7 @@ int main(int argc, char *argv[]) esl_log(ESL_LOG_DEBUG, "Using profile %s [%s]\n", profile->name, profile->host); if (argv_host) { - if (argv_port && profile->port != 8021) { + if (argv_port && profile->port != 8821) { snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s:%u@%s> ", profile->host, profile->port, profile->name); } else { snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s@%s> ", profile->host, profile->name); diff --git a/libs/esl/fs_cli.conf b/libs/esl/fs_cli.conf index 34932df48a..47de41be70 100644 --- a/libs/esl/fs_cli.conf +++ b/libs/esl/fs_cli.conf @@ -4,7 +4,7 @@ host => 127.0.0.1 password => ClueCon -port => 8021 +port => 8821 debug => 2 key_f1 => help From a60086cd22766fd9b9dc0ccfe243d12b47d958c5 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 11 Mar 2011 17:39:07 -0500 Subject: [PATCH 022/493] Changed Freeswitch core to return with error instead of abort when a critical module fails to load --- src/switch_loadable_module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index d6796c8119..fe596bdf6b 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -1300,7 +1300,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo if (switch_loadable_module_load_module_ex((char *) path, (char *) val, SWITCH_FALSE, global, &err) == SWITCH_STATUS_GENERR) { if (critical && switch_true(critical)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to load critical module '%s', abort()\n", val); - abort(); + return SWITCH_STATUS_FALSE; } } count++; From 89a2ca8d008c4782d7e1895ead7f2d63d2b9036b Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 5 May 2011 18:17:30 -0400 Subject: [PATCH 023/493] rename to NBE SS7 --- libs/esl/fs_cli.c | 22 +++++++++++----------- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 +- src/switch.c | 4 ++-- src/switch_core.c | 21 ++++++++++----------- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 8006297ddd..d7130fd2d2 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -8,7 +8,7 @@ #include #define CMD_BUFLEN 1024 -#define PROMPT_PREFIX "sangoma-media-gateway" +#define PROMPT_PREFIX "netborder-ss7" static int WARN_STOP = 0; #ifdef WIN32 @@ -854,7 +854,7 @@ static void print_banner(FILE *stream) "\n" "*******************************************************\n" - "* Sangoma Media Gateway *\n" + "* Netborder SS7 Gateway *\n" "* Powered by FreeSWITCH (http://www.freeswitch.org) *\n" "*******************************************************\n" "\n" @@ -1002,13 +1002,13 @@ int main(int argc, char *argv[]) int rv = 0; #ifndef WIN32 - char hfile[512] = "/etc/smg_cli_history"; - char cfile[512] = "/etc/smg_cli.conf"; - char dft_cfile[512] = "/etc/smg_cli.conf"; + char hfile[512] = "/etc/nbess7_cli_history"; + char cfile[512] = "/etc/nbess7_cli.conf"; + char dft_cfile[512] = "/etc/nbess7_cli.conf"; #else - char hfile[512] = "smg_cli_history"; - char cfile[512] = "smg_cli.conf"; - char dft_cfile[512] = "smg_cli.conf"; + char hfile[512] = "nbess7_cli_history"; + char cfile[512] = "nbess7_cli.conf"; + char dft_cfile[512] = "nbess7_cli.conf"; #endif char *home = getenv("HOME"); /* Vars for optargs */ @@ -1054,8 +1054,8 @@ int main(int argc, char *argv[]) if (home) { - snprintf(hfile, sizeof(hfile), "%s/.smg_cli_history", home); - snprintf(cfile, sizeof(cfile), "%s/.smg_cli_conf", home); + snprintf(hfile, sizeof(hfile), "%s/.nbess7_cli_history", home); + snprintf(cfile, sizeof(cfile), "%s/.nbess7_cli_conf", home); } signal(SIGINT, handle_SIGINT); @@ -1368,7 +1368,7 @@ int main(int argc, char *argv[]) print_banner(stdout); - esl_log(ESL_LOG_INFO, "Sangoma Media Gateway CLI Ready.\nenter /help for a list of commands.\n"); + esl_log(ESL_LOG_INFO, "Netborder SS7 CLI Ready.\nenter /help for a list of commands.\n"); printf("%s\n", handle.last_sr_reply); while (running > 0) { diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 01aa8412a1..75efdd6e40 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -90,7 +90,7 @@ typedef struct private_object private_object_t; #define MULTICAST_EVENT "multicast::event" #define SOFIA_REPLACES_HEADER "_sofia_replaces_" -#define SOFIA_USER_AGENT "SangomaMediaGateway/" SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO "-" SWITCH_VERSION_REVISION +#define SOFIA_USER_AGENT "NetborderSS7/" SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO "-" SWITCH_VERSION_REVISION #define SOFIA_CHAT_PROTO "sip" #define SOFIA_MULTIPART_PREFIX "sip_mp_" #define SOFIA_MULTIPART_PREFIX_T "~sip_mp_" diff --git a/src/switch.c b/src/switch.c index de99a905e5..7633fcae9f 100644 --- a/src/switch.c +++ b/src/switch.c @@ -48,7 +48,7 @@ #include "private/switch_core_pvt.h" /* pid filename: Stores the process id of the freeswitch process */ -#define PIDFILE "sangoma-media-gateway.pid" +#define PIDFILE "netborder-ss7.pid" static char *pfile = PIDFILE; static int system_ready = 0; @@ -540,7 +540,7 @@ int main(int argc, char *argv[]) } if (local_argv[x] && !strcmp(local_argv[x], "-version")) { - fprintf(stdout, "Sangoma Media Gateway Version: %s\n", SWITCH_VERSION_FULL); + fprintf(stdout, "Netborder SS7 Version: %s\n", SWITCH_VERSION_FULL); return 0; known_opt++; } diff --git a/src/switch_core.c b/src/switch_core.c index 07aca5752e..0d7bfa8a11 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1758,17 +1758,16 @@ SWITCH_DECLARE(const char *) switch_core_banner(void) "* Brought to you by ClueCon http://www.cluecon.com/ *\n" "************************************************************\n" "\n"); #else return ( -"\n _____ ___ ___ _ _ _____ _ \n" -"/ ___| | \\/ | | (_) | __ \\ | | \n" -"\\ `--. __ _ _ __ __ _ ___ _ __ ___ __ _ | . . | ___ __| |_ __ _ | | \\/ __ _| |_ _____ ____ _ _ _ \n" -" `--. \\/ _` | '_ \\ / _` |/ _ \\| '_ ` _ \\ / _` | | |\\/| |/ _ \\/ _` | |/ _` | | | __ / _` | __|/ _ \\ \\ /\\ / / _` | | | |\n" -"/\\__/ / (_| | | | | (_| | (_) | | | | | | (_| | | | | | __/ (_| | | (_| | | |_\\ \\ (_| | |_| __/\\ V V / (_| | |_| |\n" -"\\____/ \\__,_|_| |_|\\__, |\\___/|_| |_| |_|\\__,_| \\_| |_/\\___|\\__,_|_|\\__,_| \\____/\\__,_|\\__|\\___| \\_/\\_/ \\__,_|\\__, |\n" -" __/ | __/ |\n" -" |___/ |___/ \n" - "************************************************************\n" - "* Powered by: FreeSWITCH (http://www.freeswitch.org) *\n" - "************************************************************\n" "\n"); + "************************************************************************\n" + "* .__ __. .______ _______ _______. _______. ______ *\n" + "* | \ | | | _ \ | ____| / | / ||____ |*\n" + "* | \| | | |_) | | |__ | (----` | (----` / / *\n" + "* | . ` | | _ < | __| \ \ \ \ / / *\n" + "* | |\ | | |_) | | |____ .----) | .----) | / / *\n" + "* |__| \__| |______/ |_______| |_______/ |_______/ /_/ *\n" + "* *\n" + "* Powered by: FreeSWITCH (http://www.freeswitch.org) *\n" + "**************************************************************************\n" "\n"); #endif } From 42d40227d93ca7500518161904e76757c6e7c5ba Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 5 May 2011 18:25:47 -0400 Subject: [PATCH 024/493] fix banner --- src/switch_core.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/switch_core.c b/src/switch_core.c index 0d7bfa8a11..3c7f70c8dd 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1760,11 +1760,11 @@ SWITCH_DECLARE(const char *) switch_core_banner(void) return ( "************************************************************************\n" "* .__ __. .______ _______ _______. _______. ______ *\n" - "* | \ | | | _ \ | ____| / | / ||____ |*\n" - "* | \| | | |_) | | |__ | (----` | (----` / / *\n" - "* | . ` | | _ < | __| \ \ \ \ / / *\n" - "* | |\ | | |_) | | |____ .----) | .----) | / / *\n" - "* |__| \__| |______/ |_______| |_______/ |_______/ /_/ *\n" + "* | \\ | | | _ \\ | ____| / | / ||____ |*\n" + "* | \\| | | |_) | | |__ | (----` | (----` / / *\n" + "* | . ` | | _ < | __| \\ \\ \\ \\ / / *\n" + "* | |\\ | | |_) | | |____ .----) | .----) | / / *\n" + "* |__| \\__| |______/ |_______| |_______/ |_______/ /_/ *\n" "* *\n" "* Powered by: FreeSWITCH (http://www.freeswitch.org) *\n" "**************************************************************************\n" "\n"); From a8d1b80b83bb7a8ae66d883d5733351513065acd Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 5 May 2011 19:33:02 -0400 Subject: [PATCH 025/493] remove pid file when failing to load modules --- src/switch.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/switch.c b/src/switch.c index 7633fcae9f..f5ffe950e2 100644 --- a/src/switch.c +++ b/src/switch.c @@ -921,7 +921,10 @@ int main(int argc, char *argv[]) switch_file_write(fd, pid_buffer, &pid_len); if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { - fprintf(stderr, "Cannot Initialize [%s]\n", err); + fprintf(stderr, "Cannot Initialize [%s], deleting pid file [%s]\n", err, pid_path); + if (unlink(pid_path) != 0) { + fprintf(stderr, "Failed to delete pid file [%s]\n", pid_path); + } return 255; } From 034cb7a6870f4075ccc52c5c86cbdbf6ba08ea69 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 9 May 2011 12:39:53 -0400 Subject: [PATCH 026/493] Added modified build/modules.conf.in --- build/modules.conf.in | 114 ++---------------------------------------- 1 file changed, 4 insertions(+), 110 deletions(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index d31bb31b76..1d27aaad1b 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -1,119 +1,13 @@ loggers/mod_console loggers/mod_logfile loggers/mod_syslog -#applications/mod_cidlookup -applications/mod_commands -applications/mod_conference applications/mod_dptools -applications/mod_enum -#applications/mod_osp -applications/mod_fifo -#applications/mod_curl -applications/mod_db +applications/mod_commands applications/mod_hash -#applications/mod_redis -applications/mod_voicemail -#applications/mod_directory -#applications/mod_lcr -applications/mod_expr -applications/mod_esf -#applications/mod_easyroute -applications/mod_fsv -#applications/mod_nibblebill -#applications/mod_soundtouch -#applications/mod_rss applications/mod_spandsp -#applications/mod_snom -#applications/mod_vmd -#applications/mod_avmd -#applications/mod_memcache -#applications/mod_spy -applications/mod_cluechoo -applications/mod_valet_parking -#applications/mod_distributor -#applications/mod_stress -#applications/mod_snapshot -#applications/mod_snipe_hunt -#applications/mod_callcenter -#applications/mod_fsk -#applications/mod_ladspa -codecs/mod_g723_1 -codecs/mod_amr -#codecs/mod_amrwb -#codecs/mod_silk -#codecs/mod_codec2 -codecs/mod_g729 -#codecs/mod_com_g729 -codecs/mod_h26x -codecs/mod_bv -codecs/mod_ilbc -codecs/mod_speex -codecs/mod_siren -#codecs/mod_celt -#codecs/mod_opus -#codecs/mod_sangoma_codec -#codecs/mod_dahdi_codec -#dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml -dialplans/mod_dialplan_asterisk -#directories/mod_ldap -#endpoints/mod_dingaling -#endpoints/mod_portaudio endpoints/mod_sofia -endpoints/mod_loopback -#endpoints/mod_alsa -#endpoints/mod_opal -#endpoints/mod_skinny -#endpoints/mod_skypopen -#endpoints/mod_h323 -#endpoints/mod_khomp -#../../libs/openzap/mod_openzap -#../../libs/freetdm/mod_freetdm -#asr_tts/mod_unimrcp -#asr_tts/mod_flite -#asr_tts/mod_pocketsphinx -#asr_tts/mod_cepstral -#asr_tts/mod_tts_commandline -#event_handlers/mod_event_multicast -event_handlers/mod_event_socket -#event_handlers/mod_event_zmq -event_handlers/mod_cdr_csv -event_handlers/mod_cdr_sqlite -#event_handlers/mod_cdr_pg_csv -#event_handlers/mod_radius_cdr -#event_handlers/mod_erlang_event -#event_handlers/mod_snmp -formats/mod_native_file -formats/mod_sndfile -#formats/mod_shout -formats/mod_local_stream -formats/mod_tone_stream -#formats/mod_portaudio_stream -#formats/mod_shell_stream -#languages/mod_python -languages/mod_spidermonkey -languages/mod_lua -#languages/mod_perl -#languages/mod_yaml -#languages/mod_java -#languages/mod_managed -xml_int/mod_xml_rpc -#xml_int/mod_xml_curl +../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr -#xml_int/mod_xml_ldap -say/mod_say_en -#say/mod_say_de -#say/mod_say_es -#say/mod_say_fr -#say/mod_say_it -#say/mod_say_nl -#say/mod_say_pt -#say/mod_say_ru -#say/mod_say_zh -#say/mod_say_hu -#say/mod_say_th -#say/mod_say_he -#timers/mod_timerfd - -## Experimental Modules (don't cry if they're broken) -#../../contrib/mod/xml_int/mod_xml_odbc +event_handlers/mod_event_socket +codecs/mod_sangoma_codec From bced67d4f5da0a043e00885f1c09aa841fcce8fc Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 17 May 2011 17:13:38 -0400 Subject: [PATCH 027/493] chlog: freetdm - SS7: Support for Transparent IAM --- libs/freetdm/configure.ac | 13 + libs/freetdm/mod_freetdm/mod_freetdm.c | 30 +- libs/freetdm/src/ftdm_call_utils.c | 68 +++ libs/freetdm/src/ftdm_io.c | 4 +- .../ftmod_sangoma_isdn_support.c | 11 +- .../ftmod_sangoma_ss7_handle.c | 13 +- .../ftmod_sangoma_ss7_main.c | 9 +- .../ftmod_sangoma_ss7_main.h | 11 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 237 ++------ .../ftmod_sangoma_ss7_support.c | 526 +++++++++++++++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 34 +- libs/freetdm/src/include/freetdm.h | 12 +- libs/freetdm/src/include/ftdm_call_utils.h | 19 + 13 files changed, 753 insertions(+), 234 deletions(-) diff --git a/libs/freetdm/configure.ac b/libs/freetdm/configure.ac index 55185cb10d..493f0da3b0 100644 --- a/libs/freetdm/configure.ac +++ b/libs/freetdm/configure.ac @@ -294,6 +294,19 @@ if test "${HAVE_SNG_SS7}" = "yes"; then fi fi + +## +# zlib (required for Sangoma SS7 Transparent IAM) +# +HAVE_ZLIB="no" +AC_MSG_RESULT([${as_nl}<<>> zlib]) +AC_CHECK_LIB([z], [compress], [HAVE_ZLIB="yes"]) +AC_MSG_RESULT([checking whether zlib is installed... ${HAVE_ZLIB}]) +AM_CONDITIONAL([HAVE_ZLIB], [test "{HAVE_ZLIB]" = "yes"]) +if test "${HAVE_ZLIB}" = "yes"; then + CFLAGS="$CFLAGS -DHAVE_ZLIB" +fi + ## # libisdn # diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 954a568e6f..75b500d0f6 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1369,7 +1369,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-CPC"); if (sipvar) { - ftdm_set_calling_party_category(var, (uint8_t *)&caller_data.cpc); + ftdm_set_calling_party_category(sipvar, (uint8_t *)&caller_data.cpc); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-IAM"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_iam", sipvar); } } @@ -1443,7 +1448,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (!strncasecmp(h->name, FREETDM_VAR_PREFIX, FREETDM_VAR_PREFIX_LEN)) { char *v = h->name + FREETDM_VAR_PREFIX_LEN; if (!zstr(v)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s=%s to channel %d:%d\n", v, h->value, span_id, chan_id); + if (!strcasecmp(v, "ss7_iam")) { + /* Do not print the value of ss7_iam as it is very long */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s to channel %d:%d\n", v, span_id, chan_id); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s=%s to channel %d:%d\n", v, h->value, span_id, chan_id); + } + ftdm_usrmsg_add_var(&usrmsg, v, h->value); } } @@ -1633,6 +1644,8 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS", "%s", channel_caller_data->rdnis.digits); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-NADI", "%d", channel_caller_data->rdnis.type); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); if (!ftdm_strlen_zero(var_value)) { @@ -1678,10 +1691,10 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumInComp", "%d", var_value); } } /* End - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); */ - - var_value = ftdm_sigmsg_get_var(sigmsg, "freetdm_calling_party_category"); + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_iam"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-IAM", "%s", var_value); } switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen); @@ -1694,7 +1707,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session ftdm_get_current_var(curr, &var_name, &var_value); snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name); switch_channel_set_variable_printf(channel, name, "%s", var_value); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value); + if (!strcasecmp(var_name, "ss7_iam")) { + /* Do not print freetdm_ss7_iam as it is a very long variable */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s is present\n", name); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value); + } } ftdm_iterator_free(iter); diff --git a/libs/freetdm/src/ftdm_call_utils.c b/libs/freetdm/src/ftdm_call_utils.c index 2b72f05b77..d23c95af4e 100644 --- a/libs/freetdm/src/ftdm_call_utils.c +++ b/libs/freetdm/src/ftdm_call_utils.c @@ -42,6 +42,74 @@ #include + + +FT_DECLARE(char *) ftdm_url_encode(const char *url, char *buf, ftdm_size_t len) +{ + /* This implementation of url_encode is slightly different compared to the + * Freeswitch one. This is because this implementation accepts the full + * range of values (0x00 - 0xFF) compared to the Freeswitch implementation + * that does not accept 0x00 */ + + const char *p; + size_t x = 0,y = 0; + const char urlunsafe[] = "\r\n \"#%&+:;<=>?@[\\]^`{|}"; + const char hex[] = "0123456789ABCDEF"; + + if (!buf) { + return 0; + } + + if (!url) { + return 0; + } + + len--; + + for (p = url; y <= len; p++) { + if (*p < ' ' || *p > '~' || strchr(urlunsafe, *p)) { + buf[x++] = '%'; + buf[x++] = hex[(*p >> 4) & 0x0f]; + buf[x++] = hex[*p & 0x0f]; + } else { + buf[x++] = *p; + } + y++; + } + buf[x] = '\0'; + return buf; +} + + +FT_DECLARE(char *) ftdm_url_decode(char *s, ftdm_size_t *len) +{ + /* This implementation of url_decode is slightly different compared to the + * Freeswitch one. This is because this implementation accepts the full + * range of values (0x00 - 0xFF) compared to the Freeswitch implementation + * that does not accept 0x00 */ + + char *o; + unsigned int tmp; + ftdm_size_t mylen = 0; + + if (ftdm_strlen_zero(s)) { + return s; + } + + for (o = s; *s; s++, o++) { + if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) { + *o = (char) tmp; + s += 2; + } else { + *o = *s; + } + mylen++; + } + *o = '\0'; + *len = mylen; + return s; +} + FT_DECLARE(ftdm_status_t) ftdm_set_npi(const char *string, uint8_t *target) { uint8_t val; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 1d7a0d1eb1..c7a3ec48f4 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -411,13 +411,13 @@ FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan) if (ftdm_channel_test_feature(chan, FTDM_CHANNEL_FEATURE_HWEC)) { if (ftdm_channel_test_feature(chan, FTDM_CHANNEL_FEATURE_HWEC_DISABLED_ON_IDLE)) { /* If the ec is disabled on idle, we need to enable it unless is a digital call */ - if (caller_data->bearer_capability != FTDM_BEARER_CAP_64K_UNRESTRICTED) { + if (caller_data->bearer_capability != FTDM_BEARER_CAP_UNRESTRICTED) { ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Enabling ec for call in channel state %s\n", ftdm_channel_state2str(chan->state)); ftdm_channel_command(chan, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL); } } else { /* If the ec is enabled on idle, we do nothing unless is a digital call that needs it disabled */ - if (caller_data->bearer_capability == FTDM_BEARER_CAP_64K_UNRESTRICTED) { + if (caller_data->bearer_capability == FTDM_BEARER_CAP_UNRESTRICTED) { ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Disabling ec for digital call in channel state %s\n", ftdm_channel_state2str(chan->state)); ftdm_channel_command(chan, FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c index a343809b4c..f4fee712c9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c @@ -1069,18 +1069,20 @@ void get_memory_info(void) return; } + uint8_t sngisdn_get_infoTranCap_from_user(ftdm_bearer_cap_t bearer_capability) { switch(bearer_capability) { case FTDM_BEARER_CAP_SPEECH: return IN_ITC_SPEECH; - case FTDM_BEARER_CAP_64K_UNRESTRICTED: + case FTDM_BEARER_CAP_UNRESTRICTED: return IN_ITC_UNRDIG; case FTDM_BEARER_CAP_3_1KHZ_AUDIO: return IN_ITC_A31KHZ; case FTDM_BEARER_CAP_INVALID: return IN_ITC_SPEECH; - /* Do not put a default case here, so we can see compile warnings if we have unhandled cases */ + default: + return IN_ITC_SPEECH; } return FTDM_BEARER_CAP_SPEECH; } @@ -1096,7 +1098,8 @@ uint8_t sngisdn_get_usrInfoLyr1Prot_from_user(ftdm_user_layer1_prot_t layer1_pro return IN_UIL1_G711ALAW; case FTDM_USER_LAYER1_PROT_INVALID: return IN_UIL1_G711ULAW; - /* Do not put a default case here, so we can see compile warnings if we have unhandled cases */ + default: + return IN_UIL1_G711ULAW; } return IN_UIL1_G711ULAW; } @@ -1107,7 +1110,7 @@ ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_stack(uint8_t bearer_capability) case IN_ITC_SPEECH: return FTDM_BEARER_CAP_SPEECH; case IN_ITC_UNRDIG: - return FTDM_BEARER_CAP_64K_UNRESTRICTED; + return FTDM_BEARER_CAP_UNRESTRICTED; case IN_ITC_A31KHZ: return FTDM_BEARER_CAP_3_1KHZ_AUDIO; default: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 596ae7c734..0520e9d163 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -33,12 +33,14 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" + /******************************************************************************/ /* DEFINES ********************************************************************/ /******************************************************************************/ /* GLOBALS ********************************************************************/ + /******************************************************************************/ /* PROTOTYPES *****************************************************************/ @@ -79,14 +81,14 @@ ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circ /******************************************************************************/ /* FUNCTIONS ******************************************************************/ + ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt) { - SS7_FUNC_TRACE_ENTER(__FUNCTION__); - sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; char nadi[2]; - + + SS7_FUNC_TRACE_ENTER(__FUNCTION__); memset(nadi, '\0', sizeof(nadi)); /* get the ftdmchan and ss7_chan_data from the circuit */ @@ -208,6 +210,10 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(nadi, "%d", siConEvnt->cdPtyNum.natAddrInd.val); sngss7_add_var(sngss7_info, "ss7_cld_nadi", nadi); + if (sngss7_info->circuit->transparent_iam) { + sngss7_save_iam(ftdmchan, siConEvnt); + } + /* check if a COT test is requested */ if ((siConEvnt->natConInd.eh.pres) && (siConEvnt->natConInd.contChkInd.pres) && @@ -231,7 +237,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ siConEvnt->cgPtyNum.natAddrInd.val, ftdmchan->caller_data.dnis.digits, siConEvnt->cdPtyNum.natAddrInd.val); - } /* if (channel is usable */ break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 59660765a1..53062b9d56 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -42,6 +42,7 @@ static sng_isup_event_interface_t sng_event; static ftdm_io_interface_t g_ftdm_sngss7_interface; ftdm_sngss7_data_t g_ftdm_sngss7_data; + /******************************************************************************/ /* PROTOTYPES *****************************************************************/ @@ -509,11 +510,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s\n", ftdm_channel_state2str (ftdmchan->state)); -#if 0 - /* clear the state change flag...since we might be setting a new state */ - ftdm_channel_complete_state(ftdmchan); -#endif - /*check what state we are supposed to be in */ switch (ftdmchan->state) { /**************************************************************************/ @@ -674,9 +670,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } else { /*INBOUND...so FS told us it was going to answer...tell the stack */ ft_to_sngss7_anm(ftdmchan); -#if 1 /* DAVIDY */ - ft_to_sngss7_itx(ftdmchan); -#endif } break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 04723048f6..f88202b1a8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -339,6 +339,7 @@ typedef struct sng_isup_ckt { uint32_t min_digits; uint8_t itx_auto_reply; + uint8_t transparent_iam; void *obj; uint16_t t3; uint16_t t12; @@ -406,6 +407,7 @@ typedef struct sng_ss7_cfg { uint32_t procId; char license[MAX_PATH]; char signature[MAX_PATH]; + uint32_t transparent_iam_max_size; uint32_t flags; sng_relay_t relay[MAX_RELAY_CHANNELS+1]; sng_mtp1_link_t mtp1Link[MAX_MTP_LINKS+1]; @@ -765,6 +767,10 @@ void sngss7_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiR void sngss7_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt); void sngss7_ssp_sta_cfm(uint32_t infId); +ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt); +ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt); +ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt); + /* in ftmod_sangoma_ss7_handle.c */ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType); @@ -815,6 +821,11 @@ ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); +ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); +ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd); +ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); +ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq); +ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA); ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index e1944513d1..91b8900fef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -36,10 +36,8 @@ /******************************************************************************/ /* DEFINES ********************************************************************/ -/******************************************************************************/ /* GLOBALS ********************************************************************/ -/******************************************************************************/ /* PROTOTYPES *****************************************************************/ void ft_to_sngss7_iam(ftdm_channel_t * ftdmchan); @@ -66,219 +64,70 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan); void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan); void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan); -/******************************************************************************/ /* FUNCTIONS ******************************************************************/ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) -{ - SS7_FUNC_TRACE_ENTER (__FUNCTION__); - - sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; - const char *clg_subAddr = NULL; - const char *cld_subAddr = NULL; - char subAddrIE[MAX_SIZEOF_SUBADDR_IE]; +{ SiConEvnt iam; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; + + SS7_FUNC_TRACE_ENTER (__FUNCTION__); sngss7_info->suInstId = get_unique_id (); sngss7_info->spInstId = 0; sngss7_info->spId = 1; memset (&iam, 0x0, sizeof (iam)); - - /* copy down the nature of connection indicators */ - iam.natConInd.eh.pres = PRSNT_NODEF; - iam.natConInd.satInd.pres = PRSNT_NODEF; - iam.natConInd.satInd.val = 0; /* no satellite circuit */ - iam.natConInd.contChkInd.pres = PRSNT_NODEF; - iam.natConInd.contChkInd.val = CONTCHK_NOTREQ; - iam.natConInd.echoCntrlDevInd.pres = PRSNT_NODEF; - iam.natConInd.echoCntrlDevInd.val = ECHOCDEV_INCL; - - /* copy down the forward call indicators */ - iam.fwdCallInd.eh.pres = PRSNT_NODEF; - iam.fwdCallInd.natIntCallInd.pres = PRSNT_NODEF; - iam.fwdCallInd.natIntCallInd.val = 0x00; - iam.fwdCallInd.end2EndMethInd.pres = PRSNT_NODEF; - iam.fwdCallInd.end2EndMethInd.val = E2EMTH_NOMETH; - iam.fwdCallInd.intInd.pres = PRSNT_NODEF; - iam.fwdCallInd.intInd.val = INTIND_NOINTW; - iam.fwdCallInd.end2EndInfoInd.pres = PRSNT_NODEF; - iam.fwdCallInd.end2EndInfoInd.val = E2EINF_NOINFO; - iam.fwdCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; - iam.fwdCallInd.isdnUsrPrtInd.val = ISUP_USED; - iam.fwdCallInd.isdnUsrPrtPrfInd.pres = PRSNT_NODEF; - iam.fwdCallInd.isdnUsrPrtPrfInd.val = PREF_PREFAW; - iam.fwdCallInd.isdnAccInd.pres = PRSNT_NODEF; - iam.fwdCallInd.isdnAccInd.val = ISDNACC_ISDN; - iam.fwdCallInd.sccpMethInd.pres = PRSNT_NODEF; - iam.fwdCallInd.sccpMethInd.val = SCCPMTH_NOIND; + + if (sngss7_info->circuit->transparent_iam && + sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic); + } else { + /* Nature of Connection Indicators */ + copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); + + /* Forward Call Indicators */ + copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd); + + /* Transmission medium requirements */ + copy_txMedReq_to_sngss7(ftdmchan, &iam.txMedReq); + + /* User Service Info A */ + copy_usrServInfoA_to_sngss7(ftdmchan, &iam.usrServInfoA); - /* copy down the transmission medium requirements */ - iam.txMedReq.eh.pres = PRSNT_NODEF; - iam.txMedReq.trMedReq.pres = PRSNT_NODEF; - iam.txMedReq.trMedReq.val = ftdmchan->caller_data.bearer_capability; - - if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) || - (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) || - (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS95)) { - - /* include only if we're running ANSI */ - iam.fwdCallInd.transCallNInd.pres = PRSNT_NODEF; - iam.fwdCallInd.transCallNInd.val = 0x0; - - iam.usrServInfoA.eh.pres = PRSNT_NODEF; - - iam.usrServInfoA.infoTranCap.pres = PRSNT_NODEF; - switch (ftdmchan->caller_data.bearer_capability) { - /**********************************************************************/ - case (FTDM_BEARER_CAP_SPEECH): - iam.usrServInfoA.infoTranCap.val = 0x0; /* speech as per ATIS-1000113.3.2005 */ - break; - /**********************************************************************/ - case (FTDM_BEARER_CAP_64K_UNRESTRICTED): - iam.usrServInfoA.infoTranCap.val = 0x8; /* unrestricted digital as per ATIS-1000113.3.2005 */ - break; - /**********************************************************************/ - case (FTDM_BEARER_CAP_3_1KHZ_AUDIO): - iam.usrServInfoA.infoTranCap.val = 0x10; /* 3.1kHz audio as per ATIS-1000113.3.2005 */ - break; - /**********************************************************************/ - default: - SS7_ERROR_CHAN(ftdmchan, "Unknown Bearer capability falling back to speech%s\n", " "); - iam.usrServInfoA.infoTranCap.val = 0x0; /* speech as per ATIS-1000113.3.2005 */ - break; - /**********************************************************************/ - } /* switch (ftdmchan->caller_data.bearer_capability) */ - - iam.usrServInfoA.cdeStand.pres = PRSNT_NODEF; - iam.usrServInfoA.cdeStand.val = 0x0; /* ITU-T standardized coding */ - iam.usrServInfoA.tranMode.pres = PRSNT_NODEF; - iam.usrServInfoA.tranMode.val = 0x0; /* circuit mode */ - iam.usrServInfoA.infoTranRate0.pres = PRSNT_NODEF; - iam.usrServInfoA.infoTranRate0.val = 0x10; /* 64kbps origination to destination */ - iam.usrServInfoA.infoTranRate1.pres = PRSNT_NODEF; - iam.usrServInfoA.infoTranRate1.val = 0x10; /* 64kbps destination to origination */ - iam.usrServInfoA.chanStruct.pres = PRSNT_NODEF; - iam.usrServInfoA.chanStruct.val = 0x1; /* 8kHz integrity */ - iam.usrServInfoA.config.pres = PRSNT_NODEF; - iam.usrServInfoA.config.val = 0x0; /* point to point configuration */ - iam.usrServInfoA.establish.pres = PRSNT_NODEF; - iam.usrServInfoA.establish.val = 0x0; /* on demand */ - iam.usrServInfoA.symmetry.pres = PRSNT_NODEF; - iam.usrServInfoA.symmetry.val = 0x0; /* bi-directional symmetric */ - iam.usrServInfoA.usrInfLyr1Prot.pres = PRSNT_NODEF; - iam.usrServInfoA.usrInfLyr1Prot.val = 0x2; /* G.711 ulaw */ - iam.usrServInfoA.rateMultiplier.pres = PRSNT_NODEF; - iam.usrServInfoA.rateMultiplier.val = 0x1; /* 1x rate multipler */ - } /* if ANSI */ - - /* copy down the called number information */ - copy_cdPtyNum_to_sngss7 (ftdmchan, &iam.cdPtyNum); - - /* copy down the calling number information */ - copy_cgPtyNum_to_sngss7 (ftdmchan, &iam.cgPtyNum); - - /* copy down the generic number information */ - copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb); - - /* copy down the calling party category */ - copy_cgPtyCat_to_sngss7(ftdmchan, &iam.cgPtyCat); - - /* TODO - move this to copy_clg_subAddr_to_sngss7 function */ - /* check if the user would like us to send a clg_sub-address */ - clg_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_subaddr"); - if (!ftdm_strlen_zero(clg_subAddr)) { - SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr); + /* Called Number information */ + copy_cdPtyNum_to_sngss7(ftdmchan, &iam.cdPtyNum); - /* clean out the subAddrIE */ - memset(subAddrIE, 0x0, sizeof(subAddrIE)); + /* Calling Number information */ + copy_cgPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum); - /* check the first character in the sub-address to see what type of encoding to use */ - switch (clg_subAddr[0]) { - case '0': /* NSAP */ - encode_subAddrIE_nsap(&clg_subAddr[1], subAddrIE, SNG_CALLING); - break; - case '1': /* national variant */ - encode_subAddrIE_nat(&clg_subAddr[1], subAddrIE, SNG_CALLING); - break; - default: - SS7_ERROR_CHAN(ftdmchan,"Invalid Calling Sub-Address encoding requested: %c\n", clg_subAddr[0]); - break; - } /* switch (cld_subAddr[0]) */ + /* Generic Number information */ + copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb); + /* Calling Party's Category */ + copy_cgPtyCat_to_sngss7(ftdmchan, &iam.cgPtyCat); - /* if subaddIE is still empty don't copy it in */ - if (subAddrIE[0] != '0') { - /* check if the clg_subAddr has already been added */ - if (iam.accTrnspt.eh.pres == PRSNT_NODEF) { - /* append the subAddrIE */ - memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2)); - iam.accTrnspt.infoElmts.len = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2; - } else { - /* fill in from the beginning */ - iam.accTrnspt.eh.pres = PRSNT_NODEF; - iam.accTrnspt.infoElmts.pres = PRSNT_NODEF; - memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2)); - iam.accTrnspt.infoElmts.len = subAddrIE[1] + 2; - } /* if (iam.accTrnspt.eh.pres */ - } /* if (subAddrIE[0] != '0') */ + /* Redirecting Number */ + copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); + + /* Access Transport */ + copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); + + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n", + sngss7_info->circuit->cic, + ftdmchan->caller_data.cid_num.digits, + iam.cgPtyNum.natAddrInd.val, + ftdmchan->caller_data.dnis.digits, + iam.cdPtyNum.natAddrInd.val); } - copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); - - /* check if the user would like us to send a cld_sub-address */ - cld_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_subaddr"); - if ((cld_subAddr != NULL) && (*cld_subAddr)) { - SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called Sub-Address value \"%s\"\n", cld_subAddr); - - /* clean out the subAddrIE */ - memset(subAddrIE, 0x0, sizeof(subAddrIE)); - - /* check the first character in the sub-address to see what type of encoding to use */ - switch (cld_subAddr[0]) { - case '0': /* NSAP */ - encode_subAddrIE_nsap(&cld_subAddr[1], subAddrIE, SNG_CALLED); - break; - case '1': /* national variant */ - encode_subAddrIE_nat(&cld_subAddr[1], subAddrIE, SNG_CALLED); - break; - default: - SS7_ERROR_CHAN(ftdmchan,"Invalid Called Sub-Address encoding requested: %c\n", cld_subAddr[0]); - break; - } /* switch (cld_subAddr[0]) */ - - /* if subaddIE is still empty don't copy it in */ - if (subAddrIE[0] != '0') { - /* check if the cld_subAddr has already been added */ - if (iam.accTrnspt.eh.pres == PRSNT_NODEF) { - /* append the subAddrIE */ - memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2)); - iam.accTrnspt.infoElmts.len = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2; - } else { - /* fill in from the beginning */ - iam.accTrnspt.eh.pres = PRSNT_NODEF; - iam.accTrnspt.infoElmts.pres = PRSNT_NODEF; - memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2)); - iam.accTrnspt.infoElmts.len = subAddrIE[1] + 2; - } /* if (iam.accTrnspt.eh.pres */ - } /* if (subAddrIE[0] != '0') */ - } /* if ((cld_subAddr != NULL) && (*cld_subAddr)) */ - sng_cc_con_request (sngss7_info->spId, sngss7_info->suInstId, sngss7_info->spInstId, - sngss7_info->circuit->id, - &iam, + sngss7_info->circuit->id, + &iam, 0); - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n", - sngss7_info->circuit->cic, - ftdmchan->caller_data.cid_num.digits, - iam.cgPtyNum.natAddrInd.val, - ftdmchan->caller_data.dnis.digits, - iam.cdPtyNum.natAddrInd.val); - - SS7_FUNC_TRACE_EXIT (__FUNCTION__); return; } @@ -319,7 +168,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.bckCallInd.echoCtrlDevInd.val = 0x1; break; /**********************************************************************/ - case (FTDM_BEARER_CAP_64K_UNRESTRICTED): + case (FTDM_BEARER_CAP_UNRESTRICTED): acm.bckCallInd.echoCtrlDevInd.val = 0x0; break; /**********************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index a60a6c48ed..f82ca4d3ab 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -33,6 +33,9 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" +#ifdef HAVE_ZLIB +#include +#endif /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -111,6 +114,16 @@ ftdm2trillium_t cpc_codes[] = { {FTDM_CPC_PAYPHONE, CAT_PAYPHONE}, }; +ftdm2trillium_t bc_cap_codes[] = { + {FTDM_BEARER_CAP_SPEECH, ITC_SPEECH}, /* speech as per ATIS-1000113.3.2005 */ + {FTDM_BEARER_CAP_UNRESTRICTED, ITC_UNRDIG}, /* unrestricted digital as per ATIS-1000113.3.2005 */ + {FTDM_BEARER_CAP_RESTRICTED, ITC_UNRDIG}, /* Restricted Digital */ + {FTDM_BEARER_CAP_3_1KHZ_AUDIO, ITC_A31KHZ}, /* 3.1kHz audio as per ATIS-1000113.3.2005 */ + {FTDM_BEARER_CAP_7KHZ_AUDIO, ITC_A7KHZ}, /* 7Khz audio */ + {FTDM_BEARER_CAP_15KHZ_AUDIO, ITC_A15KHZ}, /* 15Khz audio */ + {FTDM_BEARER_CAP_VIDEO, ITC_VIDEO}, /* Video */ +}; + static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val) { ftdm2trillium_t *val = vals; @@ -485,6 +498,187 @@ ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cg return FTDM_SUCCESS; } + +ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt) +{ + const char *clg_subAddr = NULL; + const char *cld_subAddr = NULL; + char subAddrIE[MAX_SIZEOF_SUBADDR_IE]; + + /* check if the user would like us to send a clg_sub-address */ + clg_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_subaddr"); + if (!ftdm_strlen_zero(clg_subAddr)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr); + + /* clean out the subAddrIE */ + memset(subAddrIE, 0x0, sizeof(subAddrIE)); + + /* check the first character in the sub-address to see what type of encoding to use */ + switch (clg_subAddr[0]) { + case '0': /* NSAP */ + encode_subAddrIE_nsap(&clg_subAddr[1], subAddrIE, SNG_CALLING); + break; + case '1': /* national variant */ + encode_subAddrIE_nat(&clg_subAddr[1], subAddrIE, SNG_CALLING); + break; + default: + ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Invalid Calling Sub-Address encoding requested: %c\n", clg_subAddr[0]); + break; + } /* switch (cld_subAddr[0]) */ + + + /* if subaddIE is still empty don't copy it in */ + if (subAddrIE[0] != '0') { + /* check if the clg_subAddr has already been added */ + if (accTrnspt->eh.pres == PRSNT_NODEF) { + /* append the subAddrIE */ + memcpy(&accTrnspt->infoElmts.val[accTrnspt->infoElmts.len], subAddrIE, (subAddrIE[1] + 2)); + accTrnspt->infoElmts.len = accTrnspt->infoElmts.len +subAddrIE[1] + 2; + } else { + /* fill in from the beginning */ + accTrnspt->eh.pres = PRSNT_NODEF; + accTrnspt->infoElmts.pres = PRSNT_NODEF; + memcpy(accTrnspt->infoElmts.val, subAddrIE, (subAddrIE[1] + 2)); + accTrnspt->infoElmts.len = subAddrIE[1] + 2; + } + } + } + + /* check if the user would like us to send a cld_sub-address */ + cld_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_subaddr"); + if ((cld_subAddr != NULL) && (*cld_subAddr)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called Sub-Address value \"%s\"\n", cld_subAddr); + + /* clean out the subAddrIE */ + memset(subAddrIE, 0x0, sizeof(subAddrIE)); + + /* check the first character in the sub-address to see what type of encoding to use */ + switch (cld_subAddr[0]) { + case '0': /* NSAP */ + encode_subAddrIE_nsap(&cld_subAddr[1], subAddrIE, SNG_CALLED); + break; + case '1': /* national variant */ + encode_subAddrIE_nat(&cld_subAddr[1], subAddrIE, SNG_CALLED); + break; + default: + ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Invalid Called Sub-Address encoding requested: %c\n", cld_subAddr[0]); + break; + } /* switch (cld_subAddr[0]) */ + + /* if subaddIE is still empty don't copy it in */ + if (subAddrIE[0] != '0') { + /* check if the cld_subAddr has already been added */ + if (accTrnspt->eh.pres == PRSNT_NODEF) { + /* append the subAddrIE */ + memcpy(&accTrnspt->infoElmts.val[accTrnspt->infoElmts.len], subAddrIE, (subAddrIE[1] + 2)); + accTrnspt->infoElmts.len = accTrnspt->infoElmts.len +subAddrIE[1] + 2; + } else { + /* fill in from the beginning */ + accTrnspt->eh.pres = PRSNT_NODEF; + accTrnspt->infoElmts.pres = PRSNT_NODEF; + memcpy(accTrnspt->infoElmts.val, subAddrIE, (subAddrIE[1] + 2)); + accTrnspt->infoElmts.len = subAddrIE[1] + 2; + } + } + } /* if ((cld_subAddr != NULL) && (*cld_subAddr)) */ + return FTDM_SUCCESS; +} + +ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd) +{ + /* copy down the nature of connection indicators */ + natConInd->eh.pres = PRSNT_NODEF; + natConInd->satInd.pres = PRSNT_NODEF; + natConInd->satInd.val = 0; /* no satellite circuit */ + natConInd->contChkInd.pres = PRSNT_NODEF; + natConInd->contChkInd.val = CONTCHK_NOTREQ; + natConInd->echoCntrlDevInd.pres = PRSNT_NODEF; + natConInd->echoCntrlDevInd.val = ECHOCDEV_INCL; + return FTDM_SUCCESS; +} + +ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) +{ + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + fwdCallInd->eh.pres = PRSNT_NODEF; + fwdCallInd->natIntCallInd.pres = PRSNT_NODEF; + fwdCallInd->natIntCallInd.val = 0x00; + fwdCallInd->end2EndMethInd.pres = PRSNT_NODEF; + fwdCallInd->end2EndMethInd.val = E2EMTH_NOMETH; + fwdCallInd->intInd.pres = PRSNT_NODEF; + fwdCallInd->intInd.val = INTIND_NOINTW; + fwdCallInd->end2EndInfoInd.pres = PRSNT_NODEF; + fwdCallInd->end2EndInfoInd.val = E2EINF_NOINFO; + fwdCallInd->isdnUsrPrtInd.pres = PRSNT_NODEF; + fwdCallInd->isdnUsrPrtInd.val = ISUP_USED; + fwdCallInd->isdnUsrPrtPrfInd.pres = PRSNT_NODEF; + fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW; + fwdCallInd->isdnAccInd.pres = PRSNT_NODEF; + fwdCallInd->isdnAccInd.val = ISDNACC_ISDN; + fwdCallInd->sccpMethInd.pres = PRSNT_NODEF; + fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND; + + if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS95)) { + + /* include only if we're running ANSI */ + fwdCallInd->transCallNInd.pres = PRSNT_NODEF; + fwdCallInd->transCallNInd.val = 0x0; + } + return FTDM_SUCCESS; +} + +ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq) +{ + txMedReq->eh.pres = PRSNT_NODEF; + txMedReq->trMedReq.pres = PRSNT_NODEF; + txMedReq->trMedReq.val = ftdmchan->caller_data.bearer_capability; + + return FTDM_SUCCESS; +} + +ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA) +{ + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS95)) { + + usrServInfoA->eh.pres = PRSNT_NODEF; + + usrServInfoA->infoTranCap.pres = PRSNT_NODEF; + + usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, ITC_SPEECH); + + usrServInfoA->cdeStand.pres = PRSNT_NODEF; + usrServInfoA->cdeStand.val = 0x0; /* ITU-T standardized coding */ + usrServInfoA->tranMode.pres = PRSNT_NODEF; + usrServInfoA->tranMode.val = 0x0; /* circuit mode */ + usrServInfoA->infoTranRate0.pres = PRSNT_NODEF; + usrServInfoA->infoTranRate0.val = 0x10; /* 64kbps origination to destination */ + usrServInfoA->infoTranRate1.pres = PRSNT_NODEF; + usrServInfoA->infoTranRate1.val = 0x10; /* 64kbps destination to origination */ + usrServInfoA->chanStruct.pres = PRSNT_NODEF; + usrServInfoA->chanStruct.val = 0x1; /* 8kHz integrity */ + usrServInfoA->config.pres = PRSNT_NODEF; + usrServInfoA->config.val = 0x0; /* point to point configuration */ + usrServInfoA->establish.pres = PRSNT_NODEF; + usrServInfoA->establish.val = 0x0; /* on demand */ + usrServInfoA->symmetry.pres = PRSNT_NODEF; + usrServInfoA->symmetry.val = 0x0; /* bi-directional symmetric */ + usrServInfoA->usrInfLyr1Prot.pres = PRSNT_NODEF; + usrServInfoA->usrInfLyr1Prot.val = 0x2; /* G.711 ulaw */ + usrServInfoA->rateMultiplier.pres = PRSNT_NODEF; + usrServInfoA->rateMultiplier.val = 0x1; /* 1x rate multipler */ + } /* if ANSI */ + return FTDM_SUCCESS; +} + + + ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven) { uint8_t i; @@ -1710,7 +1904,7 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu sig.ev_data.sigstatus.status = status; if (ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS) { - SS7_ERROR_CHAN(ftdmchan, "Failed to change channel status to %s\n", + ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to change channel status to %s\n", ftdm_signaling_status2str(status)); } return; @@ -1885,6 +2079,336 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) return FTDM_SUCCESS; } + +ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt) +{ + if (siConEvnt->natConInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natConInd, 0, sizeof(siConEvnt->natConInd)); + if (siConEvnt->fwdCallInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->fwdCallInd, 0, sizeof(siConEvnt->fwdCallInd)); + if (siConEvnt->cgPtyCat.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyCat, 0, sizeof(siConEvnt->cgPtyCat)); + if (siConEvnt->txMedReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->txMedReq, 0, sizeof(siConEvnt->txMedReq)); +#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL) + if (siConEvnt->usrServInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfoA, 0, sizeof(siConEvnt->usrServInfoA)); +#endif + if (siConEvnt->cdPtyNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cdPtyNum, 0, sizeof(siConEvnt->cdPtyNum)); +#if TNS_ANSI +#if (SS7_ANS92 || SS7_ANS95 || SS7_BELL) + if (siConEvnt->tranNetSel1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->tranNetSel1, 0, sizeof(siConEvnt->tranNetSel1)); +#endif +#endif + if (siConEvnt->tranNetSel.eh.pres != PRSNT_NODEF) memset(&siConEvnt->tranNetSel, 0, sizeof(siConEvnt->tranNetSel)); +#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL || SS7_CHINA) + if (siConEvnt->callRefA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callRefA, 0, sizeof(siConEvnt->callRefA)); +#endif + if (siConEvnt->callRef.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callRef, 0, sizeof(siConEvnt->callRef)); + if (siConEvnt->cgPtyNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNum, 0, sizeof(siConEvnt->cgPtyNum)); +#if SS7_BELL + if (siConEvnt->cgPtyNumB.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNumB, 0, sizeof(siConEvnt->cgPtyNumB)); +#endif + if (siConEvnt->opFwdCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalInd, 0, sizeof(siConEvnt->opFwdCalInd)); +#if (SS7_Q767 || SS7_RUSSIA || SS7_NTT) + if (siConEvnt->opFwdCalIndQ.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalIndQ, 0, sizeof(siConEvnt->opFwdCalIndQ)); +#endif +#if SS7_Q767IT + if (siConEvnt->fwdVad.eh.pres != PRSNT_NODEF) memset(&siConEvnt->fwdVad, 0, sizeof(siConEvnt->fwdVad)); +#endif +#if SS7_ANS88 + if (siConEvnt->opFwdCalIndA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalIndA, 0, sizeof(siConEvnt->opFwdCalIndA)); +#endif + if (siConEvnt->redirgNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirgNum, 0, sizeof(siConEvnt->redirgNum)); + if (siConEvnt->redirInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirInfo, 0, sizeof(siConEvnt->redirInfo)); + if (siConEvnt->cugIntCode.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cugIntCode, 0, sizeof(siConEvnt->cugIntCode)); +#if SS7_ANS88 + if (siConEvnt->cugIntCodeA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cugIntCodeA, 0, sizeof(siConEvnt->cugIntCodeA)); +#endif +#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL || SS7_CHINA) + if (siConEvnt->connReqA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connReqA, 0, sizeof(siConEvnt->connReqA)); +#endif +#if SS7_ANS88 + if (siConEvnt->usr2UsrInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInfoA, 0, sizeof(siConEvnt->usr2UsrInfoA)); +#endif + if (siConEvnt->connReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connReq, 0, sizeof(siConEvnt->connReq)); + if (siConEvnt->origCdNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origCdNum, 0, sizeof(siConEvnt->origCdNum)); + if (siConEvnt->usr2UsrInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInfo, 0, sizeof(siConEvnt->usr2UsrInfo)); + if (siConEvnt->accTrnspt.eh.pres != PRSNT_NODEF) memset(&siConEvnt->accTrnspt, 0, sizeof(siConEvnt->accTrnspt)); + if (siConEvnt->echoControl.eh.pres != PRSNT_NODEF) memset(&siConEvnt->echoControl, 0, sizeof(siConEvnt->echoControl)); +#if SS7_ANS88 + if (siConEvnt->redirInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirInfoA, 0, sizeof(siConEvnt->redirInfoA)); +#endif +#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL) + if (siConEvnt->chargeNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->chargeNum, 0, sizeof(siConEvnt->chargeNum)); + if (siConEvnt->origLineInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origLineInf, 0, sizeof(siConEvnt->origLineInf)); +#endif + if (siConEvnt->usrServInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfo, 0, sizeof(siConEvnt->usrServInfo)); + if (siConEvnt->usr2UsrInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInd, 0, sizeof(siConEvnt->usr2UsrInd)); + if (siConEvnt->propDly.eh.pres != PRSNT_NODEF) memset(&siConEvnt->propDly, 0, sizeof(siConEvnt->propDly)); + if (siConEvnt->usrServInfo1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfo1, 0, sizeof(siConEvnt->usrServInfo1)); + if (siConEvnt->netFac.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netFac, 0, sizeof(siConEvnt->netFac)); +#ifdef SS7_CHINA + if (siConEvnt->orgPteCdeA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->orgPteCdeA, 0, sizeof(siConEvnt->orgPteCdeA)); +#endif + if (siConEvnt->orgPteCde.eh.pres != PRSNT_NODEF) memset(&siConEvnt->orgPteCde, 0, sizeof(siConEvnt->orgPteCde)); + if (siConEvnt->genDigits.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genDigits, 0, sizeof(siConEvnt->genDigits)); + if (siConEvnt->genDigitsR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genDigitsR, 0, sizeof(siConEvnt->genDigitsR)); + if (siConEvnt->usrTSrvInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrTSrvInfo, 0, sizeof(siConEvnt->usrTSrvInfo)); + if (siConEvnt->remotOper.eh.pres != PRSNT_NODEF) memset(&siConEvnt->remotOper, 0, sizeof(siConEvnt->remotOper)); + if (siConEvnt->parmCom.eh.pres != PRSNT_NODEF) memset(&siConEvnt->parmCom, 0, sizeof(siConEvnt->parmCom)); +#if (SS7_ANS92 || SS7_ANS95) + if (siConEvnt->servCode.eh.pres != PRSNT_NODEF) memset(&siConEvnt->servCode, 0, sizeof(siConEvnt->servCode)); +#endif +#if SS7_ANS92 + if (siConEvnt->serviceAct1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct1, 0, sizeof(siConEvnt->serviceAct1)); +#endif +#if SS7_CHINA + if (siConEvnt->serviceAct2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct2, 0, sizeof(siConEvnt->serviceAct2)); +#endif + if (siConEvnt->serviceAct2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct2, 0, sizeof(siConEvnt->serviceAct2)); + if (siConEvnt->serviceAct.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct, 0, sizeof(siConEvnt->serviceAct)); + if (siConEvnt->mlppPrec.eh.pres != PRSNT_NODEF) memset(&siConEvnt->mlppPrec, 0, sizeof(siConEvnt->mlppPrec)); +#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT)) + if (siConEvnt->txMedUsPr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->txMedUsPr, 0, sizeof(siConEvnt->txMedUsPr)); +#endif + if (siConEvnt->bckCallInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->bckCallInd, 0, sizeof(siConEvnt->bckCallInd)); + if (siConEvnt->cgPtyNum1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNum1, 0, sizeof(siConEvnt->cgPtyNum1)); + if (siConEvnt->optBckCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optBckCalInd, 0, sizeof(siConEvnt->optBckCalInd)); +#if (SS7_Q767 || SS7_RUSSIA || SS7_NTT) + if (siConEvnt->optBckCalIndQ.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optBckCalIndQ, 0, sizeof(siConEvnt->optBckCalIndQ)); +#endif + if (siConEvnt->connNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connNum, 0, sizeof(siConEvnt->connNum)); +#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT)) + if (siConEvnt->connNum2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connNum2, 0, sizeof(siConEvnt->connNum2)); +#endif + if (siConEvnt->accDelInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->accDelInfo, 0, sizeof(siConEvnt->accDelInfo)); + if (siConEvnt->notifInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifInd, 0, sizeof(siConEvnt->notifInd)); + if (siConEvnt->notifIndR2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifIndR2, 0, sizeof(siConEvnt->notifIndR2)); + if (siConEvnt->cllHstry.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cllHstry, 0, sizeof(siConEvnt->cllHstry)); + if (siConEvnt->genNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genNmb, 0, sizeof(siConEvnt->genNmb)); + if (siConEvnt->genNmbR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genNmbR, 0, sizeof(siConEvnt->genNmbR)); + if (siConEvnt->redirNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirNum, 0, sizeof(siConEvnt->redirNum)); + if (siConEvnt->redirRstr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirRstr, 0, sizeof(siConEvnt->redirRstr)); + +#if SS7_Q767IT + if (siConEvnt->backVad.eh.pres != PRSNT_NODEF) memset(&siConEvnt->backVad, 0, sizeof(siConEvnt->backVad)); +#endif +#if SS7_SINGTEL + if (siConEvnt->cgPtyNumS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNumS, 0, sizeof(siConEvnt->cgPtyNumS)); +#endif +#if (SS7_ANS92 || SS7_ANS95 || SS7_BELL) + if (siConEvnt->businessGrp.eh.pres != PRSNT_NODEF) memset(&siConEvnt->businessGrp, 0, sizeof(siConEvnt->businessGrp)); + if (siConEvnt->infoInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->infoInd, 0, sizeof(siConEvnt->infoInd)); + if (siConEvnt->carrierId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carrierId, 0, sizeof(siConEvnt->carrierId)); + if (siConEvnt->carSelInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carSelInf, 0, sizeof(siConEvnt->carSelInf)); + if (siConEvnt->egress.eh.pres != PRSNT_NODEF) memset(&siConEvnt->egress, 0, sizeof(siConEvnt->egress)); + if (siConEvnt->genAddr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genAddr, 0, sizeof(siConEvnt->genAddr)); + if (siConEvnt->genAddrR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genAddrR, 0, sizeof(siConEvnt->genAddrR)); + if (siConEvnt->infoReqInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->infoReqInd, 0, sizeof(siConEvnt->infoReqInd)); + if (siConEvnt->jurisInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->jurisInf, 0, sizeof(siConEvnt->jurisInf)); + if (siConEvnt->netTransport.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netTransport, 0, sizeof(siConEvnt->netTransport)); + if (siConEvnt->specProcReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->specProcReq, 0, sizeof(siConEvnt->specProcReq)); + if (siConEvnt->transReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->transReq, 0, sizeof(siConEvnt->transReq)); +#endif +#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT)) +#if (SS7_ANS92 || SS7_ANS95) + if (siConEvnt->notifInd1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifInd1, 0, sizeof(siConEvnt->notifInd1)); + if (siConEvnt->notifIndR1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifIndR1, 0, sizeof(siConEvnt->notifIndR1)); +#endif /* SS7_ANS92 */ +#endif /* SIT_PARAMETER || TDS_ROLL_UPGRADE_SUPPORT */ +#if (SS7_BELL || SS7_ANS95) + if (siConEvnt->genName.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genName, 0, sizeof(siConEvnt->genName)); +#endif +#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_ETSIV3 || \ + SS7_BELL || SS7_ANS95 || SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ) + if (siConEvnt->hopCounter.eh.pres != PRSNT_NODEF) memset(&siConEvnt->hopCounter, 0, sizeof(siConEvnt->hopCounter)); +#endif +#if (SS7_BELL || SS7_ITU2000 || SS7_KZ) + if (siConEvnt->redirCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirCap, 0, sizeof(siConEvnt->redirCap)); + if (siConEvnt->redirCntr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirCntr, 0, sizeof(siConEvnt->redirCntr)); +#endif +#if (SS7_ETSI || SS7_FTZ) + if (siConEvnt->ccbsParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->ccbsParam, 0, sizeof(siConEvnt->ccbsParam)); + if (siConEvnt->freePhParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->freePhParam, 0, sizeof(siConEvnt->freePhParam)); +#endif +#ifdef SS7_FTZ + if (siConEvnt->naPaFF.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaFF, 0, sizeof(siConEvnt->naPaFF)); + if (siConEvnt->naPaFE.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaFE, 0, sizeof(siConEvnt->naPaFE)); + if (siConEvnt->naPaSSP.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaSSP, 0, sizeof(siConEvnt->naPaSSP)); + if (siConEvnt->naPaCdPNO.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaCdPNO, 0, sizeof(siConEvnt->naPaCdPNO)); + if (siConEvnt->naPaSPV.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaSPV, 0, sizeof(siConEvnt->naPaSPV)); + if (siConEvnt->naPaUKK.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaUKK, 0, sizeof(siConEvnt->naPaUKK)); +#endif +#if SS7_NTT + if (siConEvnt->msgAreaInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->msgAreaInfo, 0, sizeof(siConEvnt->msgAreaInfo)); + if (siConEvnt->subsNumber.eh.pres != PRSNT_NODEF) memset(&siConEvnt->subsNumber, 0, sizeof(siConEvnt->subsNumber)); + if (siConEvnt->rpCllngNo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->rpCllngNo, 0, sizeof(siConEvnt->rpCllngNo)); + if (siConEvnt->supplUserType.eh.pres != PRSNT_NODEF) memset(&siConEvnt->supplUserType, 0, sizeof(siConEvnt->supplUserType)); + if (siConEvnt->carrierInfoTrans.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carrierInfoTrans, 0, sizeof(siConEvnt->carrierInfoTrans)); + if (siConEvnt->nwFuncType.eh.pres != PRSNT_NODEF) memset(&siConEvnt->nwFuncType, 0, sizeof(siConEvnt->nwFuncType)); +#endif +#if SS7_ANS95 + if (siConEvnt->optrServicesInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optrServicesInfo, 0, sizeof(siConEvnt->optrServicesInfo)); +#endif +#if (SS7_ANS95 || SS7_ITU97 || SS7_RUSS2000|| SS7_ITU2000 || SS7_NZL || SS7_KZ) + if (siConEvnt->cirAsgnMap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cirAsgnMap, 0, sizeof(siConEvnt->cirAsgnMap)); +#endif +#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_ETSIV3 || \ + SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ) + if (siConEvnt->displayInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->displayInfo, 0, sizeof(siConEvnt->displayInfo)); + if (siConEvnt->confTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->confTrtInd, 0, sizeof(siConEvnt->confTrtInd)); + if (siConEvnt->netMgmtControls.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netMgmtControls, 0, sizeof(siConEvnt->netMgmtControls)); + if (siConEvnt->correlationId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->correlationId, 0, sizeof(siConEvnt->correlationId)); + if (siConEvnt->callDivTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callDivTrtInd, 0, sizeof(siConEvnt->callDivTrtInd)); + if (siConEvnt->callInNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callInNmb, 0, sizeof(siConEvnt->callInNmb)); + if (siConEvnt->callOfferTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callOfferTrtInd, 0, sizeof(siConEvnt->callOfferTrtInd)); + if (siConEvnt->scfId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->scfId, 0, sizeof(siConEvnt->scfId)); + if (siConEvnt->uidCapInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->uidCapInd, 0, sizeof(siConEvnt->uidCapInd)); + if (siConEvnt->collCallReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->collCallReq, 0, sizeof(siConEvnt->collCallReq)); + if (siConEvnt->ccss.eh.pres != PRSNT_NODEF) memset(&siConEvnt->ccss, 0, sizeof(siConEvnt->ccss)); +#endif +#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_UK || SS7_NZL || SS7_KZ) + if (siConEvnt->backGVNS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->backGVNS, 0, sizeof(siConEvnt->backGVNS)); + if (siConEvnt->forwardGVNS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->forwardGVNS, 0, sizeof(siConEvnt->forwardGVNS)); +#endif +#if (SS7_ETSIV3 || SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || \ + SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ) + if (siConEvnt->appTransParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->appTransParam, 0, sizeof(siConEvnt->appTransParam)); +#endif +#if (SS7_ITU2000 || SS7_UK || SS7_NZL || SS7_KZ) + if (siConEvnt->htrInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->htrInfo, 0, sizeof(siConEvnt->htrInfo)); + if (siConEvnt->pivotCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotCap, 0, sizeof(siConEvnt->pivotCap)); + if (siConEvnt->cadDirNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cadDirNmb, 0, sizeof(siConEvnt->cadDirNmb)); + if (siConEvnt->origCallInNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origCallInNum, 0, sizeof(siConEvnt->origCallInNum)); + if (siConEvnt->calgGeoLoc.eh.pres != PRSNT_NODEF) memset(&siConEvnt->calgGeoLoc, 0, sizeof(siConEvnt->calgGeoLoc)); + if (siConEvnt->netRoutNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netRoutNum, 0, sizeof(siConEvnt->netRoutNum)); + if (siConEvnt->qonRelCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->qonRelCap, 0, sizeof(siConEvnt->qonRelCap)); + if (siConEvnt->pivotCntr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotCntr, 0, sizeof(siConEvnt->pivotCntr)); + if (siConEvnt->pivotRtgFwInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotRtgFwInfo, 0, sizeof(siConEvnt->pivotRtgFwInfo)); + if (siConEvnt->pivotRtgBkInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotRtgBkInfo, 0, sizeof(siConEvnt->pivotRtgBkInfo)); + if (siConEvnt->numPortFwdInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->numPortFwdInfo, 0, sizeof(siConEvnt->numPortFwdInfo)); +#endif +#ifdef SS7_UK + if (siConEvnt->natFwdCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natFwdCalInd, 0, sizeof(siConEvnt->natFwdCalInd)); + if (siConEvnt->presntNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->presntNum, 0, sizeof(siConEvnt->presntNum)); + if (siConEvnt->lstDvrtLineId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->lstDvrtLineId, 0, sizeof(siConEvnt->lstDvrtLineId)); + if (siConEvnt->pcgLineId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pcgLineId, 0, sizeof(siConEvnt->pcgLineId)); + if (siConEvnt->natFwdCalIndLnk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natFwdCalIndLnk, 0, sizeof(siConEvnt->natFwdCalIndLnk)); + if (siConEvnt->cdBascSrvcMrk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cdBascSrvcMrk, 0, sizeof(siConEvnt->cdBascSrvcMrk)); +#endif /* SS7_UK */ +#if (defined(CGPN_CHK)) + if (siConEvnt->causeDgnCgPnChk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->causeDgnCgPnChk, 0, sizeof(siConEvnt->causeDgnCgPnChk)); +#endif + return FTDM_SUCCESS; +} + +ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt) +{ +#ifndef HAVE_ZLIB + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Cannot perform transparent IAM because zlib is missing\n"); + return FTDM_FAIL; +#else + unsigned ret_val = FTDM_FAIL; + char *compressed_iam = NULL; + char *url_encoded_iam = NULL; + uLongf len = sizeof(*siConEvnt); + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + /* By default, Trillium does not memset their whole structure to zero for + * performance. But we want to memset all the IE's that are not present to + * optimize compressed size */ + sngss7_bufferzero_iam(siConEvnt); + + compressed_iam = ftdm_malloc(sizeof(*siConEvnt)); + if (!compressed_iam) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to allocate buffer for compressed_iam\n"); + goto done; + } + + /* Compress IAM structure to minimize buffer size */ + ret_val = compress((Bytef *)compressed_iam, &len, (const Bytef *)siConEvnt, (uLong)sizeof(*siConEvnt)); + if (ret_val != Z_OK) { + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Failed to compress IAM (error:%d)\n", ret_val); + ret_val = FTDM_FAIL; + goto done; + } + + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Compressed IAM size:%d\n", len); + + /* Worst case: size will triple after url encode */ + url_encoded_iam = ftdm_malloc(3*sizeof(*siConEvnt)); + if (!url_encoded_iam) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to allocated buffer for url_encoded_iam\n"); + ret_val = FTDM_FAIL; + goto done; + } + memset(url_encoded_iam, 0, 2*sizeof(*siConEvnt)); + + /* URL encode buffer to that its safe to store it in a string */ + ftdm_url_encode((const char*)compressed_iam, url_encoded_iam, len); + + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%d\n", strlen(url_encoded_iam)); + + if (strlen(url_encoded_iam) > g_ftdm_sngss7_data.cfg.transparent_iam_max_size) { + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "IAM variable length exceeds max size (len:%d max:%d) \n", strlen(url_encoded_iam), g_ftdm_sngss7_data.cfg.transparent_iam_max_size); + ret_val = FTDM_FAIL; + goto done; + } + + sngss7_add_var(sngss7_info, "ss7_iam", url_encoded_iam); +done: + ftdm_safe_free(compressed_iam); + ftdm_safe_free(url_encoded_iam); + return ret_val; +#endif +} + +ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt) +{ +#ifndef HAVE_ZLIB + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Cannot perform transparent IAM because zlib is missing\n"); + return FTDM_FAIL; +#else + uLongf len = 3*sizeof(*siConEvnt); /* worst case: URL encoded buffer is 3x length of buffer */ + char *val = NULL; + unsigned ret_val = FTDM_FAIL; + void *uncompressed_buffer = NULL; + char *url_encoded_iam = NULL; + ftdm_size_t url_encoded_iam_len; + + val = (char*)ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam"); + if (ftdm_strlen_zero(val)) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Transparent IAM info available\n"); + return FTDM_FAIL; + } + + url_encoded_iam = ftdm_strdup(val); + + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%d\n", strlen(val)); + ftdm_url_decode(url_encoded_iam, &url_encoded_iam_len); + + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Compressed IAM size:%d\n", url_encoded_iam_len); + + uncompressed_buffer = ftdm_malloc(sizeof(*siConEvnt)); + ftdm_assert_return(uncompressed_buffer, FTDM_FAIL, "Failed to allocate buffer for uncompressed buffer\n"); + + ret_val = uncompress(uncompressed_buffer, &len, (const Bytef *)url_encoded_iam, (uLong)url_encoded_iam_len); + if (ret_val != Z_OK) { + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Failed to uncompress IAM (error:%d)\n", ret_val); + goto done; + } + + if (len != sizeof(*siConEvnt)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Incompatible IAM structure size (expected:%d size:%d)\n", sizeof(*siConEvnt), strlen(uncompressed_buffer)); + goto done; + } + + memcpy(siConEvnt, uncompressed_buffer, sizeof(*siConEvnt)); + ret_val = FTDM_SUCCESS; + +done: + ftdm_safe_free(uncompressed_buffer); + ftdm_safe_free(url_encoded_iam); + return ret_val; +#endif +} + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 2df0a88edb..a891c50108 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -124,7 +124,8 @@ typedef struct sng_ccSpan uint32_t cld_nadi; uint32_t rdnis_nadi; uint32_t min_digits; - uint32_t itx_auto_reply; + uint8_t itx_auto_reply; + uint8_t transparent_iam; uint32_t t3; uint32_t t12; uint32_t t13; @@ -466,6 +467,9 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { + g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val); + SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size); } else { /**********************************************************************/ SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val); @@ -1896,6 +1900,13 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) } else if (!strcasecmp(parm->var, "itx_auto_reply")) { sng_ccSpan.itx_auto_reply = ftdm_true(parm->val); SS7_DEBUG("Found itx_auto_reply %d\n", sng_ccSpan.itx_auto_reply); + } else if (!strcasecmp(parm->var, "transparent_iam")) { +#ifndef HAVE_ZLIB + SS7_CRIT("Cannot enable transparent IAM becauze zlib not installed\n"); +#else + sng_ccSpan.transparent_iam = ftdm_true(parm->val); + SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam); +#endif } else if (!strcasecmp(parm->var, "cicbase")) { /**********************************************************************/ sng_ccSpan.cicbase = atoi(parm->val); @@ -2907,16 +2918,17 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].cic = 0; } - g_ftdm_sngss7_data.cfg.isupCkt[x].infId = ccSpan->isupInf; - g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = ccSpan->typeCntrl; - g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf; - g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi; - g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi; - g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi; - g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options; - g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType; - g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; - g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; + g_ftdm_sngss7_data.cfg.isupCkt[x].infId = ccSpan->isupInf; + g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = ccSpan->typeCntrl; + g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf; + g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi; + g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi; + g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi; + g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options; + g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType; + g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; + g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; + g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam; if (ccSpan->t3 == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 6b14d14524..1d27b946e3 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -276,12 +276,16 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_screening, ftdm_screening2str, ftdm_screening_t) /*! \brief bearer capability */ typedef enum { - FTDM_BEARER_CAP_SPEECH = 0x00, - FTDM_BEARER_CAP_64K_UNRESTRICTED = 0x02, - FTDM_BEARER_CAP_3_1KHZ_AUDIO = 0x03, + FTDM_BEARER_CAP_SPEECH = 0x00, /* Speech */ + FTDM_BEARER_CAP_UNRESTRICTED, /* Unrestricted Digital */ + FTDM_BEARER_CAP_RESTRICTED, /* Restricted Digital */ + FTDM_BEARER_CAP_3_1KHZ_AUDIO, /* 3.1 Khz Audio */ + FTDM_BEARER_CAP_7KHZ_AUDIO, /* 7 Khz Audio or Unrestricted digital w tones */ + FTDM_BEARER_CAP_15KHZ_AUDIO, /* 15 Khz Audio */ + FTDM_BEARER_CAP_VIDEO, /* Video */ FTDM_BEARER_CAP_INVALID } ftdm_bearer_cap_t; -#define BEARER_CAP_STRINGS "speech", "unrestricted-digital-information", "3.1-Khz-audio", "invalid" +#define BEARER_CAP_STRINGS "speech", "unrestricted-digital-information", "restricted-digital-information", "3.1-Khz-audio", "7-Khz-audio", "15-Khz-audio", "video", "invalid" FTDM_STR2ENUM_P(ftdm_str2ftdm_bearer_cap, ftdm_bearer_cap2str, ftdm_bearer_cap_t) /*! \brief user information layer 1 protocol */ diff --git a/libs/freetdm/src/include/ftdm_call_utils.h b/libs/freetdm/src/include/ftdm_call_utils.h index 2418273343..975e73e729 100644 --- a/libs/freetdm/src/include/ftdm_call_utils.h +++ b/libs/freetdm/src/include/ftdm_call_utils.h @@ -131,5 +131,24 @@ FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number); */ FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target); +/*! + * \brief URL encode a buffer + * + * \param url buffer to convert + * \param buf target to save converted string to + * \param len size of buffer + * + * \retval pointer to converted string + */ +FT_DECLARE(char *) ftdm_url_encode(const char *url, char *buf, ftdm_size_t len); + +/*! + * \param s buffer to convert + * \param len size of buffer + * + * \retval pointer to converted string + */ +FT_DECLARE(char *) ftdm_url_decode(char *s, ftdm_size_t *len); + #endif /* __FTDM_CALL_UTILS_H__ */ From 0bdf79b17c8ed811b0a75f537e58bab63d7d0f94 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 17 May 2011 14:17:00 -0400 Subject: [PATCH 028/493] mod_sangoma_codec: AMR codec fixes - Set the proper RTP payload - Do not validate RTP reads when the size is dynamic (zero) --- src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c index dd97453c7a..5b12eb6448 100644 --- a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c +++ b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c @@ -96,7 +96,7 @@ vocallo_codec_t g_codec_map[] = /* manually initialized */ { SNGTC_CODEC_GSM_FR, IANA_GSM_A_8000_1, "GSM", "Sangoma GSM", 20, 13200, 20000, 160, 320, 33, 8000, 8000, 0 }, { SNGTC_CODEC_G723_1_63, IANA_G723_A_8000_1, "G723", "Sangoma G723", 90, 6300, 30000, 240, 480, 24, 8000, 8000, 0 }, - { SNGTC_CODEC_AMR_1220, IANA_AMR_WB_16000_1, "AMR", "Sangoma AMR", 20, 12200, 20000, 160, 320, 0, 8000, 8000, 0 }, + { SNGTC_CODEC_AMR_1220, IANA_AMR_A_8000_1, "AMR", "Sangoma AMR", 20, 12200, 20000, 160, 320, 0, 8000, 8000, 0 }, { SNGTC_CODEC_SIREN7_24, IANA_SIREN7, "G7221", "Sangoma G722.1", 20, 24000, 20000, 320, 640, 60, 16000, 16000, 0 }, { SNGTC_CODEC_SIREN7_32, IANA_SIREN7, "G7221", "Sangoma G722.1", 20, 32000, 20000, 320, 640, 80, 16000, 16000, 0 }, { SNGTC_CODEC_ILBC_133, IANA_ILBC_133_8000_1, "iLBC", "Sangoma iLBC", 30, 13300, 30000, 240, 480, 50, 8000, 8000, 0 }, @@ -131,6 +131,7 @@ struct codec_data { /* packet counters */ unsigned long tx; unsigned long rx; + unsigned long ticks; /* Lost packets */ long lastrxseqno; @@ -467,6 +468,8 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec func_start_time = switch_micro_time_now(); } + sess->encoder.ticks++; + /* start assuming we will not encode anything */ *encoded_data_len = 0; @@ -547,7 +550,7 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec continue; } - if (encoded_frame.datalen != codec->implementation->encoded_bytes_per_packet) { + if (codec->implementation->encoded_bytes_per_packet && encoded_frame.datalen != codec->implementation->encoded_bytes_per_packet) { /* seen when silence suppression is enabled */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ignoring encoded frame of %d bytes intead of %d bytes\n", encoded_frame.datalen, codec->implementation->encoded_bytes_per_packet); continue; @@ -619,7 +622,7 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen = 0; SAFE_INDEX_INC(sess->encoder.rtp_queue, sess->encoder.queue_rindex); sess->encoder.queue_size--; - if (*encoded_data_len != codec->implementation->encoded_bytes_per_packet) { + if (codec->implementation->encoded_bytes_per_packet && *encoded_data_len != codec->implementation->encoded_bytes_per_packet) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Returning odd encoded frame of %d bytes intead of %d bytes\n", *encoded_data_len, codec->implementation->encoded_bytes_per_packet); } } else { @@ -667,6 +670,7 @@ static switch_status_t switch_sangoma_decode(switch_codec_t *codec, /* codec ses } dbuf_linear = decoded_data; + sess->decoder.ticks++; /* start assuming we will not decode anything */ *decoded_data_len = 0; @@ -989,6 +993,7 @@ SWITCH_STANDARD_API(sangoma_function) stream->write_function(stream, "Rx %s at %d.%d.%d.%d:%d from %d.%d.%d.%d:%d\n\n", sess->impl->iananame, SNGTC_NIPV4(sess->encoder.reply.b.host_ip), sess->encoder.reply.b.host_udp_port, SNGTC_NIPV4(sess->encoder.reply.b.codec_ip), sess->encoder.reply.b.codec_udp_port); + stream->write_function(stream, "Ticks: %lu\n", sess->encoder.ticks); stream->write_function(stream, "-- Inbound Stats --\n"); stream->write_function(stream, "Rx Discarded: %lu\n", sess->encoder.rxdiscarded); @@ -1008,6 +1013,7 @@ SWITCH_STANDARD_API(sangoma_function) SNGTC_NIPV4(sess->decoder.reply.a.codec_ip), sess->decoder.reply.a.codec_udp_port); stream->write_function(stream, "Rx L16 at %d.%d.%d.%d:%d from %d.%d.%d.%d:%d\n\n", SNGTC_NIPV4(sess->decoder.reply.b.host_ip), sess->decoder.reply.b.host_udp_port, SNGTC_NIPV4(sess->decoder.reply.b.codec_ip), sess->decoder.reply.b.codec_udp_port); + stream->write_function(stream, "Ticks: %lu\n", sess->decoder.ticks); stream->write_function(stream, "-- Inbound Stats --\n"); stream->write_function(stream, "Rx Discarded: %lu\n", sess->decoder.rxdiscarded); From 7db91251c8dbed559ca2b62e89daaf5a5c61d7b7 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 30 May 2011 18:49:15 -0400 Subject: [PATCH 029/493] modified switch.c to not create PID file until all modules are loaded this help init scripts to check when everything is really loaded. Also return 1 when loading modules fails, do not return 255 which can be confused with a segmentation fault or some other more violent code --- src/switch.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/switch.c b/src/switch.c index f5ffe950e2..5b71b64e8d 100644 --- a/src/switch.c +++ b/src/switch.c @@ -894,6 +894,11 @@ int main(int argc, char *argv[]) switch_dir_make_recursive(SWITCH_GLOBAL_dirs.run_dir, SWITCH_DEFAULT_DIR_PERMS, pool); + if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { + fprintf(stderr, "Failed to initialize modules: %s\n", err); + return 1; + } + if (switch_file_open(&fd, pid_path, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, pool) == SWITCH_STATUS_SUCCESS) { old_pid_len = sizeof(old_pid_buffer); @@ -920,14 +925,6 @@ int main(int argc, char *argv[]) switch_file_write(fd, pid_buffer, &pid_len); - if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { - fprintf(stderr, "Cannot Initialize [%s], deleting pid file [%s]\n", err, pid_path); - if (unlink(pid_path) != 0) { - fprintf(stderr, "Failed to delete pid file [%s]\n", pid_path); - } - return 255; - } - #ifndef WIN32 if (do_wait) { kill(getppid(), SIGUSR2); From cbb82ad6404b93781eec48983c04dc300bdfb789 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 30 May 2011 18:49:15 -0400 Subject: [PATCH 030/493] modified switch.c to not create PID file until all modules are loaded this help init scripts to check when everything is really loaded. Also return 1 when loading modules fails, do not return 255 which can be confused with a segmentation fault or some other more violent code --- src/switch.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/switch.c b/src/switch.c index 7e81ab01cf..fcc367c8c8 100644 --- a/src/switch.c +++ b/src/switch.c @@ -894,6 +894,11 @@ int main(int argc, char *argv[]) switch_dir_make_recursive(SWITCH_GLOBAL_dirs.run_dir, SWITCH_DEFAULT_DIR_PERMS, pool); + if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { + fprintf(stderr, "Failed to initialize modules: %s\n", err); + return 1; + } + if (switch_file_open(&fd, pid_path, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, pool) == SWITCH_STATUS_SUCCESS) { old_pid_len = sizeof(old_pid_buffer); @@ -920,11 +925,6 @@ int main(int argc, char *argv[]) switch_file_write(fd, pid_buffer, &pid_len); - if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { - fprintf(stderr, "Cannot Initialize [%s]\n", err); - return 255; - } - #ifndef WIN32 if (do_wait) { kill(getppid(), SIGUSR2); From 86072ad4edb1b1cee4bd91327ad6a334ef62fcb7 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 31 May 2011 19:56:50 -0400 Subject: [PATCH 031/493] freetdm: added fail-on-error global configuration to refuse to load the module if there is any error --- libs/freetdm/conf/freetdm.conf.xml | 5 + libs/freetdm/mod_freetdm/mod_freetdm.c | 192 +++++++------------------ 2 files changed, 59 insertions(+), 138 deletions(-) diff --git a/libs/freetdm/conf/freetdm.conf.xml b/libs/freetdm/conf/freetdm.conf.xml index 7d5de5a189..29232d927b 100644 --- a/libs/freetdm/conf/freetdm.conf.xml +++ b/libs/freetdm/conf/freetdm.conf.xml @@ -18,6 +18,11 @@ with the signaling protocols that you can run on top of your I/O interfaces. --> + + diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 8739c4c0bf..890ca504e5 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -88,6 +88,8 @@ static struct { switch_hash_t *ss7_configs; int sip_headers; uint8_t crash_on_assert; + uint8_t fail_on_error; + uint8_t config_error; } globals; /* private data attached to each fs session */ @@ -2302,6 +2304,10 @@ static uint32_t enable_analog_option(const char *str, uint32_t current_options) } +#define CONFIG_ERROR(...) do { \ + ftdm_log(FTDM_LOG_ERROR, __VA_ARGS__); \ + globals.config_error = 1; \ + } while(0) /* create ftdm_conf_node_t tree based on a fixed pattern XML configuration list * last 2 args are for limited aka dumb recursivity * */ @@ -2494,7 +2500,7 @@ static int add_profile_parameters(switch_xml_t cfg, const char *profname, ftdm_c profnode = switch_xml_child(cfg, "config_profiles"); if (!profnode) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "cannot find profile '%s', there is no 'config_profiles' XML section\n", profname); + CONFIG_ERROR("cannot find profile '%s', there is no 'config_profiles' XML section\n", profname); return 0; } @@ -2510,7 +2516,7 @@ static int add_profile_parameters(switch_xml_t cfg, const char *profname, ftdm_c } if (!profile) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to find profile '%s'\n", profname); + CONFIG_ERROR("failed to find profile '%s'\n", profname); return 0; } @@ -2545,7 +2551,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) unsigned paramindex = 0; if (!name && !id) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "sangoma isdn span missing required attribute 'id' or 'name', skipping ...\n"); + CONFIG_ERROR("sangoma isdn span missing required attribute 'id' or 'name', skipping ...\n"); continue; } @@ -2563,7 +2569,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) } if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -2590,7 +2596,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for ss7 span, ignoring any parameter after %s\n", var); + CONFIG_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); break; } @@ -2605,10 +2611,10 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) int calls; int seconds; if (sscanf(val, "%d/%d", &calls, &seconds) != 2) { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); + CONFIG_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); } else { if (calls < 1 || seconds < 1) { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter value, minimum call limit must be 1 per second\n", var); + CONFIG_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); } else { SPAN_CONFIG[span_id].limit_calls = calls; SPAN_CONFIG[span_id].limit_seconds = seconds; @@ -2618,7 +2624,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) if (!strcasecmp(val, "answer")) { SPAN_CONFIG[span_id].limit_reset_event = FTDM_LIMIT_RESET_ON_ANSWER; } else { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter value, only accepted event is 'answer'\n", var); + CONFIG_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); } } else { spanparameters[paramindex].var = var; @@ -2631,7 +2637,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) "sangoma_isdn", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring Sangoma ISDN FreeTDM span %d\n", span_id); + CONFIG_ERROR("Error configuring Sangoma ISDN FreeTDM span %d\n", span_id); continue; } SPAN_CONFIG[span_id].span = span; @@ -2648,15 +2654,11 @@ static switch_status_t load_config(void) const char *cf = "freetdm.conf"; switch_xml_t cfg, xml, settings, param, spans, myspan; ftdm_conf_node_t *ss7confnode = NULL; - ftdm_span_t *boost_spans[FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN]; - ftdm_span_t *boost_span = NULL; - unsigned boosti = 0; unsigned int i = 0; ftdm_channel_t *fchan = NULL; ftdm_iterator_t *chaniter = NULL; ftdm_iterator_t *curr = NULL; - memset(boost_spans, 0, sizeof(boost_spans)); memset(&globals, 0, sizeof(globals)); switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, module_pool); if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { @@ -2675,6 +2677,8 @@ static switch_status_t load_config(void) switch_set_string(globals.hold_music, val); } else if (!strcasecmp(var, "crash-on-assert")) { globals.crash_on_assert = switch_true(val); + } else if (!strcasecmp(var, "fail-on-error")) { + globals.fail_on_error = switch_true(val); } else if (!strcasecmp(var, "sip-headers")) { globals.sip_headers = switch_true(val); } else if (!strcasecmp(var, "enable-analog-option")) { @@ -2705,11 +2709,11 @@ static switch_status_t load_config(void) uint32_t span_id = 0; unsigned paramindex = 0; if (!name && !id) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ss7 span missing required attribute 'id' or 'name', skipping ...\n"); + CONFIG_ERROR("ss7 span missing required attribute 'id' or 'name', skipping ...\n"); continue; } if (!configname) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ss7 span missing required attribute, skipping ...\n"); + CONFIG_ERROR("ss7 span missing required attribute, skipping ...\n"); continue; } if (name) { @@ -2726,7 +2730,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -2736,7 +2740,7 @@ static switch_status_t load_config(void) ss7confnode = get_ss7_config_node(cfg, configname); if (!ss7confnode) { - ftdm_log(FTDM_LOG_ERROR, "Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); + CONFIG_ERROR("Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); continue; } @@ -2750,7 +2754,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for ss7 span, ignoring any parameter after %s\n", var); + CONFIG_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); break; } @@ -2769,7 +2773,7 @@ static switch_status_t load_config(void) "sangoma_ss7", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring ss7 FreeTDM span %d\n", span_id); + CONFIG_ERROR("Error configuring ss7 FreeTDM span %d\n", span_id); continue; } SPAN_CONFIG[span_id].span = span; @@ -2820,7 +2824,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -2854,10 +2858,10 @@ static switch_status_t load_config(void) int calls; int seconds; if (sscanf(val, "%d/%d", &calls, &seconds) != 2) { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); + CONFIG_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); } else { if (calls < 1 || seconds < 1) { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter value, minimum call limit must be 1 per second\n", var); + CONFIG_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); } else { SPAN_CONFIG[span_id].limit_calls = calls; SPAN_CONFIG[span_id].limit_seconds = seconds; @@ -2867,7 +2871,7 @@ static switch_status_t load_config(void) if (!strcasecmp(val, "answer")) { SPAN_CONFIG[span_id].limit_reset_event = FTDM_LIMIT_RESET_ON_ANSWER; } else { - ftdm_log(FTDM_LOG_ERROR, "Invalid %s parameter value, only accepted event is 'answer'\n", var); + CONFIG_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); } } else if (!strcasecmp(var, "dial-regex")) { dial_regex = val; @@ -2895,7 +2899,7 @@ static switch_status_t load_config(void) } if (!id && !name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required param 'id'\n"); + CONFIG_ERROR("span missing required param 'id'\n"); continue; } @@ -2925,7 +2929,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -2945,7 +2949,7 @@ static switch_status_t load_config(void) "callwaiting", &callwaiting, "wait_dialtone_timeout", &dialtone_timeout, FTDM_TAG_END) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM analog span %s\n", ftdm_span_get_name(span)); + CONFIG_ERROR("Error configuring FreeTDM analog span %s\n", ftdm_span_get_name(span)); continue; } @@ -3021,7 +3025,7 @@ static switch_status_t load_config(void) } if (!id && !name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required param 'id'\n"); + CONFIG_ERROR("span missing required param 'id'\n"); continue; } @@ -3053,7 +3057,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3067,7 +3071,7 @@ static switch_status_t load_config(void) "digit_timeout", &to, "max_dialstr", &max, FTDM_TAG_END) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error starting FreeTDM span %d\n", span_id); + CONFIG_ERROR("Error starting FreeTDM span %d\n", span_id); continue; } @@ -3104,7 +3108,7 @@ static switch_status_t load_config(void) uint32_t span_id = 0; if (!name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n"); + CONFIG_ERROR("span missing required attribute 'name'\n"); continue; } @@ -3115,7 +3119,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var); + CONFIG_ERROR("Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var); break; } @@ -3137,13 +3141,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", name); + CONFIG_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "isdn", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM span %s\n", name); + CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -3170,7 +3174,7 @@ static switch_status_t load_config(void) int span_id = 0; if (!name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n"); + CONFIG_ERROR("span missing required attribute 'name'\n"); continue; } @@ -3181,7 +3185,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var); + CONFIG_ERROR("Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var); break; } @@ -3198,13 +3202,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", name); + CONFIG_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "pritap", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM span %s\n", name); + CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -3230,7 +3234,7 @@ static switch_status_t load_config(void) uint32_t span_id = 0; if (!name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n"); + CONFIG_ERROR("span missing required attribute 'name'\n"); continue; } @@ -3241,7 +3245,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - ftdm_log(FTDM_LOG_ERROR, "Too many parameters for libpri span, ignoring everything after '%s'\n", var); + CONFIG_ERROR("Too many parameters for libpri span, ignoring everything after '%s'\n", var); break; } @@ -3263,13 +3267,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", name); + CONFIG_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "libpri", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM span %s\n", name); + CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -3282,86 +3286,6 @@ static switch_status_t load_config(void) } } - if ((spans = switch_xml_child(cfg, "boost_spans"))) { - for (myspan = switch_xml_child(spans, "span"); myspan; myspan = myspan->next) { - char *id = (char *) switch_xml_attr(myspan, "id"); - char *name = (char *) switch_xml_attr(myspan, "name"); - char *sigmod = (char *) switch_xml_attr(myspan, "sigmod"); - ftdm_status_t zstatus = FTDM_FAIL; - const char *context = "default"; - const char *dialplan = "XML"; - uint32_t span_id = 0; - ftdm_span_t *span = NULL; - ftdm_conf_parameter_t spanparameters[30]; - unsigned paramindex = 0; - - if (!id && !name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "boost span requires an id or name as attribute: \n"); - continue; - } - memset(spanparameters, 0, sizeof(spanparameters)); - if (sigmod) { - spanparameters[paramindex].var = "sigmod"; - spanparameters[paramindex].val = sigmod; - paramindex++; - } - - for (param = switch_xml_child(myspan, "param"); param; param = param->next) { - char *var = (char *) switch_xml_attr_soft(param, "name"); - char *val = (char *) switch_xml_attr_soft(param, "value"); - - if (ftdm_array_len(spanparameters) - 1 == paramindex) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for boost span, ignoring any parameter after %s\n", var); - break; - } - - if (!strcasecmp(var, "context")) { - context = val; - } else if (!strcasecmp(var, "dialplan")) { - dialplan = val; - } else { - spanparameters[paramindex].var = var; - spanparameters[paramindex].val = val; - paramindex++; - } - } - - if (name) { - zstatus = ftdm_span_find_by_name(name, &span); - } else { - if (switch_is_number(id)) { - span_id = atoi(id); - zstatus = ftdm_span_find(span_id, &span); - } - - if (zstatus != FTDM_SUCCESS) { - zstatus = ftdm_span_find_by_name(id, &span); - } - } - - if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); - continue; - } - - if (!span_id) { - span_id = ftdm_span_get_id(span); - } - - if (ftdm_configure_span_signaling(span, "sangoma_boost", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error starting FreeTDM span %d error: %s\n", span_id, ftdm_span_get_last_error(span)); - continue; - } - - SPAN_CONFIG[span_id].span = span; - switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context)); - switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan)); - - switch_copy_string(SPAN_CONFIG[span_id].type, "Sangoma (boost)", sizeof(SPAN_CONFIG[span_id].type)); - boost_spans[boosti++] = span; - } - } - if ((spans = switch_xml_child(cfg, "r2_spans"))) { for (myspan = switch_xml_child(spans, "span"); myspan; myspan = myspan->next) { char *name = (char *) switch_xml_attr(myspan, "name"); @@ -3380,7 +3304,7 @@ static switch_status_t load_config(void) unsigned paramindex = 0; if (!name) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "'name' attribute required for R2 spans!\n"); + CONFIG_ERROR("'name' attribute required for R2 spans!\n"); continue; } @@ -3415,14 +3339,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM R2 Span '%s'\n", name); + CONFIG_ERROR("Error finding FreeTDM R2 Span '%s'\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "r2", on_r2_signal, spanparameters) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM R2 span %s, error: %s\n", - name, ftdm_span_get_last_error(span)); + CONFIG_ERROR("Error configuring FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); continue; } @@ -3440,24 +3363,12 @@ static switch_status_t load_config(void) switch_copy_string(SPAN_CONFIG[span_id].type, "R2", sizeof(SPAN_CONFIG[span_id].type)); if (ftdm_span_start(span) == FTDM_FAIL) { - ftdm_log(FTDM_LOG_ERROR, "Error starting FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); + CONFIG_ERROR("Error starting FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); continue; } } } - /* start all boost spans now that we're done configuring. Unfortunately at this point boost modules have the limitation - * of needing all spans to be configured before starting them */ - for (i=0 ; i < boosti; i++) { - boost_span = boost_spans[i]; - ftdm_log(FTDM_LOG_DEBUG, "Starting boost span %d\n", ftdm_span_get_id(boost_span)); - if (ftdm_span_start(boost_span) == FTDM_FAIL) { - ftdm_log(FTDM_LOG_ERROR, "Error starting boost FreeTDM span %d, error: %s\n", - ftdm_span_get_id(boost_span), ftdm_span_get_last_error(boost_span)); - continue; - } - } - if (globals.crash_on_assert) { ftdm_log(FTDM_LOG_WARNING, "Crash on assert enabled\n"); ftdm_global_set_crash_policy(FTDM_CRASH_ON_ASSERT); @@ -3465,6 +3376,11 @@ static switch_status_t load_config(void) switch_xml_free(xml); + if (globals.fail_on_error && globals.config_error) { + ftdm_log(FTDM_LOG_ERROR, "Refusing to load module with errors\n"); + return SWITCH_STATUS_TERM; + } + return SWITCH_STATUS_SUCCESS; } From d19d4b96abd381e033d5d6a9d9a7a556e0a6512b Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 13 Jun 2011 13:33:25 -0400 Subject: [PATCH 032/493] use -base directory as the cwd for the process --- src/include/switch_apr.h | 1 + src/switch.c | 2 ++ src/switch_apr.c | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index 2306075e1f..9ec6f94496 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -854,6 +854,7 @@ SWITCH_DECLARE(switch_status_t) switch_queue_trypush(switch_queue_t *queue, void SWITCH_DECLARE(switch_status_t) switch_file_open(switch_file_t ** newf, const char *fname, int32_t flag, switch_fileperms_t perm, switch_memory_pool_t *pool); +SWITCH_DECLARE(switch_status_t) switch_filepath_set(const char *path, switch_memory_pool_t *pool); SWITCH_DECLARE(switch_status_t) switch_file_seek(switch_file_t *thefile, switch_seek_where_t where, int64_t *offset); diff --git a/src/switch.c b/src/switch.c index 7d4d1a8217..49ca107f67 100644 --- a/src/switch.c +++ b/src/switch.c @@ -875,6 +875,8 @@ int main(int argc, char *argv[]) apr_pool_create(&pool, NULL); + switch_filepath_set(SWITCH_GLOBAL_dirs.base_dir, pool); + switch_dir_make_recursive(SWITCH_GLOBAL_dirs.run_dir, SWITCH_DEFAULT_DIR_PERMS, pool); if (switch_file_open(&fd, pid_path, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, pool) == SWITCH_STATUS_SUCCESS) { diff --git a/src/switch_apr.c b/src/switch_apr.c index 495e0605a8..24c966e6dc 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -403,6 +403,11 @@ SWITCH_DECLARE(switch_status_t) switch_file_open(switch_file_t ** newf, const ch return apr_file_open(newf, fname, flag, perm, pool); } +SWITCH_DECLARE(switch_status_t) switch_filepath_set(const char *path, switch_memory_pool_t *pool) +{ + return apr_filepath_set(path, pool); +} + SWITCH_DECLARE(switch_status_t) switch_file_seek(switch_file_t *thefile, switch_seek_where_t where, int64_t *offset) { apr_status_t rv; From c23c3d87301cd17d1c62c0c224673748e0033dcf Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 13 Jun 2011 17:33:41 -0400 Subject: [PATCH 033/493] freetdm: set proper flags when a given layer (ISUP, MTP3 etc) is started and verify such flags on shutdown to avoid segfault when shutting down a layer that was never started - fix issue #741 --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 22 ++++++++----- .../ftmod_sangoma_ss7_main.c | 31 +++++++++++-------- .../ftmod_sangoma_ss7_main.h | 26 +++++++++++----- .../ftmod_sangoma_ss7_relay.c | 2 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 12 +++---- 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index 34d79837f0..f340fa3833 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -99,17 +99,18 @@ int ft_to_sngss7_cfg_all(void) return 1; } else { SS7_INFO("Started Stack Manager!\n"); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED); } /* check if the configuration had a Relay Channel */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_PRESENT)) { /* start up the relay task */ if (sng_isup_init_relay()) { SS7_CRITICAL("Failed to start Relay\n"); return 1; } else { SS7_INFO("Started Relay!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED); } /* run general configuration on the relay task */ @@ -122,12 +123,13 @@ int ft_to_sngss7_cfg_all(void) } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_PRESENT)) { if (sng_isup_init_cc()) { SS7_CRITICAL("Failed to start Call-Control\n"); return 1; } else { SS7_INFO("Started Call-Control!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED); } if (ftmod_ss7_cc_gen_config()) { SS7_CRITICAL("CC General configuration FAILED!\n"); @@ -143,12 +145,13 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_PRESENT)) { if (sng_isup_init_isup()) { SS7_CRITICAL("Failed to start ISUP\n"); return 1; } else { SS7_INFO("Started ISUP!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED); } if (ftmod_ss7_isup_gen_config()) { SS7_CRITICAL("ISUP General configuration FAILED!\n"); @@ -158,12 +161,13 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_PRESENT)) { if (sng_isup_init_mtp3()) { SS7_CRITICAL("Failed to start MTP3\n"); return 1; } else { SS7_INFO("Started MTP3!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED); } if (ftmod_ss7_mtp3_gen_config()) { @@ -174,18 +178,20 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_PRESENT)) { if (sng_isup_init_mtp2()) { SS7_CRITICAL("Failed to start MTP2\n"); return 1; } else { SS7_INFO("Started MTP2!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED); } if (sng_isup_init_mtp1()) { - SS7_CRITICAL("Failed to start MTP2\n"); + SS7_CRITICAL("Failed to start MTP1\n"); return 1; } else { SS7_INFO("Started MTP1!\n"); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED); } if (ftmod_ss7_mtp1_gen_config()) { SS7_CRITICAL("MTP1 General configuration FAILED!\n"); @@ -376,7 +382,7 @@ int ft_to_sngss7_cfg_all(void) x++; } /* while (x < (MAX_ISAPS)) */ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) { x = 1; while (x < (MAX_ISUP_INFS)) { /* check if this link has been configured already */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 53062b9d56..0dec4e54d7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1621,32 +1621,36 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) ftdm_log (FTDM_LOG_INFO, "Starting ftmod_sangoma_ss7 unload...\n"); - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED)) { sng_isup_free_cc(); - sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED); } - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) { ftmod_ss7_shutdown_isup(); sng_isup_free_isup(); - sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED); } - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED)) { ftmod_ss7_shutdown_mtp3(); sng_isup_free_mtp3(); - sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED); } - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED)) { ftmod_ss7_shutdown_mtp2(); sng_isup_free_mtp2(); - sng_isup_free_mtp1(); - sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED); } - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) { - /* go through all the relays channels and configure it */ + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED)) { + sng_isup_free_mtp1(); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED); + } + + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED)) { + /* go through all the relays channels and disable them */ x = 1; while (x < (MAX_RELAY_CHANNELS)) { /* check if this relay channel has been configured already */ @@ -1668,11 +1672,12 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) ftmod_ss7_shutdown_relay(); sng_isup_free_relay(); - sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED); } - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED)) { sng_isup_free_sm(); + sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED); } sng_isup_free_gen(); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 11ff2318bb..e84c367f51 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -632,13 +632,25 @@ typedef enum { } sng_cfg_flag_t; typedef enum { - SNGSS7_SM = (1 << 0), - SNGSS7_RY = (1 << 1), - SNGSS7_MTP1 = (1 << 2), - SNGSS7_MTP2 = (1 << 3), - SNGSS7_MTP3 = (1 << 4), - SNGSS7_ISUP = (1 << 5), - SNGSS7_CC = (1 << 6) + SNGSS7_SM_STARTED = (1 << 0), + + SNGSS7_RY_PRESENT = (1 << 2), + SNGSS7_RY_STARTED = (1 << 3), + + SNGSS7_MTP1_PRESENT = (1 << 4), + SNGSS7_MTP1_STARTED = (1 << 5), + + SNGSS7_MTP2_PRESENT = (1 << 6), + SNGSS7_MTP2_STARTED = (1 << 7), + + SNGSS7_MTP3_PRESENT = (1 << 8), + SNGSS7_MTP3_STARTED = (1 << 9), + + SNGSS7_ISUP_PRESENT = (1 << 10), + SNGSS7_ISUP_STARTED = (1 << 11), + + SNGSS7_CC_PRESENT = (1 << 12), + SNGSS7_CC_STARTED = (1 << 13), } sng_task_flag_t; /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index 1af538d727..890b222c64 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -300,7 +300,7 @@ ftdm_status_t disable_all_sigs_for_relay(uint32_t procId) ftdm_status_t disble_all_mtp2_sigs_for_relay(void) { /* check if there is a local mtp2 link*/ - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) { + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED)) { SS7_INFO("Disalbing all mtp2 sig links on local system\n"); ftmod_ss7_disable_grp_mtp2Link(1); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 8e327ea759..db372b0f97 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2082,7 +2082,7 @@ static int ftmod_ss7_fill_in_relay_channel(sng_relay_t *relay_channel) relay_channel->port, relay_channel->procId, relay_channel->id); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_PRESENT); } else { relay_channel->id = i; SS7_DEBUG("found existing relay channel on type:%d, hostname:%s, port:%d, procId:%d, id = %d\n", @@ -2116,7 +2116,7 @@ static int ftmod_ss7_fill_in_mtp1_link(sng_mtp1_link_t *mtp1Link) /* check if this id value has been used already */ if (g_ftdm_sngss7_data.cfg.mtp1Link[i].id == 0) { SS7_DEBUG("Found new MTP1 Link: id=%d, name=%s\n", mtp1Link->id, mtp1Link->name); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_PRESENT); } else { SS7_DEBUG("Found an existing MTP1 Link: id=%d, name=%s (old name=%s)\n", mtp1Link->id, @@ -2142,7 +2142,7 @@ static int ftmod_ss7_fill_in_mtp2_link(sng_mtp2_link_t *mtp2Link) /* check if this id value has been used already */ if (g_ftdm_sngss7_data.cfg.mtp2Link[i].id == 0) { SS7_DEBUG("Found new MTP2 Link: id=%d, name=%s\n", mtp2Link->id, mtp2Link->name); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_PRESENT); } else { SS7_DEBUG("Found an existing MTP2 Link: id=%d, name=%s (old name=%s)\n", mtp2Link->id, @@ -2219,7 +2219,7 @@ static int ftmod_ss7_fill_in_mtp3_link(sng_mtp3_link_t *mtp3Link) /* check if this id value has been used already */ if (g_ftdm_sngss7_data.cfg.mtp3Link[i].id == 0) { SS7_DEBUG("Found new MTP3 Link: id=%d, name=%s\n", mtp3Link->id, mtp3Link->name); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_PRESENT); } else { SS7_DEBUG("Found an existing MTP3 Link: id=%d, name=%s (old name=%s)\n", mtp3Link->id, @@ -2560,7 +2560,7 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup) /* check if this id value has been used already */ if (g_ftdm_sngss7_data.cfg.isupIntf[i].id == 0) { SS7_DEBUG("Found new ISUP Interface: id=%d, name=%s\n", sng_isup->id, sng_isup->name); - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_PRESENT); } else { SS7_DEBUG("Found an existing ISUP Interface: id=%d, name=%s (old name=%s)\n", sng_isup->id, @@ -2908,7 +2908,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].type = VOICE; /* throw the flag to indicate that we need to start call control */ - sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_PRESENT); } if (timeslot.channel) { From d6e3e7fcd7451234649b5f55843f3be39d13f326 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 14 Jun 2011 13:15:17 -0400 Subject: [PATCH 034/493] Changed libsng_isdn and libsng_ss7 include paths --- libs/freetdm/Makefile.am | 8 -------- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 2 +- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/Makefile.am b/libs/freetdm/Makefile.am index b0398ef90c..6c2eae3ef8 100644 --- a/libs/freetdm/Makefile.am +++ b/libs/freetdm/Makefile.am @@ -40,14 +40,6 @@ library_includedir = $(prefix)/include INCS = -I$(FT_SRCDIR)/$(SRC)/include -I$(FT_SRCDIR)/$(SRC)/include/private -if HAVE_SNG_SS7 -INCS += -I/usr/include/sng_ss7 -endif - -if HAVE_SNG_ISDN -INCS += -I/usr/include/sng_isdn -endif - # we needed to separate CFLAGS in FTDM_COMPAT_CFLAGS and FTDM_CFLAGS due to -c99 which causes problems with wanpipe headers FTDM_COMPAT_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_COMPAT_CFLAGS@ @DEFS@ FTDM_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_CFLAGS@ @DEFS@ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index 68e1371b79..9935b3e0ea 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -49,7 +49,7 @@ #include "private/ftdm_core.h" #include "ftmod_sangoma_isdn_user.h" -#include +#include /* Theoretical limit for MAX_SPANS_PER_NFAS_LINK is 31, but set to 8 for now to save some memory */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index e84c367f51..1bce70fb82 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -45,7 +45,7 @@ #include "private/ftdm_core.h" -#include "sng_ss7.h" +#include "sng_ss7/sng_ss7.h" /******************************************************************************/ From c2a1935850010a9f49c0bc3d09ece65a161fbc79 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 4 Jul 2011 11:25:18 -0400 Subject: [PATCH 035/493] skip initial space in switch console and API execution - resolve issue #778 --- src/switch_console.c | 8 +++++++- src/switch_loadable_module.c | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/switch_console.c b/src/switch_console.c index 7323a5f6a3..8f7238d257 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -346,7 +346,7 @@ SWITCH_DECLARE(switch_status_t) switch_console_execute(char *xcmd, int rec, swit int argc; char *argv[128]; int x; - char *dup = strdup(xcmd); + char *dup = NULL; char *cmd; switch_status_t status = SWITCH_STATUS_FALSE; @@ -357,6 +357,12 @@ SWITCH_DECLARE(switch_status_t) switch_console_execute(char *xcmd, int rec, swit goto end; } + while (xcmd && *xcmd == ' ') { + xcmd++; + } + + dup = strdup(xcmd); + if (!strncasecmp(xcmd, "alias", 5)) { argc = 1; argv[0] = xcmd; diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index f8a56d98bd..0938fd55ab 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -1789,6 +1789,10 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(const char *cmd, const char * switch_assert(stream->data != NULL); switch_assert(stream->write_function != NULL); + while (cmd && *cmd == ' ') { + cmd++; + } + if (strcasecmp(cmd, "console_complete")) { cmd_used = switch_strip_whitespace(cmd); arg_used = switch_strip_whitespace(arg); From fa2ef5e724e73c04e7f56a904d75a3524b0d9a83 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 23 Jun 2011 14:09:06 -0400 Subject: [PATCH 036/493] freetdm: change CLI parsing (ftdm_separate_string) to properly ignore white space (fixes Sangoma issue #778) minor change into SS7 CLI to use ftdm_array_len() instead of duplicating it --- libs/freetdm/src/ftdm_io.c | 18 +++++++----------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index f7b4bb9a1c..1824fce04a 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -5771,6 +5771,9 @@ FT_DECLARE(uint32_t) ftdm_separate_string(char *buf, char delim, char **array, i ptr = buf; + /* we swallow separators that are contiguous */ + while (*ptr == delim) ptr++; + for (argc = 0; *ptr && (argc < arraylen - 1); argc++) { array[argc] = ptr; for (; *ptr; ptr++) { @@ -5782,6 +5785,8 @@ FT_DECLARE(uint32_t) ftdm_separate_string(char *buf, char delim, char **array, i } } else if ((*ptr == delim) && !quot) { *ptr++ = '\0'; + /* we swallow separators that are contiguous */ + while (*ptr == delim) ptr++; break; } } @@ -5791,22 +5796,13 @@ FT_DECLARE(uint32_t) ftdm_separate_string(char *buf, char delim, char **array, i array[argc++] = ptr; } - /* strip quotes and leading / trailing spaces */ + /* strip quotes */ for (x = 0; x < argc; x++) { - char *p; - - while(*(array[x]) == ' ') { - (array[x])++; - } - p = array[x]; + char *p = array[x]; while((p = strchr(array[x], qc))) { memmove(p, p+1, strlen(p)); p++; } - p = array[x] + (strlen(array[x]) - 1); - while(*p == ' ') { - *p-- = '\0'; - } } return argc; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index baed57e561..710b0c37a6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -106,7 +106,7 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha if (data) { mycmd = ftdm_strdup(data); - argc = ftdm_separate_string(mycmd,' ',argv,(sizeof(argv) / sizeof(argv[0]))); + argc = ftdm_separate_string(mycmd, ' ', argv, ftdm_array_len(argv)); } if (check_arg_count(argc, 1)) goto handle_cli_error_argc; From bf41cc27a19a59d5b955bfd17a2b8fcd4e80790f Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 8 Aug 2011 12:35:41 -0400 Subject: [PATCH 037/493] chlog: freetdm: SS7 - added TX of CPG message in progress media state --- .../ftmod_sangoma_ss7_main.c | 4 +-- .../ftmod_sangoma_ss7_main.h | 1 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 29 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index cc922617af..ad1f638f54 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -656,10 +656,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OUTBOUND)) { /* inform the user there is media avai */ sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_PROGRESS_MEDIA); + } else { + ft_to_sngss7_cpg(ftdmchan); } - - /* nothing to do at this time */ break; /**************************************************************************/ case FTDM_CHANNEL_STATE_UP: /*call is accpeted...both incoming and outgoing */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index e61f1ee6df..cda6225217 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -751,6 +751,7 @@ int ftmod_ss7_isup_ckt_sta(uint32_t id, unsigned char *state); /* in ftmod_sangoma_ss7_out.c */ void ft_to_sngss7_iam(ftdm_channel_t *ftdmchan); void ft_to_sngss7_acm(ftdm_channel_t *ftdmchan); +void ft_to_sngss7_cpg (ftdm_channel_t *ftdmchan); void ft_to_sngss7_anm(ftdm_channel_t *ftdmchan); void ft_to_sngss7_rel(ftdm_channel_t *ftdmchan); void ft_to_sngss7_rlc(ftdm_channel_t *ftdmchan); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 56238abdf9..11ac14891d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -36,6 +36,8 @@ /******************************************************************************/ /* DEFINES ********************************************************************/ +#define SNGSS7_EVNTINFO_IND_INBAND_AVAIL 0x03 +/******************************************************************************/ /* GLOBALS ********************************************************************/ @@ -171,6 +173,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.optBckCalInd.simpleSegmInd.pres = PRSNT_DEF; acm.optBckCalInd.mlppUserInd.pres = PRSNT_DEF; acm.optBckCalInd.usrNetIneractInd.pres = PRSNT_DEF; + acm.optBckCalInd.netExcDelInd.pres = PRSNT_DEF; } /* if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) */ /* send the ACM request to LibSngSS7 */ @@ -187,6 +190,32 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) return; } +void ft_to_sngss7_cpg (ftdm_channel_t *ftdmchan) +{ + SiCnStEvnt cpg; + SS7_FUNC_TRACE_ENTER (__FUNCTION__); + + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + + memset (&cpg, 0, sizeof (cpg)); + + cpg.evntInfo.eh.pres = PRSNT_NODEF; + + cpg.evntInfo.evntInd.pres = PRSNT_NODEF; + cpg.evntInfo.evntInd.val = SNGSS7_EVNTINFO_IND_INBAND_AVAIL; /* Event Indicator = In-band info is now available */ + + cpg.evntInfo.evntPresResInd.pres = PRSNT_NODEF; + cpg.evntInfo.evntPresResInd.val = 0; /* Event presentation restricted indicator = no indication */ + + /* send the CPG request to LibSngSS7 */ + sng_cc_con_status (1, sngss7_info->suInstId, sngss7_info->spInstId, sngss7_info->circuit->id, &cpg, PROGRESS); + + ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "[CIC:%d]Tx CPG\n", sngss7_info->circuit->cic); + ftdm_call_clear_vars(&ftdmchan->caller_data); + SS7_FUNC_TRACE_EXIT (__FUNCTION__); + return; +} void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan) { SS7_FUNC_TRACE_ENTER (__FUNCTION__); From b2fa7e31393c196720f6a0695290f8352fbfbdd6 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 20 Sep 2011 19:15:05 -0400 Subject: [PATCH 038/493] freetdm: Fix for sending CPG without sending ACM prior to that --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index ad1f638f54..a849bf2f62 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -657,6 +657,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* inform the user there is media avai */ sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_PROGRESS_MEDIA); } else { + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_SENT_ACM)) { + sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM); + ft_to_sngss7_acm(ftdmchan); + } ft_to_sngss7_cpg(ftdmchan); } From d89f3afdc25cc8bd6d1f9e3684e231dc3edb7062 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 21 Sep 2011 15:15:19 -0400 Subject: [PATCH 039/493] freetdm: Manually merged relay code from branch jz.smg_ss7 (based on releases.3.3) - Added relay and other misc commands - Misc fixes in hardware blocks, hw alarm etc - Fix crash on shutdown in relay --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 833 ++++++++++++++---- .../ftmod_sangoma_ss7_handle.c | 16 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c | 68 +- .../ftmod_sangoma_ss7_logger.c | 8 +- .../ftmod_sangoma_ss7_main.c | 174 +++- .../ftmod_sangoma_ss7_main.h | 37 +- 6 files changed, 898 insertions(+), 238 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 5f87ffd877..9ff19bac02 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -31,6 +31,10 @@ * SOFTWARE|EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if 0 +#define SMG_RELAY_DBG +#endif + /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" /******************************************************************************/ @@ -44,7 +48,7 @@ /* PROTOTYPES *****************************************************************/ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data); -static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_procId(ftdm_stream_handle_t *stream); @@ -88,8 +92,31 @@ static ftdm_status_t handle_status_isup_ckt(ftdm_stream_handle_t *stream, char * static ftdm_status_t extract_span_chan(char *argv[10], int pos, int *span, int *chan); static ftdm_status_t check_arg_count(int args, int min); -/******************************************************************************/ + + +static ftdm_status_t cli_ss7_show_general(ftdm_stream_handle_t *stream); + +static ftdm_status_t cli_ss7_show_mtp2link_by_id(ftdm_stream_handle_t *stream, int rcId); +static ftdm_status_t cli_ss7_show_mtp2link_by_name(ftdm_stream_handle_t *stream, char *name); +static ftdm_status_t cli_ss7_show_all_mtp2link(ftdm_stream_handle_t *stream); + +static ftdm_status_t cli_ss7_show_mtp3link_by_id(ftdm_stream_handle_t *stream, int rcId); +static ftdm_status_t cli_ss7_show_mtp3link_by_name(ftdm_stream_handle_t *stream, char *name); +static ftdm_status_t cli_ss7_show_all_mtp3link(ftdm_stream_handle_t *stream); + +static ftdm_status_t cli_ss7_show_relay_by_id(ftdm_stream_handle_t *stream, int rcId); +static ftdm_status_t cli_ss7_show_relay_by_name(ftdm_stream_handle_t *stream, char *name); +static ftdm_status_t cli_ss7_show_all_relay(ftdm_stream_handle_t *stream); + +static ftdm_status_t cli_ss7_show_channel_detail_of_span(ftdm_stream_handle_t *stream, char *span_id, char *chan_id); +static ftdm_status_t cli_ss7_show_all_channels_of_span(ftdm_stream_handle_t *stream, char *span_id); + +static ftdm_status_t cli_ss7_show_span_by_id(ftdm_stream_handle_t *stream, char *span_id); +static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream); +static ftdm_status_t cli_ss7_show_all_spans_detail(ftdm_stream_handle_t *stream); + +/******************************************************************************/ /* FUNCTIONS ******************************************************************/ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data) { @@ -109,16 +136,72 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha argc = ftdm_separate_string(mycmd, ' ', argv, ftdm_array_len(argv)); } - if (check_arg_count(argc, 1)) goto handle_cli_error_argc; - + if (check_arg_count(argc, 1)) { + goto handle_cli_error_argc; + } + if (!strcasecmp(argv[c], "show")) { /**************************************************************************/ - if (check_arg_count(argc, 2)) goto handle_cli_error_argc; + if (check_arg_count(argc, 2)) { + cli_ss7_show_general(stream); + return FTDM_SUCCESS; + } c++; - if (!strcasecmp(argv[c], "status")) { + if (!strcasecmp(argv[c], "relay")) { /**********************************************************************/ - if (check_arg_count(argc, 3)) goto handle_cli_error_argc; + c++; + handle_status_relay(stream, argv[c]); + + } else if (!strcasecmp(argv[c], "span")) { + /**********************************************************************/ + switch (argc) { + case 2: + { + /* > ftdm ss7 show span */ + cli_ss7_show_all_spans_general(stream); + } + break; + + case 3: + { + if (!strcasecmp(argv[2], "all")) { + /* > ftdm ss7 show span all */ + cli_ss7_show_all_spans_detail(stream); + } else { + /* > ftdm ss7 show span 1 */ + cli_ss7_show_span_by_id(stream, argv[2]); + } + } + break; + + case 4: + { + /* > ftdm ss7 show span 1 chan */ + cli_ss7_show_all_channels_of_span(stream, argv[2]); + } + break; + + case 5: + default: + { + if (!strcasecmp(argv[3], "chan")) { + /* > ftdm ss7 show span 1 chan 2 */ + cli_ss7_show_channel_detail_of_span(stream, argv[2], argv[4]); + } else { + /* > ftdm ss7 show span 1 bla bla bla*/ + cli_ss7_show_all_channels_of_span(stream, argv[2]); + } + } + break; + } + } else if (!strcasecmp(argv[c], "status")) { + /**********************************************************************/ + if (check_arg_count(argc, 3)) { + cli_ss7_show_general(stream); + return FTDM_SUCCESS; + } + c++; if (!strcasecmp(argv[c], "mtp3")) { @@ -675,38 +758,40 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha handle_cli_error_argc: stream->write_function(stream, "Invalid # of arguments in command\n"); - handle_print_usuage(stream); + handle_print_usage(stream); return FTDM_SUCCESS; handle_cli_error_span_chan: stream->write_function(stream, "Unknown \"span\\chan\" command\n"); - handle_print_usuage(stream); + handle_print_usage(stream); return FTDM_SUCCESS; handle_cli_error: stream->write_function(stream, "Unknown command requested\n"); - handle_print_usuage(stream); + handle_print_usage(stream); return FTDM_SUCCESS; } /******************************************************************************/ -static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream) +static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) { - stream->write_function(stream, "Sangoma SS7 CLI usuage:\n\n"); + stream->write_function(stream, "Sangoma SS7 CLI usage:\n\n"); - stream->write_function(stream, "Ftmod_sangoma_ss7 general control:\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 general control:\n"); stream->write_function(stream, "ftdm ss7 set ftrace X Y\n"); stream->write_function(stream, "ftdm ss7 set mtrace X Y\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 information:\n"); stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); stream->write_function(stream, "ftdm ss7 show status mtp2 X\n"); stream->write_function(stream, "ftdm ss7 show status span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show free span X chan Y\n"); + stream->write_function(stream, "ftdm ss7 show blocks span X chan Y\n"); + stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show inreset span X chan Y\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "Ftmod_sangoma_ss7 circuit control:\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 circuit control:\n"); stream->write_function(stream, "ftdm ss7 blo span X chan Y\n"); stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n"); stream->write_function(stream, "ftdm ss7 rsc span X chan Y\n"); @@ -714,7 +799,7 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 cgb span X chan Y range Z\n"); stream->write_function(stream, "ftdm ss7 cgu span X chan Y range Z\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "Ftmod_sangoma_ss7 link control:\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 link control:\n"); stream->write_function(stream, "ftdm ss7 inhibit link X\n"); stream->write_function(stream, "ftdm ss7 uninhibit link X\n"); stream->write_function(stream, "ftdm ss7 activate link X\n"); @@ -724,8 +809,14 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 lpo link X\n"); stream->write_function(stream, "ftdm ss7 lpr link X\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "Ftmod_sangoma_ss7 Relay status:\n"); + + + stream->write_function(stream, "ftmod_sangoma_ss7 Relay status:\n"); stream->write_function(stream, "ftdm ss7 show status relay X\n"); + stream->write_function(stream, "ftdm ss7 show relay X\n"); + stream->write_function(stream, "ftdm ss7 show relay\n"); + stream->write_function(stream, "\n"); + stream->write_function(stream, "\n"); return FTDM_SUCCESS; @@ -1106,6 +1197,9 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span, stream->write_function(stream, "l_ucic=N|"); } +#ifdef SMG_RELAY_DBG + stream->write_function(stream, " blk_flag= %x ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags ); +#endif stream->write_function(stream, "\n"); } /* if ( span and chan) */ @@ -1217,6 +1311,9 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, } } +#ifdef SMG_RELAY_DBG + stream->write_function(stream," blk_flag= %x ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags ); +#endif stream->write_function(stream, "\n"); } /* if ( hole, sig, voice) */ } /* if ( span and chan) */ @@ -1226,6 +1323,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, return FTDM_SUCCESS; } + /******************************************************************************/ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose) { @@ -1263,7 +1361,7 @@ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int c if (check_for_state_change(ftdmchan)) { SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); /* check if we need to die */ - SS7_ASSERT; + ftdm_assert(0, "State change not completed\n"); /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); /* move to the next channel */ @@ -1329,7 +1427,7 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c if (check_for_state_change(ftdmchan)) { SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); /* check if we need to die */ - SS7_ASSERT; + ftdm_assert(0, "State change not completed\n"); /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); /* move to the next channel */ @@ -1341,6 +1439,9 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c /* clear the block flag */ sngss7_clear_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); + /* check group blocking */ + sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX); + /* set the channel to suspended state */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } @@ -1348,103 +1449,47 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); - } /* if ( span and chan) */ + } - } /* if ( cic != 0) */ + } /* go the next circuit */ x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + } handle_show_blocks(stream, span, chan, verbose); return FTDM_SUCCESS; } + /******************************************************************************/ static ftdm_status_t handle_status_mtp3link(ftdm_stream_handle_t *stream, char *name) { - int x = 0; - SnMngmt sta; + SS7_RELAY_DBG_FUN(handle_status_mtp3link); - /* find the link request by it's name */ - x = 1; - while(x < (MAX_MTP_LINKS+1)) { - if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) { + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Invalid stream\n"); - /* send the status request */ - if (ftmod_ss7_mtp3link_sta(x, &sta)) { - stream->write_function(stream, "Failed to read link=%s status\n", name); - return FTDM_FAIL; - } + if (!name) { + return cli_ss7_show_all_mtp3link(stream); + } - /* print the results */ - stream->write_function(stream, "%s|span=%d|chan=%d|sap=%d|state=%s|l_blk=%s|r_blk=%s|l_inhbt=%s|r_inhbt=%s\n", - name, - g_ftdm_sngss7_data.cfg.mtp1Link[x].span, - g_ftdm_sngss7_data.cfg.mtp1Link[x].chan, - g_ftdm_sngss7_data.cfg.mtp3Link[x].id, - DECODE_LSN_LINK_STATUS(sta.t.ssta.s.snDLSAP.state), - (sta.t.ssta.s.snDLSAP.locBlkd) ? "Y":"N", - (sta.t.ssta.s.snDLSAP.remBlkd) ? "Y":"N", - (sta.t.ssta.s.snDLSAP.locInhbt) ? "Y":"N", - (sta.t.ssta.s.snDLSAP.rmtInhbt) ? "Y":"N"); - - goto success; - } - - /* move to the next link */ - x++; - } /* while (x < (MAX_MTP_LINKS+1)) */ - - stream->write_function(stream, "Failed to find link=\"%s\"\n", name); - -success: - return FTDM_SUCCESS; + return cli_ss7_show_mtp3link_by_name(stream, name); } + /******************************************************************************/ static ftdm_status_t handle_status_mtp2link(ftdm_stream_handle_t *stream, char *name) { - int x = 0; - SdMngmt sta; + SS7_RELAY_DBG_FUN(handle_status_mtp2link); - /* find the link request by it's name */ - x = 1; - while(x < (MAX_MTP_LINKS+1)) { - if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp2Link[x].name, name)) { + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Invalid stream\n"); - /* send the status request */ - if (ftmod_ss7_mtp2link_sta(x, &sta)) { - stream->write_function(stream, "Failed to read link=%s status\n", name); - return FTDM_FAIL; - } + if (!name) { + return cli_ss7_show_all_mtp2link(stream); + } - /* print the results */ - stream->write_function(stream, "%s|span=%d|chan=%d|sap=%d|state=%s|outsFrm=%d|drpdFrm=%d|lclStatus=%s|rmtStatus=%s|fsn=%d|bsn=%d\n", - name, - g_ftdm_sngss7_data.cfg.mtp1Link[x].span, - g_ftdm_sngss7_data.cfg.mtp1Link[x].chan, - g_ftdm_sngss7_data.cfg.mtp2Link[x].id, - DECODE_LSD_LINK_STATUS(sta.t.ssta.s.sdDLSAP.hlSt), - sta.t.ssta.s.sdDLSAP.psOutsFrm, - sta.t.ssta.s.sdDLSAP.cntMaDrop, - (sta.t.ssta.s.sdDLSAP.lclBsy) ? "Y":"N", - (sta.t.ssta.s.sdDLSAP.remBsy) ? "Y":"N", - sta.t.ssta.s.sdDLSAP.fsn, - sta.t.ssta.s.sdDLSAP.bsn); - - goto success; - } - - /* move to the next link */ - x++; - } /* while (x < (MAX_MTP_LINKS+1)) */ - - stream->write_function(stream, "Failed to find link=\"%s\"\n", name); - -success: - return FTDM_SUCCESS; + return cli_ss7_show_mtp2link_by_name(stream, name); } /******************************************************************************/ @@ -1721,8 +1766,8 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c memset (&sigev, 0, sizeof (sigev)); - if (range > 31) { - stream->write_function(stream, "Invalid range value %d", range); + if (range <= 1 || range > 31) { + stream->write_function(stream, "Invalid range value %d. Range value must be greater than 1 and less than 31. \n", range); return FTDM_SUCCESS; } @@ -1740,7 +1785,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) { /* now that we have the right channel...put a lock on it so no-one else can use it */ - ftdm_mutex_lock(ftdmchan->mutex); + ftdm_channel_lock(ftdmchan); /* throw the grp maint. block flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX); @@ -1753,9 +1798,11 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c /* attach the cgb information */ main_chan = ftdmchan; sngss7_span->tx_cgb.circuit = sngss7_info->circuit->id; - sngss7_span->tx_cgb.range = range-1; + sngss7_span->tx_cgb.range = 0; sngss7_span->tx_cgb.type = 0; /* maintenace block */ - } /* if (ftdmchan->physical_chan_id == chan) */ + } else { + ((sngss7_span_data_t*)(main_chan->span->signal_data))->tx_cgb.range++; + } /* update the status field */ sngss7_span->tx_cgb.status[byte] = (sngss7_span->tx_cgb.status[byte] | (1 << bit)); @@ -1768,12 +1815,12 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c } /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - } /* if ( span and chan) */ - } /* if ( cic == voice) */ + ftdm_channel_unlock(ftdmchan); + } + } /* go the next circuit */ x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + } if (!main_chan) { stream->write_function(stream, "Failed to find a voice cic in span %d chan %d range %d", span, chan, range); @@ -1794,7 +1841,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c if ((ftdmchan->physical_span_id == span) && ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) { - handle_show_status(stream, span, chan, verbose); + handle_show_status(stream, ftdmchan->physical_span_id, ftdmchan->physical_chan_id, verbose); } } /* if ( cic == voice) */ @@ -1809,24 +1856,48 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c /******************************************************************************/ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose) { - int x; - sngss7_chan_data_t *sngss7_info; - ftdm_channel_t *ftdmchan; - ftdm_channel_t *main_chan = NULL; - sngss7_span_data_t *sngss7_span; - int byte = 0; - int bit = 0; - ftdm_sigmsg_t sigev; + sngss7_chan_data_t *sngss7_info = NULL; + ftdm_channel_t *ftdmchan = NULL; + ftdm_channel_t *main_chan = NULL; + sngss7_span_data_t *sngss7_span = NULL; + sngss7_chan_data_t *ubl_sng_info[MAX_CIC_MAP_LENGTH+1]; + int x = 0; + int byte = 0; + int bit = 0; + int ubl_sng_info_idx = 1; + ftdm_sigmsg_t sigev; + memset(ubl_sng_info, 0, sizeof(ubl_sng_info)); memset (&sigev, 0, sizeof (sigev)); - - if (range > 31) { - stream->write_function(stream, "Invalid range value %d", range); + if (range <= 1 || range > 31) { + stream->write_function(stream, "Invalid range value %d. Range value must be greater than 1 and less than 31.\n", range); return FTDM_SUCCESS; } - x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; + /* verify that there is not hardware block in the range. + * if there is any channel within the group unblock range, do not execute the group unblock */ + x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; + while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; + ftdmchan = sngss7_info->ftdmchan; + sngss7_span = ftdmchan->span->signal_data; + + if ( (ftdmchan->physical_span_id == span) + && (ftdmchan->physical_chan_id >= chan) + && (ftdmchan->physical_chan_id < (chan+range)) + && sngss7_test_ckt_blk_flag(sngss7_info, (FLAG_GRP_HW_BLOCK_TX | FLAG_GRP_HW_BLOCK_TX_DN)) + ) { + stream->write_function(stream, "There is at least one channel with hardware block. Group unblock operation not allowed at this time.\n"); + return FTDM_SUCCESS; + } + } + x++; + } + + + x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { @@ -1840,10 +1911,15 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) { /* now that we have the right channel...put a lock on it so no-one else can use it */ - ftdm_mutex_lock(ftdmchan->mutex); + ftdm_channel_lock(ftdmchan); /* throw the grp maint. block flag */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX); + + if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN)) { + ubl_sng_info[ubl_sng_info_idx] = sngss7_info; + ubl_sng_info_idx++; + } /* bring the sig status up */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); @@ -1853,9 +1929,11 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c /* attach the cgb information */ main_chan = ftdmchan; sngss7_span->tx_cgu.circuit = sngss7_info->circuit->id; - sngss7_span->tx_cgu.range = range-1; + sngss7_span->tx_cgu.range = 0; sngss7_span->tx_cgu.type = 0; /* maintenace block */ - } /* if (ftdmchan->physical_chan_id == chan) */ + } else { + ((sngss7_span_data_t*)(main_chan->span->signal_data))->tx_cgu.range++; + } /* update the status field */ sngss7_span->tx_cgu.status[byte] = (sngss7_span->tx_cgu.status[byte] | (1 << bit)); @@ -1868,12 +1946,12 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c } /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - } /* if ( span and chan) */ - } /* if ( cic == voice) */ + ftdm_channel_unlock(ftdmchan); + } + } /* go the next circuit */ x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + } if (!main_chan) { stream->write_function(stream, "Failed to find a voice cic in span %d chan %d range %d", span, chan, range); @@ -1883,6 +1961,13 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c /* send the circuit group block */ ft_to_sngss7_cgu(main_chan); + /* clearing blocking flags */ + for (x = 1; ubl_sng_info[x]; x++) { + sngss7_info = ubl_sng_info[x]; + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN); + } + x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { @@ -1894,7 +1979,8 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c if ((ftdmchan->physical_span_id == span) && ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) { - handle_show_status(stream, span, chan, verbose); + handle_show_status(stream, ftdmchan->physical_span_id, ftdmchan->physical_chan_id, verbose); + } } /* if ( cic == voice) */ @@ -2158,42 +2244,11 @@ success: /******************************************************************************/ static ftdm_status_t handle_status_relay(ftdm_stream_handle_t *stream, char *name) { - RyMngmt sta; - int x = 0; - - memset(&sta, 0x0, sizeof(sta)); - - - /* find the channel request by it's name */ - x = 1; - while(x < (MAX_RELAY_CHANNELS)) { - if (!strcasecmp(g_ftdm_sngss7_data.cfg.relay[x].name, name)) { - - if (ftmod_ss7_relay_status(g_ftdm_sngss7_data.cfg.relay[x].id, &sta)) { - stream->write_function(stream, "Failed to read relay =%s status\n", name); - return FTDM_FAIL; - } - - /* print the results */ - stream->write_function(stream, "%s|sap=%d|type=%d|port=%d|hostname=%s|procId=%d|status=%s\n", - name, - g_ftdm_sngss7_data.cfg.relay[x].id, - g_ftdm_sngss7_data.cfg.relay[x].type, - g_ftdm_sngss7_data.cfg.relay[x].port, - g_ftdm_sngss7_data.cfg.relay[x].hostname, - g_ftdm_sngss7_data.cfg.relay[x].procId, - DECODE_LRY_CHAN_STATUS(sta.t.ssta.rySta.cStatus)); - - goto success; - } - - /* move to the next link */ - x++; - - } /* x < (MAX_RELAY_CHANNELS) */ - -success: - return FTDM_SUCCESS; + SS7_RELAY_DBG_FUN(handle_status_relay); + if (!name) { + return cli_ss7_show_all_relay(stream); + } + return cli_ss7_show_relay_by_name(stream, name); } /******************************************************************************/ @@ -2426,6 +2481,468 @@ static ftdm_status_t check_arg_count(int args, int min) } } + +/****************************************************************************** +* Fun: cli_ss7_show_mtp2link_by_id() +* Desc: display mtp3 link information with id +* Param: +* stream : output stream object +* rcId : mtp2 link's id +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_mtp2link_by_id(ftdm_stream_handle_t *stream, int rcId) +{ + SdMngmt sta; + + SS7_RELAY_DBG_FUN(cli_ss7_show_mtp2link_by_id); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + if (ftmod_ss7_mtp2link_sta(rcId, &sta)) { + stream->write_function(stream, "Failed to read status of MTP2 link, id=%d \n", rcId); + return FTDM_FAIL; + } + + stream->write_function(stream, "name=%s|span=%d|chan=%d|sap=%d|state=%s|outsFrm=%d|drpdFrm=%d|lclStatus=%s|rmtStatus=%s|fsn=%d|bsn=%d\n", + g_ftdm_sngss7_data.cfg.mtp2Link[rcId].name, + g_ftdm_sngss7_data.cfg.mtp1Link[rcId].span, + g_ftdm_sngss7_data.cfg.mtp1Link[rcId].chan, + g_ftdm_sngss7_data.cfg.mtp2Link[rcId].id, + DECODE_LSD_LINK_STATUS(sta.t.ssta.s.sdDLSAP.hlSt), + sta.t.ssta.s.sdDLSAP.psOutsFrm, + sta.t.ssta.s.sdDLSAP.cntMaDrop, + (sta.t.ssta.s.sdDLSAP.lclBsy) ? "Y":"N", + (sta.t.ssta.s.sdDLSAP.remBsy) ? "Y":"N", + sta.t.ssta.s.sdDLSAP.fsn, + sta.t.ssta.s.sdDLSAP.bsn + ); + + return FTDM_SUCCESS; +} + +/****************************************************************************** +* Fun: cli_ss7_show_mtp2link_by_name() +* Desc: display all relay channels information +* Param: +* stream : output stream object +* rcName: mtp2 link's name +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_mtp2link_by_name(ftdm_stream_handle_t *stream, char *name) +{ + int x = 0; + SS7_RELAY_DBG_FUN(cli_ss7_show_mtp2link_by_name); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(!ftdm_strlen_zero(name), FTDM_FAIL, "Null MTP2 link name\n"); + + for (x = 0; x < (MAX_MTP_LINKS + 1); x++) { + if (0 == strcasecmp(g_ftdm_sngss7_data.cfg.mtp2Link[x].name, name)) { + return cli_ss7_show_mtp2link_by_id( stream, x ); + } + } + + stream->write_function (stream, "The MTP2 link with name \'%s\' is not found. \n", name); + return FTDM_FAIL; +} + +/****************************************************************************** +* Fun: cli_ss7_show_all_mtp2link() +* Desc: display all mtp2 links information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_mtp2link(ftdm_stream_handle_t *stream) +{ + int x = 0; + + SS7_RELAY_DBG_FUN(cli_ss7_show_all_mtp2link); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + for (x = 0; x < (MAX_MTP_LINKS + 1); x++) { + if (!ftdm_strlen_zero( g_ftdm_sngss7_data.cfg.mtp2Link[x].name)) { + cli_ss7_show_mtp2link_by_id(stream, x ); + } + } + + return FTDM_SUCCESS; +} + +/****************************************************************************** +* Fun: cli_ss7_show_mtp3link_by_id() +* Desc: display mtp3 link information with id +* Param: +* stream : output stream object +* rcId : mtp3 link's id +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_mtp3link_by_id(ftdm_stream_handle_t *stream, int rcId) +{ + SnMngmt sta; + + SS7_RELAY_DBG_FUN(cli_ss7_show_mtp3link_by_id); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + memset(&sta, 0, sizeof(sta)); + if (ftmod_ss7_mtp3link_sta(rcId, &sta)) { + stream->write_function(stream, "Failed to read status of MTP3 link, id=%d \n", rcId); + return FTDM_FAIL; + } + + stream->write_function(stream, "name=%s|span=%d|chan=%d|sap=%d|state=%s|l_blk=%s|r_blk=%s|l_inhbt=%s|r_inhbt=%s\n", + g_ftdm_sngss7_data.cfg.mtp3Link[rcId].name, + g_ftdm_sngss7_data.cfg.mtp1Link[rcId].span, + g_ftdm_sngss7_data.cfg.mtp1Link[rcId].chan, + g_ftdm_sngss7_data.cfg.mtp3Link[rcId].id, + DECODE_LSN_LINK_STATUS(sta.t.ssta.s.snDLSAP.state), + (sta.t.ssta.s.snDLSAP.locBlkd) ? "Y":"N", + (sta.t.ssta.s.snDLSAP.remBlkd) ? "Y":"N", + (sta.t.ssta.s.snDLSAP.locInhbt) ? "Y":"N", + (sta.t.ssta.s.snDLSAP.rmtInhbt) ? "Y":"N" + ); + + return FTDM_SUCCESS; +} + +/****************************************************************************** +* Fun: cli_ss7_show_mtp3link_by_name() +* Desc: display all relay channels information +* Param: +* stream : output stream object +* rcName: mtp3 link's name +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_mtp3link_by_name(ftdm_stream_handle_t *stream, char *name) +{ + int x=0; + SS7_RELAY_DBG_FUN(cli_ss7_show_mtp3link_by_name); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(!ftdm_strlen_zero(name), FTDM_FAIL, "Null MTP3 link name\n"); + + for (x = 0; x < (MAX_MTP_LINKS + 1); x++) { + if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) { + return cli_ss7_show_mtp3link_by_id(stream, x ); + } + } + + stream->write_function(stream, "The MTP3 link with name \'%s\' is not found. \n", name); + return FTDM_FAIL; +} +/****************************************************************************** +* Fun: cli_ss7_show_all_mtp3link() +* Desc: display all mtp3 links information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_mtp3link(ftdm_stream_handle_t *stream) +{ + int x = 0; + + SS7_RELAY_DBG_FUN(cli_ss7_show_all_mtp3link); + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + for (x = 0; x < (MAX_MTP_LINKS + 1); x++) { + if (!ftdm_strlen_zero(g_ftdm_sngss7_data.cfg.mtp3Link[x].name)) { + cli_ss7_show_mtp3link_by_id(stream, x); + } + } + + return FTDM_SUCCESS; +} + + +/****************************************************************************** +* Fun: cli_ss7_show_all_linkset() +* Desc: display all mtp3 linksets information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_linkset(ftdm_stream_handle_t *stream) +{ + int x = 0; + SnMngmt sta; + + SS7_RELAY_DBG_FUN(cli_ss7_show_all_linkset); + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + x = 1; + while(x < (MAX_MTP_LINKSETS+1)) { + if (!ftdm_strlen_zero(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name)) { + if (ftmod_ss7_mtplinkSet_sta(x, &sta)) { + stream->write_function(stream, "Failed to read linkset=%s status\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name); + } else { + stream->write_function(stream, "name=%s|state=%s|nmbActLnk=%d\n", + g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, + DECODE_LSN_LINKSET_STATUS(sta.t.ssta.s.snLnkSet.state), sta.t.ssta.s.snLnkSet.nmbActLnks + ); + } + } + x++; + } + return FTDM_SUCCESS; +} + + +/****************************************************************************** +* Fun: cli_ss7_show_general() +* Desc: display all general information about ss7 +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_general(ftdm_stream_handle_t *stream) +{ + SS7_RELAY_DBG_FUN(cli_ss7_show_general); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + stream->write_function(stream, "MTP2 status: \n"); + cli_ss7_show_all_mtp2link(stream); + + stream->write_function(stream, "\nMTP3 status: \n"); + cli_ss7_show_all_mtp3link(stream); + + stream->write_function(stream, "\nMTP3 linkset status: \n"); + cli_ss7_show_all_linkset(stream); + +#if 0 + stream->write_function(stream, "\nMTP3 link route status: \n"); + + stream->write_function(stream, "\nISUP status: \n"); +#endif + + stream->write_function(stream, "\nRelay status: \n"); + cli_ss7_show_all_relay(stream); + + return FTDM_SUCCESS; +} + +/****************************************************************************** +* Fun: cli_ss7_show_relay_by_id() +* Desc: display all relay channels information +* Param: +* stream : output stream object +* rcId : channel's id +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_relay_by_id(ftdm_stream_handle_t *stream, int rcId) +{ + RyMngmt sta; + + SS7_RELAY_DBG_FUN(cli_ss7_show_relay_by_id); + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + memset(&sta, 0x0, sizeof(sta)); + if (ftmod_ss7_relay_status(g_ftdm_sngss7_data.cfg.relay[rcId].id, &sta)) { + stream->write_function(stream, "Failed to read relay =%s status\n", g_ftdm_sngss7_data.cfg.relay[rcId].name); + return FTDM_FAIL; + } + + stream->write_function(stream, "name=%s|sap=%d|type=%d|port=%d|hostname=%s|procId=%d|status=%s\n", + g_ftdm_sngss7_data.cfg.relay[rcId].name, + g_ftdm_sngss7_data.cfg.relay[rcId].id, + g_ftdm_sngss7_data.cfg.relay[rcId].type, + g_ftdm_sngss7_data.cfg.relay[rcId].port, + g_ftdm_sngss7_data.cfg.relay[rcId].hostname, + g_ftdm_sngss7_data.cfg.relay[rcId].procId, + DECODE_LRY_CHAN_STATUS(sta.t.ssta.rySta.cStatus) + ); + + return FTDM_SUCCESS; +} +/****************************************************************************** +* Fun: cli_ss7_show_relay_by_name() +* Desc: display all relay channels information +* Param: +* stream : output stream object +* rcName: channel's name +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_relay_by_name(ftdm_stream_handle_t *stream, char *name) +{ + int x = 0; + + SS7_RELAY_DBG_FUN(cli_ss7_show_relay_by_name); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(!ftdm_strlen_zero(name), FTDM_FAIL, "Null relay link name\n"); + + for (x = 1; x < MAX_RELAY_CHANNELS; x++) { + if (!strcasecmp(g_ftdm_sngss7_data.cfg.relay[x].name, name)) { + return cli_ss7_show_relay_by_id(stream, x); + } + } + + stream->write_function( stream, "The relay channel with name \'%s\' is not found. \n", name); + return FTDM_FAIL; + +} +/****************************************************************************** +* Fun: cli_ss7_show_all_relay() +* Desc: display all relay channels information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_relay(ftdm_stream_handle_t *stream) +{ + int x = 0; + SS7_RELAY_DBG_FUN(cli_ss7_show_relay_by_name); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + + for (x = 1; x < MAX_RELAY_CHANNELS; x++) { + if (!ftdm_strlen_zero(g_ftdm_sngss7_data.cfg.relay[x].name)) { + cli_ss7_show_relay_by_id (stream, x); + } + } + + return FTDM_SUCCESS; +} + + +/****************************************************************************** +* Fun: cli_ss7_show_channel_detail_of_span() +* Desc: display span information of a given id +* Param: +* stream : output stream object +* span_id : span id string received from cli +* chan_id : channel id string received from cli +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_channel_detail_of_span(ftdm_stream_handle_t *stream, char *span_id, char *chan_id) +{ + int x, y; + + SS7_RELAY_DBG_FUN(cli_ss7_show_channel_detail_of_span); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(span_id != 0, FTDM_FAIL, "Invalid span id\n"); + ftdm_assert_return(chan_id != 0, FTDM_FAIL, "Invalid chan id\n"); + + x = atoi(span_id); + y = atoi(chan_id); + if (!x) { + stream->write_function( stream, "Span \'%s\' does not exist. \n", span_id); + return FTDM_FAIL; + } + + return handle_show_status(stream, x, y, 1); +} + +/****************************************************************************** +* Fun: cli_ss7_show_all_channels_of_span() +* Desc: display span information of a given id +* Param: +* stream : output stream object +* span_id : span id string received from cli +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_channels_of_span(ftdm_stream_handle_t *stream, char *span_id) +{ + int x=-1; + SS7_RELAY_DBG_FUN(cli_ss7_show_all_channels_of_span); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(span_id != 0, FTDM_FAIL, "Invalid span id\n"); + + x = atoi(span_id); + if (!x) { + stream->write_function( stream, "Span \'%s\' does not exist. \n", span_id); + return FTDM_FAIL; + } + return handle_show_status(stream, x, 0, 1); +} + +/****************************************************************************** +* Fun: cli_ss7_show_span_by_id() +* Desc: display span information of a given id +* Param: +* stream : output stream object +* span_id : span id string received from cli +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_span_by_id(ftdm_stream_handle_t *stream, char *span_id) +{ + int x = -1; + + SS7_RELAY_DBG_FUN(cli_ss7_show_span_by_id); + + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + ftdm_assert_return(span_id != 0, FTDM_FAIL, "Invalid span id\n"); + + x = atoi(span_id); + if (!x) { + stream->write_function(stream, "Span \'%s\' does not exist. \n", span_id); + return FTDM_FAIL; + } + +#if 0 + stream->write_function( stream, "JZ: we should display span details here \n" ); +#endif + + cli_ss7_show_all_channels_of_span(stream, span_id); + + return FTDM_FAIL; +} + + +/****************************************************************************** +* Fun: cli_ss7_show_all_spans_detail() +* Desc: display all spans information in detail +* Param: +* stream : output stream object +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_spans_detail(ftdm_stream_handle_t *stream) +{ + SS7_RELAY_DBG_FUN(cli_ss7_show_all_spans_detail); + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + return handle_show_status(stream, 0, 0, 1); +} + +/****************************************************************************** +* Fun: cli_ss7_show_all_spans_general() +* Desc: display all spans information in general +* Param: +* stream : output stream object +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: James Zhang +*******************************************************************************/ +static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream) +{ + SS7_RELAY_DBG_FUN(cli_ss7_show_all_spans_general); + ftdm_assert_return(stream != NULL, FTDM_FAIL, "Null stream\n"); + return FTDM_FAIL; +} + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index b541e1b551..26356220ec 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -1643,8 +1643,8 @@ ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ ftdm_mutex_lock(ftdmchan->mutex); /* check if the channel is blocked */ - if (!(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX))) { - SS7_WARN("Received UBL on circuit that is not blocked!\n"); + if (!(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) && !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) { + SS7_WARN("Received UBL on circuit that is not blocked! span= %d, chan= %d , flag = %x \n", g_ftdm_sngss7_data.cfg.isupCkt[circuit].span, g_ftdm_sngss7_data.cfg.isupCkt[circuit].chan,sngss7_info->blk_flags ); } /* throw the unblock flag */ @@ -1652,6 +1652,8 @@ ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* clear the block flag */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX_DN); /* set the channel to suspended state */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); @@ -1692,14 +1694,6 @@ ftdm_status_t handle_ubl_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ DECODE_LCC_EVENT(evntType)); } - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); - - /* KONRAD FIX ME */ - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - SS7_FUNC_TRACE_EXIT(__FUNCTION__); return FTDM_SUCCESS; } @@ -2453,6 +2447,8 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /**********************************************************************/ case 0: /* maintenance oriented */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); break; /**********************************************************************/ case 1: /* hardware failure oriented */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c index 4c6c16350d..b13c98b1e6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c @@ -486,47 +486,47 @@ void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic); } - x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; + x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; while ((g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) && - (g_ftdm_sngss7_data.cfg.isupCkt[x].id < ((g_ftdm_sngss7_data.cfg.procId +1) * 1000))) { - /**********************************************************************/ + (g_ftdm_sngss7_data.cfg.isupCkt[x].id < ((g_ftdm_sngss7_data.cfg.procId + 1) * MAX_CIC_MAP_LENGTH))) { + /**********************************************************************/ /* confirm this is a voice channel and not a gap/sig (no ftdmchan there) */ - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) goto move_along; + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + /* compare the intfIds */ + if (g_ftdm_sngss7_data.cfg.isupCkt[x].infId == intfId) { + /* we have a match, setup the pointers to the correct values */ + circuit = x; - /* compare the intfIds */ - if (g_ftdm_sngss7_data.cfg.isupCkt[x].infId == intfId) { - /* we have a match, setup the pointers to the correct values */ - circuit = x; + /* confirm that the circuit is active on our side otherwise move to the next circuit */ + if (!sngss7_test_flag(&g_ftdm_sngss7_data.cfg.isupCkt[circuit], SNGSS7_ACTIVE)) { + SS7_DEBUG("[CIC:%d]Rx %s but circuit is not active yet, skipping!\n", + g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic, + DECODE_LCC_EVENT(evntType)); + x++; + continue; + } - /* confirm that the circuit is active on our side otherwise move to the next circuit */ - if (!sngss7_test_flag(&g_ftdm_sngss7_data.cfg.isupCkt[circuit], SNGSS7_ACTIVE)) { - SS7_DEBUG("[CIC:%d]Rx %s but circuit is not active yet, skipping!\n", - g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic, - DECODE_LCC_EVENT(evntType)); - continue; - } - - if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { - SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit); - SS7_FUNC_TRACE_EXIT(__FUNCTION__); - return; + if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { + SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit); + SS7_FUNC_TRACE_EXIT(__FUNCTION__); + return; + } + + /* bounce out of the loop */ + break; } + } - /* bounce out of the loop */ - break; - } /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].intfId == intfId) */ - -move_along: - /* move along ... nothing to see here */ x++; - - /**********************************************************************/ - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */ + /**********************************************************************/ + } /* check if we found any circuits that are on the intfId, drop the message - * if none are found - */ - if (ftdmchan == NULL) goto sta_ind_end; + * if none are found */ + if (!ftdmchan) { + SS7_FUNC_TRACE_EXIT(__FUNCTION__); + return; + } break; /**************************************************************************/ @@ -544,7 +544,6 @@ move_along: SS7_FUNC_TRACE_EXIT(__FUNCTION__); return; } - break; /**************************************************************************/ } /* switch (evntType) */ @@ -571,9 +570,6 @@ move_along: /* enqueue this event */ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event); - -sta_ind_end: - SS7_FUNC_TRACE_EXIT(__FUNCTION__); } /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 4b5787c0cb..bddcd39eca 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -31,6 +31,7 @@ * SOFTWARE|EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" /******************************************************************************/ @@ -353,6 +354,8 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) char buf[50]; int x = 1; + SS7_RELAY_DBG_FUN(handle_sng_mtp3_alarm); + memset(buf, '\0', sizeof(buf)); switch (sta->hdr.elmId.elmnt) { @@ -492,6 +495,8 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta) char tmp[25]; char *p = NULL; int x = 0; + + SS7_RELAY_DBG_FUN(handle_sng_isup_alarm); /* initalize the msg variable to NULLs */ memset(&msg[0], '\0', sizeof(&msg)); @@ -502,7 +507,6 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta) return; } - /* point p to the first spot in msg */ p = &msg[0]; @@ -742,6 +746,7 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta) void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta) { + SS7_RELAY_DBG_FUN(handle_sng_cc_alarm); return; } /* handle_cc_alarm */ @@ -749,6 +754,7 @@ void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta) void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) { + SS7_RELAY_DBG_FUN(handle_sng_relay_alarm); switch (sta->hdr.elmId.elmnt) { /**************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index a849bf2f62..9f2cbbac25 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -60,6 +60,7 @@ static ftdm_status_t ftdm_sangoma_ss7_stop (ftdm_span_t * span); static ftdm_status_t ftdm_sangoma_ss7_start (ftdm_span_t * span); /******************************************************************************/ + /* STATE MAP ******************************************************************/ ftdm_state_map_t sangoma_ss7_state_map = { { @@ -281,7 +282,37 @@ ftdm_state_map_t sangoma_ss7_state_map = { } }; -/******************************************************************************/ +static void handle_hw_alarm(ftdm_event_t *e) +{ + sngss7_chan_data_t *ss7_info = NULL; + ftdm_channel_t *ftdmchan = NULL; + int x = 0; + + ftdm_assert(e != NULL, "Null event!\n"); + + for (x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; + ftdmchan = ss7_info->ftdmchan; + + if (e->channel->span_id == ftdmchan->physical_span_id && + e->channel->chan_id == ftdmchan->physical_chan_id) { + if (e->enum_id == FTDM_OOB_ALARM_TRAP) { + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); + if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } + } else { + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); + sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); + if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } + } + } + } + } +} /* MONITIOR THREADS ***********************************************************/ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) @@ -293,6 +324,9 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) sngss7_event_data_t *sngss7_event = NULL; sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data; + int b_alarm_test = 1; + sngss7_chan_data_t *ss7_info=NULL; + ftdm_log (FTDM_LOG_INFO, "ftmod_sangoma_ss7 monitor thread for span=%u started.\n", ftdmspan->span_id); /* set IN_THREAD flag so that we know this thread is running */ @@ -311,6 +345,30 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) } while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { + int x = 0; + if (b_alarm_test) { + b_alarm_test = 0; + for (x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; + g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; + ftdmchan = ss7_info->ftdmchan; + if (!ftdmchan) { + continue; + } + + if (ftdmchan->alarm_flags != 0) { /* we'll send out block */ + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX ); + } else { /* we'll send out reset */ + sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX ); + sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX_DN ); + sngss7_set_ckt_blk_flag (ss7_info, FLAG_GRP_HW_UNBLK_TX); + } + } + usleep(50); + } + ftdmchan = NULL; + } /* check the channel state queue for an event*/ switch ((ftdm_interrupt_multiple_wait(ftdm_sangoma_ss7_int, 2, 100))) { @@ -388,7 +446,11 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) { /**********************************************************************/ case FTDM_SUCCESS: - while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS); + while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS) { + if (event->e_type == FTDM_EVENT_OOB) { + handle_hw_alarm(event); + } + } break; /**********************************************************************/ case FTDM_TIMEOUT: @@ -1106,16 +1168,97 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the unblock flag */ sngss7_clear_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX); - /* bring the sig status up */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + /* not bring the cic up if there is a hardware block */ + if( !sngss7_test_ckt_blk_flag(sngss7_info, (FLAG_GRP_HW_BLOCK_TX | FLAG_GRP_HW_BLOCK_TX_DN) ) ) { + /* bring the sig status up */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - /* send a uba */ - ft_to_sngss7_uba (ftdmchan); + /* send a uba */ + ft_to_sngss7_uba (ftdmchan); + } /* check the last state and return to it to allow the call to finish */ goto suspend_goto_last; } + + /**********************************************************************/ + /* hardware block/unblock tx */ + if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_GRP_HW_BLOCK_TX ) && + !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN )) { + + SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_BLOCK_TX flag %s\n", ""); + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + + /* dont send block again if the channel is already blocked by maintenance */ + if( !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX) && + !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN) + ) { + ft_to_sngss7_blo(ftdmchan); + } + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN); + + goto suspend_goto_last; + } + + if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX)) { + SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_UNBLK_TX flag %s\n", ""); + + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX); + + /* do not set the channel up if it's blocked by blo/cgb command OR blocked by receiving blo/cgb */ + if (!sngss7_test_ckt_blk_flag(sngss7_info, ( FLAG_CKT_MN_BLOCK_TX + | FLAG_CKT_MN_BLOCK_TX + | FLAG_GRP_MN_BLOCK_TX + | FLAG_GRP_MN_BLOCK_TX_DN + | FLAG_CKT_MN_BLOCK_RX + | FLAG_CKT_MN_BLOCK_RX_DN + | FLAG_GRP_MN_BLOCK_RX + | FLAG_GRP_MN_BLOCK_RX_DN + ) + ) + ) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + ft_to_sngss7_ubl(ftdmchan); + } + + goto suspend_goto_last; + } +#if 0 +//jz: there is no such thing of "remote hw block". for receiver, there are only block and unblock + + /**********************************************************************/ + // jz: hardware block/unblock rx + if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_GRP_HW_BLOCK_RX ) && + !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN )) { + + SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_BLOCK_RX flag %s\n", ""); + + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + ft_to_sngss7_bla(ftdmchan); + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN); + + goto suspend_goto_last; + } + + if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_GRP_HW_UNBLK_RX )){ + SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_UNBLK_RX flag %s\n", ""); + + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_RX); + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + + ft_to_sngss7_uba(ftdmchan); + + goto suspend_goto_last; + } +#endif + + + /**********************************************************************/ if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX) && !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN)) { @@ -1146,11 +1289,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the unblock flag */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); - /* bring the sig status up */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + /* not bring the cic up if there is a hardware block */ + if (!sngss7_test_ckt_blk_flag(sngss7_info, (FLAG_GRP_HW_BLOCK_TX | FLAG_GRP_HW_BLOCK_TX_DN))) { + /* bring the sig status up */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - /* send a ubl */ - ft_to_sngss7_ubl (ftdmchan); + /* send a ubl */ + ft_to_sngss7_ubl(ftdmchan); + } /* check the last state and return to it to allow the call to finish */ goto suspend_goto_last; @@ -1628,6 +1774,7 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) ftdm_log (FTDM_LOG_INFO, "Starting ftmod_sangoma_ss7 unload...\n"); + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED)) { sng_isup_free_cc(); sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED); @@ -1666,13 +1813,15 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) /* send the specific configuration */ if (ftmod_ss7_disable_relay_channel(x)) { SS7_CRITICAL("Relay Channel %d disable failed!\n", x); - return 1; + /* jz: dont leave like this + * return 1; + * */ } else { SS7_INFO("Relay Channel %d disable DONE!\n", x); } /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.relay[x].flags &= !SNGSS7_CONFIGURED; + g_ftdm_sngss7_data.cfg.relay[x].flags &= ~(SNGSS7_CONFIGURED); } /* if !SNGSS7_CONFIGURED */ x++; } /* while (x < (MAX_RELAY_CHANNELS)) */ @@ -1682,6 +1831,7 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED); } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED)) { sng_isup_free_sm(); sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index cda6225217..7a116ecbb4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -64,12 +64,10 @@ (switchtype == LSI_SW_ANS92) || \ (switchtype == LSI_SW_ANS95) -typedef struct ftdm2trillium -{ +typedef struct ftdm2trillium { uint8_t ftdm_val; uint8_t trillium_val; -}ftdm2trillium_t; - +} ftdm2trillium_t; typedef enum { SNGSS7_CON_IND_EVENT = 0, @@ -609,22 +607,20 @@ typedef enum { "TX CKT BLK DN", \ "TX CKT UNBLK", \ "TX CKT UNBLK DN", \ - "RX GRP MN BLK", \ - "RX GRP MN BLK DN", \ - "RX GRP MN UNBLK", \ - "RX GRP MN UNBLK DN", \ - "TX GRP MN BLK", \ - "TX GRP MN BLK DN", \ - "TX GRP MN UNBLK", \ - "TX GRP MN UNBLK DN", \ "RX GRP HW BLK", \ "RX GRP HW BLK DN", \ - "RX GRP HW UNBLK", \ - "RX GRP HW UNBLK DN", \ "TX GRP HW BLK", \ "TX GRP HW BLK DN", \ + "RX GRP MN BLK", \ + "RX GRP MN BLK DN", \ + "TX GRP MN BLK", \ + "TX GRP MN BLK DN", \ "TX GRP HW UNBLK", \ - "TX GRP HW UNBLK DN" + "TX GRP HW UNBLK DN", \ + "TX GRP MN UNBLK", \ + "TX GRP MN UNBLK DN", \ + "RX GRP HW UNBLK", \ + "RX GRP HW UNBLK DN" FTDM_STR2ENUM_P(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t) /* valid for every cfg array except circuits */ @@ -1042,13 +1038,12 @@ if (ftdmchan->state == new_state) { \ #define sngss7_set_options(obj, option) ((obj)->options |= (option)) -#ifdef SS7_PRODUCTION -# define SS7_ASSERT \ - SS7_INFO_CHAN(ftdmchan,"Production Mode, continuing%s\n", ""); +#ifdef SMG_RELAY_DBG +#define SS7_RELAY_DBG(a,...) printf(a"\n", ##__VA_ARGS__) +#define SS7_RELAY_DBG_FUN(a) printf(#a"\n") #else -# define SS7_ASSERT \ - SS7_ERROR_CHAN(ftdmchan, "Debugging Mode, ending%s\n", ""); \ - *(int*)0=0; +#define SS7_RELAY_DBG(a, ...) +#define SS7_RELAY_DBG_FUN(a) #endif /******************************************************************************/ From 5ca31e9fbf712e721481718d57b11484b189e731 Mon Sep 17 00:00:00 2001 From: yannick Date: Tue, 27 Sep 2011 15:44:20 -0400 Subject: [PATCH 040/493] freetdm: resolve mtp2 on relay always down problem --- .../ftmod_sangoma_ss7_relay.c | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index bfb6971297..c99a14a7e7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -49,7 +49,7 @@ ftdm_status_t handle_relay_disconnect(RyMngmt *sta); static ftdm_status_t reconfig_all_ckts_for_relay(void); static ftdm_status_t disable_all_ckts_for_relay(void); static ftdm_status_t block_all_ckts_for_relay(uint32_t procId); -static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId); +/* static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId); */ static ftdm_status_t disable_all_sigs_for_relay(uint32_t procId); static ftdm_status_t disble_all_mtp2_sigs_for_relay(void); /******************************************************************************/ @@ -59,43 +59,26 @@ ftdm_status_t handle_relay_connect(RyMngmt *sta) { sng_relay_t *sng_relay = &g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id]; - - /* test if this is the first time the channel comes up */ if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) { - SS7_INFO("Relay Channel %d initial connection UP\n", sng_relay->id); - - /* mark the channel as being up */ + /* SS7_INFO("Relay Channel %d initial connection UP\n", sng_relay->id); */ sngss7_set_flag(sng_relay, SNGSS7_RELAY_INIT); - } else { - SS7_INFO("Relay Channel %d connection UP\n", sng_relay->id); - - /* react based on type of channel */ - switch (sng_relay->type) { - /******************************************************************/ - case (LRY_CT_TCP_CLIENT): - /* reconfigure all ISUP ckts, since the main system would have lost all configs */ + } + + SS7_INFO("Relay Channel %d connection UP\n", sng_relay->id); + if (sng_relay->type == LRY_CT_TCP_CLIENT) { + if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) { if (reconfig_all_ckts_for_relay()) { SS7_ERROR("Failed to reconfigure ISUP Ckts!\n"); /* we're done....this is very bad! */ } - break; - /******************************************************************/ - case (LRY_CT_TCP_SERVER): - /* bring the sig links on the client system back up */ - ftmod_ss7_enable_grp_mtp3Link(sta->t.usta.s.ryUpUsta.id); - - /* unbloock the ckts on the client system */ - unblock_all_ckts_for_relay(sta->t.usta.s.ryUpUsta.id); - - break; - /******************************************************************/ - default: - break; - /******************************************************************/ - } /* switch (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id].type) */ - } /* intial up? */ - - return FTDM_SUCCESS; + } + return FTDM_SUCCESS; + } else if (sng_relay->type == LRY_CT_TCP_SERVER) { + ftmod_ss7_enable_grp_mtp3Link(sta->t.usta.s.ryUpUsta.id); + /* unbloock the ckts on the client system */ + return FTDM_SUCCESS; + } + return FTDM_FAIL; } /******************************************************************************/ @@ -310,6 +293,7 @@ ftdm_status_t disble_all_mtp2_sigs_for_relay(void) } +#if 0 /******************************************************************************/ static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId) { @@ -345,6 +329,7 @@ static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId) return FTDM_SUCCESS; } +#endif /******************************************************************************/ /* For Emacs: From d9fe71f02485efcdd1147096023d17d7cd4ba431 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 27 Sep 2011 15:46:40 -0400 Subject: [PATCH 041/493] freetdm: changing git user to be James Zhang - last commit of mtp2 relay fixing was mine --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index c99a14a7e7..1d85dfffbb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -331,6 +331,7 @@ static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId) } #endif + /******************************************************************************/ /* For Emacs: * Local Variables: From b7199839338d812a3c5c9335885932bdcc57daac Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 11:56:19 -0400 Subject: [PATCH 042/493] mod_sofia: Resolved issue #1547 - SIP INFO not working The dtmf_type member was incorrectly being set to NONE if the SDP does not advertise RFC2833 support (which has nothing to do with SIP INFO) --- src/mod/endpoints/mod_sofia/mod_sofia.c | 5 +++++ src/mod/endpoints/mod_sofia/sofia_glue.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index d77f298588..0fc8c3acfb 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1359,10 +1359,12 @@ static switch_status_t sofia_send_dtmf(switch_core_session_t *session, const swi switch (dtmf_type) { case DTMF_2833: { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Enqueuing RFC2833 DTMF %c of length %d\n", dtmf->digit, dtmf->duration); return switch_rtp_queue_rfc2833(tech_pvt->rtp_session, dtmf); } case DTMF_INFO: { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sending INFO DTMF %c of length %d\n", dtmf->digit, dtmf->duration); snprintf(message, sizeof(message), "Signal=%c\r\nDuration=%d\r\n", dtmf->digit, dtmf->duration / 8); switch_mutex_lock(tech_pvt->sofia_mutex); nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("application/dtmf-relay"), SIPTAG_PAYLOAD_STR(message), TAG_END()); @@ -1370,6 +1372,9 @@ static switch_status_t sofia_send_dtmf(switch_core_session_t *session, const swi } break; case DTMF_NONE: + { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Discarding DTMF %c of length %d, DTMF type is NONE\n", dtmf->digit, dtmf->duration); + } break; default: switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Unhandled DTMF type!\n"); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 062da61a98..ae10ccc0aa 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -4847,10 +4847,12 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s } } } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Disable 2833 dtmf\n"); - switch_channel_set_variable(tech_pvt->channel, "dtmf_type", "none"); - tech_pvt->dtmf_type = DTMF_NONE; - te = tech_pvt->recv_te = 0; + if (tech_pvt->dtmf_type == DTMF_2833) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Disable 2833 dtmf\n"); + switch_channel_set_variable(tech_pvt->channel, "dtmf_type", "none"); + tech_pvt->dtmf_type = DTMF_NONE; + te = tech_pvt->recv_te = 0; + } } From 4ec5c66c0ccaaf27b6ac90cc3e4086cae06a0c4c Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 12:33:03 -0400 Subject: [PATCH 043/493] fixed problems with previous master merge in fs_cli.c --- libs/esl/fs_cli.c | 95 +---------------------------------------------- 1 file changed, 1 insertion(+), 94 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 6ef6d8953d..0f432f464f 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -867,8 +867,6 @@ static const char *basic_gets(int *cnt) } #endif -<<<<<<< HEAD - static void print_banner(FILE *stream) { fprintf(stream, @@ -884,27 +882,6 @@ static void print_banner(FILE *stream) ); } -======= -static const char *banner = - " _____ ____ ____ _ ___ \n" - " | ___/ ___| / ___| | |_ _| \n" - " | |_ \\___ \\ | | | | | | \n" - " | _| ___) | | |___| |___ | | \n" - " |_| |____/ \\____|_____|___| \n" - "\n" - "*******************************************************\n" - "* Anthony Minessale II, Ken Rice, *\n" - "* Michael Jerris, Travis Cross *\n" - "* FreeSWITCH (http://www.freeswitch.org) *\n" - "* Paypal Donations Appreciated: paypal@freeswitch.org *\n" - "* Brought to you by ClueCon http://www.cluecon.com/ *\n" - "*******************************************************\n" - "\n" - "Type /help to see a list of commands\n\n\n"; - -static void print_banner(FILE *stream) { fprintf(stream, "%s%s", output_text_color, banner); } ->>>>>>> master - static void set_fn_keys(cli_profile_t *profile) { profile->console_fnkeys[0] = "help"; @@ -1126,15 +1103,9 @@ int main(int argc, char *argv[]) char cmd_str[1024] = ""; cli_profile_t *profile = NULL; #ifndef WIN32 -<<<<<<< HEAD char hfile[512] = "/etc/nbess7_cli_history"; char cfile[512] = "/etc/nbess7_cli.conf"; char dft_cfile[512] = "/etc/nbess7_cli.conf"; -======= - char hfile[512] = "/tmp/fs_cli_history"; - char cfile[512] = "/etc/fs_cli.conf"; - char dft_cfile[512] = "/etc/fs_cli.conf"; ->>>>>>> master #else char hfile[512] = "nbess7_cli_history"; char cfile[512] = "nbess7_cli.conf"; @@ -1265,66 +1236,7 @@ int main(int argc, char *argv[]) printf("\n"); return usage(argv[0]); } -<<<<<<< HEAD - - if (!(rv = esl_config_open_file(&cfg, cfile))) { - rv = esl_config_open_file(&cfg, dft_cfile); - } - - if (rv) { - char *var, *val; - char cur_cat[128] = ""; - - while (esl_config_next_pair(&cfg, &var, &val)) { - if (strcmp(cur_cat, cfg.category)) { - esl_set_string(cur_cat, cfg.category); - esl_set_string(profiles[pcount].name, cur_cat); - esl_set_string(profiles[pcount].host, "localhost"); - esl_set_string(profiles[pcount].pass, "ClueCon"); - profiles[pcount].port = 8821; - set_fn_keys(&profiles[pcount]); - esl_log(ESL_LOG_DEBUG, "Found Profile [%s]\n", profiles[pcount].name); - pcount++; - } - - if (!strcasecmp(var, "host")) { - esl_set_string(profiles[pcount-1].host, val); - } else if (!strcasecmp(var, "user")) { - esl_set_string(profiles[pcount-1].user, val); - } else if (!strcasecmp(var, "password")) { - esl_set_string(profiles[pcount-1].pass, val); - } else if (!strcasecmp(var, "port")) { - int pt = atoi(val); - if (pt > 0) { - profiles[pcount-1].port = (esl_port_t)pt; - } - } else if (!strcasecmp(var, "debug")) { - int dt = atoi(val); - if (dt > -1 && dt < 8){ - profiles[pcount-1].debug = dt; - } - } else if(!strcasecmp(var, "loglevel")) { - esl_set_string(profiles[pcount-1].loglevel, val); - } else if(!strcasecmp(var, "quiet")) { - profiles[pcount-1].quiet = esl_true(val); - } else if (!strncasecmp(var, "key_F", 5)) { - char *key = var + 5; - - if (key) { - int i = atoi(key); - - if (i > 0 && i < 13) { - profiles[pcount-1].console_fnkeys[i - 1] = strdup(val); - } - } - } - } - esl_config_close_file(&cfg); - } - -======= read_config(dft_cfile, cfile); ->>>>>>> master if (optind < argc) { get_profile(argv[optind], &profile); } @@ -1485,15 +1397,10 @@ int main(int argc, char *argv[]) esl_send_recv(&handle, cmd_str); } print_banner(stdout); -<<<<<<< HEAD esl_log(ESL_LOG_INFO, "Netborder SS7 CLI Ready.\nenter /help for a list of commands.\n"); - printf("%s\n", handle.last_sr_reply); - -======= - esl_log(ESL_LOG_INFO, "FS CLI Ready.\nenter /help for a list of commands.\n"); output_printf("%s\n", handle.last_sr_reply); ->>>>>>> master + while (running > 0) { int r; #ifdef HAVE_EDITLINE From 1ba6d277fa03694d1b626bb325ff894a7ed7d5ad Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 13:23:30 -0400 Subject: [PATCH 044/493] freetdm: Fix SS7 T35 timer --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c | 7 ++++--- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c index ff66cc6b41..10afc65bc9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c @@ -56,21 +56,22 @@ void handle_isup_t35(void *userdata) ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan; /* now that we have the right channel...put a lock on it so no-one else can use it */ - ftdm_mutex_lock(ftdmchan->mutex); + ftdm_channel_lock(ftdmchan); + /* Q.764 2.2.5 Address incomplete (T35 expiry action is hangup with cause 28 according to Table A.1/Q.764) */ SS7_ERROR("[Call-Control] Timer 35 expired on CIC = %d\n", sngss7_info->circuit->cic); /* set the flag to indicate this hangup is started from the local side */ sngss7_set_ckt_flag(sngss7_info, FLAG_LOCAL_REL); /* hang up on timer expiry */ - ftdmchan->caller_data.hangup_cause = 28; + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_INVALID_NUMBER_FORMAT; /* end the call */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); /*unlock*/ - ftdm_mutex_unlock(ftdmchan->mutex); + ftdm_channel_unlock(ftdmchan); SS7_FUNC_TRACE_EXIT(__FUNCTION__); return; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 2794eb497c..d7fc553e2f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2966,9 +2966,10 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = ccSpan->t17; } if (ccSpan->t35 == 0) { - g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = 170; + /* Q.764 2.2.5 Address incomplete (T35 is 15-20 seconds according to Table A.1/Q.764) */ + g_ftdm_sngss7_data.cfg.isupCkt[x].t35 = 170; } else { - g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = ccSpan->t35; + g_ftdm_sngss7_data.cfg.isupCkt[x].t35 = ccSpan->t35; } if (ccSpan->tval == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].tval = 10; From 1aad77a0d332b05b11557c6620def53deb6353c5 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 13:40:55 -0400 Subject: [PATCH 045/493] Fix issue #1545 - Wrong branding Conflicts: src/switch_console.c --- src/mod/applications/mod_commands/mod_commands.c | 2 +- src/switch_console.c | 2 +- src/switch_core.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 785861457e..4e114ad5d7 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -283,7 +283,7 @@ SWITCH_STANDARD_API(shutdown_function) SWITCH_STANDARD_API(version_function) { - stream->write_function(stream, "Sangoma Media Gateway Version %s\n", SWITCH_VERSION_FULL); + stream->write_function(stream, "NSG Version %s\n", SWITCH_VERSION_FULL); return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_console.c b/src/switch_console.c index 8f7238d257..876e9386a4 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -1004,7 +1004,7 @@ static unsigned char console_f12key(EditLine * el, int ch) char *prompt(EditLine * e) { if (*prompt_str == '\0') { - switch_snprintf(prompt_str, sizeof(prompt_str), "sangoma-media-gateway@%s> ", switch_core_get_switchname()); + switch_snprintf(prompt_str, sizeof(prompt_str), "nsg@%s> ", switch_core_get_switchname()); } return prompt_str; diff --git a/src/switch_core.c b/src/switch_core.c index 2aa40f9188..bc4974b995 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1859,7 +1859,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, - "\nSangoma Media Gateway Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, + "\nNSG Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, switch_core_session_limit(0), switch_core_sessions_per_second(0), switch_test_flag((&runtime), SCF_USE_SQL) ? "Enabled" : "Disabled"); From fd55b32ad18322d88e861b20529c2a444c806f40 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 13:40:55 -0400 Subject: [PATCH 046/493] Fix issue #1545 - Wrong branding Conflicts: src/switch_console.c --- src/mod/applications/mod_commands/mod_commands.c | 2 +- src/switch_console.c | 2 +- src/switch_core.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 638fd1588a..1513743018 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -283,7 +283,7 @@ SWITCH_STANDARD_API(shutdown_function) SWITCH_STANDARD_API(version_function) { - stream->write_function(stream, "Sangoma Media Gateway Version %s\n", SWITCH_VERSION_FULL); + stream->write_function(stream, "NSG Version %s\n", SWITCH_VERSION_FULL); return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_console.c b/src/switch_console.c index 8f7238d257..876e9386a4 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -1004,7 +1004,7 @@ static unsigned char console_f12key(EditLine * el, int ch) char *prompt(EditLine * e) { if (*prompt_str == '\0') { - switch_snprintf(prompt_str, sizeof(prompt_str), "sangoma-media-gateway@%s> ", switch_core_get_switchname()); + switch_snprintf(prompt_str, sizeof(prompt_str), "nsg@%s> ", switch_core_get_switchname()); } return prompt_str; diff --git a/src/switch_core.c b/src/switch_core.c index 2d256177c7..8bdf3e59b5 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1894,7 +1894,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, - "\nSangoma Media Gateway Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, + "\nNSG Version %s Started.\nMax Sessions[%u]\nSession Rate[%d]\nSQL [%s]\n", SWITCH_VERSION_FULL, switch_core_session_limit(0), switch_core_sessions_per_second(0), switch_test_flag((&runtime), SCF_USE_SQL) ? "Enabled" : "Disabled"); From b8284420523f88820ca0eedc2463ed1903c88bc6 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 28 Sep 2011 19:15:35 -0400 Subject: [PATCH 047/493] freetdm: Fix SS7 ISUP T10 (Overlap digit timeout) - issue #1445 --- .../ftmod_sangoma_ss7_handle.c | 2 ++ .../ftmod_sangoma_ss7_main.c | 35 ++++++++++++++++--- .../ftmod_sangoma_ss7_main.h | 4 ++- .../ftmod_sangoma_ss7_timers.c | 35 ++++++++++++++++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 30 +++++++++------- 5 files changed, 87 insertions(+), 19 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 26356220ec..213c4c8d4d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -405,6 +405,8 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ append_tknStr_from_sngss7(siCnStEvnt->subNum.addrSig, ftdmchan->caller_data.dnis.digits, siCnStEvnt->subNum.oddEven); + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Rx SAM (digits = %s)\n", sngss7_info->circuit->cic, + ftdmchan->caller_data.dnis.digits); } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in SAM!%s\n", " "); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 9f2cbbac25..5341983e46 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -592,6 +592,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) i++; } + /* kill t10 if active */ + if (sngss7_info->t10.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t10.sched, sngss7_info->t10.hb_timer_id); + } + /* check if the end of pulsing (ST) character has arrived or the right number of digits */ if (ftdmchan->caller_data.dnis.digits[i-1] == 'F') { SS7_DEBUG_CHAN(ftdmchan, "Received the end of pulsing character %s\n", ""); @@ -613,7 +618,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } else { /* if we are coming from idle state then we have already been here once before */ if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { - SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n", + SS7_INFO_CHAN(ftdmchan, "Received %d out of %d so far: %s...starting T35\n", i, sngss7_info->circuit->min_digits, ftdmchan->caller_data.dnis.digits); @@ -628,7 +633,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_ERROR ("Unable to schedule timer, hanging up call!\n"); - ftdmchan->caller_data.hangup_cause = 41; + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE; /* set the flag to indicate this hangup is started from the local side */ sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); @@ -636,9 +641,29 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* end the call */ state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); - } /* if (ftdm_sched_timer(sngss7_info->t35.sched, */ - } /* if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) */ - } /* checking ST/#digits */ + } + } + + /* start ISUP t10 */ + if (ftdm_sched_timer (sngss7_info->t10.sched, + "t10", + sngss7_info->t10.beat, + sngss7_info->t10.callback, + &sngss7_info->t10, + &sngss7_info->t10.hb_timer_id)) { + + SS7_ERROR ("Unable to schedule timer, hanging up call!\n"); + + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE; + + /* set the flag to indicate this hangup is started from the local side */ + sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); + + /* end the call */ + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); + } + } break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 7a116ecbb4..d58d2a5331 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -288,7 +288,6 @@ typedef struct sng_isup_intf { uint32_t ssf; uint32_t isap; uint16_t t4; - uint32_t t10; uint32_t t11; uint32_t t18; uint32_t t19; @@ -344,6 +343,7 @@ typedef struct sng_isup_ckt { uint8_t transparent_iam; void *obj; uint16_t t3; + uint32_t t10; uint16_t t12; uint16_t t13; uint16_t t14; @@ -471,6 +471,7 @@ typedef struct sngss7_chan_data { void *raw_data; /* send on next sigevent */ sngss7_glare_data_t glare; sngss7_timer_data_t t35; + sngss7_timer_data_t t10; sngss7_group_data_t rx_grs; sngss7_group_data_t rx_gra; sngss7_group_data_t tx_grs; @@ -887,6 +888,7 @@ ftdm_status_t sngss7_add_raw_data(sngss7_chan_data_t *sngss7_info, uint8_t* data /* in ftmod_sangoma_ss7_timers.c */ void handle_isup_t35(void *userdata); +void handle_isup_t10(void *userdata); /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c index 10afc65bc9..6138ea34b0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2009, Konrad Hammel + * Copyright (c) 2009, Sangoma Technologies + * Konrad Hammel * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,6 +30,11 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Contributors: + * + * Moises Silva + * */ /* INCLUDE ********************************************************************/ @@ -70,12 +76,39 @@ void handle_isup_t35(void *userdata) /* end the call */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); + /* kill t10 if active */ + if (sngss7_info->t10.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t10.sched, sngss7_info->t10.hb_timer_id); + } + /*unlock*/ ftdm_channel_unlock(ftdmchan); SS7_FUNC_TRACE_EXIT(__FUNCTION__); return; } + + +void handle_isup_t10(void *userdata) +{ + SS7_FUNC_TRACE_ENTER(__FUNCTION__); + + sngss7_timer_data_t *timer = userdata; + sngss7_chan_data_t *sngss7_info = timer->sngss7_info; + ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan; + + ftdm_channel_lock(ftdmchan); + + SS7_DEBUG("[Call-Control] Timer 10 expired on CIC = %d\n", sngss7_info->circuit->cic); + + /* send the call to the user */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + + ftdm_channel_unlock(ftdmchan); + + SS7_FUNC_TRACE_EXIT(__FUNCTION__); +} + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index d7fc553e2f..acb29ba385 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -127,6 +127,7 @@ typedef struct sng_ccSpan uint8_t itx_auto_reply; uint8_t transparent_iam; uint32_t t3; + uint32_t t10; uint32_t t12; uint32_t t13; uint32_t t14; @@ -1570,11 +1571,6 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface) sng_isap.t9 = atoi(parm->val); SS7_DEBUG("Found isup t9 = %d\n",sng_isap.t9); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "isup.t10")) { - /**********************************************************************/ - sng_isup.t10 = atoi(parm->val); - SS7_DEBUG("Found isup t10 = %d\n",sng_isup.t10); - /**********************************************************************/ } else if (!strcasecmp(parm->var, "isup.t11")) { /**********************************************************************/ sng_isup.t11 = atoi(parm->val); @@ -1965,6 +1961,10 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) /**********************************************************************/ sng_ccSpan.t3 = atoi(parm->val); SS7_DEBUG("Found isup t3 = %d\n", sng_ccSpan.t3); + } else if (!strcasecmp(parm->var, "isup.t10")) { + /**********************************************************************/ + sng_ccSpan.t10 = atoi(parm->val); + SS7_DEBUG("Found isup t10 = %d\n", sng_ccSpan.t10); /**********************************************************************/ } else if (!strcasecmp(parm->var, "isup.t12")) { /**********************************************************************/ @@ -2584,11 +2584,6 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup) } else { g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = 3000; } - if (sng_isup->t10 != 0) { - g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = sng_isup->t10; - } else { - g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = 50; - } if (sng_isup->t11 != 0) { g_ftdm_sngss7_data.cfg.isupIntf[i].t11 = sng_isup->t11; } else { @@ -2935,6 +2930,11 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) } else { g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = ccSpan->t3; } + if (ccSpan->t10 == 0) { + g_ftdm_sngss7_data.cfg.isupCkt[x].t10 = 50; + } else { + g_ftdm_sngss7_data.cfg.isupCkt[x].t10 = ccSpan->t10; + } if (ccSpan->t12 == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].t12 = 300; } else { @@ -3063,12 +3063,18 @@ static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan) ftdmchan->call_data = ss7_info; /* prepare the timer structures */ - ss7_info->t35.sched = ((sngss7_span_data_t *)(ftdmspan->signal_data))->sched; + ss7_info->t35.sched = ((sngss7_span_data_t *)(ftdmspan->signal_data))->sched; ss7_info->t35.counter = 1; - ss7_info->t35.beat = (isupCkt->t35) * 100; /* beat is in ms, t35 is in 100ms */ + ss7_info->t35.beat = (isupCkt->t35) * 100; /* beat is in ms, t35 is in 100ms */ ss7_info->t35.callback = handle_isup_t35; ss7_info->t35.sngss7_info = ss7_info; + ss7_info->t10.sched = ((sngss7_span_data_t *)(ftdmspan->signal_data))->sched; + ss7_info->t10.counter = 1; + ss7_info->t10.beat = (isupCkt->t10) * 100; /* beat is in ms, t10 is in 100ms */ + ss7_info->t10.callback = handle_isup_t10; + ss7_info->t10.sngss7_info = ss7_info; + /**************************************************************************/ } /* for (i == 1; i < ftdmspan->chan_count; i++) */ From f43eecbab3cd171bd81b41e403d304c6ae65a76e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 30 Sep 2011 10:25:21 -0400 Subject: [PATCH 048/493] ftdm_ss7: Adding OPC and Call Reference Number to SIP x-headers --- libs/freetdm/mod_freetdm/mod_freetdm.c | 15 +++++++++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index caee4dcec9..8501bb1ce2 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1760,6 +1760,21 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres); + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_opc"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OPC", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_lac"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LAC", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_crn"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CRN", "%s", var_value); + } } /* Add any call variable to the dial plan */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 213c4c8d4d..41e0129919 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -219,6 +219,14 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(var, "%d", sngss7_info->circuit->cic); sngss7_add_var(sngss7_info, "ss7_cic", var); + sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc ); + sngss7_add_var(sngss7_info, "ss7_opc", var); + + if (siConEvnt->callRef.callId.pres) { + sprintf(var, "%u", (unsigned int)siConEvnt->callRef.callId.val); + sngss7_add_var(sngss7_info, "ss7_crn", var); + } + if (sngss7_info->circuit->transparent_iam) { sngss7_save_iam(ftdmchan, siConEvnt); } From dbd6bb9a83d9858ec09a6075de2c68ec1b07859e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 30 Sep 2011 11:52:33 -0400 Subject: [PATCH 049/493] fixing bug 1625 - relay status not reported properly in the cli --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 9ff19bac02..00a563962c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1304,7 +1304,9 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, stream->write_function(stream, "r_hw=N|"); } - if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_RELAY_DOWN)) { + + if (g_ftdm_sngss7_data.cfg.procId != 1) { + /* if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_RELAY_DOWN)) { */ stream->write_function(stream, "relay=Y|"); }else { stream->write_function(stream, "relay=N"); From 595454126b3aa04643e52c661d2948b3caa5e15e Mon Sep 17 00:00:00 2001 From: root Date: Fri, 30 Sep 2011 13:09:13 -0400 Subject: [PATCH 050/493] freetdm: changing call reference to generic header; removing location area code --- libs/freetdm/mod_freetdm/mod_freetdm.c | 13 ++----------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 5 +++-- libs/freetdm/src/include/freetdm.h | 1 + 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 8501bb1ce2..5a28076fb1 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1760,21 +1760,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres); - + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CallReference", "%d", channel_caller_data->call_reference); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_opc"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OPC", "%s", var_value); } - - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_lac"); - if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LAC", "%s", var_value); - } - - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_crn"); - if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CRN", "%s", var_value); - } } /* Add any call variable to the dial plan */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 41e0129919..75c5357a8c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -223,8 +223,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_add_var(sngss7_info, "ss7_opc", var); if (siConEvnt->callRef.callId.pres) { - sprintf(var, "%u", (unsigned int)siConEvnt->callRef.callId.val); - sngss7_add_var(sngss7_info, "ss7_crn", var); + ftdmchan->caller_data.call_reference = (unsigned int)siConEvnt->callRef.callId.val; + } else { + ftdmchan->caller_data.call_reference = 0; } if (sngss7_info->circuit->transparent_iam) { diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 0948f16e29..c9c1b2e687 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -362,6 +362,7 @@ typedef struct ftdm_caller_data { /* user information layer 1 protocol */ ftdm_user_layer1_prot_t bearer_layer1; ftdm_calling_party_category_t cpc; /*!< Calling party category */ + uint32_t call_reference; ftdm_channel_t *fchan; /*!< FreeTDM channel associated (can be NULL) */ From ccc81f320713e8b2e4248735f1eaf7e4340787c9 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 30 Sep 2011 16:03:08 -0400 Subject: [PATCH 051/493] ftdm: change max_path length from 255 to 4096 --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index d58d2a5331..caef19af12 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -51,7 +51,7 @@ /* DEFINES ********************************************************************/ #define MAX_NAME_LEN 25 -#define MAX_PATH 255 +#define MAX_PATH 4096 #define MAX_CIC_LENGTH 5 #define MAX_CIC_MAP_LENGTH 1000 From b89a072a4691988da077720d0cfb3f11c0a4ae01 Mon Sep 17 00:00:00 2001 From: wadam Date: Wed, 13 Jul 2011 10:57:09 -0400 Subject: [PATCH 052/493] Fix pid file name - Still hardcoded but to nsg. --- src/switch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch.c b/src/switch.c index c0f4b5c2d3..038dd2c759 100644 --- a/src/switch.c +++ b/src/switch.c @@ -48,7 +48,7 @@ #include "private/switch_core_pvt.h" /* pid filename: Stores the process id of the freeswitch process */ -#define PIDFILE "netborder-ss7.pid" +#define PIDFILE "nsg.pid" static char *pfile = PIDFILE; static int system_ready = 0; From c82f1ecabdcc3428a8bbd74d27e62e2ce7842709 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 6 Oct 2011 12:45:00 -0400 Subject: [PATCH 053/493] freetdm: Added SS7 variables for location number (pending SIP-X header integration) --- .../ftmod_sangoma_ss7_handle.c | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 75c5357a8c..dab2035450 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -93,7 +93,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; - char var[10]; + char var[FTDM_DIGITS_LIMIT]; memset(var, '\0', sizeof(var)); @@ -216,6 +216,34 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(var, "%d", siConEvnt->cdPtyNum.natAddrInd.val); sngss7_add_var(sngss7_info, "ss7_cld_nadi", var); + /* Retrieve the Location Number if present (see ITU Q.763, 3.30) */ + if (siConEvnt->cgPtyNum1.eh.pres) { + if (siConEvnt->cgPtyNum1.addrSig.pres) { + /* fill in the ss7 location address number */ + copy_tknStr_from_sngss7(siConEvnt->cgPtyNum1.addrSig, var, siConEvnt->cgPtyNum1.oddEven); + sngss7_add_var(sngss7_info, "ss7_loc_digits", var); + } + + if (siConEvnt->cgPtyNum1.scrnInd.pres) { + /* fill in the screening indication value */ + sprintf(var, "%d", siConEvnt->cgPtyNum1.scrnInd.val); + sngss7_add_var(sngss7_info, "ss7_loc_screen_ind", var); + } + + if (siConEvnt->cgPtyNum1.presRest.pres) { + /* fill in the presentation value */ + sprintf(var, "%d", siConEvnt->cgPtyNum1.presRest.val); + sngss7_add_var(sngss7_info, "ss7_loc_pres_ind", var); + } + + if (siConEvnt->cgPtyNum1.natAddrInd.pres) { + sprintf(var, "%d", siConEvnt->cgPtyNum1.natAddrInd.val); + sngss7_add_var(sngss7_info, "ss7_loc_nadi", var); + } + } else { + SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " "); + } + sprintf(var, "%d", sngss7_info->circuit->cic); sngss7_add_var(sngss7_info, "ss7_cic", var); From f1257ab8b510295a30ff2083cc6d4a11bef2a794 Mon Sep 17 00:00:00 2001 From: yannick Date: Thu, 6 Oct 2011 17:36:50 -0400 Subject: [PATCH 054/493] ftdm: fixing reset on in-use channel causing infinite state loop. --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 8 +++++-- .../ftmod_sangoma_ss7_main.c | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 00a563962c..9eb737a7f3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -29,6 +29,10 @@ * LIABILITY|WHETHER IN CONTRACT|STRICT LIABILITY|OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE|EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Contributors: + * James Zhang + * */ #if 0 @@ -1198,7 +1202,7 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span, } #ifdef SMG_RELAY_DBG - stream->write_function(stream, " blk_flag= %x ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags ); + stream->write_function(stream," blk_flag=%x | ckt_flag=%x | chan_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags, ftdmchan->flags); #endif stream->write_function(stream, "\n"); } /* if ( span and chan) */ @@ -1314,7 +1318,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, } #ifdef SMG_RELAY_DBG - stream->write_function(stream," blk_flag= %x ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags ); + stream->write_function(stream," blk_flag=%x | ckt_flag=%x | chan_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags, ftdmchan->flags); #endif stream->write_function(stream, "\n"); } /* if ( hole, sig, voice) */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 5341983e46..44870a69a9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -842,9 +842,18 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) { /* check if this hangup is from a tx RSC */ if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) { - /* go to RESTART State until RSCa is received */ - state_flag = 0; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT)) { + ft_to_sngss7_rsc (ftdmchan); + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } else if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP)) { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + } else { + /* go to RESTART State until RSCa is received */ + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } } else { /* if the hangup is from a rx RSC, rx GRS, or glare don't sent RLC */ if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) && @@ -1040,9 +1049,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) && !(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT))) { - /* send a reset request */ - ft_to_sngss7_rsc (ftdmchan); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT); + /* don't send out reset before finished hanging up if I'm in-use. */ + if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) { + /* send a reset request */ + ft_to_sngss7_rsc (ftdmchan); + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT); + } } /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) */ From 4ece7e6ffde58e140ce3b562f54d170a243ef6ca Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 6 Oct 2011 17:54:46 -0400 Subject: [PATCH 055/493] freetdm: ftmod_wanpipe - remove debug idle messages for good, not worth the noise --- libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c index 0f6f7db939..a2eed92b4e 100644 --- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c +++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c @@ -857,12 +857,6 @@ static void wanpipe_write_stats(ftdm_channel_t *ftdmchan, wp_tdm_api_tx_hdr_t *t } if (ftdmchan->iostats.tx.idle_packets < tx_stats->wp_api_tx_hdr_tx_idle_packets) { - /* HDLC channels do not always transmit, so its ok for drivers to fill with idle - * also do not report idle warning when we just started transmitting */ - if (ftdmchan->iostats.tx.packets && FTDM_IS_VOICE_CHANNEL(ftdmchan)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Tx idle changed from %d to %d\n", - ftdmchan->iostats.tx.idle_packets, tx_stats->wp_api_tx_hdr_tx_idle_packets); - } ftdmchan->iostats.tx.idle_packets = tx_stats->wp_api_tx_hdr_tx_idle_packets; } From 8ccd5f0e1304cd8dadd4bb0663b4cb8848e96b99 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 6 Oct 2011 18:53:38 -0400 Subject: [PATCH 056/493] freetdm: ss7 - fixing reset on in-use channel causing signaling down in the receiving side --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 44870a69a9..049aa1546d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -944,7 +944,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* check if we came from reset (aka we just processed a reset) */ if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) || - (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED)) { + (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) || + (ftdmchan->last_state == FTDM_CHANNEL_STATE_HANGUP_COMPLETE)) { + /* check if reset flags are up indicating there is more processing to do yet */ if (!(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) && From 4aa0285a226d10b83ec310fd5e0dadb3aad6109e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 12 Oct 2011 17:44:52 -0400 Subject: [PATCH 057/493] freetdm: CDR - location number implementation (for incoming and outgoing calls) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 26 +++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 13 ++++- .../ftmod_sangoma_ss7_handle.c | 3 - .../ftmod_sangoma_ss7_main.h | 3 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 9 ++- .../ftmod_sangoma_ss7_support.c | 56 +++++++++++++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 26 +++++++-- libs/freetdm/src/include/freetdm.h | 1 + 8 files changed, 125 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 5a28076fb1..f7b64a02a3 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1337,6 +1337,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_set_string(caller_data.dnis.digits, sipvar); } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC"); + if (sipvar) { + ftdm_set_string(caller_data.loc.digits, sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-DNIS-TON"); if (sipvar) { caller_data.dnis.type = (uint8_t)atoi(sipvar); @@ -1703,6 +1708,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Screen", "%d", var_value); @@ -1766,6 +1772,26 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OPC", "%s", var_value); } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_digits"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_screen_ind"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-Screen", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_pres_ind"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-Presentation", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_pres_nadi"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-NADI", "%s", var_value); + } } /* Add any call variable to the dial plan */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index dd1058f420..a9b4136665 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -78,6 +78,8 @@ int ft_to_sngss7_cfg_all(void) /* check if we have done gen_config already */ if (!(g_ftdm_sngss7_data.gen_config)) { + /* update the global gen_config so we don't do it again */ + g_ftdm_sngss7_data.gen_config = 1; /* start of by checking if the license and sig file are valid */ if (sng_validate_license(g_ftdm_sngss7_data.cfg.license, @@ -207,10 +209,17 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) */ - /* update the global gen_config so we don't do it again */ - g_ftdm_sngss7_data.gen_config = 1; + g_ftdm_sngss7_data.gen_config = 2; + } /* if (!(g_ftdm_sngss7_data.gen_config)) */ + + /* FIXME: Please change number 2 to an ENUM that is more explanatory */ + if (g_ftdm_sngss7_data.gen_config != 2) { + SS7_CRITICAL("General configuration FAILED!\n"); + return 1; + } + /* go through all the relays channels and configure it */ x = 1; while (x < (MAX_RELAY_CHANNELS)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index dab2035450..59a226d738 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -213,9 +213,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(var, "%d", siConEvnt->cgPtyNum.natAddrInd.val); sngss7_add_var(sngss7_info, "ss7_clg_nadi", var); - sprintf(var, "%d", siConEvnt->cdPtyNum.natAddrInd.val); - sngss7_add_var(sngss7_info, "ss7_cld_nadi", var); - /* Retrieve the Location Number if present (see ITU Q.763, 3.30) */ if (siConEvnt->cgPtyNum1.eh.pres) { if (siConEvnt->cgPtyNum1.addrSig.pres) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index caef19af12..9bf24aada3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -328,6 +328,7 @@ typedef struct sng_isup_ckt { uint32_t clg_nadi; uint32_t cld_nadi; uint8_t rdnis_nadi; + uint32_t loc_nadi; /* Generic Number defaults */ uint8_t gn_nmbqual; /* Number Qualifier */ @@ -835,6 +836,8 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum); ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); +ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); +ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index b729552092..5aed5f49a4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -79,6 +79,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Calling Number information */ copy_cgPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum); + /* Location Number information */ + copy_locPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum1); + /* Generic Number information */ copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb); @@ -91,12 +94,14 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Access Transport */ copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n", + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d), loc = %s (NADI=%d)\n", sngss7_info->circuit->cic, ftdmchan->caller_data.cid_num.digits, iam.cgPtyNum.natAddrInd.val, ftdmchan->caller_data.dnis.digits, - iam.cdPtyNum.natAddrInd.val); + iam.cdPtyNum.natAddrInd.val, + ftdmchan->caller_data.loc.digits, + iam.cgPtyNum1.natAddrInd.val); } sng_cc_con_request (sngss7_info->spId, diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 613ad6d95e..167de57bb8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -225,6 +225,62 @@ ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPt return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven); } +ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum) +{ + return FTDM_SUCCESS; +} + +ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum) +{ + const char *val = NULL; + const char *loc_nadi = NULL; + + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; + + locPtyNum->eh.pres = PRSNT_NODEF; + locPtyNum->natAddrInd.pres = PRSNT_NODEF; + locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; + + locPtyNum->scrnInd.pres = PRSNT_NODEF; + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); + if (!ftdm_strlen_zero(val)) { + locPtyNum->scrnInd.val = atoi(val); + } else { + locPtyNum->scrnInd.val = caller_data->screen; + } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Code Screening Ind %d\n", locPtyNum->scrnInd.val); + + locPtyNum->presRest.pres = PRSNT_NODEF; + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind"); + if (!ftdm_strlen_zero(val)) { + locPtyNum->presRest.val = atoi(val); + } else { + locPtyNum->presRest.val = caller_data->pres; + } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", locPtyNum->presRest.val); + + locPtyNum->numPlan.pres = PRSNT_NODEF; + locPtyNum->numPlan.val = 0x01; + + locPtyNum->niInd.pres = PRSNT_NODEF; + locPtyNum->niInd.val = 0x00; + + /* check if the user would like a custom NADI value for the Location Reference */ + loc_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_nadi"); + if (!ftdm_strlen_zero(loc_nadi)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Reference NADI value \"%s\"\n", loc_nadi); + locPtyNum->natAddrInd.val = atoi(loc_nadi); + } else { + locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; + locPtyNum->natAddrInd.val = 0x03; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); + } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Presentation Ind %d\n", locPtyNum->presRest.val); + + return copy_tknStr_to_sngss7(caller_data->loc.digits, &locPtyNum->addrSig, &locPtyNum->oddEven); +} + ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb) { const char *val = NULL; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index acb29ba385..30d215a14d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -123,6 +123,7 @@ typedef struct sng_ccSpan uint32_t clg_nadi; uint32_t cld_nadi; uint32_t rdnis_nadi; + uint32_t loc_nadi; uint32_t min_digits; uint8_t itx_auto_reply; uint8_t transparent_iam; @@ -1844,6 +1845,7 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) int flag_clg_nadi = 0; int flag_cld_nadi = 0; int flag_rdnis_nadi = 0; + int flag_loc_nadi = 0; int i; int ret; @@ -1945,6 +1947,14 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) SS7_DEBUG("Invalid parm->value for obci_bita option\n"); } /**********************************************************************/ + } else if (!strcasecmp(parm->var, "loc_nadi")) { + /* add location reference number */ + flag_loc_nadi = 1; + sng_ccSpan.loc_nadi = atoi(parm->val); + SS7_DEBUG("Found default LOC_NADI parm->value = %d\n", sng_ccSpan.loc_nadi); + printf( " --- jz: we got loc nadi from XML, val = %d \n" , sng_ccSpan.loc_nadi); + + /**********************************************************************/ } else if (!strcasecmp(parm->var, "lpa_on_cot")) { /**********************************************************************/ if (*parm->val == '1') { @@ -2034,6 +2044,11 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) sng_ccSpan.rdnis_nadi = 0x03; } + if (!flag_loc_nadi) { + /* default the nadi value to national */ + sng_ccSpan.loc_nadi = 0x03; + } + /* pull up the SSF and Switchtype from the isup interface */ sng_ccSpan.ssf = g_ftdm_sngss7_data.cfg.isupIntf[sng_ccSpan.isupInf].ssf; sng_ccSpan.switchType = g_ftdm_sngss7_data.cfg.isupIntf[sng_ccSpan.isupInf].switchType; @@ -2918,12 +2933,13 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf; g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi; g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi; - g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi; + g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi; + g_ftdm_sngss7_data.cfg.isupCkt[x].loc_nadi = ccSpan->loc_nadi; g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options; - g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType; - g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; - g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; - g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam; + g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType; + g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; + g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; + g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam; if (ccSpan->t3 == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index c9c1b2e687..966e875842 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -351,6 +351,7 @@ typedef struct ftdm_caller_data { ftdm_number_t ani; /*!< ANI (Automatic Number Identification) */ ftdm_number_t dnis; /*!< DNIS (Dialed Number Identification Service) */ ftdm_number_t rdnis; /*!< RDNIS (Redirected Dialed Number Identification Service) */ + ftdm_number_t loc; /*!< LOC (Location Reference Code) */ char aniII[FTDM_DIGITS_LIMIT]; /*! ANI II */ uint8_t screen; /*!< Screening */ uint8_t pres; /*!< Presentation*/ From d79f95f2d62503d122d65706e7c47f192627b47b Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 24 Oct 2011 12:43:54 -0400 Subject: [PATCH 058/493] freetdm: * Avoid acquiring the span mutex if the pendingchans queue is available for use * * FreeTDM modules using the old FTDM_SPAN_STATE_CHANGE flag should be updated * * until then, they are still vulnerable to deadlock situations * * Modules pending update: (ftmod_analog, ftmod_libpri, ftmod_isdn) * * Fixes Sangoma redmine ticket #1791 0 FTDM span stop deadlock * --- libs/freetdm/src/ftdm_state.c | 13 ++++++++++--- libs/freetdm/src/include/private/ftdm_types.h | 6 ++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 54ecde530d..d3f99f6074 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -370,12 +370,19 @@ end: } ftdm_set_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE); - ftdm_mutex_lock(ftdmchan->span->mutex); - ftdm_set_flag(ftdmchan->span, FTDM_SPAN_STATE_CHANGE); if (ftdmchan->span->pendingchans) { ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan); + } else { + /* there is a potential deadlock here, if a signaling module is processing + * state changes while the ftdm_span_stop() function is called, the signaling + * thread will block until it can acquire the span lock, but the thread calling + * ftdm_span_stop() which holds the span lock is waiting on the signaling thread + * to finish ... The only reason to acquire the span lock is this flag, new + * signaling modules should use the pendingchans queue instead of this flag, + * as of today a few modules need still to be updated before we can get rid of + * this flag (ie, ftmod_libpri, ftmod_isdn, ftmod_analog) */ + ftdm_set_flag_locked(ftdmchan->span, FTDM_SPAN_STATE_CHANGE); } - ftdm_mutex_unlock(ftdmchan->span->mutex); if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) { /* the channel should not block waiting for state processing */ diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 2ed9fd04c5..6df25fe4d2 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -173,6 +173,12 @@ typedef enum { FTDM_SPAN_SUSPENDED = (1 << 3), FTDM_SPAN_IN_THREAD = (1 << 4), FTDM_SPAN_STOP_THREAD = (1 << 5), + /*! Signaling modules set this flag to use fchan->pendingchans queue instead + * of the FTDM_SPAN_STATE_CHANGE flag to detect when there is channels with + * a state change pending in the span. If you set this member you can't rely + * on FTDM_SPAN_STATE_CHANGE anymore and must use the queue only instead. This + * is the new way of detecting state changes, new modules should always set this + * flag, the old modules still relying on FTDM_SPAN_STATE_CHANGE should be updated */ FTDM_SPAN_USE_CHAN_QUEUE = (1 << 6), FTDM_SPAN_SUGGEST_CHAN_ID = (1 << 7), FTDM_SPAN_USE_AV_RATE = (1 << 8), From 5fdbda54796521674599eb9981668dc715f0c4e5 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 24 Oct 2011 12:43:54 -0400 Subject: [PATCH 059/493] freetdm: * Avoid acquiring the span mutex if the pendingchans queue is available for use * * FreeTDM modules using the old FTDM_SPAN_STATE_CHANGE flag should be updated * * until then, they are still vulnerable to deadlock situations * * Modules pending update: (ftmod_analog, ftmod_libpri, ftmod_isdn) * * Fixes Sangoma redmine ticket #1791 0 FTDM span stop deadlock * --- libs/freetdm/src/ftdm_state.c | 13 ++++++++++--- libs/freetdm/src/include/private/ftdm_types.h | 6 ++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 54ecde530d..d3f99f6074 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -370,12 +370,19 @@ end: } ftdm_set_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE); - ftdm_mutex_lock(ftdmchan->span->mutex); - ftdm_set_flag(ftdmchan->span, FTDM_SPAN_STATE_CHANGE); if (ftdmchan->span->pendingchans) { ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan); + } else { + /* there is a potential deadlock here, if a signaling module is processing + * state changes while the ftdm_span_stop() function is called, the signaling + * thread will block until it can acquire the span lock, but the thread calling + * ftdm_span_stop() which holds the span lock is waiting on the signaling thread + * to finish ... The only reason to acquire the span lock is this flag, new + * signaling modules should use the pendingchans queue instead of this flag, + * as of today a few modules need still to be updated before we can get rid of + * this flag (ie, ftmod_libpri, ftmod_isdn, ftmod_analog) */ + ftdm_set_flag_locked(ftdmchan->span, FTDM_SPAN_STATE_CHANGE); } - ftdm_mutex_unlock(ftdmchan->span->mutex); if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) { /* the channel should not block waiting for state processing */ diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 2ed9fd04c5..6df25fe4d2 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -173,6 +173,12 @@ typedef enum { FTDM_SPAN_SUSPENDED = (1 << 3), FTDM_SPAN_IN_THREAD = (1 << 4), FTDM_SPAN_STOP_THREAD = (1 << 5), + /*! Signaling modules set this flag to use fchan->pendingchans queue instead + * of the FTDM_SPAN_STATE_CHANGE flag to detect when there is channels with + * a state change pending in the span. If you set this member you can't rely + * on FTDM_SPAN_STATE_CHANGE anymore and must use the queue only instead. This + * is the new way of detecting state changes, new modules should always set this + * flag, the old modules still relying on FTDM_SPAN_STATE_CHANGE should be updated */ FTDM_SPAN_USE_CHAN_QUEUE = (1 << 6), FTDM_SPAN_SUGGEST_CHAN_ID = (1 << 7), FTDM_SPAN_USE_AV_RATE = (1 << 8), From 563460ce15d333d5a9e1878ee0bf0d95458075b9 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 24 Oct 2011 13:21:15 -0400 Subject: [PATCH 060/493] freetdm: mod_freetdm - add SIP x header for FreeTDM-NADI value --- libs/freetdm/mod_freetdm/mod_freetdm.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index f7b64a02a3..ae167ccef2 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1708,6 +1708,10 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_clg_nadi"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%d", var_value); + } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); if (!ftdm_strlen_zero(var_value)) { From fc997aaea4b2555b12afef00867c14c125767672 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Mon, 24 Oct 2011 19:40:45 -0400 Subject: [PATCH 061/493] freetdm: logging fixes, ss7 events sanity checks --- .../ftmod_sangoma_ss7_logger.c | 2 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 16 +++++++++++++--- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 2 +- .../ftmod_sangoma_ss7_support.c | 18 ++++++++++++------ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 4 ++-- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index bddcd39eca..790b893a8d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -791,7 +791,7 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) break; /**************************************************************************/ case (LRY_USTA_UP): /* channel up */ - ftdm_log(FTDM_LOG_ERROR,"[RELAY] Channel UP: tx procId %d: channel %d\n", + ftdm_log(FTDM_LOG_INFO,"[RELAY] Channel UP: tx procId %d: channel %d\n", sta->t.usta.s.ryUpUsta.sendPid, sta->t.usta.s.ryUpUsta.id); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 049aa1546d..759fd2871f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1651,6 +1651,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) static ftdm_status_t ftdm_sangoma_ss7_stop(ftdm_span_t * span) { /*this function is called by the FT-Core to stop this span */ + int timeout=0; ftdm_log (FTDM_LOG_INFO, "Stopping span %s:%u.\n", span->name,span->span_id); @@ -1659,10 +1660,17 @@ static ftdm_status_t ftdm_sangoma_ss7_stop(ftdm_span_t * span) /* wait for the thread to stop */ while (ftdm_test_flag (span, FTDM_SPAN_IN_THREAD)) { - ftdm_log (FTDM_LOG_DEBUG,"Waiting for monitor thread to end for %s:%u.\n", + ftdm_set_flag (span, FTDM_SPAN_STOP_THREAD); + ftdm_log (FTDM_LOG_DEBUG,"Waiting for monitor thread to end for %s:%u. [flags=0x%08X]\n", span->name, - span->span_id); - ftdm_sleep (1); + span->span_id, + span->flags); + /* Wait 50ms */ + ftdm_sleep (50); + timeout++; + + /* timeout after 5 sec, better to crash than hang */ + ftdm_assert_return(timeout < 100, FTDM_FALSE, "SS7 Span stop timeout!\n"); } /* KONRAD FIX ME - deconfigure any circuits, links, attached to this span */ @@ -1725,12 +1733,14 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) /* parse the configuration and apply to the global config structure */ if (ftmod_ss7_parse_xml(ftdm_parameters, span)) { ftdm_log (FTDM_LOG_CRIT, "Failed to parse configuration!\n"); + ftdm_sleep (1000); return FTDM_FAIL; } /* configure libsngss7 */ if (ft_to_sngss7_cfg_all()) { ftdm_log (FTDM_LOG_CRIT, "Failed to configure LibSngSS7!\n"); + ftdm_sleep (1000); return FTDM_FAIL; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 9bf24aada3..3fd5c6e468 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -915,7 +915,7 @@ if (ftdmchan->state == new_state) { \ #define SS7_ERROR_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_ERROR, msg , ##args) #define SS7_CTRIT_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_CRIT, msg , ##args) -#ifdef KONRAD_DEVEL +#ifdef SS7_CODE_DEVEL #define SS7_DEVEL_DEBUG(a,...) ftdm_log(FTDM_LOG_DEBUG,a,##__VA_ARGS__ ); #else #define SS7_DEVEL_DEBUG(a,...) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 167de57bb8..3c1124b3d8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -922,11 +922,6 @@ int check_for_state_change(ftdm_channel_t *ftdmchan) /******************************************************************************/ ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan) { - if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj == NULL) { - SS7_ERROR("sngss7_info is Null for circuit #%d\n", circuit); - return FTDM_FAIL; - } - if (!g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj) { SS7_ERROR("No ss7 info for circuit #%d\n", circuit); return FTDM_FAIL; @@ -935,10 +930,21 @@ ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_in *sngss7_info = g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj; if (!(*sngss7_info)->ftdmchan) { - SS7_ERROR("No channel for circuit #%d\n", circuit); + SS7_ERROR("No ftdmchan for circuit #%d\n", circuit); return FTDM_FAIL; } + if (!(*sngss7_info)->ftdmchan->span) { + SS7_CRITICAL("ftdmchan->span = NULL for circuit #%d\n",circuit); + return FTDM_FAIL; + + } + if (!(*sngss7_info)->ftdmchan->span->signal_data) { + SS7_CRITICAL("ftdmchan->span->signal_data = NULL for circuit #%d\n",circuit); + return FTDM_FAIL; + + } + *ftdmchan = (*sngss7_info)->ftdmchan; return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 30d215a14d..8edea31399 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2877,7 +2877,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) (g_ftdm_sngss7_data.cfg.isupCkt[x].chan == count)) { /* we are processing a circuit that already exists */ - SS7_DEBUG("Found an existing circuit %d, ccSpanId=%d, chan%d\n", + SS7_DEVEL_DEBUG("Found an existing circuit %d, ccSpanId=%d, chan%d\n", x, ccSpan->id, count); @@ -2886,7 +2886,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) flag = 1; /* not supporting reconfig at this time */ - SS7_DEBUG("Not supporting ckt reconfig at this time!\n"); + SS7_DEVEL_DEBUG("Not supporting ckt reconfig at this time!\n"); goto move_along; } else { /* this is not the droid you are looking for */ From 13e6e7bb04ac16209f0ea2ccfeac1ea63c125525 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 25 Oct 2011 17:13:07 -0400 Subject: [PATCH 062/493] freetdm: added debug ftdm_print_stack macro --- libs/freetdm/src/include/private/ftdm_core.h | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libs/freetdm/src/include/private/ftdm_core.h b/libs/freetdm/src/include/private/ftdm_core.h index 9c5c9ad468..65ffad677c 100644 --- a/libs/freetdm/src/include/private/ftdm_core.h +++ b/libs/freetdm/src/include/private/ftdm_core.h @@ -104,6 +104,10 @@ #include #endif +#ifdef __linux__ +#include +#endif + #include #include #include @@ -220,6 +224,27 @@ extern "C" { #define ftdm_is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119) +#ifdef __linux__ +#define ftdm_print_stack(level) \ + do { \ + void *__stacktrace[100] = { 0 }; \ + char **__symbols = NULL; \ + int __size = 0; \ + int __i = 0; \ + __size = backtrace(__stacktrace, ftdm_array_len(__stacktrace)); \ + __symbols = backtrace_symbols(__stacktrace, __size); \ + if (__symbols) { \ + for (__i = 0; __i < __size; __i++) { \ + ftdm_log(__level, "%s\n", __symbols[i]); \ + } \ + free(__symbols); \ + } \ + } while (0); +#else +#define ftdm_print_stack(level) ftdm_log(level, "FTDM_PRINT_STACK is not implemented in this operating system!\n"); +#endif + + #define FTDM_SPAN_IS_BRI(x) ((x)->trunk_type == FTDM_TRUNK_BRI || (x)->trunk_type == FTDM_TRUNK_BRI_PTMP) /*! \brief Copy flags from one arbitrary object to another From 1d3d1658223474eb12d8086e1006e19c0b9112fa Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Tue, 25 Oct 2011 18:05:41 -0400 Subject: [PATCH 063/493] freetdm: ftdm_running checks on handle, implemented no wait block --- .../ftmod_sangoma_ss7_cntrl.c | 36 ++-------- .../ftmod_sangoma_ss7_handle.c | 65 +++++++++++++++++++ .../ftmod_sangoma_ss7_main.h | 4 +- .../ftmod_sangoma_ss7_relay.c | 2 +- 4 files changed, 75 insertions(+), 32 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c index b0a2163fdd..d57526b267 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c @@ -48,35 +48,7 @@ static int ftmod_ss7_enable_isap(int suId); static int ftmod_ss7_enable_nsap(int suId); static int ftmod_ss7_enable_mtpLinkSet(int lnkSetId); -int ftmod_ss7_inhibit_mtp3link(uint32_t id); -int ftmod_ss7_uninhibit_mtp3link(uint32_t id); -int ftmod_ss7_bind_mtp3link(uint32_t id); -int ftmod_ss7_unbind_mtp3link(uint32_t id); -int ftmod_ss7_activate_mtp3link(uint32_t id); -int ftmod_ss7_deactivate_mtp3link(uint32_t id); -int ftmod_ss7_deactivate2_mtp3link(uint32_t id); - -int ftmod_ss7_activate_mtplinkSet(uint32_t id); -int ftmod_ss7_deactivate_mtplinkSet(uint32_t id); -int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id); - -int ftmod_ss7_lpo_mtp3link(uint32_t id); -int ftmod_ss7_lpr_mtp3link(uint32_t id); - -int ftmod_ss7_shutdown_isup(void); -int ftmod_ss7_shutdown_mtp3(void); -int ftmod_ss7_shutdown_mtp2(void); -int ftmod_ss7_shutdown_relay(void); -int ftmod_ss7_disable_relay_channel(uint32_t chanId); - -int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId); -int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId); - -int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId); - -int ftmod_ss7_block_isup_ckt(uint32_t cktId); -int ftmod_ss7_unblock_isup_ckt(uint32_t cktId); /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -848,7 +820,7 @@ int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId) } /******************************************************************************/ -int ftmod_ss7_block_isup_ckt(uint32_t cktId) +int __ftmod_ss7_block_isup_ckt(uint32_t cktId, ftdm_bool_t wait) { SiMngmt cntrl; Pst pst; @@ -876,7 +848,11 @@ int ftmod_ss7_block_isup_ckt(uint32_t cktId) cntrl.t.cntrl.action = ADISIMM; /* block via BLO */ cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */ - return (sng_cntrl_isup(&pst, &cntrl)); + if (wait == FTDM_TRUE) { + return (sng_cntrl_isup(&pst, &cntrl)); + } else { + return (sng_cntrl_isup_nowait(&pst, &cntrl)); + } } /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 59a226d738..8d01a6d97e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -87,6 +87,8 @@ ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* FUNCTIONS ******************************************************************/ +#define ftdm_running_return(var) if (!ftdm_running()) { SS7_ERROR("Error: ftdm_running is not set! Ignoring\n"); return var; } + ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt) { SS7_FUNC_TRACE_ENTER(__FUNCTION__); @@ -97,6 +99,8 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ memset(var, '\0', sizeof(var)); + ftdm_running_return(FTDM_FAIL); + /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit); @@ -341,6 +345,8 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -596,6 +602,8 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -671,6 +679,8 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -793,6 +803,8 @@ ftdm_status_t handle_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -844,6 +856,8 @@ ftdm_status_t handle_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -871,6 +885,8 @@ ftdm_status_t handle_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -898,6 +914,8 @@ ftdm_status_t handle_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -925,6 +943,8 @@ ftdm_status_t handle_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t cir sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -952,6 +972,8 @@ ftdm_status_t handle_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t cir sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -979,6 +1001,8 @@ ftdm_status_t handle_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t cir sngss7_chan_data_t *sngss7_info ; ftdm_channel_t *ftdmchan; + + ftdm_running_return(FTDM_FAIL); /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -1003,6 +1027,8 @@ ftdm_status_t handle_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t cir ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt) { SS7_FUNC_TRACE_ENTER(__FUNCTION__); + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is active on our side otherwise move to the next circuit */ if (!sngss7_test_flag(&g_ftdm_sngss7_data.cfg.isupCkt[circuit], SNGSS7_ACTIVE)) { @@ -1203,6 +1229,8 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1266,6 +1294,8 @@ ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circui int infId; int i; + ftdm_running_return(FTDM_FAIL); + /* extract the affected infId from the circuit structure */ infId = g_ftdm_sngss7_data.cfg.isupCkt[circuit].infId; @@ -1330,6 +1360,8 @@ ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circu ftdm_channel_t *ftdmchan = NULL; int infId; int i; + + ftdm_running_return(FTDM_FAIL); /* extract the affect infId from the circuit structure */ infId = g_ftdm_sngss7_data.cfg.isupCkt[circuit].infId; @@ -1394,6 +1426,8 @@ ftdm_status_t handle_cot_start(uint32_t suInstId, uint32_t spInstId, uint32_t ci sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1449,6 +1483,8 @@ ftdm_status_t handle_cot_stop(uint32_t suInstId, uint32_t spInstId, uint32_t cir sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1494,6 +1530,8 @@ ftdm_status_t handle_cot(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1562,6 +1600,8 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1612,6 +1652,8 @@ ftdm_status_t handle_blo_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1653,6 +1695,8 @@ ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1741,6 +1785,8 @@ ftdm_status_t handle_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1800,6 +1846,8 @@ ftdm_status_t handle_local_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1858,6 +1906,8 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -1948,6 +1998,8 @@ ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ ftdm_channel_t *ftdmchan = NULL; sngss7_span_data_t *sngss7_span = NULL; int range = 0; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -2005,6 +2057,8 @@ ftdm_status_t handle_grs_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ ftdm_channel_t *ftdmchan = NULL; sngss7_span_data_t *sngss7_span = NULL; int range = 0; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -2069,6 +2123,8 @@ ftdm_status_t handle_local_blk(uint32_t suInstId, uint32_t spInstId, uint32_t ci sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -2119,6 +2175,8 @@ ftdm_status_t handle_local_ubl(uint32_t suInstId, uint32_t spInstId, uint32_t ci sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -2174,6 +2232,7 @@ ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit sngss7_span_data_t *sngss7_span = NULL; ftdm_channel_t *ftdmchan = NULL; + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { @@ -2255,6 +2314,8 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int bit = 0; int x; + ftdm_running_return(FTDM_FAIL); + memset(&status[0], '\0', sizeof(status)); /* confirm that the circuit is voice channel */ @@ -2401,6 +2462,8 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int bit = 0; int x; ftdm_sigmsg_t sigev; + + ftdm_running_return(FTDM_FAIL); memset(&sigev, 0, sizeof (sigev)); memset(&status[0], '\0', sizeof(status)); @@ -2538,6 +2601,8 @@ ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + + ftdm_running_return(FTDM_FAIL); /* confirm that the circuit is voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].type != SNG_CKT_VOICE) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 3fd5c6e468..cdef894232 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -732,7 +732,9 @@ int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId); int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId); -int ftmod_ss7_block_isup_ckt(uint32_t cktId); +#define ftmod_ss7_block_isup_ckt(x) __ftmod_ss7_block_isup_ckt(x,FTDM_TRUE) +#define ftmod_ss7_block_isup_ckt_nowait(x) __ftmod_ss7_block_isup_ckt(x,FTDM_FALSE) +int __ftmod_ss7_block_isup_ckt(uint32_t cktId, ftdm_bool_t wait); int ftmod_ss7_unblock_isup_ckt(uint32_t cktId); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index 1d85dfffbb..f58aad4ca7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -248,7 +248,7 @@ ftdm_status_t block_all_ckts_for_relay(uint32_t procId) if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { /* send a block request via stack manager */ - ret = ftmod_ss7_block_isup_ckt(g_ftdm_sngss7_data.cfg.isupCkt[x].id); + ret = ftmod_ss7_block_isup_ckt_nowait(g_ftdm_sngss7_data.cfg.isupCkt[x].id); if (ret) { SS7_INFO("Successfully BLOcked CIC:%d(ckt:%d) due to Relay failure\n", g_ftdm_sngss7_data.cfg.isupCkt[x].cic, From 7f746b4298a5b70e461ac64ce4064d463982aba0 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Tue, 25 Oct 2011 18:36:37 -0400 Subject: [PATCH 064/493] freetdm: added nowait mtp3 commands if proc ids dont match --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c index d57526b267..1fcf1fcfbe 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c @@ -751,7 +751,14 @@ int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId) cntrl.t.cntrl.action = AUBND_DIS; /* disable and unbind */ cntrl.t.cntrl.subAction = SAGR_DSTPROCID; /* specificed element */ - return (sng_cntrl_mtp3(&pst, &cntrl)); + if (g_ftdm_sngss7_data.cfg.procId == procId) { + SS7_DEBUG("Executing MTP3 cntrl command local pid =%i\n",procId); + return (sng_cntrl_mtp3(&pst, &cntrl)); + } else { + SS7_WARN("Executing MTP3 cntrl command different local=%i target=%i\n", + g_ftdm_sngss7_data.cfg.procId,procId); + return (sng_cntrl_mtp3_nowait(&pst, &cntrl)); + } } From f8ae7e7464254d03742595c7828aab14e07ffc16 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Tue, 25 Oct 2011 18:44:28 -0400 Subject: [PATCH 065/493] freetdm: ftmod_ss7_enable_grp_mtp3Link - wait no wait based on proc --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c index 1fcf1fcfbe..c5aca9aa73 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c @@ -790,7 +790,14 @@ int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId) cntrl.t.cntrl.action = ABND_ENA; /* bind and enable */ cntrl.t.cntrl.subAction = SAGR_DSTPROCID; /* specificed element */ - return (sng_cntrl_mtp3(&pst, &cntrl)); + if (g_ftdm_sngss7_data.cfg.procId == procId) { + SS7_DEBUG("Executing MTP3 cntrl command local pid =%i\n",procId); + return (sng_cntrl_mtp3(&pst, &cntrl)); + } else { + SS7_WARN("Executing MTP3 cntrl command different local=%i target=%i\n", + g_ftdm_sngss7_data.cfg.procId,procId); + return (sng_cntrl_mtp3_nowait(&pst, &cntrl)); + } } From 982bcf41460ac39150485288ab750ba5f28cf56d Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Tue, 25 Oct 2011 19:04:50 -0400 Subject: [PATCH 066/493] freetdm: added debugging - changed order of block/unblock --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index f58aad4ca7..a96dae5cdd 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -42,8 +42,6 @@ /******************************************************************************/ /* PROTOTYPES *****************************************************************/ -ftdm_status_t handle_relay_connect(RyMngmt *sta); -ftdm_status_t handle_relay_disconnect(RyMngmt *sta); /*static ftdm_status_t enable_all_ckts_for_relay(void);*/ static ftdm_status_t reconfig_all_ckts_for_relay(void); @@ -84,23 +82,24 @@ ftdm_status_t handle_relay_connect(RyMngmt *sta) /******************************************************************************/ ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta) { + SS7_DEBUG("SS7 relay disconnect on error\n"); /* check which procId is in error, if it is 1, disable the ckts */ if (sta->t.usta.s.ryErrUsta.errPid == 1 ) { - /* we've lost the server, bring down the mtp2 links */ - disble_all_mtp2_sigs_for_relay(); - /* we've lost the server, bring the sig status down on all ckts */ disable_all_ckts_for_relay(); + + /* we've lost the server, bring down the mtp2 links */ + disble_all_mtp2_sigs_for_relay(); } /* check if the channel is a server, means we just lost a MGW */ if (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryErrUsta.errPid].type == LRY_CT_TCP_SERVER) { - /* we've lost the client, bring down all mtp3 links for this procId */ - disable_all_sigs_for_relay(sta->t.usta.s.ryErrUsta.errPid); - /* we've lost the client, bring down all the ckts for this procId */ block_all_ckts_for_relay(sta->t.usta.s.ryErrUsta.errPid); + + /* we've lost the client, bring down all mtp3 links for this procId */ + disable_all_sigs_for_relay(sta->t.usta.s.ryErrUsta.errPid); } return FTDM_SUCCESS; @@ -110,6 +109,8 @@ ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta) ftdm_status_t handle_relay_disconnect_on_down(RyMngmt *sta) { + SS7_DEBUG("SS7 relay disconnect on down\n"); + /* check if the channel is a server, means we just lost a MGW */ if (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id].type == LRY_CT_TCP_SERVER) { block_all_ckts_for_relay(sta->t.usta.s.ryUpUsta.id); From 79c1ed7dc15154fc1c32087ade26766bec82d825 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Tue, 25 Oct 2011 20:29:22 -0400 Subject: [PATCH 067/493] freetdm: fixed reset tx after unequiped cic; reset sent flag was not being cleared --- .../freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 759fd2871f..4f0d021228 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1410,6 +1410,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK); /* throw the channel into reset to sync states */ + clear_tx_rsc_flags(sngss7_info); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* bring the channel into restart again */ From 859d3b0ed5fec36c667d8bddfa3571fe74d6b3df Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 13:05:12 -0400 Subject: [PATCH 068/493] Added GRS on startup by default --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 4f0d021228..ed076925b8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1568,6 +1568,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) sngss7_span_data_t *sngss7_span = NULL; sng_isup_inf_t *sngss7_intf = NULL; int x; + int first_channel=0; SS7_INFO ("Starting span %s:%u.\n", span->name, span->span_id); @@ -1612,13 +1613,15 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME); } -#if 0 +#if 1 /* throw the grp reset flag */ sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX); - if (x == 1) { - sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE); - sngss7_span->tx_grs.circuit = sngss7_info->circuit->id; - sngss7_span->tx_grs.range = span->chan_count -1; + if (first_channel == 0) { + sngss7_chan_data_t *cinfo = ftdmchan->call_data; + sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_BASE); + cinfo->tx_grs.circuit = sngss7_info->circuit->id; + cinfo->tx_grs.range = span->chan_count -1; + first_channel=1; } #else /* throw the channel into reset */ From fd6d18d56c7a3b026eb670d307fe6020f392a8ae Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 14:33:28 -0400 Subject: [PATCH 069/493] freetdm: Fixed GRA - added group reset by default on startup --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 3 +++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 16 +++++++++++++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 2 -- .../ftmod_sangoma_ss7_support.c | 2 +- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 8d01a6d97e..3733a619a7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -2271,6 +2271,8 @@ ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit cinfo->ucic.range = cinfo->tx_grs.range; ftdm_set_flag(sngss7_span, SNGSS7_UCIC_PENDING); + SS7_WARN("Set span SNGSS7_UCIC_PENDING for ISUP circuit = %d!\n", circuit); + ftdm_channel_unlock(fchan); goto done; @@ -2283,6 +2285,7 @@ ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit ftdm_mutex_lock(ftdmchan->mutex); /* throw the ckt block flag */ + SS7_DEBUG("Set FLAG_CKT_UCIC_BLOCK for ISUP circuit = %d!\n", circuit); sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK); /* set the channel to suspended state */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index ed076925b8..2cb59ca36e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1024,6 +1024,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) break; /**************************************************************************/ case FTDM_CHANNEL_STATE_RESTART: /* CICs needs a Reset */ + + SS7_DEBUG_CHAN(ftdmchan,"RESTART: Current flags: ckt=0x%X, blk=0x%X\n", + sngss7_info->ckt_flags, + sngss7_info->blk_flags); if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) { if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) || @@ -1139,7 +1143,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /**************************************************************************/ case FTDM_CHANNEL_STATE_SUSPENDED: /* circuit has been blocked */ - SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X\n", + SS7_DEBUG_CHAN(ftdmchan,"SUSPEND: Current flags: ckt=0x%X, blk=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags); @@ -1256,6 +1260,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) | FLAG_CKT_MN_BLOCK_RX_DN | FLAG_GRP_MN_BLOCK_RX | FLAG_GRP_MN_BLOCK_RX_DN + | FLAG_CKT_UCIC_BLOCK + | FLAG_CKT_UCIC_BLOCK_DN ) ) ) { @@ -1410,6 +1416,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK); /* throw the channel into reset to sync states */ + + clear_rx_grs_flags(sngss7_info); + clear_rx_grs_data(sngss7_info); + clear_tx_grs_flags(sngss7_info); + clear_tx_grs_data(sngss7_info); + clear_rx_rsc_flags(sngss7_info); + clear_tx_rsc_flags(sngss7_info); + clear_tx_rsc_flags(sngss7_info); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 5aed5f49a4..4c7bbf084c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -523,8 +523,6 @@ void ft_to_sngss7_grs (ftdm_channel_t *fchan) cinfo->circuit->cic, (cinfo->circuit->cic + cinfo->tx_grs.range)); - memset(&cinfo->tx_grs, 0, sizeof(cinfo->tx_grs)); - sngss7_set_ckt_flag(cinfo, FLAG_GRP_RESET_SENT); SS7_FUNC_TRACE_EXIT (__FUNCTION__); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 3c1124b3d8..7b53a18eba 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -1428,7 +1428,7 @@ ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan) /* lock the channel */ ftdm_channel_lock(ftdmchan); - SS7_INFO_CHAN(ftdmchan, "[CIC:%d]Rx UCIC\n", sngss7_info->circuit->cic); + SS7_INFO_CHAN(ftdmchan, "[CIC:%d]Rx Span UCIC\n", sngss7_info->circuit->cic); /* clear up any pending state changes */ while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) { From de2836e76a0f9f925bda95db3782a49e010cff1c Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 14:57:27 -0400 Subject: [PATCH 070/493] freetdm: Its possible to get HW ALARM clear even though we never got the initial alarm. Only send out an unblock if block was sent from hw alarm and there are no maintenance blocks pending. --- .../ftmod_sangoma_ss7_main.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 2cb59ca36e..177af00733 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1247,6 +1247,25 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX)) { SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_UNBLK_TX flag %s\n", ""); + if (sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX) && + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { + + /* Block was sent out we must send an unblock */ + /* Do not send an unblock if we also have Management block + enabled */ + + if (!sngss7_test_ckt_blk_flag(sngss7_info, ( FLAG_CKT_MN_BLOCK_TX + | FLAG_CKT_MN_BLOCK_TX + | FLAG_GRP_MN_BLOCK_TX + | FLAG_GRP_MN_BLOCK_TX_DN + ) + ) + ) { + ft_to_sngss7_ubl(ftdmchan); + } + + } + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX); From 0e2b85ddf4582f0d702035cd89fcbe0d64e20a18 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 16:09:32 -0400 Subject: [PATCH 071/493] freetdm: Add debugging --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 177af00733..dc8ed7dbc2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -289,6 +289,8 @@ static void handle_hw_alarm(ftdm_event_t *e) int x = 0; ftdm_assert(e != NULL, "Null event!\n"); + + SS7_DEBUG("handle_hw_alarm event\n"); for (x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { @@ -298,11 +300,13 @@ static void handle_hw_alarm(ftdm_event_t *e) if (e->channel->span_id == ftdmchan->physical_span_id && e->channel->chan_id == ftdmchan->physical_chan_id) { if (e->enum_id == FTDM_OOB_ALARM_TRAP) { + SS7_DEBUG("handle_hw_alarm: Set \n"); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } } else { + SS7_DEBUG("handle_hw_alarm: Clear\n"); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { @@ -363,6 +367,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX ); sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX_DN ); sngss7_set_ckt_blk_flag (ss7_info, FLAG_GRP_HW_UNBLK_TX); + SS7_DEBUG("b_alarm_test FLAG_GRP_HW_UNBLK_TX\n"); } } usleep(50); From d0188836f8717da029d7c0b4072cadbba66e4786 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 16:17:11 -0400 Subject: [PATCH 072/493] freetdm: Do not set hw block clear flag on startup if port is already up --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index dc8ed7dbc2..fbe5889615 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -307,10 +307,12 @@ static void handle_hw_alarm(ftdm_event_t *e) } } else { SS7_DEBUG("handle_hw_alarm: Clear\n"); - sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); - sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); - if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + if (sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) { + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); + sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); + if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } } } } From 44895d738d23a8b46550a10a1b83abf50b8b0713 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 16:34:56 -0400 Subject: [PATCH 073/493] freetdm: On alarm off event make sure that we had alarm on before issuing HW UNBLOCK --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fbe5889615..37be742793 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -366,10 +366,12 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) if (ftdmchan->alarm_flags != 0) { /* we'll send out block */ sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX ); } else { /* we'll send out reset */ - sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX ); - sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX_DN ); - sngss7_set_ckt_blk_flag (ss7_info, FLAG_GRP_HW_UNBLK_TX); - SS7_DEBUG("b_alarm_test FLAG_GRP_HW_UNBLK_TX\n"); + if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX )) { + sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX ); + sngss7_clear_ckt_blk_flag( ss7_info, FLAG_GRP_HW_BLOCK_TX_DN ); + sngss7_set_ckt_blk_flag (ss7_info, FLAG_GRP_HW_UNBLK_TX); + SS7_DEBUG("b_alarm_test FLAG_GRP_HW_UNBLK_TX\n"); + } } } usleep(50); From d442c188eb97524ec027c21ee7112ce599dd3c7a Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 16:37:44 -0400 Subject: [PATCH 074/493] freetdm: More debugging --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 37be742793..da37f485c3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -300,7 +300,7 @@ static void handle_hw_alarm(ftdm_event_t *e) if (e->channel->span_id == ftdmchan->physical_span_id && e->channel->chan_id == ftdmchan->physical_chan_id) { if (e->enum_id == FTDM_OOB_ALARM_TRAP) { - SS7_DEBUG("handle_hw_alarm: Set \n"); + SS7_DEBUG("handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX\n"); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); @@ -310,6 +310,7 @@ static void handle_hw_alarm(ftdm_event_t *e) if (sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) { sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); + SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_BLOCK_TX\n"); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } From 08768608e66e28ea0398204f5b58a8006e8e8737 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 26 Oct 2011 16:56:47 -0400 Subject: [PATCH 075/493] freetdm: on handle alarm must check TRAP or CLEAR cannot use default case --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index da37f485c3..9a7f36792f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -305,12 +305,12 @@ static void handle_hw_alarm(ftdm_event_t *e) if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } - } else { + } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { SS7_DEBUG("handle_hw_alarm: Clear\n"); if (sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) { sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); - SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_BLOCK_TX\n"); + SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } From acfdddabbb32935da98c5acebad778eba408ed06 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 28 Oct 2011 09:35:49 -0400 Subject: [PATCH 076/493] freetdm: ss7 - add china switchtype to the configuration options --- libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 30d215a14d..3807595183 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -62,6 +62,7 @@ sng_switch_type_t sng_switch_type_map[] = { 1, "india" , LSI_SW_INDIA , LSI_SW_INDIA }, { 1, "uk" , LSI_SW_UK , LSI_SW_UK }, { 1, "russia" , LSI_SW_RUSSIA , LSI_SW_RUSSIA }, + { 1, "china" , LSI_SW_CHINA , LSI_SW_CHINA }, { 0, "", 0, 0 }, }; From c98d8b49d93eb9a8a203417d8574d13ccf059ab8 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Mon, 31 Oct 2011 23:56:39 -0400 Subject: [PATCH 077/493] freetdm: Default to individual reset not GRS --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 9a7f36792f..2cc723d618 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1656,7 +1656,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME); } -#if 1 +#if 0 /* throw the grp reset flag */ sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX); if (first_channel == 0) { From 429b2944e53f5853b1ca411a093261d215cd149a Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Mon, 31 Oct 2011 23:57:45 -0400 Subject: [PATCH 078/493] freetdm: reset to reset not GRS - take2 --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 2cc723d618..bb909488d4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1610,8 +1610,10 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span) sngss7_chan_data_t *sngss7_info = NULL; sngss7_span_data_t *sngss7_span = NULL; sng_isup_inf_t *sngss7_intf = NULL; - int x; - int first_channel=0; + int x; + int first_channel; + + first_channel=0; SS7_INFO ("Starting span %s:%u.\n", span->name, span->span_id); From 953cd77f956415e8905c067a3cc1e0a81cf32c99 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 2 Nov 2011 20:53:14 -0400 Subject: [PATCH 079/493] freetdm: Fixed blocks/unblocks resets. Performed conformance tests Fixed hw alarm handling: physical ids were not used which caused alarms read wrong. Tested sip hold Group blocks/unblock Group reset Link down-> block -> unblock FS start with link down then link up FS start with link up, take link down and up -> make incoming call --- .../ftmod_sangoma_ss7_main.c | 132 +++++++++--------- .../ftmod_sangoma_ss7_main.h | 16 +++ 2 files changed, 84 insertions(+), 64 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index bb909488d4..1453581214 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -290,15 +290,16 @@ static void handle_hw_alarm(ftdm_event_t *e) ftdm_assert(e != NULL, "Null event!\n"); - SS7_DEBUG("handle_hw_alarm event\n"); + SS7_DEBUG("handle_hw_alarm event [%d/%d]\n",e->channel->physical_span_id,e->channel->physical_chan_id); for (x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; ftdmchan = ss7_info->ftdmchan; - if (e->channel->span_id == ftdmchan->physical_span_id && - e->channel->chan_id == ftdmchan->physical_chan_id) { + if (e->channel->physical_span_id == ftdmchan->physical_span_id && + e->channel->physical_chan_id == ftdmchan->physical_chan_id) { + SS7_DEBUG("handle_hw_alarm: span=%i chan=%i ckt=%i x=%i\n",ftdmchan->physical_span_id,ftdmchan->physical_chan_id,g_ftdm_sngss7_data.cfg.isupCkt[x].id,x); if (e->enum_id == FTDM_OOB_ALARM_TRAP) { SS7_DEBUG("handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX\n"); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); @@ -307,13 +308,10 @@ static void handle_hw_alarm(ftdm_event_t *e) } } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { SS7_DEBUG("handle_hw_alarm: Clear\n"); - if (sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) { - sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); - sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); - SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); - if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); - } + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); + SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); + if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } } } @@ -963,16 +961,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) !(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) && !(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX)) && !(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX))) { + + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X\n", + sngss7_info->ckt_flags, + sngss7_info->blk_flags); - /* now check if there is an active block */ - if (!(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) && - !(sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) { - + if (sngss7_channel_status_clear(sngss7_info)) { /* check if the sig status is down, and bring it up if it isn't */ if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) { SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", ""); @@ -1038,6 +1032,13 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"RESTART: Current flags: ckt=0x%X, blk=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags); + +#if 0 + if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX) && sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + break; + } +#endif if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) { if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) || @@ -1169,13 +1170,15 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); /* if there are any resets present */ - if ((sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) || - (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) || - (sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX)) || - (sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX))) { - + if (!sngss7_channel_status_clear(sngss7_info)) { /* don't bring up the sig status but also move to reset */ - goto suspend_goto_restart; + if (!sngss7_reset_status_clear(sngss7_info)) { + goto suspend_goto_restart; + } else if (!sngss7_block_status_clear(sngss7_info)) { + /* Do nothing just go and handle blocks */ + } else { + goto suspend_goto_restart; + } } else { /* bring the sig status back up */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); @@ -1190,6 +1193,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* bring the sig status down */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); } + + /* Wait for RESUME */ + goto suspend_goto_last; } /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { */ /**********************************************************************/ @@ -1221,14 +1227,17 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the unblock flag */ sngss7_clear_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX); + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X\n", + sngss7_info->ckt_flags, + sngss7_info->blk_flags); /* not bring the cic up if there is a hardware block */ - if( !sngss7_test_ckt_blk_flag(sngss7_info, (FLAG_GRP_HW_BLOCK_TX | FLAG_GRP_HW_BLOCK_TX_DN) ) ) { + if (sngss7_channel_status_clear(sngss7_info)) { /* bring the sig status up */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - /* send a uba */ - ft_to_sngss7_uba (ftdmchan); } + /* send a uba */ + ft_to_sngss7_uba (ftdmchan); /* check the last state and return to it to allow the call to finish */ goto suspend_goto_last; @@ -1255,46 +1264,27 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX)) { + int skip_unblock=0; SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_UNBLK_TX flag %s\n", ""); - if (sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX) && - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { - - /* Block was sent out we must send an unblock */ - /* Do not send an unblock if we also have Management block - enabled */ - - if (!sngss7_test_ckt_blk_flag(sngss7_info, ( FLAG_CKT_MN_BLOCK_TX - | FLAG_CKT_MN_BLOCK_TX - | FLAG_GRP_MN_BLOCK_TX - | FLAG_GRP_MN_BLOCK_TX_DN - ) - ) - ) { - ft_to_sngss7_ubl(ftdmchan); - } - + if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX) || + sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { + /* Real unblock */ + } else { + SS7_ERROR_CHAN(ftdmchan, "FLAG_GRP_HW_UNBLK_TX set while FLAG_GRP_HW_BLOCK_TX is not %s\n", ""); + skip_unblock=1; } - + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX_DN); - /* do not set the channel up if it's blocked by blo/cgb command OR blocked by receiving blo/cgb */ - if (!sngss7_test_ckt_blk_flag(sngss7_info, ( FLAG_CKT_MN_BLOCK_TX - | FLAG_CKT_MN_BLOCK_TX - | FLAG_GRP_MN_BLOCK_TX - | FLAG_GRP_MN_BLOCK_TX_DN - | FLAG_CKT_MN_BLOCK_RX - | FLAG_CKT_MN_BLOCK_RX_DN - | FLAG_GRP_MN_BLOCK_RX - | FLAG_GRP_MN_BLOCK_RX_DN - | FLAG_CKT_UCIC_BLOCK - | FLAG_CKT_UCIC_BLOCK_DN - ) - ) - ) { + if (sngss7_channel_status_clear(sngss7_info)) { sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + + if (sngss7_tx_block_status_clear(sngss7_info) && !skip_unblock) { ft_to_sngss7_ubl(ftdmchan); } @@ -1302,6 +1292,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } #if 0 //jz: there is no such thing of "remote hw block". for receiver, there are only block and unblock +//nc: yes there is: its part of the CGB - however its handled in ss7_handle.c /**********************************************************************/ // jz: hardware block/unblock rx @@ -1323,9 +1314,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_RX); - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - ft_to_sngss7_uba(ftdmchan); + if (sngss7_channel_status_clear(sngs7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + + if (sngss7_tx_block_status_clear(sngss7_info)) { + ft_to_sngss7_uba(ftdmchan); + } goto suspend_goto_last; } @@ -1363,11 +1359,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the unblock flag */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); - /* not bring the cic up if there is a hardware block */ - if (!sngss7_test_ckt_blk_flag(sngss7_info, (FLAG_GRP_HW_BLOCK_TX | FLAG_GRP_HW_BLOCK_TX_DN))) { + if (sngss7_channel_status_clear(sngss7_info)) { /* bring the sig status up */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + if (sngss7_tx_block_status_clear(sngss7_info)) { /* send a ubl */ ft_to_sngss7_ubl(ftdmchan); } @@ -1388,6 +1385,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* throw the done flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX_DN); + /* bring the sig status down */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + /* check the last state and return to it to allow the call to finish */ goto suspend_goto_last; } @@ -1405,6 +1405,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* send a uba */ /*ft_to_sngss7_uba(ftdmchan);*/ + + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } /* check the last state and return to it to allow the call to finish */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index cdef894232..4a0f6026c7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -1044,6 +1044,22 @@ if (ftdmchan->state == new_state) { \ #define sngss7_clear_options(obj, option) ((obj)->options &= ~(option)) #define sngss7_set_options(obj, option) ((obj)->options |= (option)) +#define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \ + FLAG_CKT_MN_BLOCK_TX_DN | \ + FLAG_GRP_MN_BLOCK_TX | \ + FLAG_GRP_MN_BLOCK_TX_DN | \ + FLAG_GRP_HW_BLOCK_TX | \ + FLAG_GRP_HW_BLOCK_TX_DN ))) + +#define sngss7_block_status_clear(obj) (obj->blk_flags == 0) + +#define sngss7_reset_status_clear(obj) (!sngss7_test_ckt_flag(obj, (FLAG_RESET_TX | \ + FLAG_RESET_RX | \ + FLAG_GRP_RESET_TX | \ + FLAG_GRP_RESET_RX ))) + +#define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj))) + #ifdef SMG_RELAY_DBG #define SS7_RELAY_DBG(a,...) printf(a"\n", ##__VA_ARGS__) From 69f6f20fd22a7bda09c1ea21932fafeba4ab6e88 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 3 Nov 2011 14:29:47 -0400 Subject: [PATCH 080/493] freetdm: on hander do not go up unless all channel blocks/restes are cleared Added more documentation in main --- .../ftmod_sangoma_ss7_handle.c | 4 ++- .../ftmod_sangoma_ss7_main.c | 32 +++++++------------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 3733a619a7..0f3515097b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -2571,7 +2571,9 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ sigev.channel = ftdmchan; /* bring the sig status down */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 1453581214..c4854f860c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1032,13 +1032,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"RESTART: Current flags: ckt=0x%X, blk=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags); - -#if 0 - if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX) && sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) { - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); - break; - } -#endif if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) { if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) || @@ -1175,8 +1168,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (!sngss7_reset_status_clear(sngss7_info)) { goto suspend_goto_restart; } else if (!sngss7_block_status_clear(sngss7_info)) { - /* Do nothing just go and handle blocks */ + /* Do nothing just go through and handle blocks below */ } else { + /* This should not happen as above function tests + * for reset and blocks */ + SS7_ERROR_CHAN(ftdmchan, "Invalid code path: sngss7_channel_status_clear reset and block are both cleared%s\n", ""); goto suspend_goto_restart; } } else { @@ -1195,6 +1191,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } /* Wait for RESUME */ + /* FIXME: Check if this is a correct action to wait for RESUME */ goto suspend_goto_last; } /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { */ @@ -1290,19 +1287,20 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) goto suspend_goto_last; } -#if 0 -//jz: there is no such thing of "remote hw block". for receiver, there are only block and unblock -//nc: yes there is: its part of the CGB - however its handled in ss7_handle.c /**********************************************************************/ - // jz: hardware block/unblock rx +#if 0 + /* This logic is handled in the handle_cgu_req and handle_cgb_req */ + if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_GRP_HW_BLOCK_RX ) && !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN )) { SS7_DEBUG_CHAN(ftdmchan, "Processing FLAG_GRP_HW_BLOCK_RX flag %s\n", ""); sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); - ft_to_sngss7_bla(ftdmchan); + + /* FIXME: Transmit CRG Ack */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN); goto suspend_goto_last; @@ -1319,16 +1317,13 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); } - if (sngss7_tx_block_status_clear(sngss7_info)) { - ft_to_sngss7_uba(ftdmchan); - } + /* Transmit CRU Ack */ goto suspend_goto_last; } #endif - /**********************************************************************/ if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX) && !sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN)) { @@ -1861,9 +1856,6 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init) sng_isup_version(&major, &minor, &build); SS7_INFO("Loaded LibSng-SS7 %d.%d.%d\n", major, minor, build); - /* crash on assert fail */ - ftdm_global_set_crash_policy (FTDM_CRASH_ON_ASSERT); - return FTDM_SUCCESS; } From 4b25044ac6043b4a411a62d0d28ceb4b50cc95b2 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 3 Nov 2011 20:04:26 -0400 Subject: [PATCH 081/493] freetdm: Made CPG optional on configuration file Fixes in hw alarm - no need to set hw unblock if hw block did not execute yet. Minor bug fixes --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 2 +- .../ftmod_sangoma_ss7_main.c | 47 ++++++++++++++++--- .../ftmod_sangoma_ss7_main.h | 12 ++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 12 +++++ 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index a9b4136665..e51428acaa 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -94,7 +94,7 @@ int ft_to_sngss7_cfg_all(void) /* set the desired procID value */ sng_set_procId((uint16_t)g_ftdm_sngss7_data.cfg.procId); } - + /* start up the stack manager */ if (sng_isup_init_sm()) { SS7_CRITICAL("Failed to start Stack Manager\n"); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index c4854f860c..cd7f3ad58e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -308,10 +308,14 @@ static void handle_hw_alarm(ftdm_event_t *e) } } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { SS7_DEBUG("handle_hw_alarm: Clear\n"); - sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); - SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); - if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); + sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); + if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { + sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); + SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); + if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } } } } @@ -737,6 +741,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM); ft_to_sngss7_acm(ftdmchan); } + if (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cpg_on_progress == FTDM_TRUE) { + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_SENT_CPG)) { + sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_CPG); + ft_to_sngss7_cpg(ftdmchan); + } + } } break; @@ -756,7 +766,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_ACM); ft_to_sngss7_acm(ftdmchan); } - ft_to_sngss7_cpg(ftdmchan); + if (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cpg_on_progress_media == FTDM_TRUE) { + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_SENT_CPG)) { + sngss7_set_ckt_flag(sngss7_info, FLAG_SENT_CPG); + ft_to_sngss7_cpg(ftdmchan); + } + } } break; @@ -973,7 +988,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* all flags are down so we can bring up the sig status */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); } /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */ - } /* if !blocked */ + } else { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } /* if !blocked */ } else { SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); @@ -998,6 +1016,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_clear_ckt_flag (sngss7_info, FLAG_LOCAL_REL); sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_ACM); + sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_CPG); if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) { @@ -1162,6 +1181,22 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the PAUSE flag */ sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); + /* We have transmitted Reset/GRS but have not gotten a + * Response. In mean time we got a RESUME. We cannot be sure + * that our reset has been trasmitted, thus restart reset procedure. */ + if (sngss7_tx_reset_status_pending(sngss7_info)) { + SS7_DEBUG_CHAN(ftdmchan, "Channel transmitted RSC/GRS before RESUME, restart Reset procedure%s\n", ""); + clear_rx_grs_flags(sngss7_info); + clear_rx_grs_data(sngss7_info); + clear_tx_grs_flags(sngss7_info); + clear_tx_grs_data(sngss7_info); + clear_rx_rsc_flags(sngss7_info); + clear_tx_rsc_flags(sngss7_info); + + clear_tx_rsc_flags(sngss7_info); + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); + } + /* if there are any resets present */ if (!sngss7_channel_status_clear(sngss7_info)) { /* don't bring up the sig status but also move to reset */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 4a0f6026c7..4a0a331594 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -342,6 +342,8 @@ typedef struct sng_isup_ckt { uint32_t min_digits; uint8_t itx_auto_reply; uint8_t transparent_iam; + uint8_t cpg_on_progress_media; + uint8_t cpg_on_progress; void *obj; uint16_t t3; uint32_t t10; @@ -534,6 +536,7 @@ typedef enum { FLAG_INFID_RESUME = (1 << 14), FLAG_INFID_PAUSED = (1 << 15), FLAG_SENT_ACM = (1 << 16), + FLAG_SENT_CPG = (1 << 17), FLAG_RELAY_DOWN = (1 << 30), FLAG_CKT_RECONFIG = (1 << 31) } sng_ckt_flag_t; @@ -542,14 +545,14 @@ typedef enum { "RX_RSC", \ "TX_RSC", \ "TX_RSC_REQ_SENT", \ - "TX_RSC_RSP_RECIEVED", \ + "TX_RSC_RSP_RECEIVED", \ "RX_GRS", \ "RX_GRS_DONE", \ "RX_GRS_CMPLT", \ "GRS_BASE", \ "TX_GRS", \ "TX_GRS_REQ_SENT", \ - "TX_GRS_RSP_RECIEVED", \ + "TX_GRS_RSP_RECEIVED", \ "REMOTE_REL", \ "LOCAL_REL", \ "GLARE", \ @@ -1058,6 +1061,11 @@ if (ftdmchan->state == new_state) { \ FLAG_GRP_RESET_TX | \ FLAG_GRP_RESET_RX ))) +#define sngss7_tx_reset_status_pending(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \ + sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \ + (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \ + sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT)))) + #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj))) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 8f29c55efe..045c1835ef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -128,6 +128,8 @@ typedef struct sng_ccSpan uint32_t min_digits; uint8_t itx_auto_reply; uint8_t transparent_iam; + uint8_t cpg_on_progress_media; + uint8_t cpg_on_progress; uint32_t t3; uint32_t t10; uint32_t t12; @@ -1906,6 +1908,14 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) sng_ccSpan.transparent_iam = ftdm_true(parm->val); SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam); #endif + } else if (!strcasecmp(parm->var, "cpg_on_progress_media")) { + sng_ccSpan.cpg_on_progress_media = ftdm_true(parm->val); + SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress_media); + + } else if (!strcasecmp(parm->var, "cpg_on_progress")) { + sng_ccSpan.cpg_on_progress = ftdm_true(parm->val); + SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress); + } else if (!strcasecmp(parm->var, "cicbase")) { /**********************************************************************/ sng_ccSpan.cicbase = atoi(parm->val); @@ -2941,6 +2951,8 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam; + g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress_media = ccSpan->cpg_on_progress_media; + g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress = ccSpan->cpg_on_progress; if (ccSpan->t3 == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200; From 5dd076c81f8b4506006c38ac6d6a228a5508cec3 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Mon, 7 Nov 2011 00:08:38 -0500 Subject: [PATCH 082/493] freetdm: Allow for backward compatibility. cpg_on_progress_media is default to TRUE if not xml option exists. transparent_iam_max_size added to ccspan. Gloal value is used if transparent_iam_max_size is not in ccSpan. --- .../ftmod_sangoma_ss7_main.h | 3 ++- .../ftmod_sangoma_ss7_support.c | 5 ++-- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 25 ++++++++++++++++--- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 4a0a331594..b25b21f0ef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -340,10 +340,11 @@ typedef struct sng_isup_ckt { /* END - Generic Number defaults */ uint32_t min_digits; - uint8_t itx_auto_reply; + uint32_t transparent_iam_max_size; uint8_t transparent_iam; uint8_t cpg_on_progress_media; uint8_t cpg_on_progress; + uint8_t itx_auto_reply; void *obj; uint16_t t3; uint32_t t10; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 7b53a18eba..4d81e6b1f4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2532,8 +2532,9 @@ ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt) ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%d\n", strlen(url_encoded_iam)); - if (strlen(url_encoded_iam) > g_ftdm_sngss7_data.cfg.transparent_iam_max_size) { - ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "IAM variable length exceeds max size (len:%d max:%d) \n", strlen(url_encoded_iam), g_ftdm_sngss7_data.cfg.transparent_iam_max_size); + if (strlen(url_encoded_iam) > sngss7_info->circuit->transparent_iam_max_size) { + ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "IAM variable length exceeds max size (len:%d max:%d) \n", + strlen(url_encoded_iam), sngss7_info->circuit->transparent_iam_max_size); ret_val = FTDM_FAIL; goto done; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 045c1835ef..2fbd2e5631 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -126,10 +126,11 @@ typedef struct sng_ccSpan uint32_t rdnis_nadi; uint32_t loc_nadi; uint32_t min_digits; - uint8_t itx_auto_reply; + uint32_t transparent_iam_max_size; uint8_t transparent_iam; uint8_t cpg_on_progress_media; uint8_t cpg_on_progress; + uint8_t itx_auto_reply; uint32_t t3; uint32_t t10; uint32_t t12; @@ -194,6 +195,7 @@ static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot); /******************************************************************************/ /* FUNCTIONS ******************************************************************/ + int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span) { int i = 0; @@ -203,6 +205,7 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa sng_route_t self_route; sng_span_t sngSpan; + /* clean out the isup ckt */ memset(&sngSpan, 0x0, sizeof(sngSpan)); @@ -455,6 +458,9 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) int num_parms = sng_gen->n_parameters; int i = 0; + /* Set the transparent_iam_max_size to default value */ + g_ftdm_sngss7_data.cfg.transparent_iam_max_size=800; + /* extract all the information from the parameters */ for (i = 0; i < num_parms; i++) { /**************************************************************************/ @@ -1855,6 +1861,7 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) /* initalize the ccSpan structure */ memset(&sng_ccSpan, 0x0, sizeof(sng_ccSpan)); + /* confirm that we are looking at an mtp_link */ if (strcasecmp(cc_span->name, "cc_span")) { SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"cc_span\"!\n",cc_span->name); @@ -1863,6 +1870,14 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) SS7_DEBUG("Parsing \"cc_span\"...\n"); } + /* Backward compatible. + * If cpg_on_progress_media is not in the config file + * default the cpg on progress_media to TRUE */ + sng_ccSpan.cpg_on_progress_media=FTDM_TRUE; + /* If transparent_iam_max_size is not set in cc spans + * use the global value */ + sng_ccSpan.transparent_iam_max_size=g_ftdm_sngss7_data.cfg.transparent_iam_max_size; + for (i = 0; i < num_parms; i++) { /**************************************************************************/ @@ -1908,14 +1923,15 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) sng_ccSpan.transparent_iam = ftdm_true(parm->val); SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam); #endif + } else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { + sng_ccSpan.transparent_iam_max_size = ftdm_true(parm->val); + SS7_DEBUG("Found transparent_iam_max_size %d\n", sng_ccSpan.transparent_iam_max_size); } else if (!strcasecmp(parm->var, "cpg_on_progress_media")) { sng_ccSpan.cpg_on_progress_media = ftdm_true(parm->val); SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress_media); - } else if (!strcasecmp(parm->var, "cpg_on_progress")) { sng_ccSpan.cpg_on_progress = ftdm_true(parm->val); - SS7_DEBUG("Found cpg_on_progress_media %d\n", sng_ccSpan.cpg_on_progress); - + SS7_DEBUG("Found cpg_on_progress %d\n", sng_ccSpan.cpg_on_progress); } else if (!strcasecmp(parm->var, "cicbase")) { /**********************************************************************/ sng_ccSpan.cicbase = atoi(parm->val); @@ -2951,6 +2967,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits; g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply; g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam; + g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam_max_size = ccSpan->transparent_iam_max_size; g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress_media = ccSpan->cpg_on_progress_media; g_ftdm_sngss7_data.cfg.isupCkt[x].cpg_on_progress = ccSpan->cpg_on_progress; From 3552e329ca7b7477e862bb4c09b4edfe59c26373 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 7 Nov 2011 12:53:32 -0500 Subject: [PATCH 083/493] freetdm: fix sip header wrong value of NADI error was caused by printing string value to integer --- libs/freetdm/mod_freetdm/mod_freetdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index ae167ccef2..ba0389a1cc 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1710,7 +1710,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_clg_nadi"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); From f0631fc87e9261819449195b309888485e93bd9d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 7 Nov 2011 16:37:11 -0500 Subject: [PATCH 084/493] freetdm: change call reference number to HEX string format --- libs/freetdm/mod_freetdm/mod_freetdm.c | 6 +++++- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 7 +++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index ba0389a1cc..866fb74bec 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1770,7 +1770,11 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres); - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CallReference", "%d", channel_caller_data->call_reference); + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_callref"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CallReference", "%s", var_value); + } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_opc"); if (!ftdm_strlen_zero(var_value)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 0f3515097b..f351d8ab8d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -252,10 +252,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_add_var(sngss7_info, "ss7_opc", var); if (siConEvnt->callRef.callId.pres) { - ftdmchan->caller_data.call_reference = (unsigned int)siConEvnt->callRef.callId.val; - } else { - ftdmchan->caller_data.call_reference = 0; - } + sprintf(var, "%x", siConEvnt->callRef.callId.val); + sngss7_add_var(sngss7_info, "ss7_callref", var); + } if (sngss7_info->circuit->transparent_iam) { sngss7_save_iam(ftdmchan, siConEvnt); From 08e01bb5a202082295e19f98333a42e1456797cf Mon Sep 17 00:00:00 2001 From: root Date: Mon, 7 Nov 2011 17:32:02 -0500 Subject: [PATCH 085/493] freetdm: fix generic number --- libs/freetdm/mod_freetdm/mod_freetdm.c | 14 +++++++------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 866fb74bec..be55d2b7ff 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1725,36 +1725,36 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN", "%s", var_value); var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_numqual"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumQual", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumQual", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_nadi"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NADI", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NADI", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_screen_ind"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Screen", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Screen", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_pres_ind"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Presentation", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Presentation", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_npi"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Plan", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Plan", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_num_inc_ind"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumInComp", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumInComp", "%s", var_value); } } /* End - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 4d81e6b1f4..aa50ce2264 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -375,7 +375,7 @@ ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb if (genNmb->nmbQual.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", genNmb->nmbQual.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"number qualifier\" \n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"number qualifier\" \"%s\" \n", val); sngss7_add_var(sngss7_info, "ss7_gn_numqual", val); } From 5c4a3f81a2e5c2077eb5949dfbc54101a17d3bdc Mon Sep 17 00:00:00 2001 From: wadam Date: Mon, 7 Nov 2011 22:26:02 -0500 Subject: [PATCH 086/493] Fix error in call reference conversion to string. src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c cc1: warnings being treated as errors src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c: In function 'handle_con_ind': src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c:255: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'U32' make[6]: *** [ftmod_sangoma_ss7_la-ftmod_sangoma_ss7_handle.lo] Error 1 --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index f351d8ab8d..25967e5977 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -252,7 +252,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_add_var(sngss7_info, "ss7_opc", var); if (siConEvnt->callRef.callId.pres) { - sprintf(var, "%x", siConEvnt->callRef.callId.val); + /* %x expect an unsigned int so as callId is a U32, casting to uint32_t + * is safe */ + sprintf(var, "%x", (uint32_t)siConEvnt->callRef.callId.val); sngss7_add_var(sngss7_info, "ss7_callref", var); } From dcdb5f18eb017d52dc556a62b956d1d397482591 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 14 Nov 2011 16:42:23 -0500 Subject: [PATCH 087/493] freetdm: fixing RDNIS-Screen value mis-displaying string in decimal format --- libs/freetdm/mod_freetdm/mod_freetdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index be55d2b7ff..b2df0e40ac 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1715,7 +1715,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Screen", "%d", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Screen", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_pres_ind"); From 552405024afbc40ecf57c97052f13aa37c759f39 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 15 Nov 2011 14:46:57 -0500 Subject: [PATCH 088/493] freetdm: fixing relay must start after master. relay - configuring circuits only when resume is recieved. master - configuring relay after all the others are configured. --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 322 +++++++++--------- .../ftmod_sangoma_ss7_logger.c | 5 + .../ftmod_sangoma_ss7_main.c | 22 +- .../ftmod_sangoma_ss7_support.c | 1 + 4 files changed, 189 insertions(+), 161 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index e51428acaa..25510e8c7a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -220,27 +220,6 @@ int ft_to_sngss7_cfg_all(void) return 1; } - /* go through all the relays channels and configure it */ - x = 1; - while (x < (MAX_RELAY_CHANNELS)) { - /* check if this relay channel has been configured already */ - if ((g_ftdm_sngss7_data.cfg.relay[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.relay[x].flags & SNGSS7_CONFIGURED))) { - - /* send the specific configuration */ - if (ftmod_ss7_relay_chan_config(x)) { - SS7_CRITICAL("Relay Channel %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("Relay Channel %d configuration DONE!\n", x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.relay[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - x++; - } /* while (x < (MAX_RELAY_CHANNELS)) */ - x = 1; while (x < (MAX_MTP_LINKS)) { /* check if this link has been configured already */ @@ -281,160 +260,189 @@ int ft_to_sngss7_cfg_all(void) x++; } /* while (x < (MAX_MTP_LINKS+1)) */ - x = 1; - while (x < (MAX_MTP_LINKS)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtp3Link[x].flags & SNGSS7_CONFIGURED))) { - - /* configure mtp3 */ - if (ftmod_ss7_mtp3_dlsap_config(x)) { - SS7_CRITICAL("MTP3 DLSAP %d configuration FAILED!\n", x); - return 1;; - } else { - SS7_INFO("MTP3 DLSAP %d configuration DONE!\n", x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtp3Link[x].flags |= SNGSS7_CONFIGURED; - } - - x++; - } /* while (x < (MAX_MTP_LINKS+1)) */ - - x = 1; - while (x < (MAX_NSAPS)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.nsap[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_CONFIGURED))) { - - ret = ftmod_ss7_mtp3_nsap_config(x); - if (ret) { - SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); - return 1; - } else { - SS7_INFO("MTP3 NSAP %d configuration DONE!\n", x); - } - - ret = ftmod_ss7_isup_nsap_config(x); - if (ret) { - SS7_CRITICAL("ISUP NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); - return 1; - } else { - SS7_INFO("ISUP NSAP %d configuration DONE!\n", x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_NSAPS)) */ - - x = 1; - while (x < (MAX_MTP_LINKSETS+1)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_CONFIGURED))) { - - if (ftmod_ss7_mtp3_linkset_config(x)) { - SS7_CRITICAL("MTP3 LINKSET %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("MTP3 LINKSET %d configuration DONE!\n", x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_MTP_LINKSETS+1)) */ - - x = 1; - while (x < (MAX_MTP_ROUTES+1)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & SNGSS7_CONFIGURED))) { - - if (ftmod_ss7_mtp3_route_config(x)) { - SS7_CRITICAL("MTP3 ROUTE %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("MTP3 ROUTE %d configuration DONE!\n",x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_MTP_ROUTES+1)) */ - - x = 1; - while (x < (MAX_ISAPS)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.isap[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_CONFIGURED))) { - - if (ftmod_ss7_isup_isap_config(x)) { - SS7_CRITICAL("ISUP ISAP %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("ISUP ISAP %d configuration DONE!\n", x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.isap[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_ISAPS)) */ - - if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) { + /* no configs above mtp2 for relay */ + if (g_ftdm_sngss7_data.cfg.procId == 1) { x = 1; - while (x < (MAX_ISUP_INFS)) { + while (x < (MAX_MTP_LINKS)) { /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.isupIntf[x].flags & SNGSS7_CONFIGURED))) { - - if (ftmod_ss7_isup_intf_config(x)) { - SS7_CRITICAL("ISUP INTF %d configuration FAILED!\n", x); + if ((g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtp3Link[x].flags & SNGSS7_CONFIGURED))) { + + /* configure mtp3 */ + if (ftmod_ss7_mtp3_dlsap_config(x)) { + SS7_CRITICAL("MTP3 DLSAP %d configuration FAILED!\n", x); + return 1;; + } else { + SS7_INFO("MTP3 DLSAP %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtp3Link[x].flags |= SNGSS7_CONFIGURED; + } + + x++; + } /* while (x < (MAX_MTP_LINKS+1)) */ + + x = 1; + while (x < (MAX_NSAPS)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.nsap[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_CONFIGURED))) { + + ret = ftmod_ss7_mtp3_nsap_config(x); + if (ret) { + SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); return 1; } else { - SS7_INFO("ISUP INTF %d configuration DONE!\n", x); - /* set the interface to paused */ - sngss7_set_flag(&g_ftdm_sngss7_data.cfg.isupIntf[x], SNGSS7_PAUSED); + SS7_INFO("MTP3 NSAP %d configuration DONE!\n", x); } - + + ret = ftmod_ss7_isup_nsap_config(x); + if (ret) { + SS7_CRITICAL("ISUP NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); + return 1; + } else { + SS7_INFO("ISUP NSAP %d configuration DONE!\n", x); + } + /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.isupIntf[x].flags |= SNGSS7_CONFIGURED; + g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_CONFIGURED; } /* if !SNGSS7_CONFIGURED */ x++; - } /* while (x < (MAX_ISUP_INFS)) */ - } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */ + } /* while (x < (MAX_NSAPS)) */ - x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; - while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.isupCkt[x].flags & SNGSS7_CONFIGURED))) { + x = 1; + while (x < (MAX_MTP_LINKSETS+1)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_CONFIGURED))) { - if (ftmod_ss7_isup_ckt_config(x)) { - SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", x); + if (ftmod_ss7_mtp3_linkset_config(x)) { + SS7_CRITICAL("MTP3 LINKSET %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("MTP3 LINKSET %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (x < (MAX_MTP_LINKSETS+1)) */ + + x = 1; + while (x < (MAX_MTP_ROUTES+1)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & SNGSS7_CONFIGURED))) { + + if (ftmod_ss7_mtp3_route_config(x)) { + SS7_CRITICAL("MTP3 ROUTE %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("MTP3 ROUTE %d configuration DONE!\n",x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (x < (MAX_MTP_ROUTES+1)) */ + + x = 1; + while (x < (MAX_ISAPS)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.isap[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_CONFIGURED))) { + + if (ftmod_ss7_isup_isap_config(x)) { + SS7_CRITICAL("ISUP ISAP %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("ISUP ISAP %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.isap[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (x < (MAX_ISAPS)) */ + + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) { + x = 1; + while (x < (MAX_ISUP_INFS)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.isupIntf[x].flags & SNGSS7_CONFIGURED))) { + + if (ftmod_ss7_isup_intf_config(x)) { + SS7_CRITICAL("ISUP INTF %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("ISUP INTF %d configuration DONE!\n", x); + /* set the interface to paused */ + sngss7_set_flag(&g_ftdm_sngss7_data.cfg.isupIntf[x], SNGSS7_PAUSED); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.isupIntf[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (x < (MAX_ISUP_INFS)) */ + } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */ + + x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; + while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { + + if (g_ftdm_sngss7_data.cfg.procId > 1) { + break; + } + + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.isupCkt[x].flags & SNGSS7_CONFIGURED))) { + + if (ftmod_ss7_isup_ckt_config(x)) { + SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("ISUP CKT %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.isupCkt[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */ + } + + /* go through all the relays channels and configure it */ + x = 1; + while (x < (MAX_RELAY_CHANNELS)) { + /* check if this relay channel has been configured already */ + if ((g_ftdm_sngss7_data.cfg.relay[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.relay[x].flags & SNGSS7_CONFIGURED))) { + + /* send the specific configuration */ + if (ftmod_ss7_relay_chan_config(x)) { + SS7_CRITICAL("Relay Channel %d configuration FAILED!\n", x); return 1; } else { - SS7_INFO("ISUP CKT %d configuration DONE!\n", x); + SS7_INFO("Relay Channel %d configuration DONE!\n", x); } /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.isupCkt[x].flags |= SNGSS7_CONFIGURED; + g_ftdm_sngss7_data.cfg.relay[x].flags |= SNGSS7_CONFIGURED; } /* if !SNGSS7_CONFIGURED */ - x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */ - + } /* while (x < (MAX_RELAY_CHANNELS)) */ + return 0; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 790b893a8d..176de9e627 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -810,6 +810,11 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) break; /**************************************************************************/ + case (LRY_USTA_TCP_CONN_FAILED): + ftdm_log(FTDM_LOG_ERROR,"[RELAY] TCP connection failed \n" ); + + break; + /**************************************************************************/ default: ftdm_log(FTDM_LOG_ERROR,"Unknown Relay Alram\n"); break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index cd7f3ad58e..93d76fc8e7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1166,10 +1166,24 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /**************************************************************************/ case FTDM_CHANNEL_STATE_SUSPENDED: /* circuit has been blocked */ - SS7_DEBUG_CHAN(ftdmchan,"SUSPEND: Current flags: ckt=0x%X, blk=0x%X\n", - sngss7_info->ckt_flags, - sngss7_info->blk_flags); - + SS7_DEBUG_CHAN(ftdmchan,"SUSPEND: Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", + sngss7_info->ckt_flags, sngss7_info->blk_flags, + sngss7_info->circuit->flags ); + + if (!(sngss7_info->circuit->flags & SNGSS7_CONFIGURED)) { + if ( !sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED) + ||(sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME))) { + if (ftmod_ss7_isup_ckt_config(sngss7_info->circuit->id)) { + SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", sngss7_info->circuit->id); + *(int*)0=0; + return 1; + } else { + SS7_INFO("ISUP CKT %d configuration DONE!\n", sngss7_info->circuit->id); + } + sngss7_info->circuit->flags |= SNGSS7_CONFIGURED; + } + } + /**********************************************************************/ if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index aa50ce2264..4f18459018 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -1943,6 +1943,7 @@ ftdm_status_t check_status_of_all_isup_intf(void) if (ftmod_ss7_isup_intf_sta(sngss7_intf->id, &status)) { SS7_ERROR("Failed to get status of ISUP intf %d\n", sngss7_intf->id); + sngss7_set_flag(sngss7_intf, SNGSS7_PAUSED); continue; } From e293c1253583a97a5e6b3358213bfb62f88eadf2 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 15 Nov 2011 18:26:13 -0500 Subject: [PATCH 089/493] freetdm: fix loc_nadi value --- libs/freetdm/mod_freetdm/mod_freetdm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index b2df0e40ac..2d946f3c59 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1796,7 +1796,8 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-Presentation", "%s", var_value); } - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_pres_nadi"); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_nadi"); + printf ( "ss7_loc_nadi = %s \n " , var_value ); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-NADI", "%s", var_value); } From cb1d5be5e6ce84a89c00026b97c64bbadee9362f Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 17 Nov 2011 15:43:40 -0500 Subject: [PATCH 090/493] freetdm: fix redirection presentation number in X-header --- libs/freetdm/mod_freetdm/mod_freetdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 2d946f3c59..c9daadac12 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1720,7 +1720,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_pres_ind"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Presentation", "%d", channel_caller_data->rdnis.plan); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Presentation", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); From 69c62f7b388ceaae3d16ff2d26b5f0d94e119a06 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 24 Nov 2011 19:19:58 -0500 Subject: [PATCH 091/493] Fixed the out of sequence frame condition Redmine Bug#1966 IAM -> <-REL <-ACM <-ANM ACM sets the reset flag ANM sets the group reset flag when both reset flags are set we got into infinite loop --- .../ftmod_sangoma_ss7_handle.c | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 25967e5977..cacbf15170 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -322,12 +322,14 @@ handle_glare: default: /* should not have gotten an IAM while in this state */ SS7_ERROR_CHAN(ftdmchan, "Got IAM on channel in invalid state(%s)...reset!\n", ftdm_channel_state2str (ftdmchan->state)); - /* reset the cic */ - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); - - /* move the state of the channel to RESTART to force a reset */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + /* throw the TX reset flag */ + if (!sngss7_tx_reset_status_pending(sngss7_info)) { + sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); + /* go to RESTART */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } break; /**************************************************************************/ } /* switch (ftdmchan->state) */ @@ -393,11 +395,14 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ SS7_ERROR_CHAN(ftdmchan, "RX ACM in invalid state :%s...resetting CIC\n", ftdm_channel_state2str (ftdmchan->state)); - /* reset the cic */ - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); + /* throw the TX reset flag */ + if (!sngss7_tx_reset_status_pending(sngss7_info)) { + sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); - /* go to RESTART */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + /* go to RESTART */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } break; /**********************************************************************/ } /* switch (ftdmchan->state) */ @@ -657,10 +662,13 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx ANM/CON\n", sngss7_info->circuit->cic); /* throw the TX reset flag */ - sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX); + if (!sngss7_tx_reset_status_pending(sngss7_info)) { + sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); - /* go to RESTART */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + /* go to RESTART */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } break; /**************************************************************************/ From 5b8af78a897ea2716da18e5be913eca71e72f7f1 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 25 Nov 2011 21:05:39 -0500 Subject: [PATCH 092/493] Fixed 5 relay conditions M UP -> S UP M Down -> S UP -> M UP M UP -> S UP -> relay down -> relay up M UP -> S UP -> Kill M -> M UP M Up -> S UP -> relay down -> M link down -> relay up -> M link up --- .../ftmod_sangoma_ss7_main.c | 15 ++++++++------ .../ftmod_sangoma_ss7_relay.c | 8 +++----- .../ftmod_sangoma_ss7_support.c | 20 ++++++++++++++++--- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 93d76fc8e7..468c8b0a83 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1171,16 +1171,19 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_info->circuit->flags ); if (!(sngss7_info->circuit->flags & SNGSS7_CONFIGURED)) { - if ( !sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED) - ||(sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME))) { + /* Configure the circuit if RESUME and PAUSED are not set. + And also in a case when RESUME is set */ + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED) || + sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) { if (ftmod_ss7_isup_ckt_config(sngss7_info->circuit->id)) { SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", sngss7_info->circuit->id); - *(int*)0=0; - return 1; + sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME); } else { SS7_INFO("ISUP CKT %d configuration DONE!\n", sngss7_info->circuit->id); + sngss7_info->circuit->flags |= SNGSS7_CONFIGURED; + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); } - sngss7_info->circuit->flags |= SNGSS7_CONFIGURED; } } @@ -1391,7 +1394,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* check the last state and return to it to allow the call to finish */ goto suspend_goto_last; } - + if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX)) { SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_UNBLK_TX flag %s\n", ""); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c index a96dae5cdd..0fb496843f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c @@ -64,11 +64,9 @@ ftdm_status_t handle_relay_connect(RyMngmt *sta) SS7_INFO("Relay Channel %d connection UP\n", sng_relay->id); if (sng_relay->type == LRY_CT_TCP_CLIENT) { - if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) { - if (reconfig_all_ckts_for_relay()) { - SS7_ERROR("Failed to reconfigure ISUP Ckts!\n"); - /* we're done....this is very bad! */ - } + if (reconfig_all_ckts_for_relay()) { + SS7_ERROR("Failed to reconfigure ISUP Ckts!\n"); + /* we're done....this is very bad! */ } return FTDM_SUCCESS; } else if (sng_relay->type == LRY_CT_TCP_SERVER) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 4f18459018..6d5880073d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2110,6 +2110,7 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) uint8_t bits_ef = 0; int x; int ret; + ret=0; for (x = 1; x < (ftdmspan->chan_count + 1); x++) { /**************************************************************************/ @@ -2147,6 +2148,10 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /* query for the status of the ckt */ if (ftmod_ss7_isup_ckt_sta(sngss7_info->circuit->id, &state)) { + /* NC: Circuit statistic failed: does not exist. Must re-configure circuit + Reset the circuit CONFIGURED flag so that RESUME will reconfigure + this circuit. */ + sngss7_info->circuit->flags &= ~SNGSS7_CONFIGURED; SS7_ERROR("Failed to read isup ckt = %d status\n", sngss7_info->circuit->id); continue; } @@ -2159,6 +2164,14 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) if (bits_cd == 0x0) { /* check if circuit is UCIC or transient */ if (bits_ab == 0x3) { + SS7_INFO("ISUP CKT %d re-configuration pending!\n", x); + sngss7_info->circuit->flags &= ~SNGSS7_CONFIGURED; + SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + + /* NC: The code below should be deleted. Its here for hitorical + reason. The RESUME code will reconfigure the channel since + the CONFIGURED flag has been reset */ +#if 0 /* bit a and bit b are set, unequipped */ ret = ftmod_ss7_isup_ckt_config(sngss7_info->circuit->id); if (ret) { @@ -2181,6 +2194,7 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /* unlock the channel */ ftdm_mutex_unlock(ftdmchan->mutex); +#endif } /* if (bits_ab == 0x3) */ } else { @@ -2192,8 +2206,8 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) break; /**************************************************************************/ case (1): - /* locally blocked */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX); + /* locally blocked: Therefore we need to state machine to send an unblock */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); /* set the channel to suspended state */ SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); @@ -2209,7 +2223,7 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /**************************************************************************/ case (3): /* both locally and remotely blocked */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX); + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); /* set the channel to suspended state */ From 96068d901de9a0250762e39faa53e2908950c103 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 29 Nov 2011 13:11:38 -0500 Subject: [PATCH 093/493] Fixed case S UP - Place Call - relay down - Hangup - relay up - Confirm Call hangsup up properly and unblock is set. Fixed unexpeced reset condidtions. --- .../ftmod_sangoma_ss7_handle.c | 16 ++++++-- .../ftmod_sangoma_ss7_main.c | 9 ++++- .../ftmod_sangoma_ss7_support.c | 39 ++++++++++++++----- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index cacbf15170..e61dc9426e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -325,6 +325,7 @@ handle_glare: /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ @@ -398,6 +399,7 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ @@ -664,6 +666,7 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ @@ -788,11 +791,15 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /**************************************************************************/ default: - /* throw the reset flag */ - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_RX); + /* throw the TX reset flag */ + if (!sngss7_tx_reset_status_pending(sngss7_info)) { + sngss7_info->ckt_flags=0; + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); + sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); - /* set the state to RESTART */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + /* go to RESTART */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } break; /**************************************************************************/ } /* switch (ftdmchan->state) */ @@ -1836,6 +1843,7 @@ ftdm_status_t handle_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ default: /* set the state of the channel to restart...the rest is done by the chan monitor */ + sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); break; /**************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 468c8b0a83..7350a478ef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -588,7 +588,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) int state_flag = 1; int i = 0; - SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s\n", ftdm_channel_state2str (ftdmchan->state)); + SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s: ckt=0x%X, blk=0x%X\n", + ftdm_channel_state2str (ftdmchan->state), + sngss7_info->ckt_flags, + sngss7_info->blk_flags); + /*check what state we are supposed to be in */ switch (ftdmchan->state) { @@ -863,6 +867,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) { + + sngss7_clear_ckt_flag (sngss7_info, FLAG_LOCAL_REL); + /* check if this hangup is from a tx RSC */ if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) { if (!sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 6d5880073d..47fdd47728 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2135,12 +2135,12 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /* check if the interface is paused or resumed */ if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is PAUSED\n", sngss7_intf->id); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit set to PAUSED %s\n"," "); /* throw the pause flag */ sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME); sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); } else { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is RESUMED\n", sngss7_intf->id); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit set to RESUMED %s\n"," "); /* throw the resume flag */ sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME); @@ -2152,7 +2152,7 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) Reset the circuit CONFIGURED flag so that RESUME will reconfigure this circuit. */ sngss7_info->circuit->flags &= ~SNGSS7_CONFIGURED; - SS7_ERROR("Failed to read isup ckt = %d status\n", sngss7_info->circuit->id); + ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR,"Failed to read isup ckt = %d status\n", sngss7_info->circuit->id); continue; } @@ -2160,6 +2160,8 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) bits_ab = (state & (SNG_BIT_A + SNG_BIT_B)) >> 0; bits_cd = (state & (SNG_BIT_C + SNG_BIT_D)) >> 2; bits_ef = (state & (SNG_BIT_E + SNG_BIT_F)) >> 4; + + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit state=0x%X ab=0x%X cd=0x%X ef=0x%X\n",state,bits_ab,bits_cd,bits_ef); if (bits_cd == 0x0) { /* check if circuit is UCIC or transient */ @@ -2196,7 +2198,20 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) ftdm_mutex_unlock(ftdmchan->mutex); #endif - } /* if (bits_ab == 0x3) */ + } else { /* if (bits_ab == 0x3) */ + /* The stack status is not blocked. However this is possible if + the circuit state was UP. So even though Master sent out the BLO + the status command is not showing it. + + As a kudge. We will try to send out an UBL even though the status + indicates that there is no BLO. */ + if (!sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) { + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); + + /* set the channel to suspended state */ + SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } + } } else { /* check the maintenance block status in bits A and B */ switch (bits_ab) { @@ -2206,11 +2221,17 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) break; /**************************************************************************/ case (1): - /* locally blocked: Therefore we need to state machine to send an unblock */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); + /* The stack status is Blocked. Check if the block was sent + by user via console. If the block was not sent by user then, it + was sent out by Master due to relay down. + Therefore send out the unblock to clear it */ + if (!sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) { + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); + + /* set the channel to suspended state */ + SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } - /* set the channel to suspended state */ - SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); break; /**************************************************************************/ case (2): @@ -2276,7 +2297,7 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /* clear the re-config flag ... no matter what */ sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_RECONFIG); - } /* if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_RECONFIG)) */ + } } /* for (x = 1; x < (span->chan_count + 1); x++) */ return FTDM_SUCCESS; From fa64d3954d0eac9667c63d992fac6b4364e8c912 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 30 Nov 2011 19:11:33 -0500 Subject: [PATCH 094/493] Sigificant changes to the core state machine :) Visually status of channels will only be DOWN once all resets/blocks are cleared. Therefore if any reset/block is active on a channel, the channel state will be in RESTART not DOWN. Logic Change SUSPENDED -> Originally used as intermediate state. Purpose is to handle a condition from any state and go back to the previous state. Conditions: such as block/ucic. -> Updated logic is that SUSPEND will be smart enough not to go back to just any state. SUSPEND will only go back to UP - if call is still up RESTART - if for any reason singaling is not up due to blocks/resets/etc... DOWN - if signaling is UP - no resets/blocks In this case we avoid infinite loops due to state jumping from STATE->SUSPEND->STATE->SUSPEND HANGUP_COMPLETE -> If call is in use and a RESET comes on a call the RESTART state will first try the HANGUP_COMPLETE state. HANGUP_COMPLETE will Tx RSC and wait for it. Reset Response handle was updated if current state HANGUP/HANGUP_COMPLETE go back to RESTART state. Which will call HANGUP COMPLETE due to channel in usage and HANDLE_COMPLETE will clear RESET condition and go back to DOWN TERMINATING -> This state is used to hangup a call. Sends a signal to FS. -> Usually TERMINATING state stays in TERMINATING until FS comes back. -> I added a condition in case of RESET on the line though TERMINATING will go back to RESTART. This allows us to process RESET commands even though we are in the middle of hanging up. Block Handler If BLO is received on circuit is already blocked, we failed to trasmit BLA. We should always ack the BLO even though it was alrady in blocked state. Fixed & Tested S UP --> place call --> relay down --> hangup --> relay up--> Confirm that call is hungup properly. In this condition, on relay up the circuit is put into RESET. Since circuit is still in use, it will HANGUP first, then RESET then clear pending BLOCK. S UP --> place call -> Tx RSC on call. Used to cause infitie loop Confirm call is cleard properly Re-Tested S UP --> place call -> Rx RSC on call Confirm call is cleard properly S UP --> place call -> Rx BLO -> hangup -> place call Confirm call cannot be placed Tx UBL Confirm call can be placed S UP --> place call -> Rx BLO -> Tx BLO -> hangup -> place call Confirm call cannot be placed Tx UBL Confirm call cannot be placed Rx UBL Confirm call can be placed S UP --> place call -> relay down --> Rx BLO on channel from telco --> relay up Confirm that relay detects the BLO channels even though relay was down Tx AIS -> S Start -> Confirm HW block -> Tx AIS off -> Confirm hw block clear and UP S UP -> Tx AIS -> Confirm HW block -> Tx AIS off -> confirm hw block clear and UP S UP -> relay down -> Tx AIS -> relay up -> Tx AIS off -> confirm all back up -> In this condition BLO will not go out due to PAUSE S UP -> Tx AIS -> relay down -> Tx AIS off -> relay up -> confirm all back up -> In this condition UBL will not go out due to PAUSE --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 2 + .../ftmod_sangoma_ss7_handle.c | 4 +- .../ftmod_sangoma_ss7_main.c | 75 ++++++++++++------- .../ftmod_sangoma_ss7_main.h | 16 ++-- .../ftmod_sangoma_ss7_support.c | 3 + 5 files changed, 67 insertions(+), 33 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 9eb737a7f3..1b24b9f8da 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1632,6 +1632,8 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c ftdm_mutex_lock(ftdmchan->mutex); /* throw the reset flag */ + sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); + sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); switch (ftdmchan->state) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index e61dc9426e..64c4c9252d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -1646,10 +1646,12 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* check if the circuit is already blocked or not */ if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) { SS7_WARN("Received BLO on circuit that is already blocked!\n"); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); } /* throw the ckt block flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); /* set the channel to suspended state */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); @@ -1981,7 +1983,7 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP); /* go to DOWN */ - /*ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);*/ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); break; /**********************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 7350a478ef..1b7af43bc8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -453,7 +453,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* check each channel on the span to see if it needs to be reconfigured */ check_for_reconfig_flag(ftdmspan); - + /* Poll for events, e.g HW DTMF */ switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) { /**********************************************************************/ @@ -825,6 +825,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /*this state is set when the line is hanging up */ sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_STOP); + + /* If the RESET flag is set, do not say in TERMINATING state. + Go back to RESTART state and wait for RESET Confirmation */ + if (sngss7_tx_reset_status_pending(sngss7_info)) { + SS7_DEBUG_CHAN(ftdmchan,"Reset pending in Terminating state!%s\n", ""); + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } break; /**************************************************************************/ @@ -880,9 +888,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); } else { - /* go to RESTART State until RSCa is received */ - state_flag = 0; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + /* Stay in hangup complete until RSC is received */ + /* Channel is in use if we go to RESTART we will + restart will just come back to HANGUP_COMPLETE */ } } else { /* if the hangup is from a rx RSC, rx GRS, or glare don't sent RLC */ @@ -901,6 +909,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"Completing remotely requested hangup!%s\n", ""); } else if (sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL)) { + /* if this hang up is do to a rx RESET we need to sit here till the RSP arrives */ if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX_RSP)) { @@ -923,10 +932,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /**************************************************************************/ case FTDM_CHANNEL_STATE_DOWN: /*the call is finished and removed */ - - if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) { - SS7_DEBUG("re-entering state from processing block/unblock request ... do nothing\n"); - break; + + if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) { + if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) { + SS7_DEBUG_CHAN(ftdmchan,"Down came from SUSPEND - break %s\n", ""); + break; + } } /* check if there is a reset response that needs to be sent */ @@ -997,7 +1008,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */ } else { state_flag = 0; + SS7_DEBUG_CHAN(ftdmchan,"Down detected blocked flags go to SUSPEND %s\n", " "); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + break; + } /* if !blocked */ } else { SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); @@ -1029,6 +1043,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) { ftdm_channel_t *close_chan = ftdmchan; /* close the channel */ + SS7_DEBUG_CHAN(ftdmchan,"FTDM Channel Close %s\n", ""); ftdm_channel_close (&close_chan); } @@ -1205,6 +1220,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the PAUSE flag */ sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); + if (sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL)) { + SS7_DEBUG_CHAN(ftdmchan, "Channel local release on RESUME, restart Reset procedure%s\n", ""); + /* By setting RESET_TX flag the check below sngss7_tx_reset_status_pending() will + be true, and will restart the RESET TX procedure */ + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); + sngss7_set_ckt_flag (sngss7_info, FLAG_RESET_TX); + } + /* We have transmitted Reset/GRS but have not gotten a * Response. In mean time we got a RESUME. We cannot be sure * that our reset has been trasmitted, thus restart reset procedure. */ @@ -1250,7 +1273,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } /* Wait for RESUME */ - /* FIXME: Check if this is a correct action to wait for RESUME */ goto suspend_goto_last; } /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { */ @@ -1269,8 +1291,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* throw the done flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX)){ @@ -1283,7 +1303,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the unblock flag */ sngss7_clear_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX); - SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X\n", + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags); /* not bring the cic up if there is a hardware block */ @@ -1295,8 +1315,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* send a uba */ ft_to_sngss7_uba (ftdmchan); - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } @@ -1316,7 +1334,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX_DN); - goto suspend_goto_last; } if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_UNBLK_TX)) { @@ -1344,7 +1361,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) ft_to_sngss7_ubl(ftdmchan); } - goto suspend_goto_last; } /**********************************************************************/ @@ -1398,8 +1414,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* throw the done flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX_DN); - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX)) { @@ -1423,8 +1437,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) ft_to_sngss7_ubl(ftdmchan); } - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } /**********************************************************************/ @@ -1442,8 +1454,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* bring the sig status down */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_LC_UNBLK_RX)) { @@ -1465,8 +1475,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } - /* check the last state and return to it to allow the call to finish */ - goto suspend_goto_last; } /**********************************************************************/ if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_UCIC_BLOCK) && @@ -1488,8 +1496,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* throw the done flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK_DN); - /* bring the channel down */ - goto suspend_goto_last; } if (sngss7_test_ckt_blk_flag (sngss7_info, FLAG_CKT_UCIC_UNBLK)) { @@ -1521,6 +1527,23 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"No block flag processed!%s\n", ""); suspend_goto_last: + if (ftdmchan->last_state == FTDM_CHANNEL_STATE_UP) { + /* proceed to UP */ + } else if (!sngss7_channel_status_clear(sngss7_info)) { + SS7_DEBUG_CHAN(ftdmchan,"Channel opted to stay in RESTART due to blocks!%s\n", ""); + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", + sngss7_info->ckt_flags, sngss7_info->blk_flags, + sngss7_info->circuit->flags ); + + goto suspend_goto_restart; + } else { + SS7_DEBUG_CHAN(ftdmchan,"Channel signaling is up proceed to DOWN! [Last State=%i]\n", ftdmchan->last_state); + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", + sngss7_info->ckt_flags, sngss7_info->blk_flags, + sngss7_info->circuit->flags ); + ftdmchan->last_state = FTDM_CHANNEL_STATE_DOWN; + } + state_flag = 0; ftdm_set_state(ftdmchan, ftdmchan->last_state); break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index b25b21f0ef..697da825cb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -1049,11 +1049,13 @@ if (ftdmchan->state == new_state) { \ #define sngss7_set_options(obj, option) ((obj)->options |= (option)) #define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \ - FLAG_CKT_MN_BLOCK_TX_DN | \ - FLAG_GRP_MN_BLOCK_TX | \ - FLAG_GRP_MN_BLOCK_TX_DN | \ - FLAG_GRP_HW_BLOCK_TX | \ - FLAG_GRP_HW_BLOCK_TX_DN ))) + FLAG_CKT_MN_BLOCK_TX_DN | \ + FLAG_GRP_MN_BLOCK_TX | \ + FLAG_GRP_MN_BLOCK_TX_DN | \ + FLAG_GRP_HW_BLOCK_TX | \ + FLAG_GRP_HW_BLOCK_TX_DN | \ + FLAG_GRP_HW_UNBLK_TX | \ + FLAG_CKT_MN_UNBLK_TX ))) #define sngss7_block_status_clear(obj) (obj->blk_flags == 0) @@ -1062,10 +1064,12 @@ if (ftdmchan->state == new_state) { \ FLAG_GRP_RESET_TX | \ FLAG_GRP_RESET_RX ))) -#define sngss7_tx_reset_status_pending(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \ +#define sngss7_tx_reset_sent(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \ sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \ (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \ sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT)))) + +#define sngss7_tx_reset_status_pending(obj) (sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) || sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX))) #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj))) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 47fdd47728..7a68fe318f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2232,6 +2232,9 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } + /* Only locally blocked, thus remove a remote block */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + break; /**************************************************************************/ case (2): From 997c127a9405af27f041c07a87395d10bcef63c4 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 30 Nov 2011 20:02:25 -0500 Subject: [PATCH 095/493] Fixed following two secnarios From previous commit, failed to clear the done flag _DN which cause SUSPEND to think that there was a block pending, causing state to remain in RESTART S UP -> relay down -> Tx AIS -> relay up -> Tx AIS off -> confirm all back up -> In this condition BLO will not go out due to PAUSE S UP -> Tx AIS -> relay down -> Tx AIS off -> relay up -> confirm all back up -> In this condition UBL will not go out due to PAUSE --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 4 +++- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 64c4c9252d..e7cc9db573 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -122,8 +122,11 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* as per Q.764, 2.8.2.3 xiv ... remove the block from this channel */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX_DN); /* KONRAD FIX ME : check in case there is a ckt and grp block */ } @@ -1646,7 +1649,6 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* check if the circuit is already blocked or not */ if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) { SS7_WARN("Received BLO on circuit that is already blocked!\n"); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); } /* throw the ckt block flag */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 7a68fe318f..eb1eb12961 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2234,12 +2234,14 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /* Only locally blocked, thus remove a remote block */ sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); break; /**************************************************************************/ case (2): /* remotely blocked */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); /* set the channel to suspended state */ SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); @@ -2247,8 +2249,11 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) /**************************************************************************/ case (3): /* both locally and remotely blocked */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); + if (!sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) { + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); + } sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); /* set the channel to suspended state */ SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); From 7b83dd4c968f9769c58b8ef89a83eb55a8218df3 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 1 Dec 2011 03:16:59 -0500 Subject: [PATCH 096/493] Fixed the exception condition - trigger reset used to clear ckt_flags, this was wrong. if ctk_flags are blindly cleard a PAUSE might be cleared. changed the code to clear only TX RESET and try to reset again. Release Collision If we get out of sync with other side we must reset the circuit. This condition occoured at 1+3 test box Local Management Block Its possible for stack to send us a BLO indicating to us that we are local blocked. This case never worked and we would get stuck there forever. If we never manaully sent a LOCAL block, the BLO from the stack will be acked and then unblocked. This condition occoured at 1+3 test box --- libs/freetdm/src/ftdm_state.c | 1 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 2 +- .../ftmod_sangoma_ss7_handle.c | 19 +++---- .../ftmod_sangoma_ss7_main.c | 24 ++++++--- .../ftmod_sangoma_ss7_main.h | 11 ++++- .../ftmod_sangoma_ss7_support.c | 49 +++++++++++++++++++ libs/freetdm/src/include/private/ftdm_core.h | 1 + 7 files changed, 89 insertions(+), 18 deletions(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index d3f99f6074..6572ab75a4 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -87,6 +87,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c ftdm_assert(!fchan->history[hindex].end_time, "End time should be zero!\n"); fchan->history[hindex].end_time = ftdm_current_time_in_ms(); + fchan->last_state_change_time = ftdm_current_time_in_ms(); fchan->state_status = FTDM_STATE_STATUS_COMPLETED; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 1b24b9f8da..2c8f5172b9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1634,7 +1634,7 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c /* throw the reset flag */ sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); + sngss7_tx_reset_restart(sngss7_info); switch (ftdmchan->state) { /**************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index e7cc9db573..295d127064 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -327,9 +327,8 @@ handle_glare: /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { - sngss7_info->ckt_flags=0; + sngss7_tx_reset_restart(sngss7_info); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); @@ -401,9 +400,8 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { - sngss7_info->ckt_flags=0; + sngss7_tx_reset_restart(sngss7_info); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); @@ -668,9 +666,8 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { - sngss7_info->ckt_flags=0; + sngss7_tx_reset_restart(sngss7_info); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); /* go to RESTART */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); @@ -772,6 +769,10 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* send out the release complete */ ft_to_sngss7_rlc (ftdmchan); + } else { + SS7_DEBUG_CHAN(ftdmchan, "Collision of REL messages - resetting state.\n", " "); + ft_to_sngss7_rlc (ftdmchan); + goto rel_ind_reset; } break; /**************************************************************************/ @@ -794,11 +795,11 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /**************************************************************************/ default: +rel_ind_reset: /* throw the TX reset flag */ if (!sngss7_tx_reset_status_pending(sngss7_info)) { - sngss7_info->ckt_flags=0; - sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); - sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); + sngss7_tx_reset_restart(sngss7_info); /* go to RESTART */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 1b7af43bc8..4c6992e61f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1358,6 +1358,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) } if (sngss7_tx_block_status_clear(sngss7_info) && !skip_unblock) { + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX_DN); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX); ft_to_sngss7_ubl(ftdmchan); } @@ -1434,6 +1436,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (sngss7_tx_block_status_clear(sngss7_info)) { /* send a ubl */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX_DN); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX); ft_to_sngss7_ubl(ftdmchan); } @@ -1446,13 +1450,19 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_LC_BLOCK_RX flag %s\n", ""); /* send a BLA */ - /*ft_to_sngss7_bla(ftdmchan);*/ + ft_to_sngss7_bla(ftdmchan); /* throw the done flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX_DN); - - /* bring the sig status down */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + + if (sngss7_tx_block_status_clear(sngss7_info)) { + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX_DN); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX); + ft_to_sngss7_ubl(ftdmchan); + } else { + /* bring the sig status down */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + } } @@ -1468,7 +1478,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_LC_UNBLK_RX); /* send a uba */ - /*ft_to_sngss7_uba(ftdmchan);*/ + ft_to_sngss7_uba(ftdmchan); if (sngss7_channel_status_clear(sngss7_info)) { sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); @@ -1530,14 +1540,14 @@ suspend_goto_last: if (ftdmchan->last_state == FTDM_CHANNEL_STATE_UP) { /* proceed to UP */ } else if (!sngss7_channel_status_clear(sngss7_info)) { - SS7_DEBUG_CHAN(ftdmchan,"Channel opted to stay in RESTART due to blocks!%s\n", ""); + SS7_DEBUG_CHAN(ftdmchan,"Channel opted to stay in RESTART due to reset/blocks!%s\n", ""); SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags, sngss7_info->circuit->flags ); goto suspend_goto_restart; } else { - SS7_DEBUG_CHAN(ftdmchan,"Channel signaling is up proceed to DOWN! [Last State=%i]\n", ftdmchan->last_state); + SS7_DEBUG_CHAN(ftdmchan,"Channel signaling is up proceed to DOWN! [Last State=%s]\n", ftdm_channel_state2str(ftdmchan->last_state)); SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags, sngss7_info->circuit->flags ); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 697da825cb..631dadf007 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -1071,7 +1071,16 @@ if (ftdmchan->state == new_state) { \ #define sngss7_tx_reset_status_pending(obj) (sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) || sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX))) -#define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj))) +#define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && \ + (sngss7_reset_status_clear(obj)) && \ + (!sngss7_test_ckt_flag((obj),FLAG_INFID_PAUSED))) + +#define sngss7_tx_reset_restart(obj) do { clear_tx_grs_flags((obj)); \ + clear_tx_grs_data((obj)); \ + clear_tx_rsc_flags((obj)); \ + sngss7_set_ckt_flag((obj), (FLAG_RESET_TX)); \ + } while (0); + #ifdef SMG_RELAY_DBG diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index eb1eb12961..7696974807 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -2098,6 +2098,55 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu return; } +#if 0 +ftdm_status_t check_for_invalid_states(ftdm_channel_t *ftmchan) +{ + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (!sngss7_info) { + SS7_WARN_CHAN(ftdmchan, "Found ftdmchan with no sig module data!%s\n", " "); + return FTDM_FAIL; + } + + if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) { + return FTDM_SUCCESS; + } + + switch (ftdmchan->state) { + case UP: + case DOWN: + return FTDM_SUCCESS; + + default: + if ((ftdm_current_time_in_ms() - ftdmchan->last_state_change_time) > 30000) { + SS7_WARN_CHAN(ftdmchan, "Circuite in state=%s too long - resetting!%s\n", + ftdm_channel_state2str(ftdmchan->state)); + + ftdm_channel_lock(ftdmchan); + + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_tx_reset_restart(sngss7_info); + + if (ftdmchan->state == FTDM_CHANNEL_STATE_RESTART) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } else { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + } + } else { + + } + + + + ftdm_channel_unlock(ftdmchan); + } + } + + return FTDM_SUCCESS; +} +#endif + + /******************************************************************************/ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) { diff --git a/libs/freetdm/src/include/private/ftdm_core.h b/libs/freetdm/src/include/private/ftdm_core.h index 65ffad677c..f27be789e2 100644 --- a/libs/freetdm/src/include/private/ftdm_core.h +++ b/libs/freetdm/src/include/private/ftdm_core.h @@ -469,6 +469,7 @@ struct ftdm_channel { int32_t txdrops; int32_t rxdrops; ftdm_usrmsg_t *usrmsg; + ftdm_time_t last_state_change_time; }; struct ftdm_span { From 6dabe5409bf7fb88f17b4580d7bcf0d3151f67fc Mon Sep 17 00:00:00 2001 From: wadam Date: Thu, 1 Dec 2011 11:40:18 -0500 Subject: [PATCH 097/493] Fixed Bug#2018 - The threshold of cpu warning message should be increased --- libs/freetdm/src/ftdm_io.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 0205ab36b1..8ec6a3344f 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -5594,15 +5594,15 @@ static void *ftdm_cpu_monitor_run(ftdm_thread_t *me, void *obj) if (monitor->alarm) { if ((int)time >= (100 - monitor->set_alarm_threshold)) { - ftdm_log(FTDM_LOG_DEBUG, "CPU alarm OFF (idle:%d)\n", (int) time); + ftdm_log(FTDM_LOG_DEBUG, "CPU alarm is OFF (cpu usage:%d)\n", (int) (100-time)); monitor->alarm = 0; } - if (monitor->alarm_action_flags & FTDM_CPU_ALARM_ACTION_WARN) { + if (monitor->alarm && (monitor->alarm_action_flags & FTDM_CPU_ALARM_ACTION_WARN)) { ftdm_log(FTDM_LOG_WARNING, "CPU alarm is ON (cpu usage:%d)\n", (int) (100-time)); } } else { if ((int)time <= (100-monitor->reset_alarm_threshold)) { - ftdm_log(FTDM_LOG_DEBUG, "CPU alarm ON (idle:%d)\n", (int) time); + ftdm_log(FTDM_LOG_DEBUG, "CPU alarm is ON (cpu usage:%d)\n", (int) (100-time)); monitor->alarm = 1; } } From 3432dccfc2b01b095e561d5467c76d20a094bc69 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 1 Dec 2011 12:13:12 -0500 Subject: [PATCH 098/493] freetdm: fix cpu monitor inconsistent messages, variable names etc changed parameter name from cpu_reset_alarm_threshold to cpu_clear_alarm_threshold (old parameter name still valid for backwards compatibility in configuration files) --- libs/freetdm/conf/freetdm.conf | 2 +- libs/freetdm/src/ftdm_io.c | 51 ++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/libs/freetdm/conf/freetdm.conf b/libs/freetdm/conf/freetdm.conf index eb506bef8d..0d53992979 100644 --- a/libs/freetdm/conf/freetdm.conf +++ b/libs/freetdm/conf/freetdm.conf @@ -13,7 +13,7 @@ cpu_monitoring_interval => 1000 cpu_set_alarm_threshold => 80 ; At what CPU percentage stop the CPU alarm -cpu_reset_alarm_threshold => 70 +cpu_clear_alarm_threshold => 70 ; Which action to take when the CPU alarm is raised ; it can be warn and/or reject calls diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 8ec6a3344f..bb866610a2 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -223,7 +223,7 @@ typedef struct { uint32_t interval; uint8_t alarm_action_flags; uint8_t set_alarm_threshold; - uint8_t reset_alarm_threshold; + uint8_t clear_alarm_threshold; ftdm_interrupt_t *interrupt; } cpu_monitor_t; @@ -4834,14 +4834,15 @@ static ftdm_status_t load_config(void) } else { ftdm_log(FTDM_LOG_ERROR, "Invalid cpu alarm set threshold %s\n", val); } - } else if (!strncasecmp(var, "cpu_reset_alarm_threshold", sizeof("cpu_reset_alarm_threshold")-1)) { + } else if (!strncasecmp(var, "cpu_reset_alarm_threshold", sizeof("cpu_reset_alarm_threshold")-1) || + !strncasecmp(var, "cpu_clear_alarm_threshold", sizeof("cpu_clear_alarm_threshold")-1)) { intparam = atoi(val); if (intparam > 0 && intparam < 100) { - globals.cpu_monitor.reset_alarm_threshold = (uint8_t)intparam; - if (globals.cpu_monitor.reset_alarm_threshold > globals.cpu_monitor.set_alarm_threshold) { - globals.cpu_monitor.reset_alarm_threshold = globals.cpu_monitor.set_alarm_threshold - 10; - ftdm_log(FTDM_LOG_ERROR, "Cpu alarm reset threshold must be lower than set threshold" - ", setting threshold to %d\n", globals.cpu_monitor.reset_alarm_threshold); + globals.cpu_monitor.clear_alarm_threshold = (uint8_t)intparam; + if (globals.cpu_monitor.clear_alarm_threshold > globals.cpu_monitor.set_alarm_threshold) { + globals.cpu_monitor.clear_alarm_threshold = globals.cpu_monitor.set_alarm_threshold - 10; + ftdm_log(FTDM_LOG_ERROR, "Cpu alarm clear threshold must be lower than set threshold, " + "setting clear threshold to %d\n", globals.cpu_monitor.clear_alarm_threshold); } } else { ftdm_log(FTDM_LOG_ERROR, "Invalid cpu alarm reset threshold %s\n", val); @@ -5581,28 +5582,32 @@ static void *ftdm_cpu_monitor_run(ftdm_thread_t *me, void *obj) { cpu_monitor_t *monitor = (cpu_monitor_t *)obj; struct ftdm_cpu_monitor_stats *cpu_stats = ftdm_new_cpu_monitor(); + + ftdm_log(FTDM_LOG_DEBUG, "CPU monitor thread is now running\n"); if (!cpu_stats) { - return NULL; + goto done; } monitor->running = 1; - while(ftdm_running()) { - double time; - if (ftdm_cpu_get_system_idle_time(cpu_stats, &time)) { + while (ftdm_running()) { + double idle_time = 0.0; + int cpu_usage = 0; + + if (ftdm_cpu_get_system_idle_time(cpu_stats, &idle_time)) { break; } + cpu_usage = (int)(100 - idle_time); if (monitor->alarm) { - if ((int)time >= (100 - monitor->set_alarm_threshold)) { - ftdm_log(FTDM_LOG_DEBUG, "CPU alarm is OFF (cpu usage:%d)\n", (int) (100-time)); + if (cpu_usage <= monitor->clear_alarm_threshold) { + ftdm_log(FTDM_LOG_DEBUG, "CPU alarm is now OFF (cpu usage: %d)\n", cpu_usage); monitor->alarm = 0; - } - if (monitor->alarm && (monitor->alarm_action_flags & FTDM_CPU_ALARM_ACTION_WARN)) { - ftdm_log(FTDM_LOG_WARNING, "CPU alarm is ON (cpu usage:%d)\n", (int) (100-time)); + } else if (monitor->alarm_action_flags & FTDM_CPU_ALARM_ACTION_WARN) { + ftdm_log(FTDM_LOG_WARNING, "CPU alarm is still ON (cpu usage: %d)\n", cpu_usage); } } else { - if ((int)time <= (100-monitor->reset_alarm_threshold)) { - ftdm_log(FTDM_LOG_DEBUG, "CPU alarm is ON (cpu usage:%d)\n", (int) (100-time)); + if (cpu_usage >= monitor->set_alarm_threshold) { + ftdm_log(FTDM_LOG_WARNING, "CPU alarm is now ON (cpu usage: %d)\n", cpu_usage); monitor->alarm = 1; } } @@ -5611,7 +5616,11 @@ static void *ftdm_cpu_monitor_run(ftdm_thread_t *me, void *obj) ftdm_delete_cpu_monitor(cpu_stats); monitor->running = 0; + +done: + ftdm_log(FTDM_LOG_DEBUG, "CPU monitor thread is now terminating\n"); return NULL; + #ifdef __WINDOWS__ UNREFERENCED_PARAMETER(me); #endif @@ -5714,7 +5723,7 @@ FT_DECLARE(ftdm_status_t) ftdm_global_configuration(void) globals.cpu_monitor.interval = 1000; globals.cpu_monitor.alarm_action_flags = 0; globals.cpu_monitor.set_alarm_threshold = 80; - globals.cpu_monitor.reset_alarm_threshold = 70; + globals.cpu_monitor.clear_alarm_threshold = 70; if (load_config() != FTDM_SUCCESS) { globals.running = 0; @@ -5723,10 +5732,10 @@ FT_DECLARE(ftdm_status_t) ftdm_global_configuration(void) } if (globals.cpu_monitor.enabled) { - ftdm_log(FTDM_LOG_INFO, "CPU Monitor is running interval:%d lo-thres:%d hi-thres:%d\n", + ftdm_log(FTDM_LOG_INFO, "CPU Monitor is running interval:%d set-thres:%d clear-thres:%d\n", globals.cpu_monitor.interval, globals.cpu_monitor.set_alarm_threshold, - globals.cpu_monitor.reset_alarm_threshold); + globals.cpu_monitor.clear_alarm_threshold); if (ftdm_cpu_monitor_start() != FTDM_SUCCESS) { return FTDM_FAIL; From 35df4f468c2ba3d5e6e184e2882c2b2f72a0279e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 1 Dec 2011 19:18:54 -0500 Subject: [PATCH 099/493] Update to the SUSPEND state machine updated 2 commits ago. SUSPEND will not only change the return state in few cases. I have retested all test cases from previous 2 commits. What is missing is timer for each Tx Event. RSC,BLO,UBL. Its possible to loose a message from Slave via relay to Master. If that ever occours we will not know what state we are in. Thus we need a timer that will re-transmit a packet if it does not get acknowledged. --- .../ftmod_sangoma_ss7_main.c | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 4c6992e61f..280cc1a428 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -883,7 +883,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (!sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT)) { ft_to_sngss7_rsc (ftdmchan); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT); - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); + + /* Wait for Reset in HANGUP Complete nothing to do until we + get reset response back */ } else if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP)) { state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); @@ -910,7 +912,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"Completing remotely requested hangup!%s\n", ""); } else if (sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL)) { - /* if this hang up is do to a rx RESET we need to sit here till the RSP arrives */ if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX_RSP)) { /* go to the down state as we have already received RSC-RLC */ @@ -926,6 +927,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); } else { SS7_DEBUG_CHAN(ftdmchan,"Completing requested hangup for unknown reason!%s\n", ""); + if (sngss7_channel_status_clear(sngss7_info)) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + } } break; @@ -1180,6 +1184,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); } else { + SS7_DEBUG_CHAN(ftdmchan, "Waiting on Reset Rsp/Grp Reset to move to DOWN (0x%X)\n", sngss7_info->ckt_flags); } } @@ -1539,19 +1544,49 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) suspend_goto_last: if (ftdmchan->last_state == FTDM_CHANNEL_STATE_UP) { /* proceed to UP */ - } else if (!sngss7_channel_status_clear(sngss7_info)) { - SS7_DEBUG_CHAN(ftdmchan,"Channel opted to stay in RESTART due to reset/blocks!%s\n", ""); + } else if (!sngss7_reset_status_clear(sngss7_info) || + sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { + + /* At this point the circuit is in reset, if the call is + in use make sure that at least REMOTE REL flag is set + in order to drop the call on the sip side */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) { + if (!sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL) && + !sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) { + sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); + } + } + SS7_DEBUG_CHAN(ftdmchan,"Channel opted to stay in RESTART due to reset!%s\n", ""); SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags, sngss7_info->circuit->flags ); goto suspend_goto_restart; - } else { - SS7_DEBUG_CHAN(ftdmchan,"Channel signaling is up proceed to DOWN! [Last State=%s]\n", ftdm_channel_state2str(ftdmchan->last_state)); + + } else if (sngss7_channel_status_clear(sngss7_info)) { + + /* In this case all resets and blocks are clear sig state is up, thus go to DOWN */ + if (ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART || + ftdmchan->last_state == FTDM_CHANNEL_STATE_TERMINATING) { + ftdmchan->last_state = FTDM_CHANNEL_STATE_DOWN; + } + + SS7_DEBUG_CHAN(ftdmchan,"Channel signallig is UP: proceed to State %s!\n", + ftdm_channel_state2str(ftdmchan->last_state)); SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags, sngss7_info->circuit->flags ); - ftdmchan->last_state = FTDM_CHANNEL_STATE_DOWN; + + } else { + + if (ftdmchan->last_state == FTDM_CHANNEL_STATE_DOWN) { + ftdmchan->last_state = FTDM_CHANNEL_STATE_RESTART; + } + SS7_DEBUG_CHAN(ftdmchan,"Channel signaling is in block state: proceed to State=%s]\n", + ftdm_channel_state2str(ftdmchan->last_state)); + SS7_DEBUG_CHAN(ftdmchan,"Current flags: ckt=0x%X, blk=0x%X, circuit->flag=0x%X\n", + sngss7_info->ckt_flags, sngss7_info->blk_flags, + sngss7_info->circuit->flags); } state_flag = 0; From b3297c7f3b1f5cb0bab720df1ce970aa664ec064 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 2 Dec 2011 11:24:34 -0500 Subject: [PATCH 100/493] freetdm: fix license path to use sngss7 path limits do not use strcpy, use ftdm_set_string which is safer do not use strcpy when snprintf is safer and cleaner --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 5 ++--- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 631dadf007..e39c57802f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -51,7 +51,6 @@ /* DEFINES ********************************************************************/ #define MAX_NAME_LEN 25 -#define MAX_PATH 4096 #define MAX_CIC_LENGTH 5 #define MAX_CIC_MAP_LENGTH 1000 @@ -411,8 +410,8 @@ typedef struct sng_relay { typedef struct sng_ss7_cfg { uint32_t spc; uint32_t procId; - char license[MAX_PATH]; - char signature[MAX_PATH]; + char license[MAX_SNGSS7_PATH]; + char signature[MAX_SNGSS7_PATH]; uint32_t transparent_iam_max_size; uint32_t flags; sng_relay_t relay[MAX_RELAY_CHANNELS+1]; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 2fbd2e5631..f1c6625b85 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -472,9 +472,8 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) /**********************************************************************/ } else if (!strcasecmp(parm->var, "license")) { /**********************************************************************/ - strcpy(g_ftdm_sngss7_data.cfg.license, parm->val); - strcpy(g_ftdm_sngss7_data.cfg.signature, parm->val); - strcat(g_ftdm_sngss7_data.cfg.signature, ".sig"); + ftdm_set_string(g_ftdm_sngss7_data.cfg.license, parm->val); + snprintf(g_ftdm_sngss7_data.cfg.signature, sizeof(g_ftdm_sngss7_data.cfg.signature), "%s.sig", parm->val); SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); /**********************************************************************/ From e582586876ca7b81774355982dbb7976a873755b Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 5 Dec 2011 16:58:26 -0500 Subject: [PATCH 101/493] Freetdm: adding X-FreeTDM-ANI-NADI and X-FreeTDM-DNIS-NADI support --- libs/freetdm/mod_freetdm/mod_freetdm.c | 8 +++++++- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 2 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 10 +++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index c9daadac12..a0d2279ba3 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1355,7 +1355,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi /* Used by ftmod_sangoma_ss7 only */ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-DNIS-NADI"); if (sipvar) { - ftdm_usrmsg_add_var(&usrmsg, "ss7_clg_nadi", sipvar); + ftdm_usrmsg_add_var(&usrmsg, "ss7_cld_nadi", sipvar); } sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS"); @@ -1711,6 +1711,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_clg_nadi"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%s", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-ANI-NADI", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_cld_nadi"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-NADI", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind"); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 295d127064..7c9b3061f0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -201,10 +201,10 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); - copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb); copy_cgPtyCat_from_sngss7(ftdmchan, &siConEvnt->cgPtyCat); + copy_cdPtyNum_from_sngss7(ftdmchan, &siConEvnt->cdPtyNum); /* fill in the TMR/bearer capability */ if (siConEvnt->txMedReq.eh.pres) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 7696974807..3203e52e7d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -193,7 +193,15 @@ ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPt ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum) { - /* TODO: Implement me */ + char var[FTDM_DIGITS_LIMIT]; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (cdPtyNum->eh.pres == PRSNT_NODEF && + cdPtyNum->natAddrInd.pres == PRSNT_NODEF) { + sprintf(var, "%d", cdPtyNum->natAddrInd.val); + sngss7_add_var(sngss7_info, "ss7_cld_nadi", var); + } + return FTDM_SUCCESS; } From 1cbeb33b2dd88727fb5ecbf7c8937780be05f8d3 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 6 Dec 2011 15:38:05 -0500 Subject: [PATCH 102/493] freetdm: adding support of x-headers for Redirection Information X-FreeTDM-RDINF-Indicator X-FreeTDM-RDINF-OrigReason X-FreeTDM-RDINF-Count X-FreeTDM-RDINF-Reason --- libs/freetdm/mod_freetdm/mod_freetdm.c | 40 ++++++++- .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_main.h | 3 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 4 + .../ftmod_sangoma_ss7_support.c | 85 +++++++++++++++++++ 5 files changed, 132 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index a0d2279ba3..ecd9189b39 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1438,6 +1438,24 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_iam", sipvar); } + + /* redirection information */ + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDINF-Indicator"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_indicator", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDINF-OrigReason"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_orig", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDINF-Count"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_count", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDINF-Reason"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_reason", sipvar); + } } if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) { @@ -1707,7 +1725,27 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-NADI", "%d", channel_caller_data->rdnis.type); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); - + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_indicator"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDINF-Indicator", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_orig"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDINF-OrigReason", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_count"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDINF-Count", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_reason"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDINF-Reason", "%s", var_value); + } + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_clg_nadi"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%s", var_value); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 7c9b3061f0..0497955059 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -201,6 +201,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); + copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb); copy_cgPtyCat_from_sngss7(ftdmchan, &siConEvnt->cgPtyCat); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index e39c57802f..bb02d7e3ed 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -841,6 +841,9 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum); ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); +ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); +ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); + ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 4c7bbf084c..fbfab15d1e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -91,6 +91,10 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Number */ copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); + /* Redirecting Information */ + copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); + + /* Access Transport */ copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 3203e52e7d..3230292675 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -198,6 +198,7 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd if (cdPtyNum->eh.pres == PRSNT_NODEF && cdPtyNum->natAddrInd.pres == PRSNT_NODEF) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Called Party Number NADI %d\n", cdPtyNum->natAddrInd.val); sprintf(var, "%d", cdPtyNum->natAddrInd.val); sngss7_add_var(sngss7_info, "ss7_cld_nadi", var); } @@ -538,6 +539,90 @@ ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *r return FTDM_SUCCESS; } +ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo) +{ + char val[20]; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (redirInfo->eh.pres != PRSNT_NODEF ) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Redirecting Information available\n"); + return FTDM_SUCCESS; + } + + + if (redirInfo->redirInd.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", redirInfo->redirInd.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirection Information - redirection indicator:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_rdinfo_indicator", val); + } + + if (redirInfo->origRedirReas.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", redirInfo->origRedirReas.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirection Information - original redirection reason:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_rdinfo_orig", val); + } + + if (redirInfo->redirCnt.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", redirInfo->redirCnt.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirection Information - redirection count:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_rdinfo_count", val); + } + + if (redirInfo->redirReas.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", redirInfo->redirReas.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirection Information - redirection reason:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_rdinfo_reason", val); + } + + return FTDM_SUCCESS; +} + +ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo) +{ + const char* val = NULL; + int bProceed = 0; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_indicator"); + if (!ftdm_strlen_zero(val)) { + redirInfo->redirInd.val = atoi(val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Indicator\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_orig"); + if (!ftdm_strlen_zero(val)) { + redirInfo->origRedirReas.val = atoi(val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Original Reasons\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_count"); + if (!ftdm_strlen_zero(val)) { + redirInfo->redirCnt.val = atoi(val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Count\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_reason"); + if (!ftdm_strlen_zero(val)) { + redirInfo->redirReas.val = atoi(val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Reasons\n"); + } + + if( bProceed == 1 ) { + redirInfo->eh.pres = PRSNT_NODEF; + } else { + redirInfo->eh.pres = NOTPRSNT; + } + + return FTDM_SUCCESS; +} + ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat) { ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; From 9db322f2e0a035c898509f915134cee0e47ce398 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 14 Dec 2011 19:56:25 -0500 Subject: [PATCH 103/493] Fixed hw alarm crash. When we get hw alarm in the middle of configuration. It can happen with large number of circuits. On RESTART if we are PAUSED do not try to send RESET and stay in RESTART state --- .../ftmod_sangoma_ss7_main.c | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 280cc1a428..aef7a6edef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -295,24 +295,35 @@ static void handle_hw_alarm(ftdm_event_t *e) for (x = (g_ftdm_sngss7_data.cfg.procId * MAX_CIC_MAP_LENGTH) + 1; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; + + /* NC. Its possible for alarms to come in the middle of configuration + especially on large systems */ + if (!ss7_info || !ss7_info->ftdmchan) { + SS7_DEBUG("handle_hw_alarm: span=%i chan=%i ckt=%i x=%i - ss7_info=%p ftdmchan=%p\n", + ftdmchan->physical_span_id,ftdmchan->physical_chan_id, + g_ftdm_sngss7_data.cfg.isupCkt[x].id,x, + ss7_info,ss7_info?ss7_info->ftdmchan:NULL); + continue; + } + ftdmchan = ss7_info->ftdmchan; if (e->channel->physical_span_id == ftdmchan->physical_span_id && e->channel->physical_chan_id == ftdmchan->physical_chan_id) { - SS7_DEBUG("handle_hw_alarm: span=%i chan=%i ckt=%i x=%i\n",ftdmchan->physical_span_id,ftdmchan->physical_chan_id,g_ftdm_sngss7_data.cfg.isupCkt[x].id,x); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: span=%i chan=%i ckt=%i x=%i\n",ftdmchan->physical_span_id,ftdmchan->physical_chan_id,g_ftdm_sngss7_data.cfg.isupCkt[x].id,x); if (e->enum_id == FTDM_OOB_ALARM_TRAP) { - SS7_DEBUG("handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX\n"); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { - SS7_DEBUG("handle_hw_alarm: Clear\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Clear\n"); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); - SS7_DEBUG("handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } @@ -1077,6 +1088,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"RESTART: Current flags: ckt=0x%X, blk=0x%X\n", sngss7_info->ckt_flags, sngss7_info->blk_flags); + + if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { + SS7_DEBUG_CHAN(ftdmchan,"Circuit PAUSED stay in RESTART%s\n", ""); + break; + } if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) { if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) || @@ -1225,6 +1241,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) /* clear the PAUSE flag */ sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED); + /* We tried to hangup the call while in PAUSED state. + We must send a RESET to clear this circuit */ if (sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL)) { SS7_DEBUG_CHAN(ftdmchan, "Channel local release on RESUME, restart Reset procedure%s\n", ""); /* By setting RESET_TX flag the check below sngss7_tx_reset_status_pending() will From ce9ce53b2d9496052a741739100a8ec2a71e75d2 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 14 Dec 2011 20:06:57 -0500 Subject: [PATCH 104/493] Fixed the previous commit --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index aef7a6edef..5edf7d4851 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -310,20 +310,21 @@ static void handle_hw_alarm(ftdm_event_t *e) if (e->channel->physical_span_id == ftdmchan->physical_span_id && e->channel->physical_chan_id == ftdmchan->physical_chan_id) { - SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: span=%i chan=%i ckt=%i x=%i\n",ftdmchan->physical_span_id,ftdmchan->physical_chan_id,g_ftdm_sngss7_data.cfg.isupCkt[x].id,x); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: span=%i chan=%i ckt=%i x=%i\n", + ftdmchan->physical_span_id,ftdmchan->physical_chan_id,g_ftdm_sngss7_data.cfg.isupCkt[x].id,x); if (e->enum_id == FTDM_OOB_ALARM_TRAP) { - SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Set FLAG_GRP_HW_BLOCK_TX %s\n", " "); sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } } else if (e->enum_id == FTDM_OOB_ALARM_CLEAR) { - SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Clear\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Clear %s \n", " "); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX); sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX_DN)) { sngss7_set_ckt_blk_flag(ss7_info, FLAG_GRP_HW_UNBLK_TX); - SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX\n"); + SS7_DEBUG_CHAN(ftdmchan,"handle_hw_alarm: Setting FLAG_GRP_HW_UNBLK_TX %s\n"," "); if (ftdmchan->state != FTDM_CHANNEL_STATE_SUSPENDED) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } From 09dd96455e20996cb4be31c310b13357fb149142 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 15 Dec 2011 12:34:56 -0500 Subject: [PATCH 105/493] switch-core: changed the exit status when modules fail to load to 65 (EX_DATAERR), init scripts must be updated to handle 65 instead of 1 to detect module loading errors --- src/switch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/switch.c b/src/switch.c index 038dd2c759..d33f8170c2 100644 --- a/src/switch.c +++ b/src/switch.c @@ -898,7 +898,9 @@ int main(int argc, char *argv[]) if (switch_core_init_and_modload(flags, nc ? SWITCH_FALSE : SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Failed to initialize modules: %s\n", err); - return 1; + /* 65 is EX_DATAERR (see sysexits.h), meaning some input from the user failed, some init scripts use + * this to tell when fs fails to start due to configuration error */ + return 65; } if (switch_file_open(&fd, pid_path, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, pool) == SWITCH_STATUS_SUCCESS) { From b057d873cfd1c168bc598b3740cbb9c09b71e3c4 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 15 Dec 2011 15:47:41 -0500 Subject: [PATCH 106/493] Added a retry on configuraiton. Its possible to timeout on ISUP ckt config in scenarios of huge load. --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 5edf7d4851..a98f2ee209 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1878,6 +1878,7 @@ static ftdm_status_t ftdm_sangoma_ss7_stop(ftdm_span_t * span) static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) { sngss7_span_data_t *ss7_span_info; + int sngss7_retry_cnt=5; ftdm_log (FTDM_LOG_INFO, "Configuring ftmod_sangoma_ss7 span = %s(%d)...\n", span->name, @@ -1932,7 +1933,13 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) } /* configure libsngss7 */ +try_cfg_again: if (ft_to_sngss7_cfg_all()) { + if (sngss7_retry_cnt--) { + ftdm_sleep (500); + ftdm_log (FTDM_LOG_DEBUG, "Failed to configure LibSngSS7 - retrying!\n"); + goto try_cfg_again; + } ftdm_log (FTDM_LOG_CRIT, "Failed to configure LibSngSS7!\n"); ftdm_sleep (1000); return FTDM_FAIL; From 494947bf591d2d284bb52592e2609b6facdbd36f Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 15 Dec 2011 15:50:58 -0500 Subject: [PATCH 107/493] Reverted the previous commit of doing nothing on RESTART while in PAUSE --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index a98f2ee209..f6c61162b1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1090,11 +1090,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_info->ckt_flags, sngss7_info->blk_flags); - if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { - SS7_DEBUG_CHAN(ftdmchan,"Circuit PAUSED stay in RESTART%s\n", ""); - break; - } - if (sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) { if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) || (sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX))) { From 732a0ed2de6773409146debaef4a008685bb6717 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 15 Dec 2011 20:39:38 -0500 Subject: [PATCH 108/493] Fix for 3000ms timeout on hangup. Where FS does not hangup the channel with in 3sec. Without this fix, it was possible that 2 FS sessions use the single span/chan freetdm session. Merged the feature from git master of freetdm --- libs/freetdm/mod_freetdm/mod_freetdm.c | 41 +++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index ecd9189b39..003be91b17 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -496,6 +496,14 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) private_t *tech_pvt = NULL; ftdm_chan_type_t chantype; uint32_t tokencnt; + char *uuid = NULL; + uint8_t uuid_found = 0; + uint32_t t = 0; + const char *token = NULL; + int span_id = 0; + int chan_id = 0; + const char *name = NULL; + channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -503,10 +511,42 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) tech_pvt = switch_core_session_get_private(session); assert(tech_pvt != NULL); + /* ignore any further I/O requests, we're hanging up already! */ + switch_clear_flag_locked(tech_pvt, TFLAG_IO); + + if (!tech_pvt->ftdmchan) { goto end; } + name = switch_channel_get_name(channel); + + span_id = tech_pvt->ftdmchan ? ftdm_channel_get_span_id(tech_pvt->ftdmchan) : 0; + chan_id = tech_pvt->ftdmchan ? ftdm_channel_get_id(tech_pvt->ftdmchan) : 0; + + + /* Now verify the device is still attached to this call :-) + * Sometimes the FS core takes too long (more than 3 seconds) in calling + * channel_on_hangup() and the FreeTDM core decides to take the brute + * force approach and hangup and detach themselves from the call. Later + * when FS finally comes around, we might end up hanging up the device + * attached to another call, this verification avoids that. */ + uuid = switch_core_session_get_uuid(session); + tokencnt = ftdm_channel_get_token_count(tech_pvt->ftdmchan); + for (t = 0; t < tokencnt; t++) { + token = ftdm_channel_get_token(tech_pvt->ftdmchan, t); + if (!zstr(token) && !strcasecmp(uuid, token)) { + uuid_found = 1; + break; + } + } + + if (!uuid_found) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Device [%d:%d] is no longer attached to %s. Nothing to do.\n", span_id, chan_id, name); + goto end; + } + + ftdm_channel_clear_token(tech_pvt->ftdmchan, switch_core_session_get_uuid(session)); chantype = ftdm_channel_get_type(tech_pvt->ftdmchan); @@ -2459,7 +2499,6 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal) switch_set_flag_locked(tech_pvt, TFLAG_DEAD); channel = switch_core_session_get_channel(session); switch_channel_hangup(channel, caller_data->hangup_cause); - ftdm_channel_clear_token(sigmsg->channel, switch_core_session_get_uuid(session)); switch_core_session_rwunlock(session); } } From 485746305a420a0993da0cb539e0a58789bdd993 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Fri, 16 Dec 2011 10:06:57 -0500 Subject: [PATCH 109/493] Set the cpu thresholds to 92 and 82 Set the 3000ms warning to NOTICE not CRIT --- libs/freetdm/src/ftdm_io.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index bb866610a2..731b9f88ef 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -5455,7 +5455,7 @@ static void execute_safety_hangup(void *data) ftdm_channel_lock(fchan); fchan->hangup_timer = 0; if (fchan->state == FTDM_CHANNEL_STATE_TERMINATING) { - ftdm_log_chan(fchan, FTDM_LOG_CRIT, "Forcing hangup since the user did not confirmed our hangup after %dms\n", FORCE_HANGUP_TIMER); + ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "Forcing hangup since the user did not confirmed our hangup after %dms\n", FORCE_HANGUP_TIMER); _ftdm_channel_call_hangup_nl(__FILE__, __FUNCTION__, __LINE__, fchan, NULL); } else { ftdm_log_chan(fchan, FTDM_LOG_CRIT, "Not performing safety hangup, channel state is %s\n", ftdm_channel_state2str(fchan->state)); @@ -5722,8 +5722,8 @@ FT_DECLARE(ftdm_status_t) ftdm_global_configuration(void) globals.cpu_monitor.enabled = 0; globals.cpu_monitor.interval = 1000; globals.cpu_monitor.alarm_action_flags = 0; - globals.cpu_monitor.set_alarm_threshold = 80; - globals.cpu_monitor.clear_alarm_threshold = 70; + globals.cpu_monitor.set_alarm_threshold = 92; + globals.cpu_monitor.clear_alarm_threshold = 82; if (load_config() != FTDM_SUCCESS) { globals.running = 0; From 83b5929e482a30c7ff265904fe25270db9686148 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Sat, 17 Dec 2011 19:36:47 -0500 Subject: [PATCH 110/493] freetdm: remove duplicated ss7 code for location number (previous git merge duplicated it) --- .../ftmod_sangoma_ss7_handle.c | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index b8154f96e8..6a061312a8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -249,34 +249,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " "); } - /* Retrieve the Location Number if present (see ITU Q.763, 3.30) */ - if (siConEvnt->cgPtyNum1.eh.pres) { - if (siConEvnt->cgPtyNum1.addrSig.pres) { - /* fill in the ss7 location address number */ - copy_tknStr_from_sngss7(siConEvnt->cgPtyNum1.addrSig, var, siConEvnt->cgPtyNum1.oddEven); - sngss7_add_var(sngss7_info, "ss7_loc_digits", var); - } - - if (siConEvnt->cgPtyNum1.scrnInd.pres) { - /* fill in the screening indication value */ - sprintf(var, "%d", siConEvnt->cgPtyNum1.scrnInd.val); - sngss7_add_var(sngss7_info, "ss7_loc_screen_ind", var); - } - - if (siConEvnt->cgPtyNum1.presRest.pres) { - /* fill in the presentation value */ - sprintf(var, "%d", siConEvnt->cgPtyNum1.presRest.val); - sngss7_add_var(sngss7_info, "ss7_loc_pres_ind", var); - } - - if (siConEvnt->cgPtyNum1.natAddrInd.pres) { - sprintf(var, "%d", siConEvnt->cgPtyNum1.natAddrInd.val); - sngss7_add_var(sngss7_info, "ss7_loc_nadi", var); - } - } else { - SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " "); - } - sprintf(var, "%d", sngss7_info->circuit->cic); sngss7_add_var(sngss7_info, "ss7_cic", var); From 7e2ef3a55cdd77148941772f8170b72dc3b6c651 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Sun, 18 Dec 2011 23:02:59 -0500 Subject: [PATCH 111/493] freetdm: The remote hangup logic that waits for 3sec for FS to hanup up before hanging up the freetdm channel by force seems to have a memory leak. I have increased the timeout to 30sec and made the print statement WARNING level. --- libs/freetdm/src/ftdm_io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 731b9f88ef..8b179ccf05 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -52,7 +52,7 @@ struct tm *localtime_r(const time_t *clock, struct tm *result); #endif -#define FORCE_HANGUP_TIMER 3000 +#define FORCE_HANGUP_TIMER 30000 #define SPAN_PENDING_CHANS_QUEUE_SIZE 1000 #define SPAN_PENDING_SIGNALS_QUEUE_SIZE 1000 #define FTDM_READ_TRACE_INDEX 0 @@ -5455,7 +5455,7 @@ static void execute_safety_hangup(void *data) ftdm_channel_lock(fchan); fchan->hangup_timer = 0; if (fchan->state == FTDM_CHANNEL_STATE_TERMINATING) { - ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "Forcing hangup since the user did not confirmed our hangup after %dms\n", FORCE_HANGUP_TIMER); + ftdm_log_chan(fchan, FTDM_LOG_WARNING, "Forcing hangup since the user did not confirmed our hangup after %dms\n", FORCE_HANGUP_TIMER); _ftdm_channel_call_hangup_nl(__FILE__, __FUNCTION__, __LINE__, fchan, NULL); } else { ftdm_log_chan(fchan, FTDM_LOG_CRIT, "Not performing safety hangup, channel state is %s\n", ftdm_channel_state2str(fchan->state)); From b6ca6c5b1da2d577d6ae95cbf0ce445ed59f2043 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Mon, 19 Dec 2011 02:27:38 -0500 Subject: [PATCH 112/493] freetdm: Added sng_cc_resource_check() On SIG Down we must not fail a call instead try hunting for another. The only time we can fail the call and not bother hunting is if sng_cc_resource_check fails. Took out configuration retry as the config code is now fixed in sng_ss7 library. Transaction id fix. Unit Tested: NSG UP -- start full load kill NSG NSG UP again on full load make sure it comes up fine. --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 9 +++---- .../ftmod_sangoma_ss7_main.c | 25 +++++++++++-------- .../ftmod_sangoma_ss7_main.h | 6 +++++ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index 25510e8c7a..327ca40f05 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -77,9 +77,9 @@ int ft_to_sngss7_cfg_all(void) int ret = 0; /* check if we have done gen_config already */ - if (!(g_ftdm_sngss7_data.gen_config)) { + if (g_ftdm_sngss7_data.gen_config == SNG_GEN_CFG_STATUS_INIT) { /* update the global gen_config so we don't do it again */ - g_ftdm_sngss7_data.gen_config = 1; + g_ftdm_sngss7_data.gen_config = SNG_GEN_CFG_STATUS_PENDING; /* start of by checking if the license and sig file are valid */ if (sng_validate_license(g_ftdm_sngss7_data.cfg.license, @@ -209,13 +209,12 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) */ - g_ftdm_sngss7_data.gen_config = 2; + g_ftdm_sngss7_data.gen_config = SNG_GEN_CFG_STATUS_DONE; } /* if (!(g_ftdm_sngss7_data.gen_config)) */ - /* FIXME: Please change number 2 to an ENUM that is more explanatory */ - if (g_ftdm_sngss7_data.gen_config != 2) { + if (g_ftdm_sngss7_data.gen_config != SNG_GEN_CFG_STATUS_DONE) { SS7_CRITICAL("General configuration FAILED!\n"); return 1; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index f6c61162b1..c963ea7cb7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1653,8 +1653,10 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call) /* check if the channel sig state is UP */ if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) { - SS7_ERROR_CHAN(ftdmchan, "Requested channel sig state is down, cancelling call!%s\n", " "); - goto outgoing_fail; + SS7_ERROR_CHAN(ftdmchan, "Requested channel sig state is down, skipping channell!%s\n", " "); + /* Sig state will be down due to a block. + Right action is to hunt for another call */ + goto outgoing_break; } /* check if there is a remote block */ @@ -1679,6 +1681,14 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call) goto outgoing_break; } + + /* This is a gracefull stack resource check. + Removing this function will cause unpredictable + ungracefule errors. */ + if (sng_cc_resource_check()) { + goto outgoing_fail; + } + /* check the state of the channel */ switch (ftdmchan->state){ /**************************************************************************/ @@ -1873,7 +1883,6 @@ static ftdm_status_t ftdm_sangoma_ss7_stop(ftdm_span_t * span) static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) { sngss7_span_data_t *ss7_span_info; - int sngss7_retry_cnt=5; ftdm_log (FTDM_LOG_INFO, "Configuring ftmod_sangoma_ss7 span = %s(%d)...\n", span->name, @@ -1923,20 +1932,14 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) /* parse the configuration and apply to the global config structure */ if (ftmod_ss7_parse_xml(ftdm_parameters, span)) { ftdm_log (FTDM_LOG_CRIT, "Failed to parse configuration!\n"); - ftdm_sleep (1000); + ftdm_sleep (100); return FTDM_FAIL; } /* configure libsngss7 */ -try_cfg_again: if (ft_to_sngss7_cfg_all()) { - if (sngss7_retry_cnt--) { - ftdm_sleep (500); - ftdm_log (FTDM_LOG_DEBUG, "Failed to configure LibSngSS7 - retrying!\n"); - goto try_cfg_again; - } ftdm_log (FTDM_LOG_CRIT, "Failed to configure LibSngSS7!\n"); - ftdm_sleep (1000); + ftdm_sleep (100); return FTDM_FAIL; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index bb02d7e3ed..78210d50fb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -116,6 +116,12 @@ typedef enum { SNG_CALLING = 2 } sng_addr_type_t; +typedef enum { + SNG_GEN_CFG_STATUS_INIT = 0, + SNG_GEN_CFG_STATUS_PENDING = 1, + SNG_GEN_CFG_STATUS_DONE = 2 +} nsg_gen_cfg_type_t; + typedef struct sng_mtp2_error_type { int init; char sng_type[MAX_NAME_LEN]; From 8eeb37a81b57226053caf9c2d151de721e4f6308 Mon Sep 17 00:00:00 2001 From: William Adam Date: Wed, 21 Dec 2011 14:56:03 -0500 Subject: [PATCH 113/493] Fixed bug#2215 - SPIROU transparent IAM max size error --- .../freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index f1c6625b85..f7d0171f93 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -1923,7 +1923,7 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam); #endif } else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { - sng_ccSpan.transparent_iam_max_size = ftdm_true(parm->val); + sng_ccSpan.transparent_iam_max_size = atoi(parm->val); SS7_DEBUG("Found transparent_iam_max_size %d\n", sng_ccSpan.transparent_iam_max_size); } else if (!strcasecmp(parm->var, "cpg_on_progress_media")) { sng_ccSpan.cpg_on_progress_media = ftdm_true(parm->val); From 5ac80d39399a366ee72aa80cbd2e12aa100016c1 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 19 Jan 2012 16:31:52 -0500 Subject: [PATCH 114/493] FreeTDM: fixing redirect information outgoing call bug --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 11 +++++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 0497955059..0bed14c2e6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -252,8 +252,19 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(var, "%d", sngss7_info->circuit->cic); sngss7_add_var(sngss7_info, "ss7_cic", var); + + if (siConEvnt->orgPteCde.eh.pres) { + sprintf(var, "%d",(uint32_t)siConEvnt->orgPteCde.sigPointCode.val); + sngss7_add_var(sngss7_info, "ss7_opc", var); + SS7_DEBUG_CHAN(ftdmchan, " OPC = d%\n", (uint32_t)siConEvnt->orgPteCde.sigPointCode.val); + } else { + SS7_DEBUG_CHAN(ftdmchan, "No OPC information in IAM%s\n", " "); + } + + /* original code, should be removed after review. sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc ); sngss7_add_var(sngss7_info, "ss7_opc", var); + */ if (siConEvnt->callRef.callId.pres) { /* %x expect an unsigned int so as callId is a U32, casting to uint32_t diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 3230292675..59777b048b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -585,6 +585,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_indicator"); if (!ftdm_strlen_zero(val)) { redirInfo->redirInd.val = atoi(val); + redirInfo->redirInd.pres = 1; bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Indicator\n"); @@ -593,6 +594,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_orig"); if (!ftdm_strlen_zero(val)) { redirInfo->origRedirReas.val = atoi(val); + redirInfo->origRedirReas.pres = 1; bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Original Reasons\n"); @@ -601,6 +603,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_count"); if (!ftdm_strlen_zero(val)) { redirInfo->redirCnt.val = atoi(val); + redirInfo->redirCnt.pres= 1; bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Count\n"); @@ -609,6 +612,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdinfo_reason"); if (!ftdm_strlen_zero(val)) { redirInfo->redirReas.val = atoi(val); + redirInfo->redirReas.pres = 1; bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Information on Redirection Reasons\n"); From 63ecf4e9091c1a9f2fd18d5ce324375275162739 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 19 Jan 2012 16:55:15 -0500 Subject: [PATCH 115/493] FreeTDM: remove the portion of opc fix --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 0bed14c2e6..a4d16b7dd2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -253,18 +253,8 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_add_var(sngss7_info, "ss7_cic", var); - if (siConEvnt->orgPteCde.eh.pres) { - sprintf(var, "%d",(uint32_t)siConEvnt->orgPteCde.sigPointCode.val); - sngss7_add_var(sngss7_info, "ss7_opc", var); - SS7_DEBUG_CHAN(ftdmchan, " OPC = d%\n", (uint32_t)siConEvnt->orgPteCde.sigPointCode.val); - } else { - SS7_DEBUG_CHAN(ftdmchan, "No OPC information in IAM%s\n", " "); - } - - /* original code, should be removed after review. sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc ); sngss7_add_var(sngss7_info, "ss7_opc", var); - */ if (siConEvnt->callRef.callId.pres) { /* %x expect an unsigned int so as callId is a U32, casting to uint32_t From 8d1d930085d9a594bff424d01ca5f9f8c33fbd72 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 19 Jan 2012 18:04:03 -0500 Subject: [PATCH 116/493] FreeTDM: fixing OPC bug using local SPC - take the DPC of the link and set it as OPC in x-header - this is what the user want's to have --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index a4d16b7dd2..9c3bd65426 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -253,7 +253,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_add_var(sngss7_info, "ss7_cic", var); - sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc ); + sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ); sngss7_add_var(sngss7_info, "ss7_opc", var); if (siConEvnt->callRef.callId.pres) { From 34c8e58ae1a500d0fd1855b88c4ce86f317fc03f Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 25 Jan 2012 16:00:20 -0500 Subject: [PATCH 117/493] FreeTDM: location value in REL message set to 0x04 - only available to SPIROU --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index fbfab15d1e..4b5f82f52d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -259,7 +259,11 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan) rel.causeDgn.eh.pres = PRSNT_NODEF; rel.causeDgn.location.pres = PRSNT_NODEF; +#ifdef SANGOMA_SPIROU + rel.causeDgn.location.val = 0x04; +#else rel.causeDgn.location.val = 0x01; +#endif rel.causeDgn.cdeStand.pres = PRSNT_NODEF; rel.causeDgn.cdeStand.val = 0x00; rel.causeDgn.recommend.pres = NOTPRSNT; From 28e27248e5d86ef553973dc39827bd099d2db853 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 25 Jan 2012 18:00:41 -0500 Subject: [PATCH 118/493] FreeTDM: remove the previous commit - hardcode does not work in this matter --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 4b5f82f52d..fbfab15d1e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -259,11 +259,7 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan) rel.causeDgn.eh.pres = PRSNT_NODEF; rel.causeDgn.location.pres = PRSNT_NODEF; -#ifdef SANGOMA_SPIROU - rel.causeDgn.location.val = 0x04; -#else rel.causeDgn.location.val = 0x01; -#endif rel.causeDgn.cdeStand.pres = PRSNT_NODEF; rel.causeDgn.cdeStand.val = 0x00; rel.causeDgn.recommend.pres = NOTPRSNT; From 90f538c0a0e08197f9add62131f1a5ee9a3522c0 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 11:19:41 -0500 Subject: [PATCH 119/493] FreeTDM: Fixing issues of SPIROU - redirect number in Transparent IAM - redirect information in Transparent IAM - called party number in Transparent IAM - adding incoming uuid to x-header to check loop calls --- libs/freetdm/mod_freetdm/mod_freetdm.c | 23 ++++++++++++++++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 9 ++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 003be91b17..e694a0f8fa 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -115,6 +115,8 @@ struct private_object { ftdm_channel_t *ftdmchan; uint32_t write_error; uint32_t read_error; + char network_peer_uuid[SWITCH_UUID_FORMATTED_LENGTH + 1]; + }; /* private data attached to FTDM channels (only FXS for now) */ @@ -1246,6 +1248,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi int argc = 0; const char *var; const char *dest_num = NULL, *callerid_num = NULL; + const char *network_peer_uuid = NULL; ftdm_hunting_scheme_t hunting; ftdm_usrmsg_t usrmsg; @@ -1336,6 +1339,9 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (session && globals.sip_headers) { switch_channel_t *channel = switch_core_session_get_channel(session); const char *sipvar; + + network_peer_uuid = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-TransUUID"); + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-CallerName"); if (sipvar) { ftdm_set_string(caller_data.cid_name, sipvar); @@ -1592,6 +1598,20 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } + if (network_peer_uuid) { + switch_core_session_t *network_peer = switch_core_session_locate(network_peer_uuid); + if (network_peer) { + const char *my_uuid = switch_core_session_get_uuid(*new_session); + private_t *peer_private = switch_core_session_get_private(network_peer); + switch_set_string(tech_pvt->network_peer_uuid, network_peer_uuid); + switch_set_string(peer_private->network_peer_uuid, my_uuid); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Session %s is network-bridged with %s\n", my_uuid, network_peer_uuid); + + switch_core_session_rwunlock(network_peer); + } + } + caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); caller_profile->destination_number = switch_core_strdup(caller_profile->pool, switch_str_nil(dest_num)); caller_profile->caller_id_number = switch_core_strdup(caller_profile->pool, switch_str_nil(callerid_num)); @@ -1617,7 +1637,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi } else { cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } - goto fail; + goto fail; } return SWITCH_CAUSE_SUCCESS; @@ -1746,6 +1766,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session if (globals.sip_headers) { switch_channel_set_variable(channel, "sip_h_X-FreeTDM-SpanName", ftdm_channel_get_span_name(sigmsg->channel)); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-TransUUID", "%s",switch_core_session_get_uuid(session)); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-SpanNumber", "%d", spanid); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-ChanNumber", "%d", chanid); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index fbfab15d1e..0c8cf3832a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -58,6 +58,15 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) if (sngss7_info->circuit->transparent_iam && sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic); + + /* Called Number information */ + copy_cdPtyNum_to_sngss7(ftdmchan, &iam.cdPtyNum); + + /* Redirecting Number */ + copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); + + /* Redirecting Information */ + copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); From 1b964054de8aa60299c9ffc29647ccbcd457d44f Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 15:21:51 -0500 Subject: [PATCH 120/493] freetdm: Add new queue for ss7 clone messages, all incoming messages are queued now --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 18 ++++++++++++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 1 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 3 +++ 3 files changed, 22 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index c963ea7cb7..ebee2c382d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -511,6 +511,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev { sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; + sngss7_event_data_t *event_clone = NULL; /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(sngss7_event->circuit, &sngss7_info, &ftdmchan)) { @@ -521,6 +522,22 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev /* now that we have the right channel ... put a lock on it so no-one else can use it */ ftdm_channel_lock(ftdmchan); + if (sngss7_info->event_queue) { + if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { + /* this is the first event in a call, flush the event queue */ + while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { + SS7_WARN("Discarding clone event from past call for circuit = %d!\n", sngss7_event->circuit); + ftdm_safe_free(event_clone); + } + } + /* clone the event and save it for later usage */ + event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); + if (event_clone) { + memcpy(clone, sngss7_event, sizeof(*sngss7_event)); + ftdm_queue_enqueue(sngss7_info->event_queue, clone); + } + } + /* while there's a state change present on this channel process it */ ftdm_channel_advance_states(ftdmchan); @@ -576,6 +593,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev break; /**************************************************************************/ case (SNGSS7_SSP_STA_CFM_EVENT): + SS7_ERROR("dazed and confused ... hu?!\n"); break; /**************************************************************************/ default: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 78210d50fb..2a1ca1749e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -485,6 +485,7 @@ typedef struct sngss7_chan_data { sngss7_group_data_t rx_gra; sngss7_group_data_t tx_grs; sngss7_group_data_t ucic; + ftdm_queue_t *event_queue; } sngss7_chan_data_t; #define SNGSS7_RX_GRS_PENDING (1 << 0) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index f7d0171f93..d7732cce6c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2925,6 +2925,9 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) /* prepare the global info sturcture */ ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t)); ss7_info->ftdmchan = NULL; + if (ftdm_queue_create(&ss7_info->event_queue, SNGSS7_EVENT_QUEUE_SIZE) != FTDM_SUCCESS) { + SS7_CRITICAL("Failed to create ss7 cic event queue\n"); + } ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x]; g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info; From 98d566b29c5ebc43834c27c8859d042b69ef94ba Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 16:39:43 -0500 Subject: [PATCH 121/493] FreeTDM: adding variable ss7_rel_loc for REL location indicator (to support SPIROU) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 11 +++++++++++ .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 11 ++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index e694a0f8fa..1ecf1fe7ef 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -506,6 +506,9 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) int chan_id = 0; const char *name = NULL; + ftdm_usrmsg_t usrmsg; + memset(&usrmsg, 0, sizeof(ftdm_usrmsg_t)); + channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -574,11 +577,19 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) case FTDM_CHAN_TYPE_CAS: case FTDM_CHAN_TYPE_B: { + const char *sipvar; ftdm_call_cause_t hcause = switch_channel_get_cause_q850(channel); if (hcause < 1 || hcause > 127) { hcause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER; } + sipvar = switch_channel_get_variable(channel, "ss7_rel_loc"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_rel_loc", sipvar); + } + /* ftdm_channel_call_hangup_with_cause(tech_pvt->ftdmchan, hcause); + */ + ftdm_channel_call_hangup_with_cause_ex(tech_pvt->ftdmchan, hcause, &usrmsg); } break; default: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 0c8cf3832a..f73fd871b4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -259,6 +259,7 @@ void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan) /******************************************************************************/ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan) { + const char *loc_ind = NULL; SS7_FUNC_TRACE_ENTER (__FUNCTION__); sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; @@ -268,7 +269,15 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan) rel.causeDgn.eh.pres = PRSNT_NODEF; rel.causeDgn.location.pres = PRSNT_NODEF; - rel.causeDgn.location.val = 0x01; + + loc_ind = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rel_loc"); + if (!ftdm_strlen_zero(loc_ind)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied location indicator in REL, value \"%s\"\n", loc_ind); + rel.causeDgn.location.val = atoi(loc_ind); + } else { + rel.causeDgn.location.val = 0x01; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied location indicator in REL, using 0x01\"%s\"\n", ""); + } rel.causeDgn.cdeStand.pres = PRSNT_NODEF; rel.causeDgn.cdeStand.val = 0x00; rel.causeDgn.recommend.pres = NOTPRSNT; From a1a1af579b9b6cbf7349c5e39b8d51a260eb443f Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 16:50:38 -0500 Subject: [PATCH 122/493] freetdm: Implement SS7 transparent IAM functionality using the event clones queue --- libs/freetdm/mod_freetdm/mod_freetdm.c | 17 ++++++ .../ftmod_sangoma_ss7_main.c | 15 ++++- .../ftmod_sangoma_ss7_main.h | 1 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 55 ++++++++++++++++++- 4 files changed, 86 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 003be91b17..204e5a894f 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1603,6 +1603,23 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi hunt_data.tech_pvt = tech_pvt; caller_data.priv = &hunt_data; + if (session + && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) + && switch_true(var) + && switch_core_session_compare(*new_session, session)) { + char sigbridge_peer[255]; + private_t *peer_pvt = switch_core_session_get_private(session); + switch_channel_t *peer_chan = switch_core_session_get_channel(session); + switch_channel_t *our_chan = switch_core_session_get_channel(*new_session); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, + "Bridging native signaling of channel %s to channel %s\n", + switch_channel_get_name(peer_chan), switch_channel_get_name(our_chan)); + snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", + ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); + ftdm_usrmsg_add_var(&usrmsg, "sigbridge_peer", sigbridge_peer); + } + + if ((status = ftdm_call_place_ex(&caller_data, &hunting, &usrmsg)) != FTDM_SUCCESS) { if (tech_pvt->read_codec.implementation) { switch_core_codec_destroy(&tech_pvt->read_codec); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index ebee2c382d..bcb518ff9d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -526,7 +526,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { /* this is the first event in a call, flush the event queue */ while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - SS7_WARN("Discarding clone event from past call for circuit = %d!\n", sngss7_event->circuit); + SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); ftdm_safe_free(event_clone); } } @@ -1076,6 +1076,19 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) { ftdm_channel_t *close_chan = ftdmchan; + + /* detach native bridging if needed (only the outbound leg is responsible for that) + Inbound leg was responsible of flushing its queue of events, but peer attach/detach + is left as an outbound leg responsibility + */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { + sngss7_chan_data_t *peer_info = sngss7_info->peer_data; + sngss7_info->peer_data = NULL; + if (peer_info) { + peer_info->peer_data = NULL; + } + } + /* close the channel */ SS7_DEBUG_CHAN(ftdmchan,"FTDM Channel Close %s\n", ""); ftdm_channel_close (&close_chan); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 2a1ca1749e..2fc6f740c7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -486,6 +486,7 @@ typedef struct sngss7_chan_data { sngss7_group_data_t tx_grs; sngss7_group_data_t ucic; ftdm_queue_t *event_queue; + struct sngss7_chan_data *peer_data; } sngss7_chan_data_t; #define SNGSS7_RX_GRS_PENDING (1 << 0) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index fbfab15d1e..eda03715f3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -44,6 +44,7 @@ /* FUNCTIONS ******************************************************************/ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) { + const char *var = NULL; SiConEvnt iam; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; @@ -55,7 +56,59 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) memset (&iam, 0x0, sizeof (iam)); - if (sngss7_info->circuit->transparent_iam && + var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); + if (!ftdm_strlen_zero(var)) { + ftdm_status_t status = FTDM_SUCCESS; + int rc = 0; + ftdm_span_t *peer_span = NULL; + ftdm_channel_t *peer_chan = NULL; + sngss7_chan_data_t *peer_info = NULL; + unsigned peer_span_id = 0; + unsigned peer_chan_id = 0; + rc = sscanf(var, "%u:%u", &peer_span_id, &peer_chan_id); + if (rc != 2) { + SS7_ERROR_CHAN(ftdmchan, "Failed to parse sigbridge_peer string '%s'\n", var); + } else { + status = ftdm_span_find(peer_span_id, &peer_span); + if (status != FTDM_SUCCESS || !peer_span) { + SS7_ERROR_CHAN(ftdmchan, "Failed to find peer span for channel id '%u:%u'\n", peer_span_id, peer_chan_id); + } else if (peer_span->signal_type != FTDM_SIGTYPE_SS7) { + SS7_ERROR_CHAN(ftdmchan, "Peer channel %d:%d has different signaling type %d'\n", + peer_span_id, peer_chan_id, peer_span->signal_type); + } else { + if (peer_chan_id > (FTDM_MAX_CHANNELS_SPAN+1) || !(peer_chan = peer_span->channels[peer_chan_id])) { + SS7_ERROR_CHAN(ftdmchan, "Invalid peer channel id '%u:%u'\n", peer_span_id, peer_chan_id); + } else { + sngss7_event_data_t *event_clone = NULL; + peer_info = peer_chan->call_data; + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", + sngss7_info->circuit->cic, peer_info->circuit->cic); + /* make each one of us aware of the native bridge */ + peer_info->peer_data = sngss7_info; + sngss7_info->peer_data = peer_info; + /* flush our own queue */ + while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { + SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); + ftdm_safe_free(event_clone); + } + } + } + } + } + + if (sngss7_info->peer_data) { + sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); + /* Retrieve IAM from our peer */ + if (!event_clone) { + SS7_ERROR_CHAN(ftdmchan, "No event clone in peer queue!%s\n", ""); + } else if (event_clone->event_id != SNGSS7_CON_IND_EVENT) { + /* first message in the queue should ALWAYS be an IAM */ + SS7_ERROR_CHAN(ftdmchan, "Invalid initial peer message type '%d'\n", event_clone->event_id); + } else { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged)\n", sngss7_info->circuit->cic); + memcpy(&iam, &event_clone->event.siConEvnt, sizeof(iam)); + } + } else if (sngss7_info->circuit->transparent_iam && sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic); } else { From b4e8d5b6086ddf861760db21686ad4344f470356 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 17:22:45 -0500 Subject: [PATCH 123/493] freetdm: Fix incorrect variable name leading to segfault --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index bcb518ff9d..96b662bdbb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -533,8 +533,8 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev /* clone the event and save it for later usage */ event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); if (event_clone) { - memcpy(clone, sngss7_event, sizeof(*sngss7_event)); - ftdm_queue_enqueue(sngss7_info->event_queue, clone); + memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); + ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); } } From 95baef882153eef83885022024ef5c07251b3a79 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 17:37:35 -0500 Subject: [PATCH 124/493] FreeTDM: patch SPIROU requests - adding freetdm_iam_loc_pres variable to disable LOC in transparent IAM - confirming freetdm_bearer_capability is working properly --- libs/freetdm/mod_freetdm/mod_freetdm.c | 4 ++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 3 +++ .../ftmod_sangoma_ss7_support.c | 22 ++++++++++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 1ecf1fe7ef..c2712621da 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1523,9 +1523,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi caller_data.pres = FTDM_PRES_RESTRICTED; } + if ((var = channel_get_variable(session, var_event, "freetdm_iam_loc_pres"))) { + ftdm_usrmsg_add_var(&usrmsg, "iam_loc_pres", var); + } if ((var = channel_get_variable(session, var_event, "freetdm_bearer_capability"))) { caller_data.bearer_capability = (uint8_t)atoi(var); } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "freetdm_bearer_capability is set to %s \n", var ); if ((var = channel_get_variable(session, var_event, "freetdm_bearer_layer1"))) { caller_data.bearer_layer1 = (uint8_t)atoi(var); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index f73fd871b4..a5311e9afc 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -67,6 +67,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Information */ copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); + + /* Location Number information */ + copy_locPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum1); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 59777b048b..957649fa21 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -243,15 +243,25 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc { const char *val = NULL; const char *loc_nadi = NULL; + int pres_val = PRSNT_NODEF; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; - locPtyNum->eh.pres = PRSNT_NODEF; - locPtyNum->natAddrInd.pres = PRSNT_NODEF; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_loc_pres"); + if (!ftdm_strlen_zero(val)) { + if (!strcasecmp(val, "false")) { + pres_val = NOTPRSNT; + } + } + + + locPtyNum->eh.pres = pres_val; + locPtyNum->natAddrInd.pres = pres_val; locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; - locPtyNum->scrnInd.pres = PRSNT_NODEF; + locPtyNum->scrnInd.pres = pres_val; val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); if (!ftdm_strlen_zero(val)) { locPtyNum->scrnInd.val = atoi(val); @@ -260,7 +270,7 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc } ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Code Screening Ind %d\n", locPtyNum->scrnInd.val); - locPtyNum->presRest.pres = PRSNT_NODEF; + locPtyNum->presRest.pres = pres_val; val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind"); if (!ftdm_strlen_zero(val)) { locPtyNum->presRest.val = atoi(val); @@ -269,10 +279,10 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc } ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", locPtyNum->presRest.val); - locPtyNum->numPlan.pres = PRSNT_NODEF; + locPtyNum->numPlan.pres = pres_val; locPtyNum->numPlan.val = 0x01; - locPtyNum->niInd.pres = PRSNT_NODEF; + locPtyNum->niInd.pres = pres_val; locPtyNum->niInd.val = 0x00; /* check if the user would like a custom NADI value for the Location Reference */ From 3235fa079a26142e8c499441b08660254dfee55c Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 18:00:34 -0500 Subject: [PATCH 125/493] FreeTDM: fix for SPIROU - adding freetdm_iam_fwd_ind_isdn_access_ind (value must be 0 or 1) to modify forward call indicator's ISDN access indicator value in transparent IAM --- libs/freetdm/mod_freetdm/mod_freetdm.c | 5 ++++- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 3 +++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 10 +++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index c2712621da..cdcb8ca1e0 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1523,13 +1523,16 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi caller_data.pres = FTDM_PRES_RESTRICTED; } + if ((var = channel_get_variable(session, var_event, "freetdm_iam_fwd_ind_isdn_access_ind"))) { + ftdm_usrmsg_add_var(&usrmsg, "iam_fwd_ind_isdn_access_ind", var); + } + if ((var = channel_get_variable(session, var_event, "freetdm_iam_loc_pres"))) { ftdm_usrmsg_add_var(&usrmsg, "iam_loc_pres", var); } if ((var = channel_get_variable(session, var_event, "freetdm_bearer_capability"))) { caller_data.bearer_capability = (uint8_t)atoi(var); } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "freetdm_bearer_capability is set to %s \n", var ); if ((var = channel_get_variable(session, var_event, "freetdm_bearer_layer1"))) { caller_data.bearer_layer1 = (uint8_t)atoi(var); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index a5311e9afc..d25b3342f0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -70,6 +70,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Location Number information */ copy_locPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum1); + + /* Forward Call Indicators */ + copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 957649fa21..c25597cd40 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -763,6 +763,8 @@ ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *na ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) { + const char *val = NULL; + int acc_val = ISDNACC_ISDN; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; fwdCallInd->eh.pres = PRSNT_NODEF; @@ -779,7 +781,13 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * fwdCallInd->isdnUsrPrtPrfInd.pres = PRSNT_NODEF; fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW; fwdCallInd->isdnAccInd.pres = PRSNT_NODEF; - fwdCallInd->isdnAccInd.val = ISDNACC_ISDN; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_isdn_access_ind"); + if (!ftdm_strlen_zero(val)) { + acc_val = (int)atoi(val); + } + + fwdCallInd->isdnAccInd.val = acc_val; fwdCallInd->sccpMethInd.pres = PRSNT_NODEF; fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND; From 977b546f9a420a7cc4699cabb12223744ffc93b4 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 18:52:27 -0500 Subject: [PATCH 126/493] FreeTDM: reuse sip_h_X-FreeTDM-LOC = NULL to indicate disable LOC --- libs/freetdm/mod_freetdm/mod_freetdm.c | 3 --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 9 ++------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index cdcb8ca1e0..9d15ad8eec 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1527,9 +1527,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_usrmsg_add_var(&usrmsg, "iam_fwd_ind_isdn_access_ind", var); } - if ((var = channel_get_variable(session, var_event, "freetdm_iam_loc_pres"))) { - ftdm_usrmsg_add_var(&usrmsg, "iam_loc_pres", var); - } if ((var = channel_get_variable(session, var_event, "freetdm_bearer_capability"))) { caller_data.bearer_capability = (uint8_t)atoi(var); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index c25597cd40..fde1278b15 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -248,15 +248,10 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; - - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_loc_pres"); - if (!ftdm_strlen_zero(val)) { - if (!strcasecmp(val, "false")) { - pres_val = NOTPRSNT; - } + if (!strcasecmp(caller_data->loc.digits, "NULL")) { + pres_val = NOTPRSNT; } - locPtyNum->eh.pres = pres_val; locPtyNum->natAddrInd.pres = pres_val; locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; From 71c3cf365aa724eed3429ffc736674bf1c77cd4a Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 26 Jan 2012 19:25:04 -0500 Subject: [PATCH 127/493] FreeTDM: adding sip_h_X-FreeTDM-RDNIS-Presentation in redirecting number to give the ability to change RDNIS Presentation value for Transparent IAM --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index fde1278b15..2088f240b6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -444,6 +444,13 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red return FTDM_FAIL; } } else { + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_pres_ind"); + if (!ftdm_strlen_zero(val)) { + redirgNum->presRest.val = atoi(val); + } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Address Presentation Restricted Ind:%d\n", redirgNum->presRest.val); + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Number\n"); return FTDM_SUCCESS; } From 23a328389b6bbfa905501ca907de6e2cf91a700e Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 22:44:19 -0500 Subject: [PATCH 128/493] freetdm: Initial attempt to bridge natively SS7 signaling between 2 channels --- libs/freetdm/src/ftdm_io.c | 71 +++- .../ftmod_sangoma_ss7_main.c | 397 +++++++++++++++++- .../ftmod_sangoma_ss7_main.h | 7 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 61 ++- libs/freetdm/src/include/private/ftdm_core.h | 6 + libs/freetdm/src/include/private/ftdm_types.h | 2 + 6 files changed, 491 insertions(+), 53 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 8b179ccf05..6ebe5fc161 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -53,8 +53,6 @@ struct tm *localtime_r(const time_t *clock, struct tm *result); #endif #define FORCE_HANGUP_TIMER 30000 -#define SPAN_PENDING_CHANS_QUEUE_SIZE 1000 -#define SPAN_PENDING_SIGNALS_QUEUE_SIZE 1000 #define FTDM_READ_TRACE_INDEX 0 #define FTDM_WRITE_TRACE_INDEX 1 #define MAX_CALLIDS 6000 @@ -2201,6 +2199,12 @@ static ftdm_status_t _ftdm_channel_call_hangup_nl(const char *file, const char * { ftdm_status_t status = FTDM_SUCCESS; + if (ftdm_test_flag(chan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + ftdm_log_chan_ex(chan, file, func, line, FTDM_LOG_LEVEL_DEBUG, + "Ignoring hangup in channel in state %s (native bridge enabled)\n", ftdm_channel_state2str(chan->state)); + goto done; + } + if (chan->state != FTDM_CHANNEL_STATE_DOWN) { if (chan->state == FTDM_CHANNEL_STATE_HANGUP) { /* make user's life easier, and just ignore double hangup requests */ @@ -2227,6 +2231,8 @@ static ftdm_status_t _ftdm_channel_call_hangup_nl(const char *file, const char * ftdm_channel_close(&chan); } } + +done: return status; } @@ -2322,6 +2328,15 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_call_indicate(const char *file, const ch ftdm_channel_lock(ftdmchan); + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, + "Ignoring indication %s in channel in state %s (native bridge enabled)\n", + ftdm_channel_indication2str(indication), + ftdm_channel_state2str(ftdmchan->state)); + status = FTDM_SUCCESS; + goto done; + } + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_IND_ACK_PENDING)) { ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_WARNING, "Cannot indicate %s in channel with indication %s still pending in state %s\n", ftdm_channel_indication2str(indication), @@ -2422,10 +2437,50 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_reset(const char *file, const char *func return FTDM_SUCCESS; } +FT_DECLARE(ftdm_status_t) ftdm_get_channel_from_string(const char *string_id, ftdm_span_t **out_span, ftdm_channel_t **out_channel) +{ + ftdm_status_t status = FTDM_SUCCESS; + int rc = 0; + ftdm_span_t *span = NULL; + ftdm_channel_t *ftdmchan = NULL; + unsigned span_id = 0; + unsigned chan_id = 0; + + *out_span = NULL; + *out_channel = NULL; + + rc = sscanf(string_id, "%u:%u", &span_id, &chan_id); + if (rc != 2) { + ftdm_log(FTDM_LOG_ERROR, "Failed to parse channel id string '%s'\n", string_id); + status = FTDM_EINVAL; + goto done; + } + + status = ftdm_span_find(span_id, &span); + if (status != FTDM_SUCCESS || !span) { + ftdm_log(FTDM_LOG_ERROR, "Failed to find span for channel id string '%s'\n", string_id); + status = FTDM_EINVAL; + goto done; + } + + if (chan_id > (FTDM_MAX_CHANNELS_SPAN+1) || !(ftdmchan = span->channels[chan_id])) { + ftdm_log(FTDM_LOG_ERROR, "Invalid channel id string '%s'\n", string_id); + status = FTDM_EINVAL; + goto done; + } + + status = FTDM_SUCCESS; + *out_span = span; + *out_channel = ftdmchan; +done: + return status; +} + /* this function MUST be called with the channel lock held with lock recursivity of 1 exactly, * and the caller must be aware we might unlock the channel for a brief period of time and then lock it again */ static ftdm_status_t _ftdm_channel_call_place_nl(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan, ftdm_usrmsg_t *usrmsg) { + const char *var = NULL; ftdm_status_t status = FTDM_FAIL; ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "null channel"); @@ -2461,6 +2516,17 @@ static ftdm_status_t _ftdm_channel_call_place_nl(const char *file, const char *f ftdm_set_flag(ftdmchan, FTDM_CHANNEL_CALL_STARTED); ftdm_call_set_call_id(ftdmchan, &ftdmchan->caller_data); + var = ftdm_usrmsg_get_var(usrmsg, "sigbridge_peer"); + if (var) { + ftdm_span_t *peer_span = NULL; + ftdm_channel_t *peer_chan = NULL; + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "enabling native signaling bridge!\n"); + ftdm_set_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE); + ftdm_get_channel_from_string(var, &peer_span, &peer_chan); + if (peer_chan) { + ftdm_set_flag(peer_chan, FTDM_CHANNEL_NATIVE_SIGBRIDGE); + } + } /* if the signaling stack left the channel in state down on success, is expecting us to move to DIALING */ if (ftdmchan->state == FTDM_CHANNEL_STATE_DOWN) { @@ -2662,6 +2728,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan) ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_ANSWERED); ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_USER_HANGUP); ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA); + ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE); ftdm_mutex_lock(ftdmchan->pre_buffer_mutex); ftdm_buffer_destroy(&ftdmchan->pre_buffer); ftdmchan->pre_buffer_size = 0; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 96b662bdbb..dddb0b2bef 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -55,6 +55,7 @@ ftdm_sngss7_data_t g_ftdm_sngss7_data; /* PROTOTYPES *****************************************************************/ static void *ftdm_sangoma_ss7_run (ftdm_thread_t * me, void *obj); static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_event); +static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, sngss7_event_data_t *sngss7_event); static ftdm_status_t ftdm_sangoma_ss7_stop (ftdm_span_t * span); static ftdm_status_t ftdm_sangoma_ss7_start (ftdm_span_t * span); @@ -338,9 +339,10 @@ static void handle_hw_alarm(ftdm_event_t *e) /* MONITIOR THREADS ***********************************************************/ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) { - ftdm_interrupt_t *ftdm_sangoma_ss7_int[2]; + ftdm_interrupt_t *ftdm_sangoma_ss7_int[3]; ftdm_span_t *ftdmspan = (ftdm_span_t *) obj; ftdm_channel_t *ftdmchan = NULL; + ftdm_channel_t *peerchan = NULL; ftdm_event_t *event = NULL; sngss7_event_data_t *sngss7_event = NULL; sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data; @@ -365,6 +367,12 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) goto ftdm_sangoma_ss7_run_exit; } + /* get an interrupt queue for this span for peer channel events */ + if (ftdm_queue_get_interrupt (sngss7_span->peer_chans, &ftdm_sangoma_ss7_int[2]) != FTDM_SUCCESS) { + SS7_CRITICAL ("Failed to get a ftdm_interrupt for span = %d for peer channel events queue!\n", ftdmspan->span_id); + goto ftdm_sangoma_ss7_run_exit; + } + while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { int x = 0; if (b_alarm_test) { @@ -395,7 +403,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) } /* check the channel state queue for an event*/ - switch ((ftdm_interrupt_multiple_wait(ftdm_sangoma_ss7_int, 2, 100))) { + switch ((ftdm_interrupt_multiple_wait(ftdm_sangoma_ss7_int, ftdm_array_len(ftdm_sangoma_ss7_int), 100))) { /**********************************************************************/ case FTDM_SUCCESS: /* process all pending state changes */ @@ -412,6 +420,31 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) ftdm_mutex_unlock (ftdmchan->mutex); } + /* clean out all peer pending channel events */ + while ((peerchan = ftdm_queue_dequeue (sngss7_span->peer_chans))) { + /* note that the channels being dequeued here may not belong to this span + they may belong to just about any other span that one of our channels + happens to be bridged to */ + sngss7_chan_data_t *peer_info = peerchan->call_data; + sngss7_chan_data_t *chan_info = peer_info->peer_data; + ftdmchan = chan_info->ftdmchan; + + /* + if there is any state changes at all, those will be done in the opposite channel + to peerchan (where the original event was received), therefore we must lock ftdmchan, + but do not need to lock peerchan as we only read its event queue, which is already + locked when dequeueing */ + ftdm_channel_lock(ftdmchan); + + /* clean out all pending stack events in the peer channel */ + while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) { + ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); + ftdm_safe_free(sngss7_event); + } + + ftdm_channel_lock(ftdmchan); + } + /* clean out all pending stack events */ while ((sngss7_event = ftdm_queue_dequeue(sngss7_span->event_queue))) { ftdm_sangoma_ss7_process_stack_event(sngss7_event); @@ -522,24 +555,60 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev /* now that we have the right channel ... put a lock on it so no-one else can use it */ ftdm_channel_lock(ftdmchan); - if (sngss7_info->event_queue) { - if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { - /* this is the first event in a call, flush the event queue */ - while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); - ftdm_safe_free(event_clone); - } - } - /* clone the event and save it for later usage */ - event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); - if (event_clone) { - memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); - ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); + /* while there's a state change present on this channel process it */ + ftdm_channel_advance_states(ftdmchan); + + if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { + /* this is the first event in a call, flush the event queue */ + while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { + SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); + ftdm_safe_free(event_clone); } } - /* while there's a state change present on this channel process it */ - ftdm_channel_advance_states(ftdmchan); + /* clone the event and save it for later usage */ + event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); + if (event_clone) { + memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); + ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); + if (sngss7_info->peer_data) { + sngss7_span_data_t *sngss7_peer_span = (sngss7_span_data_t *)sngss7_info->peer_data->ftdmchan->span->signal_data; + /* we already have a peer attached, wake him up */ + ftdm_queue_enqueue(sngss7_peer_span->peer_chans, sngss7_info->ftdmchan); + } + } + + /* we could test for sngss7_info->peer_data too, bit this flag is set earlier, the earlier we know the better */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + /* most messages are simply relayed in sig bridge mode, except for hangup which requires state changing */ + switch (sngss7_event->event_id) { + case SNGSS7_REL_IND_EVENT: + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); + break; + case SNGSS7_REL_CFM_EVENT: + { + ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + if (peer_chan) { + /* we need to unlock our chan or we risk deadlock */ + ftdm_channel_advance_states(ftdmchan); + ftdm_channel_unlock(ftdmchan); + + ftdm_channel_lock(peer_chan); + if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + } + ftdm_channel_unlock(peer_chan); + + ftdm_channel_lock(ftdmchan); + } + } + break; + default: + break; + } + goto done; + } /* figure out the type of event and send it to the right handler */ switch (sngss7_event->event_id) { @@ -602,6 +671,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev /**************************************************************************/ } +done: /* while there's a state change present on this channel process it */ ftdm_channel_advance_states(ftdmchan); @@ -610,8 +680,290 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev } +FTDM_ENUM_NAMES(SNG_EVENT_TYPE_NAMES, SNG_EVENT_TYPE_STRINGS) +FTDM_STR2ENUM(ftdm_str2sngss7_event, ftdm_sngss7_event2str, sng_event_type_t, SNG_EVENT_TYPE_NAMES, SNGSS7_INVALID_EVENT) +static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, sngss7_event_data_t *sngss7_event) +{ + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (ftdmchan->state < FTDM_CHANNEL_STATE_UP) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); + ftdm_channel_advance_states(ftdmchan); + } + + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Relaying message %s from bridged peer\n", + sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + + switch (sngss7_event->event_id) { + + case (SNGSS7_CON_IND_EVENT): + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Rx IAM (bridged)??\n", sngss7_info->circuit->cic); + break; + + case (SNGSS7_CON_CFM_EVENT): + /* send the ANM request to LibSngSS7 */ + sng_cc_con_response(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siConEvnt, + 5); + + SS7_INFO_CHAN(ftdmchan, "[CIC:%d]Tx peer ANM\n", sngss7_info->circuit->cic); + break; + + case (SNGSS7_CON_STA_EVENT): + switch (sngss7_event->evntType) { + /**************************************************************************/ + case (ADDRCMPLT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer ACM\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (MODIFY): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer MODIFY\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (MODCMPLT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer MODIFY-COMPLETE\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (MODREJ): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer MODIFY-REJECT\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (PROGRESS): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CPG\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (FRWDTRSFR): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer FOT\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (INFORMATION): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer INF\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (INFORMATREQ): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer INR\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (SUBSADDR): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer SAM\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (EXIT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer EXIT\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (NETRESMGT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer NRM\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (IDENTREQ): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer IDR\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (IDENTRSP): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer IRS\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (MALCLLPRNT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer MALICIOUS CALL\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (CHARGE): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CRG\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (TRFFCHGE): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CRG-TARIFF\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (CHARGEACK): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CRG-ACK\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (CALLOFFMSG): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CALL-OFFER\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (LOOPPRVNT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer LOP\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (TECT_TIMEOUT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer ECT-Timeout\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (RINGSEND): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer RINGING-SEND\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (CALLCLEAR): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CALL-LINE Clear\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (PRERELEASE): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer PRI\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (APPTRANSPORT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer APM\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (OPERATOR): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer OPERATOR\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (METPULSE): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer METERING-PULSE\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (CLGPTCLR): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer CALLING_PARTY_CLEAR\n", sngss7_info->circuit->cic); + break; + /**************************************************************************/ + case (SUBDIRNUM): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer SUB-DIR\n", sngss7_info->circuit->cic); + break; +#ifdef SANGOMA_SPIROU + case (CHARGE_ACK): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer TXA\n", sngss7_info->circuit->cic); + break; + case (CHARGE_UNIT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer ITX\n", sngss7_info->circuit->cic); + break; +#endif + /**************************************************************************/ + default: + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer Unknown Msg %d\n", sngss7_info->circuit->cic, sngss7_event->evntType); + break; + /**************************************************************************/ + } + sng_cc_con_status (1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siCnStEvnt, + sngss7_event->evntType); + + break; + /**************************************************************************/ + case (SNGSS7_REL_IND_EVENT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer REL cause=%d\n", sngss7_info->circuit->cic, sngss7_event->event.siRelEvnt.causeDgn.causeVal.val); + + //handle_rel_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siRelEvnt); + sng_cc_rel_request (1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siRelEvnt); + break; + + /**************************************************************************/ + case (SNGSS7_REL_CFM_EVENT): + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer RLC\n", sngss7_info->circuit->cic); + sng_cc_rel_response (1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siRelEvnt); + //handle_rel_cfm(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siRelEvnt); + break; + + /**************************************************************************/ + case (SNGSS7_DAT_IND_EVENT): + //handle_dat_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siInfoEvnt); + break; + /**************************************************************************/ + case (SNGSS7_FAC_IND_EVENT): + //handle_fac_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->evntType, &sngss7_event->event.siFacEvnt); + break; + /**************************************************************************/ + case (SNGSS7_FAC_CFM_EVENT): + //handle_fac_cfm(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->evntType, &sngss7_event->event.siFacEvnt); + break; + /**************************************************************************/ + case (SNGSS7_UMSG_IND_EVENT): + //handle_umsg_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit); + break; + /**************************************************************************/ + case (SNGSS7_STA_IND_EVENT): + //handle_sta_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->globalFlg, sngss7_event->evntType, &sngss7_event->event.siStaEvnt); + break; + /**************************************************************************/ + case (SNGSS7_SUSP_IND_EVENT): + //handle_susp_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siSuspEvnt); + break; + /**************************************************************************/ + case (SNGSS7_RESM_IND_EVENT): + //handle_resm_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siResmEvnt); + break; + /**************************************************************************/ + case (SNGSS7_SSP_STA_CFM_EVENT): + SS7_ERROR("dazed and confused ... hu?!\n"); + break; + /**************************************************************************/ + default: + SS7_ERROR("Unknown Event Id!\n"); + break; + /**************************************************************************/ + } + +} + +static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t *ftdmchan); +static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t *ftdmchan) +{ + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + ftdm_channel_complete_state(ftdmchan); + + switch (ftdmchan->state) { + + case FTDM_CHANNEL_STATE_DOWN: + { + /* both peers come here after the channel processing the RLC moves the pair to DOWN */ + ftdm_channel_t *close_chan = ftdmchan; + + /* detach native bridging if needed (only the outbound leg is responsible for that to avoid races or messy locks) */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { + sngss7_chan_data_t *peer_info = sngss7_info->peer_data; + sngss7_info->peer_data = NULL; + if (peer_info) { + peer_info->peer_data = NULL; + } + } + + /* close the channel */ + ftdm_channel_close (&close_chan); + } + break; + + case FTDM_CHANNEL_STATE_UP: + { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { + sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_UP); + } + } + break; + + case FTDM_CHANNEL_STATE_TERMINATING: + { + /* when receiving REL we move to TERMINATING and notify the user that the bridge is ending */ + sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_STOP); + } + break; + + default: + break; + } + + return FTDM_SUCCESS; +} + /******************************************************************************/ -ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) +ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) { sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; sng_isup_inf_t *isup_intf = NULL; @@ -623,6 +975,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan) sngss7_info->ckt_flags, sngss7_info->blk_flags); + if (sngss7_info->peer_data) { + return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan); + } /*check what state we are supposed to be in */ switch (ftdmchan->state) { @@ -1940,6 +2295,12 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) return FTDM_FAIL; } + /* create an peer channel queue for this span */ + if ((ftdm_queue_create(&(ss7_span_info)->peer_chans, SPAN_PENDING_CHANS_QUEUE_SIZE)) != FTDM_SUCCESS) { + SS7_CRITICAL("Unable to create peer chans queue!\n"); + return FTDM_FAIL; + } + /*setup the span structure with the info so far */ g_ftdm_sngss7_data.sig_cb = sig_cb; span->start = ftdm_sangoma_ss7_start; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 2fc6f740c7..7404a8e55d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -81,8 +81,12 @@ typedef enum { SNGSS7_STA_IND_EVENT, SNGSS7_SUSP_IND_EVENT, SNGSS7_RESM_IND_EVENT, - SNGSS7_SSP_STA_CFM_EVENT + SNGSS7_SSP_STA_CFM_EVENT, + SNGSS7_INVALID_EVENT, } sng_event_type_t; +#define SNG_EVENT_TYPE_STRINGS "CON_IND", "CON_CFM", "CON_STA", "REL_IND", "REL_CFM", "DAT_IND", "FAC_IND", \ + "FAC_CFM", "UMSG_IND", "STA_IND", "SUSP_IND", "RESM_IND", "SSP_STA_CFM", "INVALID" +FTDM_STR2ENUM_P(ftdm_str2sngss7_event, ftdm_sngss7_event2str, sng_event_type_t) typedef enum { SNG_BIT_A = (1 << 0), @@ -500,6 +504,7 @@ typedef struct sngss7_span_data { sngss7_group_data_t rx_cgu; sngss7_group_data_t tx_cgu; ftdm_queue_t *event_queue; + ftdm_queue_t *peer_chans; } sngss7_span_data_t; typedef struct sngss7_event_data diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index eda03715f3..96ec5afae9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -58,45 +58,39 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); if (!ftdm_strlen_zero(var)) { - ftdm_status_t status = FTDM_SUCCESS; - int rc = 0; ftdm_span_t *peer_span = NULL; ftdm_channel_t *peer_chan = NULL; sngss7_chan_data_t *peer_info = NULL; - unsigned peer_span_id = 0; - unsigned peer_chan_id = 0; - rc = sscanf(var, "%u:%u", &peer_span_id, &peer_chan_id); - if (rc != 2) { - SS7_ERROR_CHAN(ftdmchan, "Failed to parse sigbridge_peer string '%s'\n", var); + + ftdm_get_channel_from_string(var, &peer_span, &peer_chan); + if (!peer_chan) { + SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var); } else { - status = ftdm_span_find(peer_span_id, &peer_span); - if (status != FTDM_SUCCESS || !peer_span) { - SS7_ERROR_CHAN(ftdmchan, "Failed to find peer span for channel id '%u:%u'\n", peer_span_id, peer_chan_id); - } else if (peer_span->signal_type != FTDM_SIGTYPE_SS7) { - SS7_ERROR_CHAN(ftdmchan, "Peer channel %d:%d has different signaling type %d'\n", - peer_span_id, peer_chan_id, peer_span->signal_type); + if (peer_span->signal_type != FTDM_SIGTYPE_SS7) { + SS7_ERROR_CHAN(ftdmchan, "Peer channel '%s' has different signaling type %d'\n", + var, peer_span->signal_type); } else { - if (peer_chan_id > (FTDM_MAX_CHANNELS_SPAN+1) || !(peer_chan = peer_span->channels[peer_chan_id])) { - SS7_ERROR_CHAN(ftdmchan, "Invalid peer channel id '%u:%u'\n", peer_span_id, peer_chan_id); - } else { - sngss7_event_data_t *event_clone = NULL; - peer_info = peer_chan->call_data; - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", - sngss7_info->circuit->cic, peer_info->circuit->cic); - /* make each one of us aware of the native bridge */ - peer_info->peer_data = sngss7_info; - sngss7_info->peer_data = peer_info; - /* flush our own queue */ - while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); - ftdm_safe_free(event_clone); - } + sngss7_event_data_t *event_clone = NULL; + peer_info = peer_chan->call_data; + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", + sngss7_info->circuit->cic, peer_info->circuit->cic); + /* make each one of us aware of the native bridge */ + peer_info->peer_data = sngss7_info; + sngss7_info->peer_data = peer_info; + /* flush our own queue */ + while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { + SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); + ftdm_safe_free(event_clone); } + /* go up until release comes, note that state processing is done different and much simpler when there is a peer */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); + ftdm_channel_advance_states(ftdmchan); } } } if (sngss7_info->peer_data) { + sngss7_span_data_t *span_data = ftdmchan->span->signal_data; sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); /* Retrieve IAM from our peer */ if (!event_clone) { @@ -108,6 +102,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged)\n", sngss7_info->circuit->cic); memcpy(&iam, &event_clone->event.siConEvnt, sizeof(iam)); } + /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, + this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ + ftdm_queue_enqueue(span_data->peer_chans, sngss7_info->peer_data->ftdmchan); } else if (sngss7_info->circuit->transparent_iam && sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic); @@ -322,10 +319,10 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan) /* send the REL request to LibSngSS7 */ sng_cc_rel_request (1, - sngss7_info->suInstId, - sngss7_info->spInstId, - sngss7_info->circuit->id, - &rel); + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &rel); SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx REL cause=%d \n", sngss7_info->circuit->cic, diff --git a/libs/freetdm/src/include/private/ftdm_core.h b/libs/freetdm/src/include/private/ftdm_core.h index f27be789e2..4150480297 100644 --- a/libs/freetdm/src/include/private/ftdm_core.h +++ b/libs/freetdm/src/include/private/ftdm_core.h @@ -130,6 +130,9 @@ extern "C" { #endif +#define SPAN_PENDING_CHANS_QUEUE_SIZE 1000 +#define SPAN_PENDING_SIGNALS_QUEUE_SIZE 1000 + #define GOTO_STATUS(label,st) status = st; goto label ; #define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1) @@ -686,6 +689,9 @@ FT_DECLARE(ftdm_status_t) ftdm_sigmsg_remove_var(ftdm_sigmsg_t *sigmsg, const ch */ FT_DECLARE(ftdm_status_t) ftdm_sigmsg_set_raw_data(ftdm_sigmsg_t *sigmsg, void *data, ftdm_size_t datalen); +/*! \brief Retrieve a span and channel data structure from a string in the format 'span_id:chan_id'*/ +FT_DECLARE(ftdm_status_t) ftdm_get_channel_from_string(const char *string_id, ftdm_span_t **out_span, ftdm_channel_t **out_channel); + /*! \brief Assert condition */ diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 6df25fe4d2..17e273c425 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -265,6 +265,8 @@ typedef enum { #define FTDM_CHANNEL_BLOCKING (1ULL << 35) /*!< Media is digital */ #define FTDM_CHANNEL_DIGITAL_MEDIA (1ULL << 36) +/*!< Native signaling bridge is enabled */ +#define FTDM_CHANNEL_NATIVE_SIGBRIDGE (1ULL << 37) #include "ftdm_state.h" From f2cdb8c6c75039f431ea51964f0542a73f56fde3 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 23:31:29 -0500 Subject: [PATCH 129/493] freetdm: Fixes for native signaling bridge (now tested, and works for basic call flows) - Fix typo when unlocking channel that resulted in deadlock - Defer clearing of the peer data until it is completely safe (next call) --- libs/freetdm/src/ftdm_state.c | 5 ++++ .../ftmod_sangoma_ss7_main.c | 24 +++++++------------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 6572ab75a4..30ef3ce478 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -263,6 +263,9 @@ static ftdm_status_t ftdm_core_set_state(const char *file, const char *func, int } } + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + goto perform_state_change; + } if (ftdmchan->span->state_map) { ok = ftdm_parse_state_map(ftdmchan, state, ftdmchan->span->state_map); @@ -354,6 +357,8 @@ end: goto done; } +perform_state_change: + ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Changed state from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state)); ftdmchan->last_state = ftdmchan->state; ftdmchan->state = state; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index dddb0b2bef..968e557acc 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -441,8 +441,8 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); ftdm_safe_free(sngss7_event); } - - ftdm_channel_lock(ftdmchan); + + ftdm_channel_unlock(ftdmchan); } /* clean out all pending stack events */ @@ -564,6 +564,8 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); ftdm_safe_free(event_clone); } + /* clear the peer if any */ + sngss7_info->peer_data = NULL; } /* clone the event and save it for later usage */ @@ -596,7 +598,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ftdm_channel_lock(peer_chan); if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); } ftdm_channel_unlock(peer_chan); @@ -923,19 +925,7 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t case FTDM_CHANNEL_STATE_DOWN: { - /* both peers come here after the channel processing the RLC moves the pair to DOWN */ ftdm_channel_t *close_chan = ftdmchan; - - /* detach native bridging if needed (only the outbound leg is responsible for that to avoid races or messy locks) */ - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { - sngss7_chan_data_t *peer_info = sngss7_info->peer_data; - sngss7_info->peer_data = NULL; - if (peer_info) { - peer_info->peer_data = NULL; - } - } - - /* close the channel */ ftdm_channel_close (&close_chan); } break; @@ -975,6 +965,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) sngss7_info->ckt_flags, sngss7_info->blk_flags); + if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALING) { + sngss7_info->peer_data = NULL; + } + if (sngss7_info->peer_data) { return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan); } From 1aa4f87b6acd16a3a75f84f611af189725a696eb Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 26 Jan 2012 23:51:21 -0500 Subject: [PATCH 130/493] freetdm: Tweaks to SS7 native bridge feature - Enable native bridge also when receiving the UUID via SIP header - Remove some debug CRIT messages and set a more proper log level --- libs/freetdm/mod_freetdm/mod_freetdm.c | 38 ++++++++++++------- libs/freetdm/src/ftdm_io.c | 1 - .../ftmod_sangoma_ss7_main.c | 2 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 1 - 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index a007fef081..2bbcdf97e4 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1260,6 +1260,9 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *var; const char *dest_num = NULL, *callerid_num = NULL; const char *network_peer_uuid = NULL; + char sigbridge_peer[255]; + switch_channel_t *peer_chan = NULL; + switch_channel_t *our_chan = NULL; ftdm_hunting_scheme_t hunting; ftdm_usrmsg_t usrmsg; @@ -1613,17 +1616,22 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } + our_chan = switch_core_session_get_channel(*new_session); + if (network_peer_uuid) { switch_core_session_t *network_peer = switch_core_session_locate(network_peer_uuid); if (network_peer) { - const char *my_uuid = switch_core_session_get_uuid(*new_session); - private_t *peer_private = switch_core_session_get_private(network_peer); - switch_set_string(tech_pvt->network_peer_uuid, network_peer_uuid); - switch_set_string(peer_private->network_peer_uuid, my_uuid); + const char *my_uuid = switch_core_session_get_uuid(*new_session); + private_t *peer_private = switch_core_session_get_private(network_peer); + switch_set_string(tech_pvt->network_peer_uuid, network_peer_uuid); + switch_set_string(peer_private->network_peer_uuid, my_uuid); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Session %s is network-bridged with %s\n", my_uuid, network_peer_uuid); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Session %s is network-bridged with %s\n", + my_uuid, network_peer_uuid); - switch_core_session_rwunlock(network_peer); + snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", + ftdm_channel_get_span_id(peer_private->ftdmchan), ftdm_channel_get_id(peer_private->ftdmchan)); + switch_core_session_rwunlock(network_peer); } } @@ -1642,15 +1650,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) && switch_true(var) && switch_core_session_compare(*new_session, session)) { - char sigbridge_peer[255]; private_t *peer_pvt = switch_core_session_get_private(session); - switch_channel_t *peer_chan = switch_core_session_get_channel(session); - switch_channel_t *our_chan = switch_core_session_get_channel(*new_session); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, - "Bridging native signaling of channel %s to channel %s\n", - switch_channel_get_name(peer_chan), switch_channel_get_name(our_chan)); snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); + } + + if (!zstr(sigbridge_peer)) { + peer_chan = switch_core_session_get_channel(session); ftdm_usrmsg_add_var(&usrmsg, "sigbridge_peer", sigbridge_peer); } @@ -1669,7 +1675,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi } else { cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } - goto fail; + goto fail; + } + + if (our_chan && peer_chan) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "Bridging native signaling of channel %s to channel %s\n", + switch_channel_get_name(peer_chan), switch_channel_get_name(our_chan)); } return SWITCH_CAUSE_SUCCESS; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 6ebe5fc161..3b11611d49 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2520,7 +2520,6 @@ static ftdm_status_t _ftdm_channel_call_place_nl(const char *file, const char *f if (var) { ftdm_span_t *peer_span = NULL; ftdm_channel_t *peer_chan = NULL; - ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "enabling native signaling bridge!\n"); ftdm_set_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE); ftdm_get_channel_from_string(var, &peer_span, &peer_chan); if (peer_chan) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 968e557acc..24f612545f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -693,7 +693,7 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, ftdm_channel_advance_states(ftdmchan); } - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Relaying message %s from bridged peer\n", + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Relaying message %s from bridged peer\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); switch (sngss7_event->event_id) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 59cb6a4f53..cc66365593 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -79,7 +79,6 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) sngss7_info->peer_data = peer_info; /* flush our own queue */ while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); ftdm_safe_free(event_clone); } /* go up until release comes, note that state processing is done different and much simpler when there is a peer */ From a83f04ab6a7e2f8276f6e280c8b1eeb578897a5a Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 00:13:59 -0500 Subject: [PATCH 131/493] freetdm: Relay the rest of SS7 messages supported by libsng_ss7 when in native bridge mode --- .../ftmod_sangoma_ss7_main.c | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 24f612545f..06ddd7e8d1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -561,7 +561,6 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { /* this is the first event in a call, flush the event queue */ while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic); ftdm_safe_free(event_clone); } /* clear the peer if any */ @@ -693,13 +692,13 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, ftdm_channel_advance_states(ftdmchan); } - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Relaying message %s from bridged peer\n", + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Receiving message %s from bridged peer\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); switch (sngss7_event->event_id) { case (SNGSS7_CON_IND_EVENT): - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Rx IAM (bridged)??\n", sngss7_info->circuit->cic); + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Rx IAM while bridged??\n", sngss7_info->circuit->cic); break; case (SNGSS7_CON_CFM_EVENT): @@ -876,18 +875,48 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, /**************************************************************************/ case (SNGSS7_DAT_IND_EVENT): //handle_dat_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siInfoEvnt); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + sng_cc_dat_request(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siInfoEvnt); break; /**************************************************************************/ case (SNGSS7_FAC_IND_EVENT): - //handle_fac_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->evntType, &sngss7_event->event.siFacEvnt); + //handle_fac_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->evntType, + //&sngss7_event->event.siFacEvnt); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s -> %d\n", sngss7_info->circuit->cic, + ftdm_sngss7_event2str(sngss7_event->event_id), sngss7_event->evntType); + sng_cc_fac_request(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + sngss7_event->evntType, + &sngss7_event->event.siFacEvnt); + break; /**************************************************************************/ case (SNGSS7_FAC_CFM_EVENT): - //handle_fac_cfm(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, sngss7_event->evntType, &sngss7_event->event.siFacEvnt); + //handle_fac_cfm(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, + //sngss7_event->evntType, &sngss7_event->event.siFacEvnt); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s -> %d\n", sngss7_info->circuit->cic, + ftdm_sngss7_event2str(sngss7_event->event_id), sngss7_event->evntType); + sng_cc_fac_response(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + sngss7_event->evntType, + &sngss7_event->event.siFacEvnt); break; /**************************************************************************/ case (SNGSS7_UMSG_IND_EVENT): //handle_umsg_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + sng_cc_umsg_request (1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id); break; /**************************************************************************/ case (SNGSS7_STA_IND_EVENT): @@ -896,18 +925,30 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, /**************************************************************************/ case (SNGSS7_SUSP_IND_EVENT): //handle_susp_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siSuspEvnt); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + sng_cc_susp_request (1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siSuspEvnt); break; /**************************************************************************/ case (SNGSS7_RESM_IND_EVENT): //handle_resm_ind(sngss7_event->suInstId, sngss7_event->spInstId, sngss7_event->circuit, &sngss7_event->event.siResmEvnt); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx peer %s\n", sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + sng_cc_resm_request(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &sngss7_event->event.siResmEvnt); break; /**************************************************************************/ case (SNGSS7_SSP_STA_CFM_EVENT): - SS7_ERROR("dazed and confused ... hu?!\n"); + SS7_CRITICAL("dazed and confused ... hu?!\n"); break; /**************************************************************************/ default: - SS7_ERROR("Unknown Event Id!\n"); + SS7_ERROR("Failed to relay unknown event id %d!\n", sngss7_event->event_id); break; /**************************************************************************/ } From 2db41c5c793fd18acd25b0cd22499d7b1406b88e Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 06:34:36 -0500 Subject: [PATCH 132/493] freetdm: Fix uninitialized var leading to segfault --- libs/freetdm/mod_freetdm/mod_freetdm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 2bbcdf97e4..a180f03fef 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1267,6 +1267,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_usrmsg_t usrmsg; memset(&usrmsg, 0, sizeof(ftdm_usrmsg_t)); + memset(sigbridge_peer, 0, sizeof(sigbridge_peer)); if (!outbound_profile) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing caller profile\n"); @@ -1655,7 +1656,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); } - if (!zstr(sigbridge_peer)) { + if (session && !zstr(sigbridge_peer)) { peer_chan = switch_core_session_get_channel(session); ftdm_usrmsg_add_var(&usrmsg, "sigbridge_peer", sigbridge_peer); } From 0ff8a087c616177f0162d4acab6bf7be2e60aa4a Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 06:44:11 -0500 Subject: [PATCH 133/493] freetdm: Fix incorrect state transition from DOWN to UP when processing an SS7 clone event --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 06ddd7e8d1..bcc21df7be 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -687,13 +687,13 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, { sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; - if (ftdmchan->state < FTDM_CHANNEL_STATE_UP) { + if (ftdmchan->state < FTDM_CHANNEL_STATE_UP && ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) { ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); ftdm_channel_advance_states(ftdmchan); } - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Receiving message %s from bridged peer\n", - sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id)); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Receiving message %s from bridged peer (our state = %s)\n", + sngss7_info->circuit->cic, ftdm_sngss7_event2str(sngss7_event->event_id), ftdm_channel_state2str(ftdmchan->state)); switch (sngss7_event->event_id) { From de56f3c465d98bddb916a106092db94a8459d853 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 14:42:33 +0100 Subject: [PATCH 134/493] freetdm: spirou transparent IAM fix for called number --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index cc66365593..b9914337a5 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -98,8 +98,18 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* first message in the queue should ALWAYS be an IAM */ SS7_ERROR_CHAN(ftdmchan, "Invalid initial peer message type '%d'\n", event_clone->event_id); } else { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged)\n", sngss7_info->circuit->cic); + ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; + + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged, dialing %s)\n", sngss7_info->circuit->cic, caller_data->dnis.digits); + + /* copy original incoming IAM */ memcpy(&iam, &event_clone->event.siConEvnt, sizeof(iam)); + + /* Change DNIS to whatever was specified, do not change NADI or anything else! */ + copy_tknStr_to_sngss7(caller_data->dnis.digits, &iam.cdPtyNum.addrSig, &iam.cdPtyNum.oddEven); + + /* SPIROU certification hack + If the IAM contains */ } /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ From 572154693e3e972f50d4385ad3456f73e8235a69 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 16:21:53 +0100 Subject: [PATCH 135/493] freetdm: spirou certification specific changes about RDNIS/RDINF usage --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index b9914337a5..c1eef81d92 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -109,7 +109,31 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) copy_tknStr_to_sngss7(caller_data->dnis.digits, &iam.cdPtyNum.addrSig, &iam.cdPtyNum.oddEven); /* SPIROU certification hack - If the IAM contains */ + If the IAM already contain RDINF, just increment the count and set the RDNIS digits + otherwise, honor RDNIS and RDINF stuff coming from the user */ + if (iam.redirInfo.eh.pres == PRSNT_NODEF) { + const char *val = NULL; + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect info present\n", sngss7_info->circuit->cic); + if (iam.redirInfo.redirCnt.pres) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect count present = %d\n", sngss7_info->circuit->cic, iam.redirInfo.redirCnt.val); + iam.redirInfo.redirCnt.val++; + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect count incremented = %d\n", sngss7_info->circuit->cic, iam.redirInfo.redirCnt.val); + } + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_digits"); + if (!ftdm_strlen_zero(val)) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), found user supplied RDNIS digits = %s\n", sngss7_info->circuit->cic, val); + copy_tknStr_to_sngss7((char*)val, &iam.redirgNum.addrSig, &iam.redirgNum.oddEven); + } else { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), not found user supplied RDNIS digits\n", sngss7_info->circuit->cic); + } + } else { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect info not present, attempting to copy user supplied values\n", sngss7_info->circuit->cic); + /* Redirecting Number */ + copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); + + /* Redirecting Information */ + copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); + } } /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ From 3199513c96b0fef5cca09b283361da449ffedcad Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 16:22:45 +0100 Subject: [PATCH 136/493] freetdm: More spirou certification changes - Send RLC immediately even when in native bridge mode - Do not enqueue RLC coming from the network --- .../ftmod_sangoma_ss7_main.c | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index bcc21df7be..993ea68e5a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -567,18 +567,20 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev sngss7_info->peer_data = NULL; } - /* clone the event and save it for later usage */ - event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); - if (event_clone) { - memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); - ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); - if (sngss7_info->peer_data) { - sngss7_span_data_t *sngss7_peer_span = (sngss7_span_data_t *)sngss7_info->peer_data->ftdmchan->span->signal_data; - /* we already have a peer attached, wake him up */ - ftdm_queue_enqueue(sngss7_peer_span->peer_chans, sngss7_info->ftdmchan); + /* clone the event and save it for later usage, we do not clone RLC messages */ + if (sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { + event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); + if (event_clone) { + memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); + ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); + if (sngss7_info->peer_data) { + sngss7_span_data_t *sngss7_peer_span = (sngss7_span_data_t *)sngss7_info->peer_data->ftdmchan->span->signal_data; + /* we already have a peer attached, wake him up */ + ftdm_queue_enqueue(sngss7_peer_span->peer_chans, sngss7_info->ftdmchan); + } } } - + /* we could test for sngss7_info->peer_data too, bit this flag is set earlier, the earlier we know the better */ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { /* most messages are simply relayed in sig bridge mode, except for hangup which requires state changing */ @@ -981,6 +983,7 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t case FTDM_CHANNEL_STATE_TERMINATING: { + ft_to_sngss7_rlc(ftdmchan); /* when receiving REL we move to TERMINATING and notify the user that the bridge is ending */ sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_STOP); } From 8476d664656b9ffdb0cbb775d33d4ac4be53c039 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 27 Jan 2012 18:54:06 +0100 Subject: [PATCH 137/493] freetdm: Cancel ISUP T6 timer when using native bridge (Spirou certification fix) --- .../ftmod_sangoma_ss7_main.c | 59 +++++++++++++++++++ .../ftmod_sangoma_ss7_main.h | 2 + 2 files changed, 61 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 993ea68e5a..4c47ee0578 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -40,6 +40,13 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" +#include +#include +#include +#include +#include +#include +#include /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -567,6 +574,33 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev sngss7_info->peer_data = NULL; } + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + + if (sngss7_event->event_id == SNGSS7_SUSP_IND_EVENT) { + sngss7_set_ckt_flag(sngss7_info, FLAG_SUS_RECVD); + sngss7_clear_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + } + + if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && + !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) { + /* SPIROU cert, disable ISUP T6 when bridged natively */ + int trc = 0; + SiCon *siCon = NULL; + if (siFindSuInstId(sngss7_info->suInstId, &siCon) != RFAILED) { + if (siCon) { + trc = siStopConTmr(siCon, TMR_T6I); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Stopped T6 timer (%d)\n", sngss7_info->circuit->cic, trc); + sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + } else { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]siCon is null!\n", sngss7_info->circuit->cic); + } + } else { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); + } + } + + } + /* clone the event and save it for later usage, we do not clone RLC messages */ if (sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); @@ -955,6 +989,29 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, /**************************************************************************/ } + if ((sngss7_event->event_id == SNGSS7_SUSP_IND_EVENT)) { + sngss7_set_ckt_flag(sngss7_info, FLAG_SUS_RECVD); + } + + if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && + !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) { + /* SPIROU cert, disable ISUP T6 when bridged natively */ + int trc = 0; + SiCon *siCon = NULL; + if (siFindSuInstId(sngss7_info->suInstId, &siCon) != RFAILED) { + if (siCon) { + trc = siStopConTmr(siCon, TMR_T6I); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Stopped T6 timer (%d)\n", sngss7_info->circuit->cic, trc); + sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + } else { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]siCon is null!\n", sngss7_info->circuit->cic); + } + } else { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); + } + } + + } static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t *ftdmchan); @@ -969,6 +1026,8 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t case FTDM_CHANNEL_STATE_DOWN: { ftdm_channel_t *close_chan = ftdmchan; + sngss7_clear_ckt_flag(sngss7_info, FLAG_SUS_RECVD); + sngss7_clear_ckt_flag(sngss7_info, FLAG_T6_CANCELED); ftdm_channel_close (&close_chan); } break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 7404a8e55d..b5494bc174 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -550,6 +550,8 @@ typedef enum { FLAG_INFID_PAUSED = (1 << 15), FLAG_SENT_ACM = (1 << 16), FLAG_SENT_CPG = (1 << 17), + FLAG_SUS_RECVD = (1 << 18), + FLAG_T6_CANCELED = (1 << 19), FLAG_RELAY_DOWN = (1 << 30), FLAG_CKT_RECONFIG = (1 << 31) } sng_ckt_flag_t; From 777f946e2f0f02f058171c7c0e13a973d6bed837 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 10:28:08 -0500 Subject: [PATCH 138/493] freetdm: adding susp/resm/rels but not finished. disable t6 finished. --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 125 +++++++++++++++++- .../ftmod_sangoma_ss7_main.c | 27 ++-- 2 files changed, 142 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 2c8f5172b9..d738edb959 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -71,6 +71,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int chan, int verbose); static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose); +static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose); +static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose); +static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose); + static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose); static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int chan, int verbose); @@ -458,9 +462,49 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha goto handle_cli_error; /**********************************************************************/ } + + /**************************************************************************/ + /* sending resume for a ckt's call */ + } else if (!strcasecmp(argv[c], "resm") == FTDM_FAIL) { + if (check_arg_count(argc, 5) == FTDM_FAIL) { + goto handle_cli_error_argc; + } + + if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { + handle_tx_resm(stream, span, chan, verbose); + } else { + stream->write_function(stream, "Bad command format. \n"); + goto handle_cli_error_argc; + } + /**************************************************************************/ + /* sending resume for a ckt's call */ + } else if (!strcasecmp(argv[c], "rels")) { + if (check_arg_count(argc, 5) == FTDM_FAIL) { + goto handle_cli_error_argc; + } + + if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { + handle_tx_rels(stream, span, chan, verbose); + } else { + stream->write_function(stream, "Bad command format.\n"); + goto handle_cli_error_argc; + } + + /**************************************************************************/ + /* sending suspend for a ckt's call */ + } else if (!strcasecmp(argv[c], "susp")) { + if (check_arg_count(argc, 5) == FTDM_FAIL) { + goto handle_cli_error_argc; + } + + if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { + handle_tx_susp(stream, span, chan, verbose); + } else { + stream->write_function(stream, "Bad command format. \n"); + goto handle_cli_error_argc; + } /**************************************************************************/ } else if (!strcasecmp(argv[c], "blo")) { - /**************************************************************************/ if (check_arg_count(argc, 2)) goto handle_cli_error_argc; c++; @@ -1330,6 +1374,85 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, return FTDM_SUCCESS; } +static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose) +{ + SS7_ERROR("JZ error alert. handle_tx_resm \n"); + return FTDM_FAIL; +} +static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose) +{ + SS7_ERROR("JZ error alert. handle_tx_rels \n"); + return FTDM_FAIL; +} + +/******************************************************************************/ +static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose) +{ + int x; + sngss7_chan_data_t *ss7_info; + ftdm_channel_t *ftdmchan; + int lspan; + int lchan; + + SS7_ERROR("JZ error alert. handle_tx_susp \n"); + return FTDM_FAIL; + + x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; + while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; + ftdmchan = ss7_info->ftdmchan; + + /* if span == 0 then all spans should be printed */ + if (span == 0) { + lspan = ftdmchan->physical_span_id; + } else { + lspan = span; + } + + /* if chan == 0 then all chans should be printed */ + if (chan == 0) { + lchan = ftdmchan->physical_chan_id; + } else { + lchan = chan; + } + + if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) { + /* now that we have the right channel...put a lock on it so no-one else can use it */ + ftdm_mutex_lock(ftdmchan->mutex); + + /* check if there is a pending state change|give it a bit to clear */ + if (check_for_state_change(ftdmchan)) { + SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); + /* check if we need to die */ + ftdm_assert(0, "State change not completed\n"); + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + /* move to the next channel */ + continue; + } else { + /* throw the ckt block flag */ + sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); + + /* set the channel to suspended state */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + } + + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + + } /* if ( span and chan) */ + + } /* if ( cic != 0) */ + + /* go the next circuit */ + x++; + } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + + handle_show_blocks(stream, span, chan, verbose); + + return FTDM_SUCCESS; +} /******************************************************************************/ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 4c47ee0578..3f87ccf713 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -40,13 +40,6 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" -#include -#include -#include -#include -#include -#include -#include /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -583,6 +576,14 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) { + if (sng_cancel_isup_tmr(sngss7_info->suInstId, ISUP_T6i) == RFAILED ) { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not stop timer T6 \n", sngss7_info->circuit->cic); + } else { + sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic); + } + +#if 0 /* SPIROU cert, disable ISUP T6 when bridged natively */ int trc = 0; SiCon *siCon = NULL; @@ -597,6 +598,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev } else { SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); } +#endif } } @@ -995,6 +997,14 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) { + if (sng_cancel_isup_tmr(sngss7_info->suInstId, ISUP_T6i) == RFAILED ) { + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not stop timer T6 \n", sngss7_info->circuit->cic); + } else { + sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic); + } + +#if 0 /* SPIROU cert, disable ISUP T6 when bridged natively */ int trc = 0; SiCon *siCon = NULL; @@ -1009,9 +1019,8 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, } else { SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); } +#endif } - - } static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t *ftdmchan); From 14d8b42e58355597cdfb49a30626313afa8e695a Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 13:19:36 -0500 Subject: [PATCH 139/493] freetdm: testing code of sending suspend message --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 85 +++++++++---------- .../ftmod_sangoma_ss7_main.h | 2 +- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index d738edb959..6e97a3db4e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1389,67 +1389,64 @@ static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose) { int x; + ftdm_channel_t *ftdmchan; + int lspan; + int lchan; + SiSuspEvnt suspEvnt; sngss7_chan_data_t *ss7_info; - ftdm_channel_t *ftdmchan; - int lspan; - int lchan; + /* SS7_ERROR("JZ error alert. handle_tx_susp \n"); return FTDM_FAIL; + */ + /* JZ implementation */ + + if (span <= 0 || chan <= 0 || chan >= 32 ) { + SS7_ERROR ("Wrong span number or chan number.\n"); + return FTDM_FAIL; + } + + x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; - while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) { + for ( ; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { + ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; ftdmchan = ss7_info->ftdmchan; - /* if span == 0 then all spans should be printed */ - if (span == 0) { - lspan = ftdmchan->physical_span_id; - } else { - lspan = span; + lspan = span; + lchan = chan; + + if ((ftdmchan->physical_span_id != lspan) && (ftdmchan->physical_chan_id != lchan)) { + continue; } - /* if chan == 0 then all chans should be printed */ - if (chan == 0) { - lchan = ftdmchan->physical_chan_id; - } else { - lchan = chan; - } + ftdm_mutex_lock(ftdmchan->mutex); - if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) { - /* now that we have the right channel...put a lock on it so no-one else can use it */ - ftdm_mutex_lock(ftdmchan->mutex); - - /* check if there is a pending state change|give it a bit to clear */ - if (check_for_state_change(ftdmchan)) { - SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); - /* check if we need to die */ - ftdm_assert(0, "State change not completed\n"); - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - /* move to the next channel */ - continue; - } else { - /* throw the ckt block flag */ - sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); - - /* set the channel to suspended state */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); - } - - /* unlock the channel again before we exit */ + if (check_for_state_change(ftdmchan)) { + SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); + ftdm_assert(0, "State change not completed\n"); ftdm_mutex_unlock(ftdmchan->mutex); + continue; + } - } /* if ( span and chan) */ - - } /* if ( cic != 0) */ - - /* go the next circuit */ - x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + /* + sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + */ + suspEvnt.susResInd.eh.pres = PRSNT_NODEF; + suspEvnt.susResInd.susResInd.pres = PRSNT_NODEF; + suspEvnt.susResInd.susResInd.val = EVTSITSUSPREQ; + + sng_cc_susp_request(lspan, ss7_info->suInstId, ss7_info->spInstId, ss7_info->circuit->id, &suspEvnt); + + ftdm_mutex_unlock(ftdmchan->mutex); + } + } handle_show_blocks(stream, span, chan, verbose); + /* end of JZ implementation */ return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index b5494bc174..f9aed03083 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -607,7 +607,7 @@ typedef enum { FLAG_GRP_HW_UNBLK_TX = (1 << 24), FLAG_GRP_HW_UNBLK_TX_DN = (1 << 25), FLAG_GRP_MN_UNBLK_TX = (1 << 26), - FLAG_GRP_MN_UNBLK_TX_DN = (1 << 27) + FLAG_GRP_MN_UNBLK_TX_DN = (1 << 27), } sng_ckt_block_flag_t; #define BLK_FLAGS_STRING \ From c1ad5677429d3c8be6ebfcc756e3328c0f82e073 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 17:37:57 -0500 Subject: [PATCH 140/493] freetdm: removing sus|res|rel commands --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 121 ------------------ .../ftmod_sangoma_ss7_main.c | 35 ----- 2 files changed, 156 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 6e97a3db4e..cb5584760f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -71,10 +71,6 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int chan, int verbose); static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose); -static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose); -static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose); -static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose); - static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose); static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int chan, int verbose); @@ -462,47 +458,6 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha goto handle_cli_error; /**********************************************************************/ } - - /**************************************************************************/ - /* sending resume for a ckt's call */ - } else if (!strcasecmp(argv[c], "resm") == FTDM_FAIL) { - if (check_arg_count(argc, 5) == FTDM_FAIL) { - goto handle_cli_error_argc; - } - - if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { - handle_tx_resm(stream, span, chan, verbose); - } else { - stream->write_function(stream, "Bad command format. \n"); - goto handle_cli_error_argc; - } - /**************************************************************************/ - /* sending resume for a ckt's call */ - } else if (!strcasecmp(argv[c], "rels")) { - if (check_arg_count(argc, 5) == FTDM_FAIL) { - goto handle_cli_error_argc; - } - - if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { - handle_tx_rels(stream, span, chan, verbose); - } else { - stream->write_function(stream, "Bad command format.\n"); - goto handle_cli_error_argc; - } - - /**************************************************************************/ - /* sending suspend for a ckt's call */ - } else if (!strcasecmp(argv[c], "susp")) { - if (check_arg_count(argc, 5) == FTDM_FAIL) { - goto handle_cli_error_argc; - } - - if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) { - handle_tx_susp(stream, span, chan, verbose); - } else { - stream->write_function(stream, "Bad command format. \n"); - goto handle_cli_error_argc; - } /**************************************************************************/ } else if (!strcasecmp(argv[c], "blo")) { if (check_arg_count(argc, 2)) goto handle_cli_error_argc; @@ -1374,82 +1329,6 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, return FTDM_SUCCESS; } -static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose) -{ - SS7_ERROR("JZ error alert. handle_tx_resm \n"); - return FTDM_FAIL; -} -static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose) -{ - SS7_ERROR("JZ error alert. handle_tx_rels \n"); - return FTDM_FAIL; -} - -/******************************************************************************/ -static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose) -{ - int x; - ftdm_channel_t *ftdmchan; - int lspan; - int lchan; - SiSuspEvnt suspEvnt; - sngss7_chan_data_t *ss7_info; - - /* - SS7_ERROR("JZ error alert. handle_tx_susp \n"); - return FTDM_FAIL; - */ - - /* JZ implementation */ - - if (span <= 0 || chan <= 0 || chan >= 32 ) { - SS7_ERROR ("Wrong span number or chan number.\n"); - return FTDM_FAIL; - } - - - x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1; - for ( ; g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0; x++) { - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) { - - ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj; - ftdmchan = ss7_info->ftdmchan; - - lspan = span; - lchan = chan; - - if ((ftdmchan->physical_span_id != lspan) && (ftdmchan->physical_chan_id != lchan)) { - continue; - } - - ftdm_mutex_lock(ftdmchan->mutex); - - if (check_for_state_change(ftdmchan)) { - SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); - ftdm_assert(0, "State change not completed\n"); - ftdm_mutex_unlock(ftdmchan->mutex); - continue; - } - - /* - sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); - */ - suspEvnt.susResInd.eh.pres = PRSNT_NODEF; - suspEvnt.susResInd.susResInd.pres = PRSNT_NODEF; - suspEvnt.susResInd.susResInd.val = EVTSITSUSPREQ; - - sng_cc_susp_request(lspan, ss7_info->suInstId, ss7_info->spInstId, ss7_info->circuit->id, &suspEvnt); - - ftdm_mutex_unlock(ftdmchan->mutex); - } - } - - handle_show_blocks(stream, span, chan, verbose); - /* end of JZ implementation */ - - return FTDM_SUCCESS; -} /******************************************************************************/ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 3f87ccf713..950a28500e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -582,25 +582,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic); } - -#if 0 - /* SPIROU cert, disable ISUP T6 when bridged natively */ - int trc = 0; - SiCon *siCon = NULL; - if (siFindSuInstId(sngss7_info->suInstId, &siCon) != RFAILED) { - if (siCon) { - trc = siStopConTmr(siCon, TMR_T6I); - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Stopped T6 timer (%d)\n", sngss7_info->circuit->cic, trc); - sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); - } else { - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]siCon is null!\n", sngss7_info->circuit->cic); - } - } else { - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); - } -#endif } - } /* clone the event and save it for later usage, we do not clone RLC messages */ @@ -1003,23 +985,6 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan, sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic); } - -#if 0 - /* SPIROU cert, disable ISUP T6 when bridged natively */ - int trc = 0; - SiCon *siCon = NULL; - if (siFindSuInstId(sngss7_info->suInstId, &siCon) != RFAILED) { - if (siCon) { - trc = siStopConTmr(siCon, TMR_T6I); - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Stopped T6 timer (%d)\n", sngss7_info->circuit->cic, trc); - sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED); - } else { - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]siCon is null!\n", sngss7_info->circuit->cic); - } - } else { - SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic); - } -#endif } } From d1a772bfe9620f1305eeb7d97681a9c798d0108b Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 18:02:26 -0500 Subject: [PATCH 141/493] freetdm: Only hangup with user message when release location information is set --- libs/freetdm/mod_freetdm/mod_freetdm.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index a180f03fef..b78cc078d4 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -506,10 +506,6 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) int chan_id = 0; const char *name = NULL; - ftdm_usrmsg_t usrmsg; - memset(&usrmsg, 0, sizeof(ftdm_usrmsg_t)); - - channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -577,19 +573,20 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) case FTDM_CHAN_TYPE_CAS: case FTDM_CHAN_TYPE_B: { - const char *sipvar; + const char *var = NULL; ftdm_call_cause_t hcause = switch_channel_get_cause_q850(channel); if (hcause < 1 || hcause > 127) { hcause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER; } - sipvar = switch_channel_get_variable(channel, "ss7_rel_loc"); - if (sipvar) { - ftdm_usrmsg_add_var(&usrmsg, "ss7_rel_loc", sipvar); + var = switch_channel_get_variable(channel, "ss7_rel_loc"); + if (var) { + ftdm_usrmsg_t usrmsg; + memset(&usrmsg, 0, sizeof(ftdm_usrmsg_t)); + ftdm_usrmsg_add_var(&usrmsg, "ss7_rel_loc", var); + ftdm_channel_call_hangup_with_cause_ex(tech_pvt->ftdmchan, hcause, &usrmsg); + } else { + ftdm_channel_call_hangup_with_cause(tech_pvt->ftdmchan, hcause); } - /* - ftdm_channel_call_hangup_with_cause(tech_pvt->ftdmchan, hcause); - */ - ftdm_channel_call_hangup_with_cause_ex(tech_pvt->ftdmchan, hcause, &usrmsg); } break; default: From b6c02364a790e81c2d67b33b1cd432ee9af9750d Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 18:26:08 -0500 Subject: [PATCH 142/493] freetdm: Reduce the size of the span peer channels and ss7 info per channel clone event queues --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 2 +- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 2 ++ .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 10 ++++------ .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 950a28500e..5f2beee65b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -2367,7 +2367,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) } /* create an peer channel queue for this span */ - if ((ftdm_queue_create(&(ss7_span_info)->peer_chans, SPAN_PENDING_CHANS_QUEUE_SIZE)) != FTDM_SUCCESS) { + if ((ftdm_queue_create(&(ss7_span_info)->peer_chans, SNGSS7_PEER_CHANS_QUEUE_SIZE)) != FTDM_SUCCESS) { SS7_CRITICAL("Unable to create peer chans queue!\n"); return FTDM_FAIL; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index f9aed03083..c77599d3d9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -56,6 +56,8 @@ #define MAX_CIC_MAP_LENGTH 1000 #define SNGSS7_EVENT_QUEUE_SIZE 100 +#define SNGSS7_PEER_CHANS_QUEUE_SIZE 100 +#define SNGSS7_CHAN_EVENT_QUEUE_SIZE 5 #define MAX_SIZEOF_SUBADDR_IE 24 /* as per Q931 4.5.9 */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index c1eef81d92..20e661d73e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -113,21 +113,19 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) otherwise, honor RDNIS and RDINF stuff coming from the user */ if (iam.redirInfo.eh.pres == PRSNT_NODEF) { const char *val = NULL; - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect info present\n", sngss7_info->circuit->cic); if (iam.redirInfo.redirCnt.pres) { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect count present = %d\n", sngss7_info->circuit->cic, iam.redirInfo.redirCnt.val); iam.redirInfo.redirCnt.val++; - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect count incremented = %d\n", sngss7_info->circuit->cic, iam.redirInfo.redirCnt.val); + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect count incremented = %d\n", sngss7_info->circuit->cic, iam.redirInfo.redirCnt.val); } val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_digits"); if (!ftdm_strlen_zero(val)) { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), found user supplied RDNIS digits = %s\n", sngss7_info->circuit->cic, val); + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), found user supplied RDNIS digits = %s\n", sngss7_info->circuit->cic, val); copy_tknStr_to_sngss7((char*)val, &iam.redirgNum.addrSig, &iam.redirgNum.oddEven); } else { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), not found user supplied RDNIS digits\n", sngss7_info->circuit->cic); + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), not found user supplied RDNIS digits\n", sngss7_info->circuit->cic); } } else { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect info not present, attempting to copy user supplied values\n", sngss7_info->circuit->cic); + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged), redirect info not present, attempting to copy user supplied values\n", sngss7_info->circuit->cic); /* Redirecting Number */ copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index d7732cce6c..e76397580e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2925,7 +2925,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) /* prepare the global info sturcture */ ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t)); ss7_info->ftdmchan = NULL; - if (ftdm_queue_create(&ss7_info->event_queue, SNGSS7_EVENT_QUEUE_SIZE) != FTDM_SUCCESS) { + if (ftdm_queue_create(&ss7_info->event_queue, SNGSS7_CHAN_EVENT_QUEUE_SIZE) != FTDM_SUCCESS) { SS7_CRITICAL("Failed to create ss7 cic event queue\n"); } ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x]; From c9c68a7759ab2ea60e9115d6046850311aa6b1b8 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 30 Jan 2012 19:15:02 -0500 Subject: [PATCH 143/493] freetdm: Some more clean up for ss7 event cloning - The queue size has been bumped again, long calls could potentially require more elements (multiple resume/suspend) - The queue is only used when there is a call active --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 16 ++++++++++++---- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 12 ++++++++++-- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 8 ++++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 5f2beee65b..20b2199f21 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -545,6 +545,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; sngss7_event_data_t *event_clone = NULL; + int clone_event = 0; /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(sngss7_event->circuit, &sngss7_info, &ftdmchan)) { @@ -560,11 +561,16 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { /* this is the first event in a call, flush the event queue */ - while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - ftdm_safe_free(event_clone); - } + sngss7_flush_queue(sngss7_info->event_queue); /* clear the peer if any */ sngss7_info->peer_data = NULL; + clone_event++; + } + + /* if the call has already started and the event is not a release confirmation, clone the event */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_CALL_STARTED) && + sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { + clone_event++; } if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { @@ -586,7 +592,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev } /* clone the event and save it for later usage, we do not clone RLC messages */ - if (sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { + if (clone_event) { event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); if (event_clone) { memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); @@ -1002,6 +1008,7 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t ftdm_channel_t *close_chan = ftdmchan; sngss7_clear_ckt_flag(sngss7_info, FLAG_SUS_RECVD); sngss7_clear_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + sngss7_flush_queue(sngss7_info->event_queue); ftdm_channel_close (&close_chan); } break; @@ -1517,6 +1524,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /* close the channel */ SS7_DEBUG_CHAN(ftdmchan,"FTDM Channel Close %s\n", ""); + sngss7_flush_queue(sngss7_info->event_queue); ftdm_channel_close (&close_chan); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index c77599d3d9..fb60183bf8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -57,7 +57,7 @@ #define SNGSS7_EVENT_QUEUE_SIZE 100 #define SNGSS7_PEER_CHANS_QUEUE_SIZE 100 -#define SNGSS7_CHAN_EVENT_QUEUE_SIZE 5 +#define SNGSS7_CHAN_EVENT_QUEUE_SIZE 100 #define MAX_SIZEOF_SUBADDR_IE 24 /* as per Q931 4.5.9 */ @@ -65,6 +65,14 @@ (switchtype == LSI_SW_ANS92) || \ (switchtype == LSI_SW_ANS95) +#define sngss7_flush_queue(queue) \ + do { \ + void *__queue_data = NULL; \ + while ((__queue_data = ftdm_queue_dequeue(queue))) { \ + ftdm_safe_free(__queue_data); \ + } \ + } while (0) + typedef struct ftdm2trillium { uint8_t ftdm_val; uint8_t trillium_val; @@ -552,7 +560,7 @@ typedef enum { FLAG_INFID_PAUSED = (1 << 15), FLAG_SENT_ACM = (1 << 16), FLAG_SENT_CPG = (1 << 17), - FLAG_SUS_RECVD = (1 << 18), + FLAG_SUS_RECVD = (1 << 18), FLAG_T6_CANCELED = (1 << 19), FLAG_RELAY_DOWN = (1 << 30), FLAG_CKT_RECONFIG = (1 << 31) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 20e661d73e..00d06905dd 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -70,17 +70,17 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) SS7_ERROR_CHAN(ftdmchan, "Peer channel '%s' has different signaling type %d'\n", var, peer_span->signal_type); } else { - sngss7_event_data_t *event_clone = NULL; peer_info = peer_chan->call_data; SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", sngss7_info->circuit->cic, peer_info->circuit->cic); + /* make each one of us aware of the native bridge */ peer_info->peer_data = sngss7_info; sngss7_info->peer_data = peer_info; + /* flush our own queue */ - while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) { - ftdm_safe_free(event_clone); - } + sngss7_flush_queue(sngss7_info->event_queue); + /* go up until release comes, note that state processing is done different and much simpler when there is a peer */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); ftdm_channel_advance_states(ftdmchan); From cca407d09a1dbddfa876497ac9f3c172e2eac92b Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 31 Jan 2012 15:18:53 -0500 Subject: [PATCH 144/493] freetdm: Fix bug in SS7 state processing introduced during the changes for native bridging that caused infinite SUSPEND state executions due to peer member not being cleared at the end of the call --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 20b2199f21..fa36c7280a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1049,14 +1049,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) sngss7_info->ckt_flags, sngss7_info->blk_flags); - if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALING) { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + /* DIALING is the only state we process normally when doing an outgoing call that is natively bridged */ + if (ftdmchan->state != FTDM_CHANNEL_STATE_DIALING) { + return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan); + } sngss7_info->peer_data = NULL; } - if (sngss7_info->peer_data) { - return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan); - } - /*check what state we are supposed to be in */ switch (ftdmchan->state) { /**************************************************************************/ From e8407ab1e1300e27ce65f63be8b214355cf8d80a Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Tue, 31 Jan 2012 17:13:10 -0500 Subject: [PATCH 145/493] mod_logfile: Fix compilation that was broken due to previous merge Note that we no longer use our custom-made log rotation as the FreeSWITCH mainstream project added that feature we just re-use the same feature with a different parameter --- src/mod/loggers/mod_logfile/mod_logfile.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/mod/loggers/mod_logfile/mod_logfile.c b/src/mod/loggers/mod_logfile/mod_logfile.c index 9e16f5d73e..27f0aeba37 100644 --- a/src/mod/loggers/mod_logfile/mod_logfile.c +++ b/src/mod/loggers/mod_logfile/mod_logfile.c @@ -116,8 +116,6 @@ static switch_status_t mod_logfile_openlogfile(logfile_profile_t *profile, switc static switch_status_t mod_logfile_rotate(logfile_profile_t *profile) { unsigned int i = 0; - unsigned int fcount = 0; - const char *fname = NULL; char *filename = NULL; switch_status_t stat = 0; int64_t offset = 0; @@ -125,15 +123,6 @@ static switch_status_t mod_logfile_rotate(logfile_profile_t *profile) switch_time_exp_t tm; char date[80] = ""; switch_size_t retsize; - char *dend = NULL; - char *hay = NULL; - switch_dir_t *dirhandle = NULL; - switch_time_t wtime = 0; - char dirname[128]; - char filebuf[128]; - char fullfile[512]; - char filetodelete[128]; - switch_finfo_t statinfo; switch_status_t status = SWITCH_STATUS_SUCCESS; switch_mutex_lock(globals.mutex); @@ -344,8 +333,8 @@ static switch_status_t load_profile(switch_xml_t xml) new_profile->logfile = strdup(val); } else if (!strcmp(var, "rollover")) { new_profile->roll_size = switch_atoui(val); - } else if (!strcmp(var, "maximum-rotate")) || - (!strcmp(var, "maxfilecount")) { + } else if (!strcmp(var, "maximum-rotate") || + !strcmp(var, "maxfilecount")) { /* maxfilecount is backwards compatible parameter, we had our own log rotation code * and eventually mainstream FreeSWITCH included the parameter maximum-rotate which * did pretty much the same as ours, I deleted the old code and stayed with the official From 34b0f8ad74edde0b049e4edcc87466ef4fd28a84 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 2 Feb 2012 11:38:12 -0500 Subject: [PATCH 146/493] spandsp: fixing t38 with configurable tone type. - tone_type value is taken from dialplan t38_gateway function's 2nd parameter - tone type could be one of cng|ced_preamble|ans|ans_pr|ansam|preamble - in dialplan, if enable t38 in ftdm-to-sip, tone type should be set to "t38_gateway peer cng" - if enable t38 in sip-to-ftdm, tone type should be set to "t38_gateway peer ced_preamble" --- .../applications/mod_spandsp/mod_spandsp.c | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/mod/applications/mod_spandsp/mod_spandsp.c b/src/mod/applications/mod_spandsp/mod_spandsp.c index 68ac50f137..2f9b47419d 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp.c @@ -125,12 +125,14 @@ static void event_handler(switch_event_t *event) SWITCH_STANDARD_APP(t38_gateway_function) { switch_channel_t *channel = switch_core_session_get_channel(session); - time_t timeout = switch_epoch_time_now(NULL) + 20; + time_t timeout = 20; const char *var; int argc = 0; char *argv[2] = { 0 }; char *dupdata; const char *direction = NULL, *flags = NULL; + + int tone_type = 0; if (!zstr(data) && (dupdata = switch_core_session_strdup(session, data))) { if ((argc = switch_split(dupdata, ' ', argv))) { @@ -156,14 +158,35 @@ SWITCH_STANDARD_APP(t38_gateway_function) if ((var = switch_channel_get_variable(channel, "t38_gateway_detect_timeout"))) { long to = atol(var); if (to > -1) { - timeout = (time_t) (switch_epoch_time_now(NULL) + to); + timeout = to; } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s invalid timeout value.\n", switch_channel_get_name(channel)); } } + if (!strcasecmp(flags, "cng")) { + tone_type = MODEM_CONNECT_TONES_FAX_CNG; + } else if (!strcasecmp(flags, "ans")) { + tone_type = MODEM_CONNECT_TONES_ANS; + } else if (!strcasecmp(flags, "ans_pr")) { + tone_type = MODEM_CONNECT_TONES_ANS_PR; + } else if (!strcasecmp(flags, "ansam")) { + tone_type = MODEM_CONNECT_TONES_ANSAM; + } else if (!strcasecmp(flags, "ansam_pr")) { + tone_type = MODEM_CONNECT_TONES_ANSAM_PR; + } else if (!strcasecmp(flags, "preamble")) { + tone_type = MODEM_CONNECT_TONES_FAX_PREAMBLE; + } else if (!strcasecmp(flags, "ced_preamble")) { + tone_type = MODEM_CONNECT_TONES_FAX_CED_OR_PREAMBLE; + } else { + tone_type = MODEM_CONNECT_TONES_NONE; + } + + + //switch_ivr_tone_detect_session(session, "t38", "1100.0", "rw", timeout, 1, direction, NULL, t38_gateway_start); - spandsp_fax_detect_session(session, "rw", timeout, MODEM_CONNECT_TONES_FAX_CED_OR_PREAMBLE, 1, direction, NULL, t38_gateway_start); + //spandsp_fax_detect_session(session, "rw", timeout, MODEM_CONNECT_TONES_FAX_CED_OR_PREAMBLE, 1, direction, NULL, t38_gateway_start); + spandsp_fax_detect_session(session, "rw", timeout, tone_type, 1, direction, NULL, t38_gateway_start); } } From 03fee3de39ef0e21034edb136c6fd4aaf57f9a57 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 2 Feb 2012 13:48:44 -0500 Subject: [PATCH 147/493] fs_cli: fix empty prompt in nbss7 --- libs/esl/fs_cli.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index faac75a437..81ab0c696b 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -1287,11 +1287,13 @@ int main(int argc, char *argv[]) snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s> ", profile->name); } bare_prompt_str_len = (int)strlen(bare_prompt_str); + #if 0 if (feature_level) { - snprintf(prompt_str, sizeof(prompt_str), "%s%s%s", prompt_color, bare_prompt_str, input_text_color); + snprintf(prompt_str, sizeof(prompt_str), "%s%s%s #", prompt_color, bare_prompt_str, input_text_color); } else { - snprintf(prompt_str, sizeof(prompt_str), "%s", bare_prompt_str); + snprintf(prompt_str, sizeof(prompt_str), "%s >> ", bare_prompt_str); } + #endif connect: connected = 0; while (--loops > 0) { From 460814d8713e6b8f585ace3c857f4db1a394e747 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 3 Feb 2012 15:32:10 -0500 Subject: [PATCH 148/493] esl: fix command prompt --- libs/esl/fs_cli.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 81ab0c696b..193157e5cd 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -1153,6 +1153,7 @@ int main(int argc, char *argv[]) #else feature_level = 1; #endif + feature_level = 0; strncpy(internal_profile.host, "127.0.0.1", sizeof(internal_profile.host)); strncpy(internal_profile.pass, "ClueCon", sizeof(internal_profile.pass)); @@ -1287,13 +1288,15 @@ int main(int argc, char *argv[]) snprintf(prompt_str, sizeof(prompt_str), PROMPT_PREFIX "@%s> ", profile->name); } bare_prompt_str_len = (int)strlen(bare_prompt_str); - #if 0 if (feature_level) { - snprintf(prompt_str, sizeof(prompt_str), "%s%s%s #", prompt_color, bare_prompt_str, input_text_color); - } else { - snprintf(prompt_str, sizeof(prompt_str), "%s >> ", bare_prompt_str); - } - #endif + snprintf(prompt_str, sizeof(prompt_str), "%s%s%s", prompt_color, bare_prompt_str, input_text_color); + } + /* + else { + + snprintf(prompt_str, sizeof(prompt_str), "%s", bare_prompt_str); + } + */ connect: connected = 0; while (--loops > 0) { From b0ee65b45a301d191f3636d07253b0270f17af1e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 9 Feb 2012 11:15:48 -0500 Subject: [PATCH 149/493] freetdm: adding new commands and removing unused ones - ftdm ss7 show - ftdm ss7 show span X - ftdm ss7 show status linkset X - ftdm ss7 inhibit X - ftdm ss7 uninhibit X --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index cb5584760f..ece88caac2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -784,16 +784,24 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 set ftrace X Y\n"); stream->write_function(stream, "ftdm ss7 set mtrace X Y\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "ftmod_sangoma_ss7 information:\n"); - stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); + + stream->write_function(stream, "ftmod_sangoma_ss7 signaling information:\n"); + stream->write_function(stream, "ftdm ss7 show \n"); stream->write_function(stream, "ftdm ss7 show status mtp2 X\n"); + stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); + stream->write_function(stream, "ftdm ss7 show status linkset X\n"); + stream->write_function(stream, "\n"); + + stream->write_function(stream, "ftmod_sangoma_ss7 circuit information:\n"); + stream->write_function(stream, "ftdm ss7 show span all\n"); + stream->write_function(stream, "ftdm ss7 show span X\n"); stream->write_function(stream, "ftdm ss7 show status span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show free span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show blocks span X chan Y\n"); - stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show inreset span X chan Y\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 circuit control:\n"); stream->write_function(stream, "ftdm ss7 blo span X chan Y\n"); stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n"); @@ -802,9 +810,12 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 cgb span X chan Y range Z\n"); stream->write_function(stream, "ftdm ss7 cgu span X chan Y range Z\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 link control:\n"); + /* stream->write_function(stream, "ftdm ss7 inhibit link X\n"); stream->write_function(stream, "ftdm ss7 uninhibit link X\n"); + */ stream->write_function(stream, "ftdm ss7 activate link X\n"); stream->write_function(stream, "ftdm ss7 deactivate link X\n"); stream->write_function(stream, "ftdm ss7 activate linkset X\n"); From 024a043e2c2fcf5c64ae4326db42cceb360fb60f Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 9 Feb 2012 14:04:45 -0500 Subject: [PATCH 150/493] freetdm: initial fix to rx cgb --- .../ftmod_sangoma_ss7_handle.c | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 41223199b0..0999eed4d8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -2338,7 +2338,8 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int blockType = 0; int byte = 0; int bit = 0; - int x; + int x; + int loop_range=0; ftdm_running_return(FTDM_FAIL); @@ -2405,6 +2406,56 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } /* loop over the cics starting from circuit until range+1 */ + loop_range = circuit + range + 1; + x circuit; + while( x < loop_range ) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) { + loop_range++; + } + else { + if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { + SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); + break; + } + + ftdm_mutex_lock(ftdmchan->mutex); + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } + } + + /* bring the sig status down */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } + } + x++; + } + +#if 0 for (x = circuit; x < (circuit + range + 1); x++) { /* confirm this is a voice channel */ if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; @@ -2460,6 +2511,7 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } } /* for (x = circuit; x < (circuit + range + 1); x++) */ +#endif /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { From b78b612b47a48ed9080608abe7bd462079de4c28 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 9 Feb 2012 14:11:21 -0500 Subject: [PATCH 151/493] freetdm: fixing cgu with signaling link in unblock range --- .../ftmod_sangoma_ss7_handle.c | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 0999eed4d8..6726627750 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -2407,7 +2407,7 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* loop over the cics starting from circuit until range+1 */ loop_range = circuit + range + 1; - x circuit; + x = circuit; while( x < loop_range ) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) { loop_range++; @@ -2538,7 +2538,8 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int blockType = 0; int byte = 0; int bit = 0; - int x; + int x; + int loop_range=0; ftdm_sigmsg_t sigev; ftdm_running_return(FTDM_FAIL); @@ -2608,6 +2609,60 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } /* loop over the cics starting from circuit until range+1 */ + loop_range = circuit + range + 1; + x = circuit; + while( x < loop_range ) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) { + loop_range++; + } + else { + /* lock the channel */ + ftdm_mutex_lock(ftdmchan->mutex); + + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } /* switch (blockType) */ + } /* if (status[byte] & (1 << bit)) */ + + sigev.chan_id = ftdmchan->chan_id; + sigev.span_id = ftdmchan->span_id; + sigev.channel = ftdmchan; + + /* bring the sig status down */ + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } + } + x++; + } +#if 0 for (x = circuit; x < (circuit + range + 1); x++) { if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; /* grab the circuit in question */ @@ -2661,6 +2716,7 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } } /* for (x = circuit; x < (circuit + range + 1); x++) */ +#endif /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { From 7b3a3d86b9dfe368371caa741245af0c1a18b417 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 9 Feb 2012 14:32:08 -0500 Subject: [PATCH 152/493] freetdm: fixed cgu/cgb commands wrongly setting cic status when the range covers one or more signaling links --- .../ftmod_sangoma_ss7_handle.c | 144 +++++++++--------- 1 file changed, 73 insertions(+), 71 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 6726627750..84da8b95e9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -2415,41 +2415,40 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ else { if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); - break; - } - - ftdm_mutex_lock(ftdmchan->mutex); - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ + } else { + ftdm_mutex_lock(ftdmchan->mutex); + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } } - } - /* bring the sig status down */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + /* bring the sig status down */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } } } x++; @@ -2616,48 +2615,51 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ loop_range++; } else { - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); - - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ - } /* switch (blockType) */ - } /* if (status[byte] & (1 << bit)) */ - - sigev.chan_id = ftdmchan->chan_id; - sigev.span_id = ftdmchan->span_id; - sigev.channel = ftdmchan; - - /* bring the sig status down */ - if (sngss7_channel_status_clear(sngss7_info)) { - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { + SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); } - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); + else { + ftdm_mutex_lock(ftdmchan->mutex); - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } /* switch (blockType) */ + } /* if (status[byte] & (1 << bit)) */ + + sigev.chan_id = ftdmchan->chan_id; + sigev.span_id = ftdmchan->span_id; + sigev.channel = ftdmchan; + + /* bring the sig status down */ + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + + ftdm_mutex_unlock(ftdmchan->mutex); + + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } } } x++; From a46c03ef6588f9a476838d4f17429a456364ed5b Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 10 Feb 2012 17:29:28 -0500 Subject: [PATCH 153/493] freetdm: fixing glare - adding configuration of glare handling rule - fixed cic status remains COLLECTING --- .../ftmod_sangoma_ss7_handle.c | 4 +- .../ftmod_sangoma_ss7_main.c | 48 ++++++++++++++----- .../ftmod_sangoma_ss7_main.h | 22 +++++++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 48 ++++++++++++++----- 4 files changed, 98 insertions(+), 24 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 84da8b95e9..2eed15e391 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -33,6 +33,7 @@ * Contributors: * * Ricardo Barroetaveña + * James Zhang * */ @@ -96,7 +97,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; char var[FTDM_DIGITS_LIMIT]; - + memset(var, '\0', sizeof(var)); ftdm_running_return(FTDM_FAIL); @@ -199,7 +200,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } - copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fa36c7280a..2463d59115 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -35,6 +35,7 @@ * * Moises Silva * David Yat Sin + * James Zhang * */ @@ -1086,14 +1087,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /*now go to the RING state */ state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); - } else if (i >= sngss7_info->circuit->min_digits) { SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits); /*now go to the RING state */ state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); - } else { /* if we are coming from idle state then we have already been here once before */ if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { @@ -1101,7 +1100,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) i, sngss7_info->circuit->min_digits, ftdmchan->caller_data.dnis.digits); - + /* start ISUP t35 */ if (ftdm_sched_timer (sngss7_info->t35.sched, "t35", @@ -1530,20 +1529,47 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /* check if there is a glared call that needs to be processed */ if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) { - - /* clear the glare flag */ sngss7_clear_ckt_flag (sngss7_info, FLAG_GLARE); - /* check if we have an IAM stored...if we don't have one just exit */ if (sngss7_info->glare.circuit != 0) { - /* send the saved call back in to us */ - handle_con_ind (0, - sngss7_info->glare.spInstId, - sngss7_info->glare.circuit, - &sngss7_info->glare.iam); + int bHandle=0; + switch (g_ftdm_sngss7_data.cfg.glareResolution) { + case SNGSS7_GLARE_DOWN: + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Giving control to the other side, handling copied IAM from glare. \n", sngss7_info->circuit->cic); + bHandle = 1; + break; + case SNGSS7_GLARE_PC: + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Trying to handle IAM copied from glare. \n", sngss7_info->circuit->cic); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]My PC = %d, incoming PC = %d. \n", sngss7_info->circuit->cic, + g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc, + g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ); + + if( g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc > g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ) + { + if ((sngss7_info->circuit->cic % 2) == 1 ) { + bHandle = 1; + } + } else { + if( (sngss7_info->circuit->cic % 2) == 0 ) { + bHandle = 1; + } + } + + break; + default: /* if configured as SNGSS7_GLARE_CONTROL, always abandon incoming glared IAM. */ + bHandle = 0; + break; + } + + if (!bHandle) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Handling glare IAM. \n", sngss7_info->circuit->cic); + handle_con_ind (0, sngss7_info->glare.spInstId, sngss7_info->glare.circuit, &sngss7_info->glare.iam); + } + /* clear the glare info */ memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t)); + state_flag = 0; } } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index fb60183bf8..f288a78e5f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -29,6 +29,12 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * James Zhang + * */ /******************************************************************************/ #ifndef __FTMOD_SNG_SS7_H__ @@ -195,6 +201,21 @@ typedef struct sng_mtp2_link { uint32_t t7; } sng_mtp2_link_t; +/* defining glare handling methods: + SNGSS7_GLARE_PC: + higher PointCode controls even number CIC + lower PointCode controls odd number CIC + SNGSS7_GLARE_DOWN: + always give control to the other side + SNGSS7_GLARE_CONTROL: + always trying to control +*/ +typedef enum { + SNGSS7_GLARE_PC = 0, + SNGSS7_GLARE_DOWN, + SNGSS7_GLARE_CONTROL +} sng_glare_resolution; + typedef struct sng_mtp3_link { char name[MAX_NAME_LEN]; uint32_t flags; @@ -444,6 +465,7 @@ typedef struct sng_ss7_cfg { sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */ sng_nsap_t nsap[MAX_NSAPS+1]; sng_isap_t isap[MAX_ISAPS+1]; + sng_glare_resolution glareResolution; } sng_ss7_cfg_t; typedef struct ftdm_sngss7_data { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 430b9895fe..6ea7400b37 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -29,6 +29,12 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * James Zhang + * */ /* INCLUDE ********************************************************************/ @@ -191,6 +197,7 @@ static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, i static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan); static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot); +static void ftmod_ss7_set_glare_resolution (const char *method); /******************************************************************************/ @@ -451,6 +458,26 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_SUCCESS; } +static void ftmod_ss7_set_glare_resolution (const char *method) +{ + sng_glare_resolution iMethod=SNGSS7_GLARE_PC; + if (!method || (strlen (method) <=0) ) { + SS7_ERROR( "Wrong glare resolution parameter, using default. \n" ); + } else { + if (!strcasecmp( method, "PointCode")) { + iMethod = SNGSS7_GLARE_PC; + } else if (!strcasecmp( method, "Down")) { + iMethod = SNGSS7_GLARE_DOWN; + } else if (!strcasecmp( method, "Control")) { + iMethod = SNGSS7_GLARE_CONTROL; + } else { + SS7_ERROR( "Wrong glare resolution parameter, using default. \n" ); + iMethod = SNGSS7_GLARE_PC; + } + } + g_ftdm_sngss7_data.cfg.glareResolution = iMethod; +} + /******************************************************************************/ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) { @@ -463,28 +490,27 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) /* extract all the information from the parameters */ for (i = 0; i < num_parms; i++) { - /**************************************************************************/ - if (!strcasecmp(parm->var, "procId")) { - /**********************************************************************/ g_ftdm_sngss7_data.cfg.procId = atoi(parm->val); SS7_DEBUG("Found a procId = %d\n", g_ftdm_sngss7_data.cfg.procId); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "license")) { - /**********************************************************************/ + } + else if (!strcasecmp(parm->var, "license")) { ftdm_set_string(g_ftdm_sngss7_data.cfg.license, parm->val); snprintf(g_ftdm_sngss7_data.cfg.signature, sizeof(g_ftdm_sngss7_data.cfg.signature), "%s.sig", parm->val); SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { + } + else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val); SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size); - } else { - /**********************************************************************/ + } + else if (!strcasecmp(parm->var, "glare-reso")) { + ftmod_ss7_set_glare_resolution (parm->val); + SS7_DEBUG("Found glare resolution configuration = %d %s\n", g_ftdm_sngss7_data.cfg.glareResolution, parm->val ); + } + else { SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val); return FTDM_FAIL; - /**********************************************************************/ } /* move to the next parmeter */ From a6e868f588572034dbf41866432138aa54a10aa4 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 16 Feb 2012 14:49:18 -0500 Subject: [PATCH 154/493] freetdm: Fix spirou certification native bridge issue - The outgoing tdm leg should not move to UP until after the IAM is sent at the end of the function - The UP state should be processed immediately otherwise the state processor is not run due to the way the main ss7 processing loop currently works --- libs/freetdm/src/ftdm_state.c | 10 +++++++-- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 21 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 30ef3ce478..03f2cd8e18 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -48,9 +48,15 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c ftdm_time_t diff = 0; ftdm_channel_state_t state = fchan->state; + if (fchan->state_status == FTDM_STATE_STATUS_NEW) { + ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_CRIT, + "Asking to complete state change from %s to %s in %llums, but the state is still unprocessed (this might be a bug!)\n", + ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff); + /* We should probably return here with FTDM_FAIL if we don't see this message in production environments for a while (2012-02-16) */ + } + if (fchan->state_status == FTDM_STATE_STATUS_COMPLETED) { - ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, - "State change flag set but state is not completed\n"); + ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, "State change flag set but state is already completed\n"); return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 00d06905dd..7ad510079f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -46,6 +46,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) { const char *var = NULL; SiConEvnt iam; + ftdm_bool_t native_going_up = FTDM_FALSE; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; SS7_FUNC_TRACE_ENTER (__FUNCTION__); @@ -81,9 +82,11 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* flush our own queue */ sngss7_flush_queue(sngss7_info->event_queue); - /* go up until release comes, note that state processing is done different and much simpler when there is a peer */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); - ftdm_channel_advance_states(ftdmchan); + /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, + We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function + because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped + and we still need those variables for further IAM processing */ + native_going_up = FTDM_TRUE; } } } @@ -211,6 +214,18 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) &iam, 0); + if (native_going_up) { + /* + Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in + response to the DIALING state handler, we can set the state to UP here and that will + implicitly complete the DIALING state, but we *MUST* also advance the state handler + right away for a native bridge, otherwise, the processing state function (ftdm_sangoma_ss7_process_state_change) + will complete the state without having executed the handler for FTDM_CHANNEL_STATE_UP, and we won't notify + the user sending FTDM_SIGEVENT_UP which can cause the application to misbehave (ie, no audio) */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); + ftdm_channel_advance_states(ftdmchan); + } + SS7_FUNC_TRACE_EXIT (__FUNCTION__); return; } From 8c8d649221b6d700d9738c619ceef0689aa0e134 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 16 Feb 2012 15:14:06 -0500 Subject: [PATCH 155/493] freetdm: Add support to set/receive location and original call number SS7 elements through variables (including SIP X headers) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 55 ++++++++++++- .../ftmod_sangoma_ss7_main.h | 3 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 21 ++++- .../ftmod_sangoma_ss7_support.c | 81 ++++++++++++++++--- 4 files changed, 148 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index b78cc078d4..01d7c282c3 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1400,6 +1400,22 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_set_string(caller_data.loc.digits, sipvar); } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-Screen"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_screen_ind", sipvar); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-Presentation"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_pres_ind", sipvar); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-NADI"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_nadi", sipvar); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-DNIS-TON"); if (sipvar) { caller_data.dnis.type = (uint8_t)atoi(sipvar); @@ -1514,6 +1530,24 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_reason", sipvar); } + + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-NADI"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_nadi", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-Plan"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_plan", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-Presentation"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_pres", sipvar); + } } if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) { @@ -1944,10 +1978,29 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_nadi"); - printf ( "ss7_loc_nadi = %s \n " , var_value ); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-NADI", "%s", var_value); } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_nadi"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-NADI", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_plan"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-Plan", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_pres"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-Presentation", "%s", var_value); + } } /* Add any call variable to the dial plan */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index fb60183bf8..86cdc73bc9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -868,6 +868,9 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); +ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); +ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); + ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 7ad510079f..930457c7c8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -135,6 +135,11 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Information */ copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); } + + if (iam.origCdNum.eh.pres != PRSNT_NODEF) { + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); + } } /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ @@ -157,6 +162,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Forward Call Indicators */ copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd); + + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); @@ -193,6 +201,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Information */ copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); /* Access Transport */ copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); @@ -236,6 +246,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; SiCnStEvnt acm; + const char *backwardInd = NULL; memset (&acm, 0x0, sizeof (acm)); @@ -253,8 +264,16 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.bckCallInd.intInd.val = INTIND_NOINTW; acm.bckCallInd.end2EndInfoInd.pres = PRSNT_NODEF; acm.bckCallInd.end2EndInfoInd.val = E2EINF_NOINFO; + acm.bckCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; - acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_NOTUSED; + backwardInd = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "acm_bi_iup"); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied backward indicator ISDN user part indicator ACM, value \"%s\"\n", backwardInd); + if (!ftdm_strlen_zero(backwardInd)) { + if (atoi(backwardInd) != 0 ) { + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; + } + } acm.bckCallInd.holdInd.pres = PRSNT_NODEF; acm.bckCallInd.holdInd.val = HOLD_NOTREQD; acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2088f240b6..4557c00a10 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -259,20 +259,20 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc locPtyNum->scrnInd.pres = pres_val; val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); if (!ftdm_strlen_zero(val)) { - locPtyNum->scrnInd.val = atoi(val); + locPtyNum->scrnInd.val = atoi(val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Screening Ind %d\n", locPtyNum->scrnInd.val); } else { - locPtyNum->scrnInd.val = caller_data->screen; + locPtyNum->scrnInd.val = caller_data->screen; } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Code Screening Ind %d\n", locPtyNum->scrnInd.val); locPtyNum->presRest.pres = pres_val; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_pres_ind"); if (!ftdm_strlen_zero(val)) { - locPtyNum->presRest.val = atoi(val); + locPtyNum->presRest.val = atoi(val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Presentation Ind %d\n", locPtyNum->presRest.val); } else { - locPtyNum->presRest.val = caller_data->pres; + locPtyNum->presRest.val = caller_data->pres; } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", locPtyNum->presRest.val); locPtyNum->numPlan.pres = pres_val; locPtyNum->numPlan.val = 0x01; @@ -286,11 +286,10 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Reference NADI value \"%s\"\n", loc_nadi); locPtyNum->natAddrInd.val = atoi(loc_nadi); } else { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; locPtyNum->natAddrInd.val = 0x03; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Presentation Ind %d\n", locPtyNum->presRest.val); return copy_tknStr_to_sngss7(caller_data->loc.digits, &locPtyNum->addrSig, &locPtyNum->oddEven); } @@ -439,7 +438,7 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red return FTDM_FAIL; } } else if (!ftdm_strlen_zero(caller_data->rdnis.digits)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", caller_data->rdnis.digits); if (copy_tknStr_to_sngss7(caller_data->rdnis.digits, &redirgNum->addrSig, &redirgNum->oddEven) != FTDM_SUCCESS) { return FTDM_FAIL; } @@ -639,6 +638,68 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r return FTDM_SUCCESS; } +ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) +{ + return FTDM_FAIL; +} + +ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) +{ + + const char *val = NULL; + int bProceed = 0; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn"); + if (!ftdm_strlen_zero(val)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number \"%s\"\n", val); + if (copy_tknStr_to_sngss7((char*)val, &origCdNum->addrSig, &origCdNum->oddEven) != FTDM_SUCCESS) { + return FTDM_FAIL; + } + origCdNum->addrSig.pres = 1; + } else { + return FTDM_SUCCESS; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_nadi"); + if (!ftdm_strlen_zero(val)) { + origCdNum->natAddr.val = atoi(val); + origCdNum->natAddr.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number NADI value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number NADI value\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_plan"); + if (!ftdm_strlen_zero(val)) { + origCdNum->numPlan.val = atoi(val); + origCdNum->numPlan.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Plan value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Plan value\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_pres"); + if (!ftdm_strlen_zero(val)) { + origCdNum->presRest.val = atoi(val); + origCdNum->presRest.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Presentation value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Presentation value\n"); + } + + if( bProceed == 1 ) { + origCdNum->eh.pres = PRSNT_NODEF; + } else { + origCdNum->eh.pres = NOTPRSNT; + } + + + return FTDM_SUCCESS; +} + ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat) { ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; From 4ccc26f08b94404246c951d13d62dbafe2ecc781 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 16 Feb 2012 15:15:22 -0500 Subject: [PATCH 156/493] freetdm: Fix improper logging statement when doing native ss7 bridge (peer_chan was set to the SIP leg) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 01d7c282c3..f9381ce133 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1650,11 +1650,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi our_chan = switch_core_session_get_channel(*new_session); + /* Figure out if there is a native bridge requested through SIP x headers */ if (network_peer_uuid) { switch_core_session_t *network_peer = switch_core_session_locate(network_peer_uuid); if (network_peer) { const char *my_uuid = switch_core_session_get_uuid(*new_session); private_t *peer_private = switch_core_session_get_private(network_peer); + peer_chan = switch_core_session_get_channel(network_peer); switch_set_string(tech_pvt->network_peer_uuid, network_peer_uuid); switch_set_string(peer_private->network_peer_uuid, my_uuid); @@ -1665,6 +1667,15 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_channel_get_span_id(peer_private->ftdmchan), ftdm_channel_get_id(peer_private->ftdmchan)); switch_core_session_rwunlock(network_peer); } + /* Figure out if there is a native bridge requested through dial plan variable and the originating channel is also freetdm (not going through SIP) */ + } else if (session + && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) + && switch_true(var) + && switch_core_session_compare(*new_session, session)) { + private_t *peer_pvt = switch_core_session_get_private(session); + peer_chan = switch_core_session_get_channel(session); + snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", + ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); } caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); @@ -1678,21 +1689,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi hunt_data.tech_pvt = tech_pvt; caller_data.priv = &hunt_data; - if (session - && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) - && switch_true(var) - && switch_core_session_compare(*new_session, session)) { - private_t *peer_pvt = switch_core_session_get_private(session); - snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", - ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); - } - if (session && !zstr(sigbridge_peer)) { peer_chan = switch_core_session_get_channel(session); ftdm_usrmsg_add_var(&usrmsg, "sigbridge_peer", sigbridge_peer); } - if ((status = ftdm_call_place_ex(&caller_data, &hunting, &usrmsg)) != FTDM_SUCCESS) { if (tech_pvt->read_codec.implementation) { switch_core_codec_destroy(&tech_pvt->read_codec); From 1f34c9301e6a737890f9d756f87554afc8a96f4e Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 16 Feb 2012 16:08:21 -0500 Subject: [PATCH 157/493] freetdm: Remove optimistic sanity check, prints spurious error messages --- libs/freetdm/src/ftdm_state.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 03f2cd8e18..c6d45c3c3c 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -48,12 +48,22 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c ftdm_time_t diff = 0; ftdm_channel_state_t state = fchan->state; +#if 0 + /* I could not perform this sanity check without more disruptive changes. Ideally we should check here if the signaling module completing the state + executed a state processor (called ftdm_channel_advance_states() which call fchan->span->state_processor(fchan)) for the state. That is just a + sanity check, as in the past we had at least one bug where the signaling module set the state and then accidentally changed the state to a new one + without calling ftdm_channel_advance_states(), meaning the state processor for the first state was not executed and that lead to unexpected behavior. + + If we want to be able to perform this kind of sanity check it would be nice to add a new state status (FTDM_STATE_STATUS_PROCESSING), the function + ftdm_channel_advance_states() would set the state_status to PROCESSING and then the check below for STATUS_NEW would be valid. Currently is not + valid because the signaling module may be completing the state at the end of the state_processor callback and therefore the state will still be + in STATUS_NEW, and is perfectly valid ... */ if (fchan->state_status == FTDM_STATE_STATUS_NEW) { ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_CRIT, "Asking to complete state change from %s to %s in %llums, but the state is still unprocessed (this might be a bug!)\n", ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff); - /* We should probably return here with FTDM_FAIL if we don't see this message in production environments for a while (2012-02-16) */ } +#endif if (fchan->state_status == FTDM_STATE_STATUS_COMPLETED) { ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, "State change flag set but state is already completed\n"); From 3f43b053a07cd26d40bc4bb069b7a8cff8315ce7 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 16 Feb 2012 16:49:51 -0500 Subject: [PATCH 158/493] freetdm: adding x-ocn-* headers for incoming sip calls --- libs/freetdm/mod_freetdm/mod_freetdm.c | 1 + .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_support.c | 36 ++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index f9381ce133..c3e5c486db 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -26,6 +26,7 @@ * Anthony Minessale II * Moises Silva * David Yat Sin + * James Zhang * * * mod_freetdm.c -- FreeTDM Endpoint Module diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 9c3bd65426..f080352d4a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -200,6 +200,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } + copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 4557c00a10..e7af4bb6e0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -640,7 +640,41 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) { - return FTDM_FAIL; + + char val[20]; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (origCdNum->eh.pres != PRSNT_NODEF ) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Original Called Number available\n"); + return FTDM_SUCCESS; + } + + + if (origCdNum->addrSig.pres == PRSNT_NODEF) { + copy_tknStr_from_sngss7(origCdNum->addrSig, val, origCdNum->oddEven); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number digits:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn", val); + } + + if (origCdNum->natAddr.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->natAddr.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_nadi", val); + } + + if (origCdNum->numPlan.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->numPlan.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -plan:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_plan", val); + } + + if (origCdNum->presRest.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->presRest.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - presentation:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_pres", val); + } + + return FTDM_SUCCESS; } ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) From 713b55cd585aab9c6ea7969e6f03b30d10a5a7e6 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 16 Feb 2012 18:33:00 -0500 Subject: [PATCH 159/493] freetdm: fixing improper log position in tx acm function --- .../freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 930457c7c8..84b9a9b7f2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -268,8 +268,8 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.bckCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; acm.bckCallInd.isdnUsrPrtInd.val = ISUP_NOTUSED; backwardInd = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "acm_bi_iup"); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied backward indicator ISDN user part indicator ACM, value \"%s\"\n", backwardInd); if (!ftdm_strlen_zero(backwardInd)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied backward indicator ISDN user part indicator ACM, value \"%s\"\n", backwardInd); if (atoi(backwardInd) != 0 ) { acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; } From 6ed6fd2c1a467a9ab9ec5138cbd6102c76e44973 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 24 Feb 2012 15:43:23 -0500 Subject: [PATCH 160/493] freetdm: latest SPIROU fixes in releases.3.4 branch merged in releases.3.5 --- libs/freetdm/mod_freetdm/mod_freetdm.c | 75 ++++++++++-- libs/freetdm/src/ftdm_state.c | 21 +++- .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_main.h | 2 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 44 ++++++- .../ftmod_sangoma_ss7_support.c | 111 ++++++++++++++++-- 6 files changed, 227 insertions(+), 27 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 11f30019e8..699ce194e1 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -26,6 +26,7 @@ * Anthony Minessale II * Moises Silva * David Yat Sin + * James Zhang * * * mod_freetdm.c -- FreeTDM Endpoint Module @@ -1459,6 +1460,21 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_set_string(caller_data.loc.digits, sipvar); } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-Screen"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_screen_ind", sipvar); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-Presentation"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_pres_ind", sipvar); + } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-NADI"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_loc_nadi", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-DNIS-TON"); if (sipvar) { caller_data.dnis.type = (uint8_t)atoi(sipvar); @@ -1573,6 +1589,23 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_rdinfo_reason", sipvar); } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-NADI"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_nadi", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-Plan"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_plan", sipvar); + } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-OCN-Presentation"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_pres", sipvar); + } } if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) { @@ -1675,11 +1708,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi our_chan = switch_core_session_get_channel(*new_session); + /* Figure out if there is a native bridge requested through SIP x headers */ if (network_peer_uuid) { switch_core_session_t *network_peer = switch_core_session_locate(network_peer_uuid); if (network_peer) { const char *my_uuid = switch_core_session_get_uuid(*new_session); private_t *peer_private = switch_core_session_get_private(network_peer); + peer_chan = switch_core_session_get_channel(network_peer); switch_set_string(tech_pvt->network_peer_uuid, network_peer_uuid); switch_set_string(peer_private->network_peer_uuid, my_uuid); @@ -1690,6 +1725,16 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_channel_get_span_id(peer_private->ftdmchan), ftdm_channel_get_id(peer_private->ftdmchan)); switch_core_session_rwunlock(network_peer); } + + /* Figure out if there is a native bridge requested through dial plan variable and the originating channel is also freetdm (not going through SIP) */ + } else if (session + && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) + && switch_true(var) + && switch_core_session_compare(*new_session, session)) { + private_t *peer_pvt = switch_core_session_get_private(session); + peer_chan = switch_core_session_get_channel(session); + snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", + ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); } caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); @@ -1703,21 +1748,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi hunt_data.tech_pvt = tech_pvt; caller_data.priv = &hunt_data; - if (session - && (var = channel_get_variable(session, var_event, FREETDM_VAR_PREFIX "native_sigbridge")) - && switch_true(var) - && switch_core_session_compare(*new_session, session)) { - private_t *peer_pvt = switch_core_session_get_private(session); - snprintf(sigbridge_peer, sizeof(sigbridge_peer), "%u:%u", - ftdm_channel_get_span_id(peer_pvt->ftdmchan), ftdm_channel_get_id(peer_pvt->ftdmchan)); - } - if (session && !zstr(sigbridge_peer)) { peer_chan = switch_core_session_get_channel(session); ftdm_usrmsg_add_var(&usrmsg, "sigbridge_peer", sigbridge_peer); } - if ((status = ftdm_call_place_ex(&caller_data, &hunting, &usrmsg)) != FTDM_SUCCESS) { if (tech_pvt->read_codec.implementation) { switch_core_codec_destroy(&tech_pvt->read_codec); @@ -1999,10 +2034,28 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_loc_nadi"); - printf ( "ss7_loc_nadi = %s \n " , var_value ); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LOC-NADI", "%s", var_value); } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN", "%s", var_value); + } + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_nadi"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-NADI", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_plan"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-Plan", "%s", var_value); + } + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_ocn_pres"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OCN-Presentation", "%s", var_value); + } } /* Add any call variable to the dial plan */ diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c index 30ef3ce478..bd670d0062 100644 --- a/libs/freetdm/src/ftdm_state.c +++ b/libs/freetdm/src/ftdm_state.c @@ -48,9 +48,26 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c ftdm_time_t diff = 0; ftdm_channel_state_t state = fchan->state; + +#if 0 + /* I could not perform this sanity check without more disruptive changes. Ideally we should check here if the signaling module completing the state + executed a state processor (called ftdm_channel_advance_states() which call fchan->span->state_processor(fchan)) for the state. That is just a + sanity check, as in the past we had at least one bug where the signaling module set the state and then accidentally changed the state to a new one + without calling ftdm_channel_advance_states(), meaning the state processor for the first state was not executed and that lead to unexpected behavior. + + If we want to be able to perform this kind of sanity check it would be nice to add a new state status (FTDM_STATE_STATUS_PROCESSING), the function + ftdm_channel_advance_states() would set the state_status to PROCESSING and then the check below for STATUS_NEW would be valid. Currently is not + valid because the signaling module may be completing the state at the end of the state_processor callback and therefore the state will still be + in STATUS_NEW, and is perfectly valid ... */ + if (fchan->state_status == FTDM_STATE_STATUS_NEW) { + ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_CRIT, + "Asking to complete state change from %s to %s in %llums, but the state is still unprocessed (this might be a bug!)\n", + ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff); + } +#endif + if (fchan->state_status == FTDM_STATE_STATUS_COMPLETED) { - ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, - "State change flag set but state is not completed\n"); + ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, "State change flag set but state is already completed\n"); return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 2eed15e391..667dc09ba0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -200,6 +200,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } + copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index f288a78e5f..63d4ded203 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -890,6 +890,8 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); +ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); +ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 00d06905dd..fb91b834ec 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -46,6 +46,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) { const char *var = NULL; SiConEvnt iam; + ftdm_bool_t native_going_up = FTDM_FALSE; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; SS7_FUNC_TRACE_ENTER (__FUNCTION__); @@ -81,9 +82,11 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* flush our own queue */ sngss7_flush_queue(sngss7_info->event_queue); - /* go up until release comes, note that state processing is done different and much simpler when there is a peer */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); - ftdm_channel_advance_states(ftdmchan); + /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, + We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function + because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped + and we still need those variables for further IAM processing */ + native_going_up = FTDM_TRUE; } } } @@ -132,6 +135,11 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Information */ copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); } + + if (iam.origCdNum.eh.pres != PRSNT_NODEF) { + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); + } } /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ @@ -154,6 +162,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Forward Call Indicators */ copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd); + + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); @@ -190,6 +201,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Redirecting Information */ copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo); + /* Original Called Number */ + copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); /* Access Transport */ copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); @@ -211,6 +224,19 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) &iam, 0); + + if (native_going_up) { + /* + Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in + response to the DIALING state handler, we can set the state to UP here and that will + implicitly complete the DIALING state, but we *MUST* also advance the state handler + right away for a native bridge, otherwise, the processing state function (ftdm_sangoma_ss7_process_state_change) + will complete the state without having executed the handler for FTDM_CHANNEL_STATE_UP, and we won't notify + the user sending FTDM_SIGEVENT_UP which can cause the application to misbehave (ie, no audio) */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); + ftdm_channel_advance_states(ftdmchan); + } + SS7_FUNC_TRACE_EXIT (__FUNCTION__); return; } @@ -221,6 +247,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; SiCnStEvnt acm; + const char *backwardInd = NULL; memset (&acm, 0x0, sizeof (acm)); @@ -238,8 +265,17 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.bckCallInd.intInd.val = INTIND_NOINTW; acm.bckCallInd.end2EndInfoInd.pres = PRSNT_NODEF; acm.bckCallInd.end2EndInfoInd.val = E2EINF_NOINFO; + acm.bckCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; - acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_NOTUSED; + backwardInd = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "acm_bi_iup"); + if (!ftdm_strlen_zero(backwardInd)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied backward indicator ISDN user part indicator ACM, value \"%s\"\n", backwardInd); + if (atoi(backwardInd) != 0 ) { + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; + } + } + acm.bckCallInd.holdInd.pres = PRSNT_NODEF; acm.bckCallInd.holdInd.val = HOLD_NOTREQD; acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2088f240b6..5bd9799c8f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -259,20 +259,20 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc locPtyNum->scrnInd.pres = pres_val; val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); if (!ftdm_strlen_zero(val)) { - locPtyNum->scrnInd.val = atoi(val); + locPtyNum->scrnInd.val = atoi(val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Screening Ind %d\n", locPtyNum->scrnInd.val); } else { - locPtyNum->scrnInd.val = caller_data->screen; + locPtyNum->scrnInd.val = caller_data->screen; } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Code Screening Ind %d\n", locPtyNum->scrnInd.val); locPtyNum->presRest.pres = pres_val; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_pres_ind"); if (!ftdm_strlen_zero(val)) { - locPtyNum->presRest.val = atoi(val); + locPtyNum->presRest.val = atoi(val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Presentation Ind %d\n", locPtyNum->presRest.val); } else { - locPtyNum->presRest.val = caller_data->pres; + locPtyNum->presRest.val = caller_data->pres; } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", locPtyNum->presRest.val); locPtyNum->numPlan.pres = pres_val; locPtyNum->numPlan.val = 0x01; @@ -286,11 +286,10 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Reference NADI value \"%s\"\n", loc_nadi); locPtyNum->natAddrInd.val = atoi(loc_nadi); } else { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; locPtyNum->natAddrInd.val = 0x03; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Location Reference Presentation Ind %d\n", locPtyNum->presRest.val); return copy_tknStr_to_sngss7(caller_data->loc.digits, &locPtyNum->addrSig, &locPtyNum->oddEven); } @@ -439,7 +438,7 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red return FTDM_FAIL; } } else if (!ftdm_strlen_zero(caller_data->rdnis.digits)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", caller_data->rdnis.digits); if (copy_tknStr_to_sngss7(caller_data->rdnis.digits, &redirgNum->addrSig, &redirgNum->oddEven) != FTDM_SUCCESS) { return FTDM_FAIL; } @@ -639,6 +638,98 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r return FTDM_SUCCESS; } +ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) +{ + char val[20]; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (origCdNum->eh.pres != PRSNT_NODEF ) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Original Called Number available\n"); + return FTDM_SUCCESS; + } + + if (origCdNum->addrSig.pres == PRSNT_NODEF) { + copy_tknStr_from_sngss7(origCdNum->addrSig, val, origCdNum->oddEven); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number digits:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn", val); + } + + if (origCdNum->natAddr.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->natAddr.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_nadi", val); + } + + if (origCdNum->numPlan.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->numPlan.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -plan:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_plan", val); + } + + if (origCdNum->presRest.pres == PRSNT_NODEF) { + snprintf(val, sizeof(val), "%d", origCdNum->presRest.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - presentation:%s\n", val); + sngss7_add_var(sngss7_info, "ss7_ocn_pres", val); + } + + return FTDM_SUCCESS; +} + +ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) +{ + const char *val = NULL; + int bProceed = 0; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn"); + if (!ftdm_strlen_zero(val)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number \"%s\"\n", val); + if (copy_tknStr_to_sngss7((char*)val, &origCdNum->addrSig, &origCdNum->oddEven) != FTDM_SUCCESS) { + return FTDM_FAIL; + } + origCdNum->addrSig.pres = 1; + } else { + return FTDM_SUCCESS; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_nadi"); + if (!ftdm_strlen_zero(val)) { + origCdNum->natAddr.val = atoi(val); + origCdNum->natAddr.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number NADI value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number NADI value\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_plan"); + if (!ftdm_strlen_zero(val)) { + origCdNum->numPlan.val = atoi(val); + origCdNum->numPlan.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Plan value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Plan value\n"); + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_pres"); + if (!ftdm_strlen_zero(val)) { + origCdNum->presRest.val = atoi(val); + origCdNum->presRest.pres = 1; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Presentation value \"%s\"\n", val); + bProceed = 1; + } else { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Presentation value\n"); + } + + if( bProceed == 1 ) { + origCdNum->eh.pres = PRSNT_NODEF; + } else { + origCdNum->eh.pres = NOTPRSNT; + } + + return FTDM_SUCCESS; +} + ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat) { ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; From 938fafb09e72492acec51dd9d5109f64a6d54d39 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 24 Feb 2012 16:09:58 -0500 Subject: [PATCH 161/493] freetdm: fixing problem during review - review board number 98 --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 13 ++++++------- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 3 +-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 5bd9799c8f..91e1f90043 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -286,10 +286,9 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Reference NADI value \"%s\"\n", loc_nadi); locPtyNum->natAddrInd.val = atoi(loc_nadi); } else { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; - locPtyNum->natAddrInd.val = 0x03; - } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); + } return copy_tknStr_to_sngss7(caller_data->loc.digits, &locPtyNum->addrSig, &locPtyNum->oddEven); } @@ -650,25 +649,25 @@ ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCd if (origCdNum->addrSig.pres == PRSNT_NODEF) { copy_tknStr_from_sngss7(origCdNum->addrSig, val, origCdNum->oddEven); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number digits:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Digits: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn", val); } if (origCdNum->natAddr.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->natAddr.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_nadi", val); } if (origCdNum->numPlan.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->numPlan.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -plan:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -Plan: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_plan", val); } if (origCdNum->presRest.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->presRest.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - presentation:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Presentation: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_pres", val); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 6ea7400b37..ee39e0dcb4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2004,8 +2004,7 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) flag_loc_nadi = 1; sng_ccSpan.loc_nadi = atoi(parm->val); SS7_DEBUG("Found default LOC_NADI parm->value = %d\n", sng_ccSpan.loc_nadi); - printf( " --- jz: we got loc nadi from XML, val = %d \n" , sng_ccSpan.loc_nadi); - + /**********************************************************************/ } else if (!strcasecmp(parm->var, "lpa_on_cot")) { /**********************************************************************/ From b5f69db10f551f9582515fe1b4ac04aeae4f7223 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 24 Feb 2012 16:21:21 -0500 Subject: [PATCH 162/493] freetdm: fixing printing in ftmod_sangoma_ss7_support.c functions --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 91e1f90043..7426b033b8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -661,7 +661,7 @@ ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCd if (origCdNum->numPlan.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->numPlan.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -Plan: %s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Plan: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_plan", val); } @@ -681,7 +681,7 @@ ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNu val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn"); if (!ftdm_strlen_zero(val)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Digits: %s\n", val); if (copy_tknStr_to_sngss7((char*)val, &origCdNum->addrSig, &origCdNum->oddEven) != FTDM_SUCCESS) { return FTDM_FAIL; } @@ -694,7 +694,7 @@ ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNu if (!ftdm_strlen_zero(val)) { origCdNum->natAddr.val = atoi(val); origCdNum->natAddr.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number NADI value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - NADI: %s\n", val); bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number NADI value\n"); @@ -704,7 +704,7 @@ ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNu if (!ftdm_strlen_zero(val)) { origCdNum->numPlan.val = atoi(val); origCdNum->numPlan.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Plan value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Plan: %s\n", val); bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Plan value\n"); @@ -714,7 +714,7 @@ ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNu if (!ftdm_strlen_zero(val)) { origCdNum->presRest.val = atoi(val); origCdNum->presRest.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Presentation value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Presentation: %s\n", val); bProceed = 1; } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Presentation value\n"); From eeec65265aa2bcce552df6effd0c18ecda473d8a Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 24 Feb 2012 16:32:44 -0500 Subject: [PATCH 163/493] freetdm: fixing format and loc_nadi value according to review board No. 98 --- .../ftmod_sangoma_ss7_support.c | 55 +++++++++---------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 1 - 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index e7af4bb6e0..4bfa5d2065 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -257,21 +257,21 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; locPtyNum->scrnInd.pres = pres_val; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_screen_ind"); if (!ftdm_strlen_zero(val)) { locPtyNum->scrnInd.val = atoi(val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Screening Ind %d\n", locPtyNum->scrnInd.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Screening Ind %d\n", locPtyNum->scrnInd.val); } else { locPtyNum->scrnInd.val = caller_data->screen; } locPtyNum->presRest.pres = pres_val; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_pres_ind"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_loc_pres_ind"); if (!ftdm_strlen_zero(val)) { locPtyNum->presRest.val = atoi(val); ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Presentation Ind %d\n", locPtyNum->presRest.val); } else { - locPtyNum->presRest.val = caller_data->pres; + locPtyNum->presRest.val = caller_data->pres; } locPtyNum->numPlan.pres = pres_val; @@ -286,10 +286,9 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Location Reference NADI value \"%s\"\n", loc_nadi); locPtyNum->natAddrInd.val = atoi(loc_nadi); } else { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); locPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].loc_nadi; - locPtyNum->natAddrInd.val = 0x03; - } + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for LOC, using \"%d\"\n", locPtyNum->natAddrInd.val); + } return copy_tknStr_to_sngss7(caller_data->loc.digits, &locPtyNum->addrSig, &locPtyNum->oddEven); } @@ -640,7 +639,6 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) { - char val[20]; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; @@ -649,43 +647,41 @@ ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCd return FTDM_SUCCESS; } - if (origCdNum->addrSig.pres == PRSNT_NODEF) { copy_tknStr_from_sngss7(origCdNum->addrSig, val, origCdNum->oddEven); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number digits:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Digits: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn", val); } - + if (origCdNum->natAddr.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->natAddr.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - NADI: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_nadi", val); } - + if (origCdNum->numPlan.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->numPlan.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number -plan:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Plan: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_plan", val); } if (origCdNum->presRest.pres == PRSNT_NODEF) { snprintf(val, sizeof(val), "%d", origCdNum->presRest.val); - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - presentation:%s\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Original Called Number - Presentation: %s\n", val); sngss7_add_var(sngss7_info, "ss7_ocn_pres", val); } - + return FTDM_SUCCESS; } ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) { - const char *val = NULL; int bProceed = 0; - + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn"); if (!ftdm_strlen_zero(val)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Digits: %s\n", val); if (copy_tknStr_to_sngss7((char*)val, &origCdNum->addrSig, &origCdNum->oddEven) != FTDM_SUCCESS) { return FTDM_FAIL; } @@ -698,39 +694,38 @@ ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNu if (!ftdm_strlen_zero(val)) { origCdNum->natAddr.val = atoi(val); origCdNum->natAddr.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number NADI value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - NADI: %s\n", val); bProceed = 1; - } else { + } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number NADI value\n"); } - + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_plan"); if (!ftdm_strlen_zero(val)) { origCdNum->numPlan.val = atoi(val); origCdNum->numPlan.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Plan value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Plan: %s\n", val); bProceed = 1; - } else { + } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Plan value\n"); } - + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_ocn_pres"); if (!ftdm_strlen_zero(val)) { origCdNum->presRest.val = atoi(val); origCdNum->presRest.pres = 1; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number Presentation value \"%s\"\n", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Original Called Number - Presentation: %s\n", val); bProceed = 1; - } else { + } else { ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Original Called Number Presentation value\n"); } - + if( bProceed == 1 ) { origCdNum->eh.pres = PRSNT_NODEF; } else { origCdNum->eh.pres = NOTPRSNT; } - - + return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index e76397580e..24293ef0ee 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -1978,7 +1978,6 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) flag_loc_nadi = 1; sng_ccSpan.loc_nadi = atoi(parm->val); SS7_DEBUG("Found default LOC_NADI parm->value = %d\n", sng_ccSpan.loc_nadi); - printf( " --- jz: we got loc nadi from XML, val = %d \n" , sng_ccSpan.loc_nadi); /**********************************************************************/ } else if (!strcasecmp(parm->var, "lpa_on_cot")) { From 3c4fdca9e0bb43f9656fa70f00e4ddf738a2169b Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 7 Mar 2012 19:04:31 -0500 Subject: [PATCH 164/493] freetdm: Fix redmine issue #2931 - Crash on SIP to SS7 call after sigbridge call The code was improperly using peer_data as an indicator that the sigbridge ss7 mode was enabled. The channel flag FTDM_CHANNEL_NATIVE_SIGBRDIGE should be used instead --- libs/freetdm/src/ftdm_io.c | 6 ++++++ .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 3b11611d49..513fc0c595 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2449,6 +2449,12 @@ FT_DECLARE(ftdm_status_t) ftdm_get_channel_from_string(const char *string_id, ft *out_span = NULL; *out_channel = NULL; + if (!string_id) { + ftdm_log(FTDM_LOG_ERROR, "Cannot parse NULL channel id string\n"); + status = FTDM_EINVAL; + goto done; + } + rc = sscanf(string_id, "%u:%u", &span_id, &chan_id); if (rc != 2) { ftdm_log(FTDM_LOG_ERROR, "Failed to parse channel id string '%s'\n", string_id); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 84b9a9b7f2..5f0a0f0960 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -57,12 +57,12 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) memset (&iam, 0x0, sizeof (iam)); - var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); - if (!ftdm_strlen_zero(var)) { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { ftdm_span_t *peer_span = NULL; ftdm_channel_t *peer_chan = NULL; sngss7_chan_data_t *peer_info = NULL; + var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); ftdm_get_channel_from_string(var, &peer_span, &peer_chan); if (!peer_chan) { SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var); @@ -91,7 +91,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) } } - if (sngss7_info->peer_data) { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE) && sngss7_info->peer_data) { sngss7_span_data_t *span_data = ftdmchan->span->signal_data; sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); /* Retrieve IAM from our peer */ From 19f01bf50a1b478b7206f2b9f083b08ac357ff12 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 15 Mar 2012 18:05:47 -0400 Subject: [PATCH 165/493] freetdm: fixing a potential crash on a rarely happened situation --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 4 +++ .../ftmod_sangoma_ss7_main.c | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index cb5584760f..60b44cec1e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1314,6 +1314,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, }else { stream->write_function(stream, "relay=N"); } + +#ifdef SMG_RELAY_DBG + stream->write_function(stream, "| flag=0x%llx", ftdmchan->flags); +#endif } #ifdef SMG_RELAY_DBG diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fa36c7280a..ecd83a14d4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -614,20 +614,22 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev break; case SNGSS7_REL_CFM_EVENT: { - ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); - if (peer_chan) { - /* we need to unlock our chan or we risk deadlock */ - ftdm_channel_advance_states(ftdmchan); - ftdm_channel_unlock(ftdmchan); + if (sngss7_info->peer_data) { + ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + if (peer_chan) { + /* we need to unlock our chan or we risk deadlock */ + ftdm_channel_advance_states(ftdmchan); + ftdm_channel_unlock(ftdmchan); - ftdm_channel_lock(peer_chan); - if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); + ftdm_channel_lock(peer_chan); + if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { + ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); + } + ftdm_channel_unlock(peer_chan); + + ftdm_channel_lock(ftdmchan); } - ftdm_channel_unlock(peer_chan); - - ftdm_channel_lock(ftdmchan); } } break; From 46ddfc0ebbf92a8bc0d67794c5ada396a15064ec Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 16 Mar 2012 11:19:01 -0400 Subject: [PATCH 166/493] freetdm: fixing glare with different options --- .../ftmod_sangoma_ss7_handle.c | 166 +++++------------- .../ftmod_sangoma_ss7_main.c | 6 +- 2 files changed, 46 insertions(+), 126 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 667dc09ba0..f48d25ce3c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -315,13 +315,13 @@ handle_glare: /* setup the hangup cause */ ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */ - - /* this is a remote hangup request */ - sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL); - - /* move the state of the channel to Terminating to end the call */ + + /* move the state of the channel to Terminating to end the call + in TERMINATING state, the release cause is set to REMOTE_REL + in any means. So we don't have to set the release reason here. + */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); - } /* if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE))) */ + } break; /**************************************************************************/ default: /* should not have gotten an IAM while in this state */ @@ -1282,6 +1282,7 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci /* the glare flag is already up so it was caught ... do nothing */ SS7_DEBUG_CHAN(ftdmchan, "Glare flag is already up...nothing to do!%s\n", " "); } else { + int bHangup = 0; SS7_DEBUG_CHAN(ftdmchan, "Glare flag is not up yet...indicating glare from reattempt!%s\n", " "); /* glare, throw the flag */ sngss7_set_ckt_flag(sngss7_info, FLAG_GLARE); @@ -1289,14 +1290,45 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci /* clear any existing glare data from the channel */ memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t)); + if (g_ftdm_sngss7_data.cfg.glareResolution == SNGSS7_GLARE_DOWN) { + /* If I'm in DOWN mode, I will always hangup my call. */ + bHangup = 1; + } + else if (g_ftdm_sngss7_data.cfg.glareResolution == SNGSS7_GLARE_PC) { + /* I'm in PointCode mode. + Case 1: My point code is higher than the other side. + If the CIC number is even, I'm trying to control. + If the CIC number is odd, I'll hangup my call and back off. + Case 2: My point code is lower than the other side. + If the CIC number is odd, I'm trying to control. + If the CIC number is even, I'll hangup my call and back off. + */ + if( g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc > g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ) + { + if ((sngss7_info->circuit->cic % 2) == 1 ) { + bHangup = 1; + } + } else { + if( (sngss7_info->circuit->cic % 2) == 0 ) { + bHangup = 1; + } + } + } + else { + /* If I'm in CONTROL mode, I will not hangup my call. */ + bHangup = 0; + } + + if (bHangup) { /* setup the hangup cause */ ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */ - /* this is a remote hangup request */ - sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL); - - /* move the state of the channel to Terminating to end the call */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); + /* move the state of the channel to Terminating to end the call + in TERMINATING state, the release cause is set to REMOTE_REL + in any means. So we don't have to set the release reason here. + */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); + } } /* unlock the channel again before we exit */ @@ -2455,63 +2487,6 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ x++; } -#if 0 - for (x = circuit; x < (circuit + range + 1); x++) { - /* confirm this is a voice channel */ - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; - - /* grab the circuit in question */ - if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { - SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); - break; - } - - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); - -#if 0 - SS7_ERROR("KONRAD -> circuit=%d, byte=%d, bit=%d, status[byte]=%d, math=%d\n", - x, - byte, - bit, - status[byte], - (status[byte] & (1 << bit))); -#endif - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ - } /* switch (blockType) */ - } - - /* bring the sig status down */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; - } - - } /* for (x = circuit; x < (circuit + range + 1); x++) */ -#endif /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -2665,61 +2640,6 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } x++; } -#if 0 - for (x = circuit; x < (circuit + range + 1); x++) { - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; - /* grab the circuit in question */ - if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { - SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); - break; - } - - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); - - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ - } /* switch (blockType) */ - } /* if (status[byte] & (1 << bit)) */ - - sigev.chan_id = ftdmchan->chan_id; - sigev.span_id = ftdmchan->span_id; - sigev.channel = ftdmchan; - - /* bring the sig status down */ - if (sngss7_channel_status_clear(sngss7_info)) { - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - } - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; - } - - } /* for (x = circuit; x < (circuit + range + 1); x++) */ -#endif /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 2463d59115..9b6c561742 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1471,14 +1471,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", ""); /* all flags are down so we can bring up the sig status */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - } /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */ + } } else { state_flag = 0; SS7_DEBUG_CHAN(ftdmchan,"Down detected blocked flags go to SUSPEND %s\n", " "); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); break; - } /* if !blocked */ + } } else { SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); @@ -1486,7 +1486,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); } - } /* if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) */ + } /* check if t35 is active */ if (sngss7_info->t35.hb_timer_id) { From 10277be8d6b2df8a97f1ee9564cb6468691bb2cc Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 16 Mar 2012 11:40:21 -0400 Subject: [PATCH 167/493] freetdm: synchronizing fixes in releases.3.5 version - glare - cgb/cgu range bug - inhibit/uninhibit --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 17 +- .../ftmod_sangoma_ss7_handle.c | 256 ++++++++++-------- .../ftmod_sangoma_ss7_main.c | 50 +++- .../ftmod_sangoma_ss7_main.h | 23 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 52 +++- 5 files changed, 257 insertions(+), 141 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 60b44cec1e..3f1a03f4d8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -784,16 +784,24 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 set ftrace X Y\n"); stream->write_function(stream, "ftdm ss7 set mtrace X Y\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "ftmod_sangoma_ss7 information:\n"); - stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); + + stream->write_function(stream, "ftmod_sangoma_ss7 signaling information:\n"); + stream->write_function(stream, "ftdm ss7 show \n"); stream->write_function(stream, "ftdm ss7 show status mtp2 X\n"); + stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); + stream->write_function(stream, "ftdm ss7 show status linkset X\n"); + stream->write_function(stream, "\n"); + + stream->write_function(stream, "ftmod_sangoma_ss7 circuit information:\n"); + stream->write_function(stream, "ftdm ss7 show span all\n"); + stream->write_function(stream, "ftdm ss7 show span X\n"); stream->write_function(stream, "ftdm ss7 show status span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show free span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show blocks span X chan Y\n"); - stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show inreset span X chan Y\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 circuit control:\n"); stream->write_function(stream, "ftdm ss7 blo span X chan Y\n"); stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n"); @@ -802,9 +810,12 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 cgb span X chan Y range Z\n"); stream->write_function(stream, "ftdm ss7 cgu span X chan Y range Z\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 link control:\n"); + /* stream->write_function(stream, "ftdm ss7 inhibit link X\n"); stream->write_function(stream, "ftdm ss7 uninhibit link X\n"); + */ stream->write_function(stream, "ftdm ss7 activate link X\n"); stream->write_function(stream, "ftdm ss7 deactivate link X\n"); stream->write_function(stream, "ftdm ss7 activate linkset X\n"); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index f080352d4a..d9816dfa0e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -33,6 +33,7 @@ * Contributors: * * Ricardo Barroetaveña + * James Zhang * */ @@ -199,7 +200,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } - copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); @@ -316,13 +316,13 @@ handle_glare: /* setup the hangup cause */ ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */ - - /* this is a remote hangup request */ - sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL); - - /* move the state of the channel to Terminating to end the call */ + + /* move the state of the channel to Terminating to end the call + in TERMINATING state, the release cause is set to REMOTE_REL + in any means. So we don't have to set the release reason here. + */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); - } /* if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE))) */ + } break; /**************************************************************************/ default: /* should not have gotten an IAM while in this state */ @@ -1283,6 +1283,7 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci /* the glare flag is already up so it was caught ... do nothing */ SS7_DEBUG_CHAN(ftdmchan, "Glare flag is already up...nothing to do!%s\n", " "); } else { + int bHangup = 0; SS7_DEBUG_CHAN(ftdmchan, "Glare flag is not up yet...indicating glare from reattempt!%s\n", " "); /* glare, throw the flag */ sngss7_set_ckt_flag(sngss7_info, FLAG_GLARE); @@ -1290,14 +1291,45 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci /* clear any existing glare data from the channel */ memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t)); + if (g_ftdm_sngss7_data.cfg.glareResolution == SNGSS7_GLARE_DOWN) { + /* If I'm in DOWN mode, I will always hangup my call. */ + bHangup = 1; + } + else if (g_ftdm_sngss7_data.cfg.glareResolution == SNGSS7_GLARE_PC) { + /* I'm in PointCode mode. + Case 1: My point code is higher than the other side. + If the CIC number is even, I'm trying to control. + If the CIC number is odd, I'll hangup my call and back off. + Case 2: My point code is lower than the other side. + If the CIC number is odd, I'm trying to control. + If the CIC number is even, I'll hangup my call and back off. + */ + if( g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc > g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ) + { + if ((sngss7_info->circuit->cic % 2) == 1 ) { + bHangup = 1; + } + } else { + if( (sngss7_info->circuit->cic % 2) == 0 ) { + bHangup = 1; + } + } + } + else { + /* If I'm in CONTROL mode, I will not hangup my call. */ + bHangup = 0; + } + + if (bHangup) { /* setup the hangup cause */ ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */ - /* this is a remote hangup request */ - sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL); - - /* move the state of the channel to Terminating to end the call */ - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); + /* move the state of the channel to Terminating to end the call + in TERMINATING state, the release cause is set to REMOTE_REL + in any means. So we don't have to set the release reason here. + */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); + } } /* unlock the channel again before we exit */ @@ -2340,7 +2372,8 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int blockType = 0; int byte = 0; int bit = 0; - int x; + int x; + int loop_range=0; ftdm_running_return(FTDM_FAIL); @@ -2407,61 +2440,54 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } /* loop over the cics starting from circuit until range+1 */ - for (x = circuit; x < (circuit + range + 1); x++) { - /* confirm this is a voice channel */ - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; - - /* grab the circuit in question */ - if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { - SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); - break; + loop_range = circuit + range + 1; + x = circuit; + while( x < loop_range ) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) { + loop_range++; } - - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); + else { + if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { + SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); + } else { + ftdm_mutex_lock(ftdmchan->mutex); + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } + } -#if 0 - SS7_ERROR("KONRAD -> circuit=%d, byte=%d, bit=%d, status[byte]=%d, math=%d\n", - x, - byte, - bit, - status[byte], - (status[byte] & (1 << bit))); -#endif - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ - } /* switch (blockType) */ + /* bring the sig status down */ + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + + /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } + } } + x++; + } - /* bring the sig status down */ - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; - } - - } /* for (x = circuit; x < (circuit + range + 1); x++) */ /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { @@ -2488,7 +2514,8 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ int blockType = 0; int byte = 0; int bit = 0; - int x; + int x; + int loop_range=0; ftdm_sigmsg_t sigev; ftdm_running_return(FTDM_FAIL); @@ -2558,59 +2585,62 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ } /* loop over the cics starting from circuit until range+1 */ - for (x = circuit; x < (circuit + range + 1); x++) { - if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) continue; - /* grab the circuit in question */ - if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { - SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); - break; + loop_range = circuit + range + 1; + x = circuit; + while( x < loop_range ) { + if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != SNG_CKT_VOICE) { + loop_range++; } - - /* lock the channel */ - ftdm_mutex_lock(ftdmchan->mutex); + else { + if (extract_chan_data(x, &sngss7_info, &ftdmchan)) { + SS7_ERROR("Failed to extract channel data for circuit = %d!\n", x); + } + else { + ftdm_mutex_lock(ftdmchan->mutex); - if (status[byte] & (1 << bit)) { - switch (blockType) { - /**********************************************************************/ - case 0: /* maintenance oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); - break; - /**********************************************************************/ - case 1: /* hardware failure oriented */ - sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); - break; - /**********************************************************************/ - case 2: /* reserved for national use */ - break; - /**********************************************************************/ - default: - break; - /**********************************************************************/ - } /* switch (blockType) */ - } /* if (status[byte] & (1 << bit)) */ + if (status[byte] & (1 << bit)) { + switch (blockType) { + /**********************************************************************/ + case 0: /* maintenance oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN); + break; + /**********************************************************************/ + case 1: /* hardware failure oriented */ + sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); + break; + /**********************************************************************/ + case 2: /* reserved for national use */ + break; + /**********************************************************************/ + default: + break; + /**********************************************************************/ + } /* switch (blockType) */ + } /* if (status[byte] & (1 << bit)) */ - sigev.chan_id = ftdmchan->chan_id; - sigev.span_id = ftdmchan->span_id; - sigev.channel = ftdmchan; + sigev.chan_id = ftdmchan->chan_id; + sigev.span_id = ftdmchan->span_id; + sigev.channel = ftdmchan; - /* bring the sig status down */ - if (sngss7_channel_status_clear(sngss7_info)) { - sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + /* bring the sig status down */ + if (sngss7_channel_status_clear(sngss7_info)) { + sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + } + + ftdm_mutex_unlock(ftdmchan->mutex); + + /* update the bit and byte counter*/ + bit ++; + if (bit == 8) { + byte++; + bit = 0; + } + } } - - /* unlock the channel again before we exit */ - ftdm_mutex_unlock(ftdmchan->mutex); - - /* update the bit and byte counter*/ - bit ++; - if (bit == 8) { - byte++; - bit = 0; - } - - } /* for (x = circuit; x < (circuit + range + 1); x++) */ + x++; + } /* get the ftdmchan and ss7_chan_data from the circuit */ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index ecd83a14d4..fe129c0f73 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -35,6 +35,7 @@ * * Moises Silva * David Yat Sin + * James Zhang * */ @@ -1474,14 +1475,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", ""); /* all flags are down so we can bring up the sig status */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); - } /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */ + } } else { state_flag = 0; SS7_DEBUG_CHAN(ftdmchan,"Down detected blocked flags go to SUSPEND %s\n", " "); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); break; - } /* if !blocked */ + } } else { SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); @@ -1489,7 +1490,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); } - } /* if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) */ + } /* check if t35 is active */ if (sngss7_info->t35.hb_timer_id) { @@ -1532,20 +1533,47 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /* check if there is a glared call that needs to be processed */ if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) { - - /* clear the glare flag */ sngss7_clear_ckt_flag (sngss7_info, FLAG_GLARE); - /* check if we have an IAM stored...if we don't have one just exit */ if (sngss7_info->glare.circuit != 0) { - /* send the saved call back in to us */ - handle_con_ind (0, - sngss7_info->glare.spInstId, - sngss7_info->glare.circuit, - &sngss7_info->glare.iam); + int bHandle=0; + switch (g_ftdm_sngss7_data.cfg.glareResolution) { + case SNGSS7_GLARE_DOWN: + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Giving control to the other side, handling copied IAM from glare. \n", sngss7_info->circuit->cic); + bHandle = 1; + break; + case SNGSS7_GLARE_PC: + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Trying to handle IAM copied from glare. \n", sngss7_info->circuit->cic); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]My PC = %d, incoming PC = %d. \n", sngss7_info->circuit->cic, + g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc, + g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ); + + if( g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc > g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc ) + { + if ((sngss7_info->circuit->cic % 2) == 1 ) { + bHandle = 1; + } + } else { + if( (sngss7_info->circuit->cic % 2) == 0 ) { + bHandle = 1; + } + } + + break; + default: /* if configured as SNGSS7_GLARE_CONTROL, always abandon incoming glared IAM. */ + bHandle = 0; + break; + } + + if (!bHandle) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Handling glare IAM. \n", sngss7_info->circuit->cic); + handle_con_ind (0, sngss7_info->glare.spInstId, sngss7_info->glare.circuit, &sngss7_info->glare.iam); + } + /* clear the glare info */ memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t)); + state_flag = 0; } } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 86cdc73bc9..63d4ded203 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -29,6 +29,12 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * James Zhang + * */ /******************************************************************************/ #ifndef __FTMOD_SNG_SS7_H__ @@ -195,6 +201,21 @@ typedef struct sng_mtp2_link { uint32_t t7; } sng_mtp2_link_t; +/* defining glare handling methods: + SNGSS7_GLARE_PC: + higher PointCode controls even number CIC + lower PointCode controls odd number CIC + SNGSS7_GLARE_DOWN: + always give control to the other side + SNGSS7_GLARE_CONTROL: + always trying to control +*/ +typedef enum { + SNGSS7_GLARE_PC = 0, + SNGSS7_GLARE_DOWN, + SNGSS7_GLARE_CONTROL +} sng_glare_resolution; + typedef struct sng_mtp3_link { char name[MAX_NAME_LEN]; uint32_t flags; @@ -444,6 +465,7 @@ typedef struct sng_ss7_cfg { sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */ sng_nsap_t nsap[MAX_NSAPS+1]; sng_isap_t isap[MAX_ISAPS+1]; + sng_glare_resolution glareResolution; } sng_ss7_cfg_t; typedef struct ftdm_sngss7_data { @@ -871,7 +893,6 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); - ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 24293ef0ee..ad47f0cbb4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -29,6 +29,12 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * James Zhang + * */ /* INCLUDE ********************************************************************/ @@ -191,6 +197,7 @@ static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, i static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan); static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot); +static void ftmod_ss7_set_glare_resolution (const char *method); /******************************************************************************/ @@ -239,11 +246,11 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa if (!strcasecmp(var, "dialplan")) { /**********************************************************************/ - /* do i give a shit about this??? */ + /* don't care for now */ /**********************************************************************/ } else if (!strcasecmp(var, "context")) { /**********************************************************************/ - /* do i give a shit about this??? */ + /* don't care for now */ /**********************************************************************/ } else if (!strcasecmp(var, "ccSpanId")) { /**********************************************************************/ @@ -451,6 +458,26 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_SUCCESS; } +static void ftmod_ss7_set_glare_resolution (const char *method) +{ + sng_glare_resolution iMethod=SNGSS7_GLARE_PC; + if (!method || (strlen (method) <=0) ) { + SS7_ERROR( "Wrong glare resolution parameter, using default. \n" ); + } else { + if (!strcasecmp( method, "PointCode")) { + iMethod = SNGSS7_GLARE_PC; + } else if (!strcasecmp( method, "Down")) { + iMethod = SNGSS7_GLARE_DOWN; + } else if (!strcasecmp( method, "Control")) { + iMethod = SNGSS7_GLARE_CONTROL; + } else { + SS7_ERROR( "Wrong glare resolution parameter, using default. \n" ); + iMethod = SNGSS7_GLARE_DOWN; + } + } + g_ftdm_sngss7_data.cfg.glareResolution = iMethod; +} + /******************************************************************************/ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) { @@ -463,28 +490,27 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) /* extract all the information from the parameters */ for (i = 0; i < num_parms; i++) { - /**************************************************************************/ - if (!strcasecmp(parm->var, "procId")) { - /**********************************************************************/ g_ftdm_sngss7_data.cfg.procId = atoi(parm->val); SS7_DEBUG("Found a procId = %d\n", g_ftdm_sngss7_data.cfg.procId); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "license")) { - /**********************************************************************/ + } + else if (!strcasecmp(parm->var, "license")) { ftdm_set_string(g_ftdm_sngss7_data.cfg.license, parm->val); snprintf(g_ftdm_sngss7_data.cfg.signature, sizeof(g_ftdm_sngss7_data.cfg.signature), "%s.sig", parm->val); SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { + } + else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val); SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size); - } else { - /**********************************************************************/ + } + else if (!strcasecmp(parm->var, "glare-reso")) { + ftmod_ss7_set_glare_resolution (parm->val); + SS7_DEBUG("Found glare resolution configuration = %d %s\n", g_ftdm_sngss7_data.cfg.glareResolution, parm->val ); + } + else { SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val); return FTDM_FAIL; - /**********************************************************************/ } /* move to the next parmeter */ From 63a2c847ebe320f4c4d16e1d34cfc4e84365e357 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 16 Mar 2012 12:24:10 -0400 Subject: [PATCH 168/493] freetdm: merge native bridge fix from releases.3.4 which solves the crash on outgoing calls after native bridge --- libs/freetdm/src/ftdm_io.c | 6 ++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 4 +++ .../ftmod_sangoma_ss7_main.c | 30 +++++++++++-------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 26 ++++++++-------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 63029e74e0..a2d80a40eb 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2453,6 +2453,12 @@ FT_DECLARE(ftdm_status_t) ftdm_get_channel_from_string(const char *string_id, ft *out_span = NULL; *out_channel = NULL; + if (!string_id) { + ftdm_log(FTDM_LOG_ERROR, "Cannot parse NULL channel id string\n"); + status = FTDM_EINVAL; + goto done; + } + rc = sscanf(string_id, "%u:%u", &span_id, &chan_id); if (rc != 2) { ftdm_log(FTDM_LOG_ERROR, "Failed to parse channel id string '%s'\n", string_id); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index ece88caac2..3f1a03f4d8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1325,6 +1325,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, }else { stream->write_function(stream, "relay=N"); } + +#ifdef SMG_RELAY_DBG + stream->write_function(stream, "| flag=0x%llx", ftdmchan->flags); +#endif } #ifdef SMG_RELAY_DBG diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 9b6c561742..fe129c0f73 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -615,20 +615,22 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev break; case SNGSS7_REL_CFM_EVENT: { - ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); - if (peer_chan) { - /* we need to unlock our chan or we risk deadlock */ - ftdm_channel_advance_states(ftdmchan); - ftdm_channel_unlock(ftdmchan); + if (sngss7_info->peer_data) { + ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + if (peer_chan) { + /* we need to unlock our chan or we risk deadlock */ + ftdm_channel_advance_states(ftdmchan); + ftdm_channel_unlock(ftdmchan); - ftdm_channel_lock(peer_chan); - if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); + ftdm_channel_lock(peer_chan); + if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { + ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); + } + ftdm_channel_unlock(peer_chan); + + ftdm_channel_lock(ftdmchan); } - ftdm_channel_unlock(peer_chan); - - ftdm_channel_lock(ftdmchan); } } break; @@ -1087,12 +1089,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /*now go to the RING state */ state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } else if (i >= sngss7_info->circuit->min_digits) { SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits); /*now go to the RING state */ state_flag = 0; ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } else { /* if we are coming from idle state then we have already been here once before */ if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { @@ -1100,7 +1104,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) i, sngss7_info->circuit->min_digits, ftdmchan->caller_data.dnis.digits); - + /* start ISUP t35 */ if (ftdm_sched_timer (sngss7_info->t35.sched, "t35", diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index fb91b834ec..5f0a0f0960 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -57,12 +57,12 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) memset (&iam, 0x0, sizeof (iam)); - var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); - if (!ftdm_strlen_zero(var)) { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { ftdm_span_t *peer_span = NULL; ftdm_channel_t *peer_chan = NULL; sngss7_chan_data_t *peer_info = NULL; + var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer"); ftdm_get_channel_from_string(var, &peer_span, &peer_chan); if (!peer_chan) { SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var); @@ -82,16 +82,16 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* flush our own queue */ sngss7_flush_queue(sngss7_info->event_queue); - /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, - We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function - because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped - and we still need those variables for further IAM processing */ + /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, + We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function + because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped + and we still need those variables for further IAM processing */ native_going_up = FTDM_TRUE; } } } - if (sngss7_info->peer_data) { + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE) && sngss7_info->peer_data) { sngss7_span_data_t *span_data = ftdmchan->span->signal_data; sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); /* Retrieve IAM from our peer */ @@ -224,18 +224,17 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) &iam, 0); - if (native_going_up) { /* - Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in - response to the DIALING state handler, we can set the state to UP here and that will + Note that this function (ft_to_sngss7_iam) is run within the main SS7 processing loop in + response to the DIALING state handler, we can set the state to UP here and that will implicitly complete the DIALING state, but we *MUST* also advance the state handler right away for a native bridge, otherwise, the processing state function (ftdm_sangoma_ss7_process_state_change) will complete the state without having executed the handler for FTDM_CHANNEL_STATE_UP, and we won't notify the user sending FTDM_SIGEVENT_UP which can cause the application to misbehave (ie, no audio) */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); ftdm_channel_advance_states(ftdmchan); - } + } SS7_FUNC_TRACE_EXIT (__FUNCTION__); return; @@ -267,15 +266,14 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) acm.bckCallInd.end2EndInfoInd.val = E2EINF_NOINFO; acm.bckCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; - acm.bckCallInd.isdnUsrPrtInd.val = ISUP_NOTUSED; + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_NOTUSED; backwardInd = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "acm_bi_iup"); if (!ftdm_strlen_zero(backwardInd)) { ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied backward indicator ISDN user part indicator ACM, value \"%s\"\n", backwardInd); if (atoi(backwardInd) != 0 ) { - acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; + acm.bckCallInd.isdnUsrPrtInd.val = ISUP_USED; } } - acm.bckCallInd.holdInd.pres = PRSNT_NODEF; acm.bckCallInd.holdInd.val = HOLD_NOTREQD; acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF; From f1d80cd25d13d78deab88ea7f559e63aa899f319 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 16 Mar 2012 16:09:54 -0400 Subject: [PATCH 169/493] freetdm: fixing default values for ISUP --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index ad47f0cbb4..230476d8e1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2788,7 +2788,7 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t1 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1; } else { - g_ftdm_sngss7_data.cfg.isap[i].t1 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t1 = 150; } if (sng_isap->t2 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2; @@ -2803,17 +2803,17 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t6 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6; } else { - g_ftdm_sngss7_data.cfg.isap[i].t6 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t6 = 600; } if (sng_isap->t7 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7; } else { - g_ftdm_sngss7_data.cfg.isap[i].t7 = 250; + g_ftdm_sngss7_data.cfg.isap[i].t7 = 200; } if (sng_isap->t8 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8; } else { - g_ftdm_sngss7_data.cfg.isap[i].t8 = 120; + g_ftdm_sngss7_data.cfg.isap[i].t8 = 100; } if (sng_isap->t9 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9; From fbc5322e65eca3e9258053c6035f2f6ff675255e Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 20 Mar 2012 10:51:53 -0400 Subject: [PATCH 170/493] freetdm: fixing wrong default timer values --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index ee39e0dcb4..724fee25b9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2788,7 +2788,7 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t1 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1; } else { - g_ftdm_sngss7_data.cfg.isap[i].t1 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t1 = 150; } if (sng_isap->t2 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2; @@ -2803,17 +2803,17 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t6 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6; } else { - g_ftdm_sngss7_data.cfg.isap[i].t6 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t6 = 600; } if (sng_isap->t7 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7; } else { - g_ftdm_sngss7_data.cfg.isap[i].t7 = 250; + g_ftdm_sngss7_data.cfg.isap[i].t7 = 200; } if (sng_isap->t8 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8; } else { - g_ftdm_sngss7_data.cfg.isap[i].t8 = 120; + g_ftdm_sngss7_data.cfg.isap[i].t8 = 100; } if (sng_isap->t9 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9; From e560ddccdec0232a040851f088db1adec2cbc7f4 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 20 Mar 2012 11:56:29 -0400 Subject: [PATCH 171/493] freeswitch: taking out -Ox cflags and have them replaced with -O0 we dont want to optimize out symbols for debugging --- build/config/ax_cc_maxopt.m4 | 16 ++++++------ libs/apr/build/NWGNUenvironment.inc | 2 +- libs/apr/build/apr_hints.m4 | 2 +- libs/apr/configure.in | 8 +++--- libs/broadvoice/configure.ac | 8 +++--- libs/broadvoice/debian/rules | 2 +- libs/curl/lib/Makefile.b32 | 2 +- libs/curl/lib/Makefile.m32 | 2 +- libs/curl/src/Makefile.b32 | 2 +- libs/curl/src/makefile.amiga | 2 +- libs/js/nsprpub/configure.in | 20 +++++++------- libs/libg722_1/configure.ac | 8 +++--- libs/libsndfile/INSTALL | 2 +- libs/pcre/configure.ac | 10 +++---- libs/portaudio/Makefile.darwin | 2 +- libs/portaudio/SConstruct | 2 +- .../bindings/cpp/build/gnu/configure | 14 +++++----- .../bindings/cpp/build/gnu/configure.ac | 2 +- libs/portaudio/bindings/cpp/configure.ac | 2 +- libs/portaudio/build/dev-cpp/Makefile-static | 6 ++--- libs/portaudio/configure.in | 2 +- libs/sqlite/Makefile.linux-gcc | 6 ++--- libs/sqlite/mkso.sh | 2 +- libs/sqlite/publish.sh | 2 +- libs/srtp/INSTALL | 2 +- libs/srtp/build/config/ax_cc_maxopt.m4 | 16 ++++++------ libs/srtp/configure.in | 10 +++---- libs/yaml/aclocal.m4 | 2 +- libs/yaml/configure | 18 ++++++------- src/mod/applications/mod_avmd/Makefile | 4 +-- .../endpoints/mod_gsmopen/asterisk/Makefile | 2 +- .../gsmlib-1.10-patched-12ubuntu1/configure | 26 +++++++++---------- src/mod/languages/mod_lua/lua/Makefile | 4 +-- 33 files changed, 105 insertions(+), 105 deletions(-) diff --git a/build/config/ax_cc_maxopt.m4 b/build/config/ax_cc_maxopt.m4 index 6205ee84c8..40bb95c8b7 100644 --- a/build/config/ax_cc_maxopt.m4 +++ b/build/config/ax_cc_maxopt.m4 @@ -10,7 +10,7 @@ AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disa if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + dec) CFLAGS="-newc -w0 -O0 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; @@ -31,13 +31,13 @@ if test "$ac_test_CFLAGS" != "set"; then xlc_opt="-qtune=auto" fi AX_CHECK_COMPILER_FLAGS($xlc_opt, - CFLAGS="-O3 -qansialias -w $xlc_opt", - [CFLAGS="-O3 -qansialias -w" + CFLAGS="-O0 -qansialias -w $xlc_opt", + [CFLAGS="-O0 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" - echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* CFLAGS=-O0 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" @@ -45,7 +45,7 @@ if test "$ac_test_CFLAGS" != "set"; then echo "******************************************************"]) ;; - intel) CFLAGS="-O3 -ansi_alias" + intel) CFLAGS="-O0 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" @@ -78,7 +78,7 @@ if test "$ac_test_CFLAGS" != "set"; then gnu) # default optimization flags for gcc on all systems - CFLAGS="-O3 -fomit-frame-pointer" + CFLAGS="-O0 -fomit-frame-pointer" # -malign-double for x86 systems AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") @@ -99,10 +99,10 @@ if test "$ac_test_CFLAGS" != "set"; then echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "* (otherwise, a default of CFLAGS=-O0 will be used) *" echo "********************************************************" echo "" - CFLAGS="-O3" + CFLAGS="-O0" fi AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ diff --git a/libs/apr/build/NWGNUenvironment.inc b/libs/apr/build/NWGNUenvironment.inc index fd54b487c9..884330fbb7 100644 --- a/libs/apr/build/NWGNUenvironment.inc +++ b/libs/apr/build/NWGNUenvironment.inc @@ -161,7 +161,7 @@ endif # -O4,p level 4 optimizations, optimize for speed ifeq "$(RELEASE)" "optimized" -CFLAGS += -O4,p +CFLAGS += -O0,p endif # -prefix apr_arch_pre_nw.h #include pre_nw.h for all files diff --git a/libs/apr/build/apr_hints.m4 b/libs/apr/build/apr_hints.m4 index 1347653659..a7011db555 100644 --- a/libs/apr/build/apr_hints.m4 +++ b/libs/apr/build/apr_hints.m4 @@ -326,7 +326,7 @@ dnl # Not a problem in 10.20. Otherwise, who knows? ;; *convex-v11*) APR_ADDTO(CPPFLAGS, [-DCONVEXOS11]) - APR_SETIFNULL(CFLAGS, [-O1]) + APR_SETIFNULL(CFLAGS, [-O0]) APR_ADDTO(CFLAGS, [-ext]) ;; i860-intel-osf1) diff --git a/libs/apr/configure.in b/libs/apr/configure.in index 68c030e124..a1d375d768 100644 --- a/libs/apr/configure.in +++ b/libs/apr/configure.in @@ -239,7 +239,7 @@ nl=' ' echo "${nl}Check for compiler flags..." -dnl AC_PROG_CC sets -g in CFLAGS (and -O2 for gcc) by default. +dnl AC_PROG_CC sets -g in CFLAGS (and -O0 for gcc) by default. dnl On OS/390 this causes the compiler to insert extra debugger dnl hook instructions. That's fine for debug/maintainer builds, not fine dnl otherwise. @@ -287,8 +287,8 @@ AC_ARG_ENABLE(profile,[ --enable-profile Turn on profiling for the build APR_ADDTO(CFLAGS, -pg) APR_REMOVEFROM(CFLAGS, -g) if test "$host" = "i586-pc-beos"; then - APR_REMOVEFROM(CFLAGS, -O2) - APR_ADDTO(CFLAGS, -O1) + APR_REMOVEFROM(CFLAGS, -O0) + APR_ADDTO(CFLAGS, -O0) APR_ADDTO(LDFLAGS, -p) fi fi @@ -340,7 +340,7 @@ AC_ARG_ENABLE(pool-debug, if test "$host" = "i586-pc-beos"; then AC_ARG_ENABLE(malloc-debug,[ --enable-malloc-debug Switch on malloc_debug for BeOS], - APR_REMOVEFROM(CFLAGS, -O2) + APR_REMOVEFROM(CFLAGS, -O0) APR_ADDTO(CPPFLAGS, -fcheck-memory-usage -D_KERNEL_MODE) ) dnl fi diff --git a/libs/broadvoice/configure.ac b/libs/broadvoice/configure.ac index ceb92a57cb..10d279ed8a 100644 --- a/libs/broadvoice/configure.ac +++ b/libs/broadvoice/configure.ac @@ -71,9 +71,9 @@ then CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} - CFLAGS=${CFLAGS-"-g -O2"} + CFLAGS=${CFLAGS-"-g -O0"} CXX=${CXX-${host_alias}-c++} - CXXFLAGS=${CXXFLAGS-"-g -O2"} + CXXFLAGS=${CXXFLAGS-"-g -O0"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally @@ -108,8 +108,8 @@ else fi CXX=${CXX-"c++"} - CFLAGS=${CFLAGS-"-g -O2"} - CXXFLAGS=${CXXFLAGS-"-g -O2"} + CFLAGS=${CFLAGS-"-g -O0"} + CXXFLAGS=${CXXFLAGS-"-g -O0"} fi AC_DEFUN([REMOVE_FROM_VAR],[ diff --git a/libs/broadvoice/debian/rules b/libs/broadvoice/debian/rules index 636e1b42ae..b4f11d6876 100644 --- a/libs/broadvoice/debian/rules +++ b/libs/broadvoice/debian/rules @@ -21,7 +21,7 @@ CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else - CFLAGS += -O2 + CFLAGS += -O0 endif include /usr/share/dpatch/dpatch.make diff --git a/libs/curl/lib/Makefile.b32 b/libs/curl/lib/Makefile.b32 index 4544d7e7be..97c27ddf12 100644 --- a/libs/curl/lib/Makefile.b32 +++ b/libs/curl/lib/Makefile.b32 @@ -35,7 +35,7 @@ RM = del LIB = tlib IMPLIB = implib -CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM +CXXFLAGS = -q -5 -O0 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM LIBFLAGS = /C /P32 LDFLAGS = -q -lq -laa -tWD diff --git a/libs/curl/lib/Makefile.m32 b/libs/curl/lib/Makefile.m32 index 77085c6b08..1e7977f24c 100644 --- a/libs/curl/lib/Makefile.m32 +++ b/libs/curl/lib/Makefile.m32 @@ -26,7 +26,7 @@ STRIP = strip -g ## Nothing more to do below this line! INCLUDES = -I. -I../include -CFLAGS = -g -O2 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG +CFLAGS = -g -O0 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG ifdef SSL INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl" CFLAGS += -DUSE_SSLEAY -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \ diff --git a/libs/curl/src/Makefile.b32 b/libs/curl/src/Makefile.b32 index d4c1a073c9..b7ad61733a 100644 --- a/libs/curl/src/Makefile.b32 +++ b/libs/curl/src/Makefile.b32 @@ -32,7 +32,7 @@ CP = copy RM = del LIB = tlib -CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM +CXXFLAGS = -q -5 -O0 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM LDFLAGS = -q -lq -lap INCDIRS = -I.;../include;../lib diff --git a/libs/curl/src/makefile.amiga b/libs/curl/src/makefile.amiga index 9e03e070f0..15234d422c 100755 --- a/libs/curl/src/makefile.amiga +++ b/libs/curl/src/makefile.amiga @@ -8,7 +8,7 @@ ATCPSDKI= /GG/netinclude CC = m68k-amigaos-gcc -CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall +CFLAGS = -I$(ATCPSDKI) -m68020-60 -O0 -msoft-float -noixemul -g -I. -I../include -W -Wall LIBS = ../lib/libcurl.a -lssl -lcrypto -lz MANPAGE = ../docs/curl.1 README = ../docs/MANUAL diff --git a/libs/js/nsprpub/configure.in b/libs/js/nsprpub/configure.in index 93d3bd9f85..b3fcffe60c 100644 --- a/libs/js/nsprpub/configure.in +++ b/libs/js/nsprpub/configure.in @@ -62,7 +62,7 @@ USE_CPLUS= USE_IPV6= USE_MDUPDATE= _MACOSX_DEPLOYMENT_TARGET= -_OPTIMIZE_FLAGS=-O +_OPTIMIZE_FLAGS=-O0 _DEBUG_FLAGS=-g MOZ_DEBUG=1 MOZ_OPTIMIZE= @@ -176,7 +176,7 @@ AC_ARG_WITH(mozilla, fi]) AC_ARG_ENABLE(optimize, - [ --enable-optimize(=val) Enable code optimizations (val, ie. -O2) ], + [ --enable-optimize(=val) Enable code optimizations (val, ie. -O0) ], [ if test "$enableval" != "no"; then MOZ_OPTIMIZE=1 if test -n "$enableval" && test "$enableval" != "yes"; then @@ -887,7 +887,7 @@ case "$target" in RESOLVE_LINK_SYMBOLS=1 case "${target_cpu}" in i*86) - _OPTIMIZE_FLAGS=-O2 + _OPTIMIZE_FLAGS=-O0 _DEBUG_FLAGS='-gdwarf-2 -O0' MKSHLIB='$(CCC) $(DSO_LDOPTS) -o $@' AC_CHECK_LIB(bind, gethostbyaddr, [OS_LIBS="$OS_LIBS -lbind -lsocket"]) @@ -897,7 +897,7 @@ case "$target" in CCC=mwcc LD=mwld DSO_LDOPTS='-xms -export pragma -init _init_routine_ -term _term_routine_ -lroot -lnet /boot/develop/lib/ppc/glue-noinit.a /boot/develop/lib/ppc/init_term_dyn.o /boot/develop/lib/ppc/start_dyn.o' - _OPTIMIZE_FLAGS=-O2 + _OPTIMIZE_FLAGS=-O0 _DEBUG_FLAGS='-g -O0' ;; esac @@ -1115,7 +1115,7 @@ tools are selected during the Xcode/Developer Tools installation.]) AC_DEFINE(_DGUX_SOURCE) AC_DEFINE(_POSIX4A_DRAFT6_SOURCE) DSO_LDOPTS=-G - _OPTIMIZE_FLAGS=-O2 + _OPTIMIZE_FLAGS=-O0 _DEBUG_FLAGS= MDCPUCFG_H=_dgux.cfg PR_MD_CSRCS=dgux.c @@ -1334,7 +1334,7 @@ tools are selected during the Xcode/Developer Tools installation.]) dnl AS='$(CC) -Wp,-P -x assembler-with-cpp -D_ASM -mips2 $(INCLUDES)' CFLAGS="$CFLAGS -Wall -Wno-format" - _OPTIMIZE_FLAGS="-O6" + _OPTIMIZE_FLAGS="-O0" else if test -n "$USE_N32"; then AS='as -D_ASM $(INCLUDES) -n32' @@ -1408,7 +1408,7 @@ tools are selected during the Xcode/Developer Tools installation.]) MKSHLIB='$(CC) $(DSO_LDOPTS) $(OS_LDFLAGS) -o $@' DSO_CFLAGS=-fPIC DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' - _OPTIMIZE_FLAGS=-O2 + _OPTIMIZE_FLAGS=-O0 _DEBUG_FLAGS="-g" # most people on linux use gcc/gdb, and that # combo is not yet good at debugging inlined # functions (even when using DWARF2 as the @@ -1485,7 +1485,7 @@ tools are selected during the Xcode/Developer Tools installation.]) CFLAGS="$CFLAGS -W3 -nologo -GF -Gy" DLLFLAGS='-OUT:"$@"' _DEBUG_FLAGS=-Z7 - _OPTIMIZE_FLAGS=-O2 + _OPTIMIZE_FLAGS=-O0 if test -z "$MOZ_OPTIMIZE"; then CFLAGS="$CFLAGS -Od" fi @@ -1724,7 +1724,7 @@ mips-sony-newsos*) DSO_CFLAGS=-fPIC DSO_LDOPTS=-shared OS_LIBS="$OS_LIBS -lsocket" - _OPTIMIZE_FLAGS="-O1" + _OPTIMIZE_FLAGS="-O0" _DEBUG_FLAGS="-gstabs" ;; @@ -2082,7 +2082,7 @@ mips-sony-newsos*) DSO_CFLAGS= DSO_LDOPTS='-Zomf -Zdll -Zmap' LDFLAGS='-Zmap' - _OPTIMIZE_FLAGS="-O2 -s" + _OPTIMIZE_FLAGS="-O0 -s" _DEBUG_FLAGS="-g -fno-inline" if test -n "$MOZ_OPTIMIZE"; then DSO_LDOPTS="$DSO_LDOPTS -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA" diff --git a/libs/libg722_1/configure.ac b/libs/libg722_1/configure.ac index 62095ce374..e5385d4091 100644 --- a/libs/libg722_1/configure.ac +++ b/libs/libg722_1/configure.ac @@ -64,9 +64,9 @@ then CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} - CFLAGS=${CFLAGS-"-g -O2"} + CFLAGS=${CFLAGS-"-g -O0"} CXX=${CXX-${host_alias}-c++} - CXXFLAGS=${CXXFLAGS-"-g -O2"} + CXXFLAGS=${CXXFLAGS-"-g -O0"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally @@ -101,8 +101,8 @@ else fi CXX=${CXX-"c++"} - CFLAGS=${CFLAGS-"-g -O2"} - CXXFLAGS=${CXXFLAGS-"-g -O2"} + CFLAGS=${CFLAGS-"-g -O0"} + CXXFLAGS=${CXXFLAGS-"-g -O0"} fi AC_DEFUN([REMOVE_FROM_VAR],[ diff --git a/libs/libsndfile/INSTALL b/libs/libsndfile/INSTALL index b42a17ac46..d520a54b6b 100644 --- a/libs/libsndfile/INSTALL +++ b/libs/libsndfile/INSTALL @@ -59,7 +59,7 @@ the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + CC=c89 CFLAGS=-O0 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure diff --git a/libs/pcre/configure.ac b/libs/pcre/configure.ac index b6f79f98cf..7bf7c95b35 100644 --- a/libs/pcre/configure.ac +++ b/libs/pcre/configure.ac @@ -26,7 +26,7 @@ CFLAGS="$CFLAGS $CONFIGURE_CFLAGS" CXXFLAGS="$CXXFLAGS $CONFIGURE_CXXFLAGS" LDFLAGS="$LDFLAGS $CONFIGURE_LDFLAGS" -# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just +# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O0" for gcc and just # "-g" for any other compiler. There doesn't seem to be a standard way of # getting rid of the -g (which I don't think is needed for a production # library). This fudge seems to achieve the necessary. First, we remember the @@ -44,9 +44,9 @@ AC_PROG_CXX if test "x$remember_set_CFLAGS" = "x" then - if test "$CFLAGS" = "-g -O2" + if test "$CFLAGS" = "-g -O0" then - CFLAGS="-O2" + CFLAGS="-O0" elif test "$CFLAGS" = "-g" then CFLAGS="" @@ -55,9 +55,9 @@ fi if test "x$remember_set_CXXFLAGS" = "x" then - if test "$CXXFLAGS" = "-g -O2" + if test "$CXXFLAGS" = "-g -O0" then - CXXFLAGS="-O2" + CXXFLAGS="-O0" elif test "$CXXFLAGS" = "-g" then CXXFLAGS="" diff --git a/libs/portaudio/Makefile.darwin b/libs/portaudio/Makefile.darwin index 9aec51de24..0d37963f04 100644 --- a/libs/portaudio/Makefile.darwin +++ b/libs/portaudio/Makefile.darwin @@ -11,7 +11,7 @@ top_srcdir = . srcdir = . top_builddir = . -OPT_LEVEL := -O2 +OPT_LEVEL := -O0 PREFIX = /usr/local prefix = $(PREFIX) exec_prefix = ${prefix} diff --git a/libs/portaudio/SConstruct b/libs/portaudio/SConstruct index 15d36bad57..3c4bca0df7 100644 --- a/libs/portaudio/SConstruct +++ b/libs/portaudio/SConstruct @@ -39,7 +39,7 @@ if Platform in Posix: baseLinkFlags = threadCFlags = "-pthread" baseCxxFlags = baseCFlags = "-Wall -pedantic -pipe " + threadCFlags debugCxxFlags = debugCFlags = "-g" - optCxxFlags = optCFlags = "-O2" + optCxxFlags = optCFlags = "-O0" env["CCFLAGS"] = baseCFlags.split() env["CXXFLAGS"] = baseCxxFlags.split() env["LINKFLAGS"] = baseLinkFlags.split() diff --git a/libs/portaudio/bindings/cpp/build/gnu/configure b/libs/portaudio/bindings/cpp/build/gnu/configure index 69070c66d4..e91013c07c 100644 --- a/libs/portaudio/bindings/cpp/build/gnu/configure +++ b/libs/portaudio/bindings/cpp/build/gnu/configure @@ -1263,7 +1263,7 @@ PORTAUDIO="$PACPP_ROOT/../portaudio" PACPP_INC="$PACPP_ROOT/include" INCLUDES="-I$PACPP_INC -I$PORTAUDIO -I$PORTAUDIO/pa_common" -CFLAGS="-g -O2 -Wall -ansi -pedantic $INCLUDES" +CFLAGS="-g -O0 -Wall -ansi -pedantic $INCLUDES" CXXFLAGS="$CFLAGS" PALIBDIR="$PORTAUDIO/lib" @@ -1908,13 +1908,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O2" + CFLAGS="-g -O0" else - CFLAGS="-g" + CFLAGS="-g -O0" fi else if test "$GCC" = yes; then - CFLAGS="-O2" + CFLAGS="-O0" else CFLAGS= fi @@ -2350,13 +2350,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O2" + CXXFLAGS="-g -O0" else - CXXFLAGS="-g" + CXXFLAGS="-g -O0" fi else if test "$GXX" = yes; then - CXXFLAGS="-O2" + CXXFLAGS="-O0" else CXXFLAGS= fi diff --git a/libs/portaudio/bindings/cpp/build/gnu/configure.ac b/libs/portaudio/bindings/cpp/build/gnu/configure.ac index 5457c53420..071a7e94ef 100644 --- a/libs/portaudio/bindings/cpp/build/gnu/configure.ac +++ b/libs/portaudio/bindings/cpp/build/gnu/configure.ac @@ -24,7 +24,7 @@ PORTAUDIO="$PACPP_ROOT/../portaudio" PACPP_INC="$PACPP_ROOT/include" INCLUDES="-I$PACPP_INC -I$PORTAUDIO -I$PORTAUDIO/pa_common" -CFLAGS="-g -O2 -Wall -ansi -pedantic $INCLUDES" +CFLAGS="-g -O0 -Wall -ansi -pedantic $INCLUDES" CXXFLAGS="$CFLAGS" PALIBDIR="$PORTAUDIO/lib" diff --git a/libs/portaudio/bindings/cpp/configure.ac b/libs/portaudio/bindings/cpp/configure.ac index 100656ac41..94baff8fc3 100644 --- a/libs/portaudio/bindings/cpp/configure.ac +++ b/libs/portaudio/bindings/cpp/configure.ac @@ -25,7 +25,7 @@ PORTAUDIO_ROOT="../.." # Various other variables and flags DEFAULT_INCLUDES="-I$PACPP_ROOT/include -I$PACPP_ROOT/$PORTAUDIO_ROOT/include" -CFLAGS=${CFLAGS-"-g -O2 -Wall -ansi -pedantic"} +CFLAGS=${CFLAGS-"-g -O0 -Wall -ansi -pedantic"} CXXFLAGS=${CXXFLAGS-"${CFLAGS}"} LT_VERSION_INFO="lt_current:lt_revision:lt_age" diff --git a/libs/portaudio/build/dev-cpp/Makefile-static b/libs/portaudio/build/dev-cpp/Makefile-static index 2a1647ddc5..65fcb5dacf 100644 --- a/libs/portaudio/build/dev-cpp/Makefile-static +++ b/libs/portaudio/build/dev-cpp/Makefile-static @@ -7,12 +7,12 @@ WINDRES = windres.exe RES = OBJ = ./pa_skeleton.o ./pa_stream.o ./pa_trace.o ./pa_allocation.o ./pa_converters.o ./pa_cpuload.o ./pa_dither.o ./pa_front.o ./pa_process.o ./pa_asio.o ./pa_win_util.o ./pa_win_hostapis.o ./pa_win_ds.o ./dsound_wrapper.o ./pa_win_wmme.o ./iasiothiscallresolver.o $(RES) LINKOBJ = ./pa_skeleton.o ./pa_stream.o ./pa_trace.o ./pa_allocation.o ./pa_converters.o ./pa_cpuload.o ./pa_dither.o ./pa_front.o ./pa_process.o ./pa_asio.o ./pa_win_util.o ./pa_win_hostapis.o ./pa_win_ds.o ./dsound_wrapper.o ./pa_win_wmme.o ./iasiothiscallresolver.o $(RES) -LIBS = -L"C:/Dev-CPP/lib" -fmessage-length=0 -O3 -s +LIBS = -L"C:/Dev-CPP/lib" -fmessage-length=0 -O0 -s INCS = -I"C:/Dev-CPP/include" -I"../../../asiosdk2" -I"../../../asiosdk2/common" -I"../../../asiosdk2/host" -I"../../../asiosdk2/host/pc" -I"../../pa_common" CXXINCS = -I"C:/Dev-CPP/include/c++" -I"C:/Dev-CPP/include/c++/mingw32" -I"C:/Dev-CPP/include/c++/backward" -I"C:/Dev-CPP/include" -I"../../../asiosdk2" -I"../../../asiosdk2/common" -I"../../../asiosdk2/host" -I"../../../asiosdk2/host/pc" -I"../../pa_common" BIN = portaudio-static.a -CXXFLAGS = $(CXXINCS)-O3 -fmessage-length=0 -Wall -CFLAGS = $(INCS)-O3 -fmessage-length=0 -Wall +CXXFLAGS = $(CXXINCS)-O0 -fmessage-length=0 -Wall +CFLAGS = $(INCS)-O0 -fmessage-length=0 -Wall .PHONY: all all-before all-after clean clean-custom diff --git a/libs/portaudio/configure.in b/libs/portaudio/configure.in index f4ef9abbee..24deaf701c 100644 --- a/libs/portaudio/configure.in +++ b/libs/portaudio/configure.in @@ -130,7 +130,7 @@ AC_SUBST(CXXFLAGS) AC_SUBST(NASM) AC_SUBST(NASMOPT) -CFLAGS=${CFLAGS:-"-g -O2 -Wall -pedantic -pipe -fPIC"} +CFLAGS=${CFLAGS:-"-g -O0 -Wall -pedantic -pipe -fPIC"} if [[ $ac_cv_c_bigendian = "yes" ]] ; then CFLAGS="$CFLAGS -DPA_BIG_ENDIAN" diff --git a/libs/sqlite/Makefile.linux-gcc b/libs/sqlite/Makefile.linux-gcc index c865024b44..e3a3d385dd 100644 --- a/libs/sqlite/Makefile.linux-gcc +++ b/libs/sqlite/Makefile.linux-gcc @@ -19,7 +19,7 @@ TOP = ../sqlite #### C Compiler and options for use in building executables that # will run on the platform that is doing the build. # -BCC = gcc -g -O2 +BCC = gcc -g -O0 #BCC = /opt/ancic/bin/c89 -0 #### If the target operating system supports the "usleep()" system @@ -70,10 +70,10 @@ EXE = # will run on the target platform. This is usually the same # as BCC, unless you are cross-compiling. # -TCC = gcc -O6 +TCC = gcc -O0 #TCC = gcc -g -O0 -Wall #TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage -#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 +#TCC = /opt/mingw/bin/i386-mingw32-gcc -O0 #TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive #### Tools used to build a static library. diff --git a/libs/sqlite/mkso.sh b/libs/sqlite/mkso.sh index 9050d74255..d6afb0198d 100755 --- a/libs/sqlite/mkso.sh +++ b/libs/sqlite/mkso.sh @@ -14,7 +14,7 @@ TCLSTUBLIB=$TCLDIR/libtclstub8.4g.a OPTS='-DUSE_TCL_STUBS=1 -DNDEBUG=1 -DHAVE_DLOPEN=1' for i in *.c; do if test $i != 'keywordhash.c'; then - CMD="cc -fPIC $OPTS -O2 -I. -I$TCLDIR -c $i" + CMD="cc -fPIC $OPTS -O0 -I. -I$TCLDIR -c $i" echo $CMD $CMD fi diff --git a/libs/sqlite/publish.sh b/libs/sqlite/publish.sh index 043c89a039..68d7c7f6e8 100755 --- a/libs/sqlite/publish.sh +++ b/libs/sqlite/publish.sh @@ -66,7 +66,7 @@ make target_source cd tsrc rm tclsqlite.c OPTS='-DSTATIC_BUILD=1 -DNDEBUG=1' -i386-mingw32msvc-gcc -O2 $OPTS -I. -I$TCLDIR *.c -o sqlite3.exe +i386-mingw32msvc-gcc -O0 $OPTS -I. -I$TCLDIR *.c -o sqlite3.exe zip ../doc/sqlite-$VERSW.zip sqlite3.exe cd .. diff --git a/libs/srtp/INSTALL b/libs/srtp/INSTALL index 23e5f25d0e..7d2c51bb9d 100644 --- a/libs/srtp/INSTALL +++ b/libs/srtp/INSTALL @@ -78,7 +78,7 @@ details on some of the pertinent environment variables. by setting variables in the command line or in the environment. Here is an example: - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + ./configure CC=c89 CFLAGS=-O0 LIBS=-lposix *Note Defining Variables::, for more details. diff --git a/libs/srtp/build/config/ax_cc_maxopt.m4 b/libs/srtp/build/config/ax_cc_maxopt.m4 index 6205ee84c8..40bb95c8b7 100644 --- a/libs/srtp/build/config/ax_cc_maxopt.m4 +++ b/libs/srtp/build/config/ax_cc_maxopt.m4 @@ -10,7 +10,7 @@ AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disa if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + dec) CFLAGS="-newc -w0 -O0 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; @@ -31,13 +31,13 @@ if test "$ac_test_CFLAGS" != "set"; then xlc_opt="-qtune=auto" fi AX_CHECK_COMPILER_FLAGS($xlc_opt, - CFLAGS="-O3 -qansialias -w $xlc_opt", - [CFLAGS="-O3 -qansialias -w" + CFLAGS="-O0 -qansialias -w $xlc_opt", + [CFLAGS="-O0 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" - echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* CFLAGS=-O0 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" @@ -45,7 +45,7 @@ if test "$ac_test_CFLAGS" != "set"; then echo "******************************************************"]) ;; - intel) CFLAGS="-O3 -ansi_alias" + intel) CFLAGS="-O0 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" @@ -78,7 +78,7 @@ if test "$ac_test_CFLAGS" != "set"; then gnu) # default optimization flags for gcc on all systems - CFLAGS="-O3 -fomit-frame-pointer" + CFLAGS="-O0 -fomit-frame-pointer" # -malign-double for x86 systems AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") @@ -99,10 +99,10 @@ if test "$ac_test_CFLAGS" != "set"; then echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "* (otherwise, a default of CFLAGS=-O0 will be used) *" echo "********************************************************" echo "" - CFLAGS="-O3" + CFLAGS="-O0" fi AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ diff --git a/libs/srtp/configure.in b/libs/srtp/configure.in index 2495a55f95..8584be880e 100644 --- a/libs/srtp/configure.in +++ b/libs/srtp/configure.in @@ -49,7 +49,7 @@ case "$host" in IN_LINE="" elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then SOLINK="-Bdynamic -dy -G" - new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" IN_LINE=inline fi @@ -71,7 +71,7 @@ case "$host" in FUNC_DEF=__func__ elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" fi DYNAMIC_LIB_EXTEN="so" @@ -84,20 +84,20 @@ case "$host" in FUNC_DEF=__func__ elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fpic -Wall -O4 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fpic -Wall -O0 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" fi DYNAMIC_LIB_EXTEN="so" ;; i*6*-*-freebsd*) SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" DYNAMIC_LIB_EXTEN="so" ;; x86_64-*-freebsd*|amd64-*-freebsd*) SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" DYNAMIC_LIB_EXTEN="so" ;; diff --git a/libs/yaml/aclocal.m4 b/libs/yaml/aclocal.m4 index b7984f0f01..ba1ed63878 100644 --- a/libs/yaml/aclocal.m4 +++ b/libs/yaml/aclocal.m4 @@ -6311,7 +6311,7 @@ ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O0" AC_SUBST(GCJFLAGS) ]) diff --git a/libs/yaml/configure b/libs/yaml/configure index 66e708215a..f66fa4972c 100755 --- a/libs/yaml/configure +++ b/libs/yaml/configure @@ -3222,13 +3222,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O2" + CFLAGS="-g -O0" else - CFLAGS="-g" + CFLAGS="-g -O0" fi else if test "$GCC" = yes; then - CFLAGS="-O2" + CFLAGS="-O0" else CFLAGS= fi @@ -5579,13 +5579,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O2" + CXXFLAGS="-g -O0" else - CXXFLAGS="-g" + CXXFLAGS="-g -O0" fi else if test "$GXX" = yes; then - CXXFLAGS="-O2" + CXXFLAGS="-O0" else CXXFLAGS= fi @@ -6180,13 +6180,13 @@ if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" + FFLAGS="-g -O0" else - FFLAGS="-g" + FFLAGS="-g -O0" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" + FFLAGS="-O0" else FFLAGS= fi diff --git a/src/mod/applications/mod_avmd/Makefile b/src/mod/applications/mod_avmd/Makefile index c4a62d4120..fbf7ccb023 100644 --- a/src/mod/applications/mod_avmd/Makefile +++ b/src/mod/applications/mod_avmd/Makefile @@ -1,6 +1,6 @@ BASE=../../../.. -MOD_CFLAGS= -O2 -#MOD_CFLAGS= -march=core2 -g -O2 -malign-double -mtune=core2 -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse -ffast-math -funroll-loops -fprefetch-loop-arrays -funit-at-a-time -ftracer --save-temps +MOD_CFLAGS= -O0 +#MOD_CFLAGS= -march=core2 -g -O0 -malign-double -mtune=core2 -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse -ffast-math -funroll-loops -fprefetch-loop-arrays -funit-at-a-time -ftracer --save-temps #MOD_LDFLAGS= --save-temps LOCAL_SOURCES=amplitude.c buffer.c desa2.c goertzel.c fast_acosf.c LOCAL_OBJS=amplitude.o buffer.o desa2.o goertzel.o fast_acosf.o diff --git a/src/mod/endpoints/mod_gsmopen/asterisk/Makefile b/src/mod/endpoints/mod_gsmopen/asterisk/Makefile index 6aed86266e..f1b2d54450 100644 --- a/src/mod/endpoints/mod_gsmopen/asterisk/Makefile +++ b/src/mod/endpoints/mod_gsmopen/asterisk/Makefile @@ -33,7 +33,7 @@ CFLAGS+=-g3 CFLAGS+=-I$(AST_INCLUDE_DIR) -I. CFLAGS+=-D_REENTRANT -D_GNU_SOURCE -#CFLAGS+=-O6 +#CFLAGS+=-O0 #CFLAGS+=-march=i586 CFLAGS+=-fomit-frame-pointer ifeq ($(shell uname -m),x86_64) diff --git a/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure b/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure index 5918af81fb..23bae83868 100755 --- a/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure +++ b/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure @@ -2261,13 +2261,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O2" + CFLAGS="-g -O0" else - CFLAGS="-g" + CFLAGS="-g -O0" fi else if test "$GCC" = yes; then - CFLAGS="-O2" + CFLAGS="-O0" else CFLAGS= fi @@ -3144,7 +3144,7 @@ fi; if test "$CXXFLAGS" = ""; then - CXXFLAGS="-O2" + CXXFLAGS="-O0" fi @@ -4748,13 +4748,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O2" + CXXFLAGS="-g -O0" else - CXXFLAGS="-g" + CXXFLAGS="-g -O0" fi else if test "$GXX" = yes; then - CXXFLAGS="-O2" + CXXFLAGS="-O0" else CXXFLAGS= fi @@ -5431,13 +5431,13 @@ if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" + FFLAGS="-g -O0" else - FFLAGS="-g" + FFLAGS="-g -O0" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" + FFLAGS="-O0" else FFLAGS= fi @@ -20153,13 +20153,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O2" + CXXFLAGS="-g -O0" else - CXXFLAGS="-g" + CXXFLAGS="-g -O0" fi else if test "$GXX" = yes; then - CXXFLAGS="-O2" + CXXFLAGS="-O0" else CXXFLAGS= fi diff --git a/src/mod/languages/mod_lua/lua/Makefile b/src/mod/languages/mod_lua/lua/Makefile index e4a3cd6108..4e0b5480d6 100644 --- a/src/mod/languages/mod_lua/lua/Makefile +++ b/src/mod/languages/mod_lua/lua/Makefile @@ -8,7 +8,7 @@ PLAT= none CC= gcc -CFLAGS= -O2 -Wall $(MYCFLAGS) +CFLAGS= -O0 -Wall $(MYCFLAGS) AR= ar rcu RANLIB= ranlib RM= rm -f @@ -81,7 +81,7 @@ none: @echo " $(PLATS)" aix: - $(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" + $(MAKE) all CC="xlc" CFLAGS="-O0 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" ansi: $(MAKE) all MYCFLAGS=-DLUA_ANSI From 012bc154b07aec248fe4b91581ba1a5ea1d3f0d9 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 21 Mar 2012 10:00:27 -0400 Subject: [PATCH 172/493] Revert "freetdm: fixing default values for ISUP" This reverts commit f1d80cd25d13d78deab88ea7f559e63aa899f319. --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 230476d8e1..ad47f0cbb4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2788,7 +2788,7 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t1 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1; } else { - g_ftdm_sngss7_data.cfg.isap[i].t1 = 150; + g_ftdm_sngss7_data.cfg.isap[i].t1 = 200; } if (sng_isap->t2 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2; @@ -2803,17 +2803,17 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t6 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6; } else { - g_ftdm_sngss7_data.cfg.isap[i].t6 = 600; + g_ftdm_sngss7_data.cfg.isap[i].t6 = 200; } if (sng_isap->t7 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7; } else { - g_ftdm_sngss7_data.cfg.isap[i].t7 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t7 = 250; } if (sng_isap->t8 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8; } else { - g_ftdm_sngss7_data.cfg.isap[i].t8 = 100; + g_ftdm_sngss7_data.cfg.isap[i].t8 = 120; } if (sng_isap->t9 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9; From a8e21663ce6684eb665dfddfd1757e76ad13a152 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 21 Mar 2012 10:05:51 -0400 Subject: [PATCH 173/493] Revert "freeswitch: taking out -Ox cflags and have them replaced with -O0" This reverts commit e560ddccdec0232a040851f088db1adec2cbc7f4. --- build/config/ax_cc_maxopt.m4 | 16 ++++++------ libs/apr/build/NWGNUenvironment.inc | 2 +- libs/apr/build/apr_hints.m4 | 2 +- libs/apr/configure.in | 8 +++--- libs/broadvoice/configure.ac | 8 +++--- libs/broadvoice/debian/rules | 2 +- libs/curl/lib/Makefile.b32 | 2 +- libs/curl/lib/Makefile.m32 | 2 +- libs/curl/src/Makefile.b32 | 2 +- libs/curl/src/makefile.amiga | 2 +- libs/js/nsprpub/configure.in | 20 +++++++------- libs/libg722_1/configure.ac | 8 +++--- libs/libsndfile/INSTALL | 2 +- libs/pcre/configure.ac | 10 +++---- libs/portaudio/Makefile.darwin | 2 +- libs/portaudio/SConstruct | 2 +- .../bindings/cpp/build/gnu/configure | 14 +++++----- .../bindings/cpp/build/gnu/configure.ac | 2 +- libs/portaudio/bindings/cpp/configure.ac | 2 +- libs/portaudio/build/dev-cpp/Makefile-static | 6 ++--- libs/portaudio/configure.in | 2 +- libs/sqlite/Makefile.linux-gcc | 6 ++--- libs/sqlite/mkso.sh | 2 +- libs/sqlite/publish.sh | 2 +- libs/srtp/INSTALL | 2 +- libs/srtp/build/config/ax_cc_maxopt.m4 | 16 ++++++------ libs/srtp/configure.in | 10 +++---- libs/yaml/aclocal.m4 | 2 +- libs/yaml/configure | 18 ++++++------- src/mod/applications/mod_avmd/Makefile | 4 +-- .../endpoints/mod_gsmopen/asterisk/Makefile | 2 +- .../gsmlib-1.10-patched-12ubuntu1/configure | 26 +++++++++---------- src/mod/languages/mod_lua/lua/Makefile | 4 +-- 33 files changed, 105 insertions(+), 105 deletions(-) diff --git a/build/config/ax_cc_maxopt.m4 b/build/config/ax_cc_maxopt.m4 index 40bb95c8b7..6205ee84c8 100644 --- a/build/config/ax_cc_maxopt.m4 +++ b/build/config/ax_cc_maxopt.m4 @@ -10,7 +10,7 @@ AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disa if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O0 -ansi_alias -ansi_args -fp_reorder -tune host" + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; @@ -31,13 +31,13 @@ if test "$ac_test_CFLAGS" != "set"; then xlc_opt="-qtune=auto" fi AX_CHECK_COMPILER_FLAGS($xlc_opt, - CFLAGS="-O0 -qansialias -w $xlc_opt", - [CFLAGS="-O0 -qansialias -w" + CFLAGS="-O3 -qansialias -w $xlc_opt", + [CFLAGS="-O3 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" - echo "* CFLAGS=-O0 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" @@ -45,7 +45,7 @@ if test "$ac_test_CFLAGS" != "set"; then echo "******************************************************"]) ;; - intel) CFLAGS="-O0 -ansi_alias" + intel) CFLAGS="-O3 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" @@ -78,7 +78,7 @@ if test "$ac_test_CFLAGS" != "set"; then gnu) # default optimization flags for gcc on all systems - CFLAGS="-O0 -fomit-frame-pointer" + CFLAGS="-O3 -fomit-frame-pointer" # -malign-double for x86 systems AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") @@ -99,10 +99,10 @@ if test "$ac_test_CFLAGS" != "set"; then echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O0 will be used) *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" echo "********************************************************" echo "" - CFLAGS="-O0" + CFLAGS="-O3" fi AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ diff --git a/libs/apr/build/NWGNUenvironment.inc b/libs/apr/build/NWGNUenvironment.inc index 884330fbb7..fd54b487c9 100644 --- a/libs/apr/build/NWGNUenvironment.inc +++ b/libs/apr/build/NWGNUenvironment.inc @@ -161,7 +161,7 @@ endif # -O4,p level 4 optimizations, optimize for speed ifeq "$(RELEASE)" "optimized" -CFLAGS += -O0,p +CFLAGS += -O4,p endif # -prefix apr_arch_pre_nw.h #include pre_nw.h for all files diff --git a/libs/apr/build/apr_hints.m4 b/libs/apr/build/apr_hints.m4 index a7011db555..1347653659 100644 --- a/libs/apr/build/apr_hints.m4 +++ b/libs/apr/build/apr_hints.m4 @@ -326,7 +326,7 @@ dnl # Not a problem in 10.20. Otherwise, who knows? ;; *convex-v11*) APR_ADDTO(CPPFLAGS, [-DCONVEXOS11]) - APR_SETIFNULL(CFLAGS, [-O0]) + APR_SETIFNULL(CFLAGS, [-O1]) APR_ADDTO(CFLAGS, [-ext]) ;; i860-intel-osf1) diff --git a/libs/apr/configure.in b/libs/apr/configure.in index a1d375d768..68c030e124 100644 --- a/libs/apr/configure.in +++ b/libs/apr/configure.in @@ -239,7 +239,7 @@ nl=' ' echo "${nl}Check for compiler flags..." -dnl AC_PROG_CC sets -g in CFLAGS (and -O0 for gcc) by default. +dnl AC_PROG_CC sets -g in CFLAGS (and -O2 for gcc) by default. dnl On OS/390 this causes the compiler to insert extra debugger dnl hook instructions. That's fine for debug/maintainer builds, not fine dnl otherwise. @@ -287,8 +287,8 @@ AC_ARG_ENABLE(profile,[ --enable-profile Turn on profiling for the build APR_ADDTO(CFLAGS, -pg) APR_REMOVEFROM(CFLAGS, -g) if test "$host" = "i586-pc-beos"; then - APR_REMOVEFROM(CFLAGS, -O0) - APR_ADDTO(CFLAGS, -O0) + APR_REMOVEFROM(CFLAGS, -O2) + APR_ADDTO(CFLAGS, -O1) APR_ADDTO(LDFLAGS, -p) fi fi @@ -340,7 +340,7 @@ AC_ARG_ENABLE(pool-debug, if test "$host" = "i586-pc-beos"; then AC_ARG_ENABLE(malloc-debug,[ --enable-malloc-debug Switch on malloc_debug for BeOS], - APR_REMOVEFROM(CFLAGS, -O0) + APR_REMOVEFROM(CFLAGS, -O2) APR_ADDTO(CPPFLAGS, -fcheck-memory-usage -D_KERNEL_MODE) ) dnl fi diff --git a/libs/broadvoice/configure.ac b/libs/broadvoice/configure.ac index 10d279ed8a..ceb92a57cb 100644 --- a/libs/broadvoice/configure.ac +++ b/libs/broadvoice/configure.ac @@ -71,9 +71,9 @@ then CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} - CFLAGS=${CFLAGS-"-g -O0"} + CFLAGS=${CFLAGS-"-g -O2"} CXX=${CXX-${host_alias}-c++} - CXXFLAGS=${CXXFLAGS-"-g -O0"} + CXXFLAGS=${CXXFLAGS-"-g -O2"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally @@ -108,8 +108,8 @@ else fi CXX=${CXX-"c++"} - CFLAGS=${CFLAGS-"-g -O0"} - CXXFLAGS=${CXXFLAGS-"-g -O0"} + CFLAGS=${CFLAGS-"-g -O2"} + CXXFLAGS=${CXXFLAGS-"-g -O2"} fi AC_DEFUN([REMOVE_FROM_VAR],[ diff --git a/libs/broadvoice/debian/rules b/libs/broadvoice/debian/rules index b4f11d6876..636e1b42ae 100644 --- a/libs/broadvoice/debian/rules +++ b/libs/broadvoice/debian/rules @@ -21,7 +21,7 @@ CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else - CFLAGS += -O0 + CFLAGS += -O2 endif include /usr/share/dpatch/dpatch.make diff --git a/libs/curl/lib/Makefile.b32 b/libs/curl/lib/Makefile.b32 index 97c27ddf12..4544d7e7be 100644 --- a/libs/curl/lib/Makefile.b32 +++ b/libs/curl/lib/Makefile.b32 @@ -35,7 +35,7 @@ RM = del LIB = tlib IMPLIB = implib -CXXFLAGS = -q -5 -O0 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM +CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM LIBFLAGS = /C /P32 LDFLAGS = -q -lq -laa -tWD diff --git a/libs/curl/lib/Makefile.m32 b/libs/curl/lib/Makefile.m32 index 1e7977f24c..77085c6b08 100644 --- a/libs/curl/lib/Makefile.m32 +++ b/libs/curl/lib/Makefile.m32 @@ -26,7 +26,7 @@ STRIP = strip -g ## Nothing more to do below this line! INCLUDES = -I. -I../include -CFLAGS = -g -O0 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG +CFLAGS = -g -O2 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG ifdef SSL INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl" CFLAGS += -DUSE_SSLEAY -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \ diff --git a/libs/curl/src/Makefile.b32 b/libs/curl/src/Makefile.b32 index b7ad61733a..d4c1a073c9 100644 --- a/libs/curl/src/Makefile.b32 +++ b/libs/curl/src/Makefile.b32 @@ -32,7 +32,7 @@ CP = copy RM = del LIB = tlib -CXXFLAGS = -q -5 -O0 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM +CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM LDFLAGS = -q -lq -lap INCDIRS = -I.;../include;../lib diff --git a/libs/curl/src/makefile.amiga b/libs/curl/src/makefile.amiga index 15234d422c..9e03e070f0 100755 --- a/libs/curl/src/makefile.amiga +++ b/libs/curl/src/makefile.amiga @@ -8,7 +8,7 @@ ATCPSDKI= /GG/netinclude CC = m68k-amigaos-gcc -CFLAGS = -I$(ATCPSDKI) -m68020-60 -O0 -msoft-float -noixemul -g -I. -I../include -W -Wall +CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall LIBS = ../lib/libcurl.a -lssl -lcrypto -lz MANPAGE = ../docs/curl.1 README = ../docs/MANUAL diff --git a/libs/js/nsprpub/configure.in b/libs/js/nsprpub/configure.in index b3fcffe60c..93d3bd9f85 100644 --- a/libs/js/nsprpub/configure.in +++ b/libs/js/nsprpub/configure.in @@ -62,7 +62,7 @@ USE_CPLUS= USE_IPV6= USE_MDUPDATE= _MACOSX_DEPLOYMENT_TARGET= -_OPTIMIZE_FLAGS=-O0 +_OPTIMIZE_FLAGS=-O _DEBUG_FLAGS=-g MOZ_DEBUG=1 MOZ_OPTIMIZE= @@ -176,7 +176,7 @@ AC_ARG_WITH(mozilla, fi]) AC_ARG_ENABLE(optimize, - [ --enable-optimize(=val) Enable code optimizations (val, ie. -O0) ], + [ --enable-optimize(=val) Enable code optimizations (val, ie. -O2) ], [ if test "$enableval" != "no"; then MOZ_OPTIMIZE=1 if test -n "$enableval" && test "$enableval" != "yes"; then @@ -887,7 +887,7 @@ case "$target" in RESOLVE_LINK_SYMBOLS=1 case "${target_cpu}" in i*86) - _OPTIMIZE_FLAGS=-O0 + _OPTIMIZE_FLAGS=-O2 _DEBUG_FLAGS='-gdwarf-2 -O0' MKSHLIB='$(CCC) $(DSO_LDOPTS) -o $@' AC_CHECK_LIB(bind, gethostbyaddr, [OS_LIBS="$OS_LIBS -lbind -lsocket"]) @@ -897,7 +897,7 @@ case "$target" in CCC=mwcc LD=mwld DSO_LDOPTS='-xms -export pragma -init _init_routine_ -term _term_routine_ -lroot -lnet /boot/develop/lib/ppc/glue-noinit.a /boot/develop/lib/ppc/init_term_dyn.o /boot/develop/lib/ppc/start_dyn.o' - _OPTIMIZE_FLAGS=-O0 + _OPTIMIZE_FLAGS=-O2 _DEBUG_FLAGS='-g -O0' ;; esac @@ -1115,7 +1115,7 @@ tools are selected during the Xcode/Developer Tools installation.]) AC_DEFINE(_DGUX_SOURCE) AC_DEFINE(_POSIX4A_DRAFT6_SOURCE) DSO_LDOPTS=-G - _OPTIMIZE_FLAGS=-O0 + _OPTIMIZE_FLAGS=-O2 _DEBUG_FLAGS= MDCPUCFG_H=_dgux.cfg PR_MD_CSRCS=dgux.c @@ -1334,7 +1334,7 @@ tools are selected during the Xcode/Developer Tools installation.]) dnl AS='$(CC) -Wp,-P -x assembler-with-cpp -D_ASM -mips2 $(INCLUDES)' CFLAGS="$CFLAGS -Wall -Wno-format" - _OPTIMIZE_FLAGS="-O0" + _OPTIMIZE_FLAGS="-O6" else if test -n "$USE_N32"; then AS='as -D_ASM $(INCLUDES) -n32' @@ -1408,7 +1408,7 @@ tools are selected during the Xcode/Developer Tools installation.]) MKSHLIB='$(CC) $(DSO_LDOPTS) $(OS_LDFLAGS) -o $@' DSO_CFLAGS=-fPIC DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' - _OPTIMIZE_FLAGS=-O0 + _OPTIMIZE_FLAGS=-O2 _DEBUG_FLAGS="-g" # most people on linux use gcc/gdb, and that # combo is not yet good at debugging inlined # functions (even when using DWARF2 as the @@ -1485,7 +1485,7 @@ tools are selected during the Xcode/Developer Tools installation.]) CFLAGS="$CFLAGS -W3 -nologo -GF -Gy" DLLFLAGS='-OUT:"$@"' _DEBUG_FLAGS=-Z7 - _OPTIMIZE_FLAGS=-O0 + _OPTIMIZE_FLAGS=-O2 if test -z "$MOZ_OPTIMIZE"; then CFLAGS="$CFLAGS -Od" fi @@ -1724,7 +1724,7 @@ mips-sony-newsos*) DSO_CFLAGS=-fPIC DSO_LDOPTS=-shared OS_LIBS="$OS_LIBS -lsocket" - _OPTIMIZE_FLAGS="-O0" + _OPTIMIZE_FLAGS="-O1" _DEBUG_FLAGS="-gstabs" ;; @@ -2082,7 +2082,7 @@ mips-sony-newsos*) DSO_CFLAGS= DSO_LDOPTS='-Zomf -Zdll -Zmap' LDFLAGS='-Zmap' - _OPTIMIZE_FLAGS="-O0 -s" + _OPTIMIZE_FLAGS="-O2 -s" _DEBUG_FLAGS="-g -fno-inline" if test -n "$MOZ_OPTIMIZE"; then DSO_LDOPTS="$DSO_LDOPTS -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA" diff --git a/libs/libg722_1/configure.ac b/libs/libg722_1/configure.ac index e5385d4091..62095ce374 100644 --- a/libs/libg722_1/configure.ac +++ b/libs/libg722_1/configure.ac @@ -64,9 +64,9 @@ then CC_FOR_BUILD=${CC_FOR_BUILD-gcc} CPPFLAGS_FOR_BUILD="\$(CPPFLAGS)" CC=${CC-${host_alias}-gcc} - CFLAGS=${CFLAGS-"-g -O0"} + CFLAGS=${CFLAGS-"-g -O2"} CXX=${CXX-${host_alias}-c++} - CXXFLAGS=${CXXFLAGS-"-g -O0"} + CXXFLAGS=${CXXFLAGS-"-g -O2"} else # Set reasonable default values for some tools even if not Canadian. # Of course, these are different reasonable default values, originally @@ -101,8 +101,8 @@ else fi CXX=${CXX-"c++"} - CFLAGS=${CFLAGS-"-g -O0"} - CXXFLAGS=${CXXFLAGS-"-g -O0"} + CFLAGS=${CFLAGS-"-g -O2"} + CXXFLAGS=${CXXFLAGS-"-g -O2"} fi AC_DEFUN([REMOVE_FROM_VAR],[ diff --git a/libs/libsndfile/INSTALL b/libs/libsndfile/INSTALL index d520a54b6b..b42a17ac46 100644 --- a/libs/libsndfile/INSTALL +++ b/libs/libsndfile/INSTALL @@ -59,7 +59,7 @@ the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: - CC=c89 CFLAGS=-O0 LIBS=-lposix ./configure + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure diff --git a/libs/pcre/configure.ac b/libs/pcre/configure.ac index 7bf7c95b35..b6f79f98cf 100644 --- a/libs/pcre/configure.ac +++ b/libs/pcre/configure.ac @@ -26,7 +26,7 @@ CFLAGS="$CFLAGS $CONFIGURE_CFLAGS" CXXFLAGS="$CXXFLAGS $CONFIGURE_CXXFLAGS" LDFLAGS="$LDFLAGS $CONFIGURE_LDFLAGS" -# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O0" for gcc and just +# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just # "-g" for any other compiler. There doesn't seem to be a standard way of # getting rid of the -g (which I don't think is needed for a production # library). This fudge seems to achieve the necessary. First, we remember the @@ -44,9 +44,9 @@ AC_PROG_CXX if test "x$remember_set_CFLAGS" = "x" then - if test "$CFLAGS" = "-g -O0" + if test "$CFLAGS" = "-g -O2" then - CFLAGS="-O0" + CFLAGS="-O2" elif test "$CFLAGS" = "-g" then CFLAGS="" @@ -55,9 +55,9 @@ fi if test "x$remember_set_CXXFLAGS" = "x" then - if test "$CXXFLAGS" = "-g -O0" + if test "$CXXFLAGS" = "-g -O2" then - CXXFLAGS="-O0" + CXXFLAGS="-O2" elif test "$CXXFLAGS" = "-g" then CXXFLAGS="" diff --git a/libs/portaudio/Makefile.darwin b/libs/portaudio/Makefile.darwin index 0d37963f04..9aec51de24 100644 --- a/libs/portaudio/Makefile.darwin +++ b/libs/portaudio/Makefile.darwin @@ -11,7 +11,7 @@ top_srcdir = . srcdir = . top_builddir = . -OPT_LEVEL := -O0 +OPT_LEVEL := -O2 PREFIX = /usr/local prefix = $(PREFIX) exec_prefix = ${prefix} diff --git a/libs/portaudio/SConstruct b/libs/portaudio/SConstruct index 3c4bca0df7..15d36bad57 100644 --- a/libs/portaudio/SConstruct +++ b/libs/portaudio/SConstruct @@ -39,7 +39,7 @@ if Platform in Posix: baseLinkFlags = threadCFlags = "-pthread" baseCxxFlags = baseCFlags = "-Wall -pedantic -pipe " + threadCFlags debugCxxFlags = debugCFlags = "-g" - optCxxFlags = optCFlags = "-O0" + optCxxFlags = optCFlags = "-O2" env["CCFLAGS"] = baseCFlags.split() env["CXXFLAGS"] = baseCxxFlags.split() env["LINKFLAGS"] = baseLinkFlags.split() diff --git a/libs/portaudio/bindings/cpp/build/gnu/configure b/libs/portaudio/bindings/cpp/build/gnu/configure index e91013c07c..69070c66d4 100644 --- a/libs/portaudio/bindings/cpp/build/gnu/configure +++ b/libs/portaudio/bindings/cpp/build/gnu/configure @@ -1263,7 +1263,7 @@ PORTAUDIO="$PACPP_ROOT/../portaudio" PACPP_INC="$PACPP_ROOT/include" INCLUDES="-I$PACPP_INC -I$PORTAUDIO -I$PORTAUDIO/pa_common" -CFLAGS="-g -O0 -Wall -ansi -pedantic $INCLUDES" +CFLAGS="-g -O2 -Wall -ansi -pedantic $INCLUDES" CXXFLAGS="$CFLAGS" PALIBDIR="$PORTAUDIO/lib" @@ -1908,13 +1908,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O0" + CFLAGS="-g -O2" else - CFLAGS="-g -O0" + CFLAGS="-g" fi else if test "$GCC" = yes; then - CFLAGS="-O0" + CFLAGS="-O2" else CFLAGS= fi @@ -2350,13 +2350,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O0" + CXXFLAGS="-g -O2" else - CXXFLAGS="-g -O0" + CXXFLAGS="-g" fi else if test "$GXX" = yes; then - CXXFLAGS="-O0" + CXXFLAGS="-O2" else CXXFLAGS= fi diff --git a/libs/portaudio/bindings/cpp/build/gnu/configure.ac b/libs/portaudio/bindings/cpp/build/gnu/configure.ac index 071a7e94ef..5457c53420 100644 --- a/libs/portaudio/bindings/cpp/build/gnu/configure.ac +++ b/libs/portaudio/bindings/cpp/build/gnu/configure.ac @@ -24,7 +24,7 @@ PORTAUDIO="$PACPP_ROOT/../portaudio" PACPP_INC="$PACPP_ROOT/include" INCLUDES="-I$PACPP_INC -I$PORTAUDIO -I$PORTAUDIO/pa_common" -CFLAGS="-g -O0 -Wall -ansi -pedantic $INCLUDES" +CFLAGS="-g -O2 -Wall -ansi -pedantic $INCLUDES" CXXFLAGS="$CFLAGS" PALIBDIR="$PORTAUDIO/lib" diff --git a/libs/portaudio/bindings/cpp/configure.ac b/libs/portaudio/bindings/cpp/configure.ac index 94baff8fc3..100656ac41 100644 --- a/libs/portaudio/bindings/cpp/configure.ac +++ b/libs/portaudio/bindings/cpp/configure.ac @@ -25,7 +25,7 @@ PORTAUDIO_ROOT="../.." # Various other variables and flags DEFAULT_INCLUDES="-I$PACPP_ROOT/include -I$PACPP_ROOT/$PORTAUDIO_ROOT/include" -CFLAGS=${CFLAGS-"-g -O0 -Wall -ansi -pedantic"} +CFLAGS=${CFLAGS-"-g -O2 -Wall -ansi -pedantic"} CXXFLAGS=${CXXFLAGS-"${CFLAGS}"} LT_VERSION_INFO="lt_current:lt_revision:lt_age" diff --git a/libs/portaudio/build/dev-cpp/Makefile-static b/libs/portaudio/build/dev-cpp/Makefile-static index 65fcb5dacf..2a1647ddc5 100644 --- a/libs/portaudio/build/dev-cpp/Makefile-static +++ b/libs/portaudio/build/dev-cpp/Makefile-static @@ -7,12 +7,12 @@ WINDRES = windres.exe RES = OBJ = ./pa_skeleton.o ./pa_stream.o ./pa_trace.o ./pa_allocation.o ./pa_converters.o ./pa_cpuload.o ./pa_dither.o ./pa_front.o ./pa_process.o ./pa_asio.o ./pa_win_util.o ./pa_win_hostapis.o ./pa_win_ds.o ./dsound_wrapper.o ./pa_win_wmme.o ./iasiothiscallresolver.o $(RES) LINKOBJ = ./pa_skeleton.o ./pa_stream.o ./pa_trace.o ./pa_allocation.o ./pa_converters.o ./pa_cpuload.o ./pa_dither.o ./pa_front.o ./pa_process.o ./pa_asio.o ./pa_win_util.o ./pa_win_hostapis.o ./pa_win_ds.o ./dsound_wrapper.o ./pa_win_wmme.o ./iasiothiscallresolver.o $(RES) -LIBS = -L"C:/Dev-CPP/lib" -fmessage-length=0 -O0 -s +LIBS = -L"C:/Dev-CPP/lib" -fmessage-length=0 -O3 -s INCS = -I"C:/Dev-CPP/include" -I"../../../asiosdk2" -I"../../../asiosdk2/common" -I"../../../asiosdk2/host" -I"../../../asiosdk2/host/pc" -I"../../pa_common" CXXINCS = -I"C:/Dev-CPP/include/c++" -I"C:/Dev-CPP/include/c++/mingw32" -I"C:/Dev-CPP/include/c++/backward" -I"C:/Dev-CPP/include" -I"../../../asiosdk2" -I"../../../asiosdk2/common" -I"../../../asiosdk2/host" -I"../../../asiosdk2/host/pc" -I"../../pa_common" BIN = portaudio-static.a -CXXFLAGS = $(CXXINCS)-O0 -fmessage-length=0 -Wall -CFLAGS = $(INCS)-O0 -fmessage-length=0 -Wall +CXXFLAGS = $(CXXINCS)-O3 -fmessage-length=0 -Wall +CFLAGS = $(INCS)-O3 -fmessage-length=0 -Wall .PHONY: all all-before all-after clean clean-custom diff --git a/libs/portaudio/configure.in b/libs/portaudio/configure.in index 24deaf701c..f4ef9abbee 100644 --- a/libs/portaudio/configure.in +++ b/libs/portaudio/configure.in @@ -130,7 +130,7 @@ AC_SUBST(CXXFLAGS) AC_SUBST(NASM) AC_SUBST(NASMOPT) -CFLAGS=${CFLAGS:-"-g -O0 -Wall -pedantic -pipe -fPIC"} +CFLAGS=${CFLAGS:-"-g -O2 -Wall -pedantic -pipe -fPIC"} if [[ $ac_cv_c_bigendian = "yes" ]] ; then CFLAGS="$CFLAGS -DPA_BIG_ENDIAN" diff --git a/libs/sqlite/Makefile.linux-gcc b/libs/sqlite/Makefile.linux-gcc index e3a3d385dd..c865024b44 100644 --- a/libs/sqlite/Makefile.linux-gcc +++ b/libs/sqlite/Makefile.linux-gcc @@ -19,7 +19,7 @@ TOP = ../sqlite #### C Compiler and options for use in building executables that # will run on the platform that is doing the build. # -BCC = gcc -g -O0 +BCC = gcc -g -O2 #BCC = /opt/ancic/bin/c89 -0 #### If the target operating system supports the "usleep()" system @@ -70,10 +70,10 @@ EXE = # will run on the target platform. This is usually the same # as BCC, unless you are cross-compiling. # -TCC = gcc -O0 +TCC = gcc -O6 #TCC = gcc -g -O0 -Wall #TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage -#TCC = /opt/mingw/bin/i386-mingw32-gcc -O0 +#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 #TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive #### Tools used to build a static library. diff --git a/libs/sqlite/mkso.sh b/libs/sqlite/mkso.sh index d6afb0198d..9050d74255 100755 --- a/libs/sqlite/mkso.sh +++ b/libs/sqlite/mkso.sh @@ -14,7 +14,7 @@ TCLSTUBLIB=$TCLDIR/libtclstub8.4g.a OPTS='-DUSE_TCL_STUBS=1 -DNDEBUG=1 -DHAVE_DLOPEN=1' for i in *.c; do if test $i != 'keywordhash.c'; then - CMD="cc -fPIC $OPTS -O0 -I. -I$TCLDIR -c $i" + CMD="cc -fPIC $OPTS -O2 -I. -I$TCLDIR -c $i" echo $CMD $CMD fi diff --git a/libs/sqlite/publish.sh b/libs/sqlite/publish.sh index 68d7c7f6e8..043c89a039 100755 --- a/libs/sqlite/publish.sh +++ b/libs/sqlite/publish.sh @@ -66,7 +66,7 @@ make target_source cd tsrc rm tclsqlite.c OPTS='-DSTATIC_BUILD=1 -DNDEBUG=1' -i386-mingw32msvc-gcc -O0 $OPTS -I. -I$TCLDIR *.c -o sqlite3.exe +i386-mingw32msvc-gcc -O2 $OPTS -I. -I$TCLDIR *.c -o sqlite3.exe zip ../doc/sqlite-$VERSW.zip sqlite3.exe cd .. diff --git a/libs/srtp/INSTALL b/libs/srtp/INSTALL index 7d2c51bb9d..23e5f25d0e 100644 --- a/libs/srtp/INSTALL +++ b/libs/srtp/INSTALL @@ -78,7 +78,7 @@ details on some of the pertinent environment variables. by setting variables in the command line or in the environment. Here is an example: - ./configure CC=c89 CFLAGS=-O0 LIBS=-lposix + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. diff --git a/libs/srtp/build/config/ax_cc_maxopt.m4 b/libs/srtp/build/config/ax_cc_maxopt.m4 index 40bb95c8b7..6205ee84c8 100644 --- a/libs/srtp/build/config/ax_cc_maxopt.m4 +++ b/libs/srtp/build/config/ax_cc_maxopt.m4 @@ -10,7 +10,7 @@ AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disa if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O0 -ansi_alias -ansi_args -fp_reorder -tune host" + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; @@ -31,13 +31,13 @@ if test "$ac_test_CFLAGS" != "set"; then xlc_opt="-qtune=auto" fi AX_CHECK_COMPILER_FLAGS($xlc_opt, - CFLAGS="-O0 -qansialias -w $xlc_opt", - [CFLAGS="-O0 -qansialias -w" + CFLAGS="-O3 -qansialias -w $xlc_opt", + [CFLAGS="-O3 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" - echo "* CFLAGS=-O0 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" @@ -45,7 +45,7 @@ if test "$ac_test_CFLAGS" != "set"; then echo "******************************************************"]) ;; - intel) CFLAGS="-O0 -ansi_alias" + intel) CFLAGS="-O3 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" @@ -78,7 +78,7 @@ if test "$ac_test_CFLAGS" != "set"; then gnu) # default optimization flags for gcc on all systems - CFLAGS="-O0 -fomit-frame-pointer" + CFLAGS="-O3 -fomit-frame-pointer" # -malign-double for x86 systems AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") @@ -99,10 +99,10 @@ if test "$ac_test_CFLAGS" != "set"; then echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O0 will be used) *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" echo "********************************************************" echo "" - CFLAGS="-O0" + CFLAGS="-O3" fi AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ diff --git a/libs/srtp/configure.in b/libs/srtp/configure.in index 8584be880e..2495a55f95 100644 --- a/libs/srtp/configure.in +++ b/libs/srtp/configure.in @@ -49,7 +49,7 @@ case "$host" in IN_LINE="" elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then SOLINK="-Bdynamic -dy -G" - new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" IN_LINE=inline fi @@ -71,7 +71,7 @@ case "$host" in FUNC_DEF=__func__ elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" fi DYNAMIC_LIB_EXTEN="so" @@ -84,20 +84,20 @@ case "$host" in FUNC_DEF=__func__ elif test "x${ax_cv_c_compiler_vendor}"="xgnu" ; then SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fpic -Wall -O0 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fpic -Wall -O4 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" fi DYNAMIC_LIB_EXTEN="so" ;; i*6*-*-freebsd*) SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" DYNAMIC_LIB_EXTEN="so" ;; x86_64-*-freebsd*|amd64-*-freebsd*) SOLINK="-shared -Xlinker -x" - new_AM_CFLAGS="-fPIC -Wall -O0 -fexpensive-optimizations -funroll-loops" + new_AM_CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops" new_AM_LDFLAGS="" DYNAMIC_LIB_EXTEN="so" ;; diff --git a/libs/yaml/aclocal.m4 b/libs/yaml/aclocal.m4 index ba1ed63878..b7984f0f01 100644 --- a/libs/yaml/aclocal.m4 +++ b/libs/yaml/aclocal.m4 @@ -6311,7 +6311,7 @@ ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O0" + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) diff --git a/libs/yaml/configure b/libs/yaml/configure index f66fa4972c..66e708215a 100755 --- a/libs/yaml/configure +++ b/libs/yaml/configure @@ -3222,13 +3222,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O0" + CFLAGS="-g -O2" else - CFLAGS="-g -O0" + CFLAGS="-g" fi else if test "$GCC" = yes; then - CFLAGS="-O0" + CFLAGS="-O2" else CFLAGS= fi @@ -5579,13 +5579,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O0" + CXXFLAGS="-g -O2" else - CXXFLAGS="-g -O0" + CXXFLAGS="-g" fi else if test "$GXX" = yes; then - CXXFLAGS="-O0" + CXXFLAGS="-O2" else CXXFLAGS= fi @@ -6180,13 +6180,13 @@ if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O0" + FFLAGS="-g -O2" else - FFLAGS="-g -O0" + FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O0" + FFLAGS="-O2" else FFLAGS= fi diff --git a/src/mod/applications/mod_avmd/Makefile b/src/mod/applications/mod_avmd/Makefile index fbf7ccb023..c4a62d4120 100644 --- a/src/mod/applications/mod_avmd/Makefile +++ b/src/mod/applications/mod_avmd/Makefile @@ -1,6 +1,6 @@ BASE=../../../.. -MOD_CFLAGS= -O0 -#MOD_CFLAGS= -march=core2 -g -O0 -malign-double -mtune=core2 -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse -ffast-math -funroll-loops -fprefetch-loop-arrays -funit-at-a-time -ftracer --save-temps +MOD_CFLAGS= -O2 +#MOD_CFLAGS= -march=core2 -g -O2 -malign-double -mtune=core2 -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse -ffast-math -funroll-loops -fprefetch-loop-arrays -funit-at-a-time -ftracer --save-temps #MOD_LDFLAGS= --save-temps LOCAL_SOURCES=amplitude.c buffer.c desa2.c goertzel.c fast_acosf.c LOCAL_OBJS=amplitude.o buffer.o desa2.o goertzel.o fast_acosf.o diff --git a/src/mod/endpoints/mod_gsmopen/asterisk/Makefile b/src/mod/endpoints/mod_gsmopen/asterisk/Makefile index f1b2d54450..6aed86266e 100644 --- a/src/mod/endpoints/mod_gsmopen/asterisk/Makefile +++ b/src/mod/endpoints/mod_gsmopen/asterisk/Makefile @@ -33,7 +33,7 @@ CFLAGS+=-g3 CFLAGS+=-I$(AST_INCLUDE_DIR) -I. CFLAGS+=-D_REENTRANT -D_GNU_SOURCE -#CFLAGS+=-O0 +#CFLAGS+=-O6 #CFLAGS+=-march=i586 CFLAGS+=-fomit-frame-pointer ifeq ($(shell uname -m),x86_64) diff --git a/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure b/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure index 23bae83868..5918af81fb 100755 --- a/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure +++ b/src/mod/endpoints/mod_gsmopen/gsmlib/gsmlib-1.10-patched-12ubuntu1/configure @@ -2261,13 +2261,13 @@ if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then - CFLAGS="-g -O0" + CFLAGS="-g -O2" else - CFLAGS="-g -O0" + CFLAGS="-g" fi else if test "$GCC" = yes; then - CFLAGS="-O0" + CFLAGS="-O2" else CFLAGS= fi @@ -3144,7 +3144,7 @@ fi; if test "$CXXFLAGS" = ""; then - CXXFLAGS="-O0" + CXXFLAGS="-O2" fi @@ -4748,13 +4748,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O0" + CXXFLAGS="-g -O2" else - CXXFLAGS="-g -O0" + CXXFLAGS="-g" fi else if test "$GXX" = yes; then - CXXFLAGS="-O0" + CXXFLAGS="-O2" else CXXFLAGS= fi @@ -5431,13 +5431,13 @@ if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O0" + FFLAGS="-g -O2" else - FFLAGS="-g -O0" + FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O0" + FFLAGS="-O2" else FFLAGS= fi @@ -20153,13 +20153,13 @@ if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then - CXXFLAGS="-g -O0" + CXXFLAGS="-g -O2" else - CXXFLAGS="-g -O0" + CXXFLAGS="-g" fi else if test "$GXX" = yes; then - CXXFLAGS="-O0" + CXXFLAGS="-O2" else CXXFLAGS= fi diff --git a/src/mod/languages/mod_lua/lua/Makefile b/src/mod/languages/mod_lua/lua/Makefile index 4e0b5480d6..e4a3cd6108 100644 --- a/src/mod/languages/mod_lua/lua/Makefile +++ b/src/mod/languages/mod_lua/lua/Makefile @@ -8,7 +8,7 @@ PLAT= none CC= gcc -CFLAGS= -O0 -Wall $(MYCFLAGS) +CFLAGS= -O2 -Wall $(MYCFLAGS) AR= ar rcu RANLIB= ranlib RM= rm -f @@ -81,7 +81,7 @@ none: @echo " $(PLATS)" aix: - $(MAKE) all CC="xlc" CFLAGS="-O0 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" + $(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" ansi: $(MAKE) all MYCFLAGS=-DLUA_ANSI From bfefbb55220f48e3c397c8f48c39cfe740cb9325 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 21 Mar 2012 10:12:59 -0400 Subject: [PATCH 174/493] freetdm: fix isup timers default values --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index ad47f0cbb4..230476d8e1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -2788,7 +2788,7 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t1 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1; } else { - g_ftdm_sngss7_data.cfg.isap[i].t1 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t1 = 150; } if (sng_isap->t2 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2; @@ -2803,17 +2803,17 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap) if (sng_isap->t6 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6; } else { - g_ftdm_sngss7_data.cfg.isap[i].t6 = 200; + g_ftdm_sngss7_data.cfg.isap[i].t6 = 600; } if (sng_isap->t7 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7; } else { - g_ftdm_sngss7_data.cfg.isap[i].t7 = 250; + g_ftdm_sngss7_data.cfg.isap[i].t7 = 200; } if (sng_isap->t8 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8; } else { - g_ftdm_sngss7_data.cfg.isap[i].t8 = 120; + g_ftdm_sngss7_data.cfg.isap[i].t8 = 100; } if (sng_isap->t9 != 0) { g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9; From a2db3c24b38eb260bda331f8ec5ae512661b5b5f Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 27 Mar 2012 18:00:24 -0400 Subject: [PATCH 175/493] freetdm: fixing more potential null pointers in native bridge mode. --- .../ftmod_sangoma_ss7_main.c | 45 ++++++++++++------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 26 ++++++----- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fe129c0f73..3d30a534cd 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -426,24 +426,33 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* note that the channels being dequeued here may not belong to this span they may belong to just about any other span that one of our channels happens to be bridged to */ - sngss7_chan_data_t *peer_info = peerchan->call_data; - sngss7_chan_data_t *chan_info = peer_info->peer_data; - ftdmchan = chan_info->ftdmchan; + sngss7_chan_data_t *peer_info; + sngss7_chan_data_t *chan_info; - /* - if there is any state changes at all, those will be done in the opposite channel - to peerchan (where the original event was received), therefore we must lock ftdmchan, - but do not need to lock peerchan as we only read its event queue, which is already - locked when dequeueing */ - ftdm_channel_lock(ftdmchan); + peer_info = peerchan->call_data; + if (peer_info) { + chan_info = peer_info->peer_data; + if (chan_info) { + ftdmchan = chan_info->ftdmchan; + if (ftdmchan) { - /* clean out all pending stack events in the peer channel */ - while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) { - ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); - ftdm_safe_free(sngss7_event); + /* + if there is any state changes at all, those will be done in the opposite channel + to peerchan (where the original event was received), therefore we must lock ftdmchan, + but do not need to lock peerchan as we only read its event queue, which is already + locked when dequeueing */ + ftdm_channel_lock(ftdmchan); + + /* clean out all pending stack events in the peer channel */ + while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) { + ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); + ftdm_safe_free(sngss7_event); + } + + ftdm_channel_unlock(ftdmchan); + } + } } - - ftdm_channel_unlock(ftdmchan); } /* clean out all pending stack events */ @@ -1519,9 +1528,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) */ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { sngss7_chan_data_t *peer_info = sngss7_info->peer_data; - sngss7_info->peer_data = NULL; if (peer_info) { - peer_info->peer_data = NULL; + sngss7_info->peer_data = NULL; + if (peer_info) { + peer_info->peer_data = NULL; + } } } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 5f0a0f0960..c44c7bd7b2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -72,21 +72,23 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) var, peer_span->signal_type); } else { peer_info = peer_chan->call_data; - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", - sngss7_info->circuit->cic, peer_info->circuit->cic); + if (peer_info) { + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", + sngss7_info->circuit->cic, peer_info->circuit->cic); - /* make each one of us aware of the native bridge */ - peer_info->peer_data = sngss7_info; - sngss7_info->peer_data = peer_info; + /* make each one of us aware of the native bridge */ + peer_info->peer_data = sngss7_info; + sngss7_info->peer_data = peer_info; - /* flush our own queue */ - sngss7_flush_queue(sngss7_info->event_queue); + /* flush our own queue */ + sngss7_flush_queue(sngss7_info->event_queue); - /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, - We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function - because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped - and we still need those variables for further IAM processing */ - native_going_up = FTDM_TRUE; + /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, + We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function + because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped + and we still need those variables for further IAM processing */ + native_going_up = FTDM_TRUE; + } } } } From 8a589435de7b8656bd18a1a10ff66529380b7f09 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 30 Mar 2012 16:50:00 -0400 Subject: [PATCH 176/493] freetdm: Adding condition to parse sip headers only for non-freetdm channels. This fixes an issue where ss7 native bridge was accidentally enabled any time two freetdm channels were bridged regardless of the freetdm_native_sigbridge variable value. --- libs/freetdm/mod_freetdm/mod_freetdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index c3e5c486db..6a32098b44 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1349,7 +1349,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi chan_id = 0; } - if (session && globals.sip_headers) { + if (session && globals.sip_headers && !switch_core_session_check_interface (session,freetdm_endpoint_interface) ) { switch_channel_t *channel = switch_core_session_get_channel(session); const char *sipvar; From b324f8679782957bc9db3bdfd6687aa42cba77dd Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 3 Apr 2012 11:23:49 -0400 Subject: [PATCH 177/493] freetdm: Clean up SS7 native bridge code to separate the call control, queuing and resource-cleanup responsibilities clearly between the 2 channels involved in the bridge - Each channel is responsible for clearning its own peer_data and event queue at the end of the call (when moving to DOWN state) - Each channel dequeues messages only from its own queue and enqueues messages in the peer's queue, with the only exception being messages received before the bridge is stablished (IAM for sure and possible SAM messages) because if the bridge is not yet stablished the messages must be queued by the channel in its own queue temporarily until the bridge is ready - When the bridge is ready it is the responsibility of the incoming channel to move the messages that stored temporarily in its own queue to the bridged peer queue - During hangup, each channel is responsible for moving itself to DOWN. The procedure however differs slightly depending on the hangup conditions If the user requests hangup (ie, FreeSWITCH) the request will be noted by setting the FTDM_CHANNEL_USER_HANGUP flag but will not be processed yet because call control is driven only by the link messages (so no hangup from ESL or command line allowed) When REL message comes, the channel receiving it must move to TERMINATING state and: - If the user has not hangup yet (FTDM_CHANNEL_USER_HANGUP flag not set) then notify the user via SIGEVENT_STOP and wait for the user to move to HANGUP state by calling ftdm_channel_call_hangup() before sending RLC - If the user did hangup already (FTDM_CHANNEL_USER_HANGUP flag is set) then skip user notification and move to HANGUP state directly where the RLC message will be sent - On HANGUP state the RLC is sent and the channel is moved to DOWN, final state The peer channel will forward the REL message and wait for RLC from the network, when RLC is received the channel can move straight to DOWN itself because the peer channel is completing its own shutdown procedure when it received the REL message --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c | 1 + .../ftmod_sangoma_ss7_main.c | 163 +++++++----------- .../ftmod_sangoma_ss7_main.h | 6 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 41 ++--- 4 files changed, 88 insertions(+), 123 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c index b13c98b1e6..92931c4b8d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c @@ -81,6 +81,7 @@ void sngss7_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCo /* initalize the sngss7_event */ sngss7_event = ftdm_malloc(sizeof(*sngss7_event)); + if (sngss7_event == NULL) { SS7_ERROR("Failed to allocate memory for sngss7_event!\n"); SS7_FUNC_TRACE_EXIT(__FUNCTION__); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 3d30a534cd..76266f0d53 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -340,10 +340,9 @@ static void handle_hw_alarm(ftdm_event_t *e) /* MONITIOR THREADS ***********************************************************/ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) { - ftdm_interrupt_t *ftdm_sangoma_ss7_int[3]; + ftdm_interrupt_t *ftdm_sangoma_ss7_int[2]; ftdm_span_t *ftdmspan = (ftdm_span_t *) obj; ftdm_channel_t *ftdmchan = NULL; - ftdm_channel_t *peerchan = NULL; ftdm_event_t *event = NULL; sngss7_event_data_t *sngss7_event = NULL; sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data; @@ -368,12 +367,6 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) goto ftdm_sangoma_ss7_run_exit; } - /* get an interrupt queue for this span for peer channel events */ - if (ftdm_queue_get_interrupt (sngss7_span->peer_chans, &ftdm_sangoma_ss7_int[2]) != FTDM_SUCCESS) { - SS7_CRITICAL ("Failed to get a ftdm_interrupt for span = %d for peer channel events queue!\n", ftdmspan->span_id); - goto ftdm_sangoma_ss7_run_exit; - } - while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { int x = 0; if (b_alarm_test) { @@ -410,51 +403,26 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* clean out all pending channel state changes */ while ((ftdmchan = ftdm_queue_dequeue (ftdmspan->pendingchans))) { + sngss7_chan_data_t *chan_info = ftdmchan->call_data; /*first lock the channel */ ftdm_mutex_lock(ftdmchan->mutex); /* process state changes for this channel until they are all done */ ftdm_channel_advance_states(ftdmchan); + + if (chan_info->peer_data) { + /* clean out all pending stack events in the peer channel */ + while ((sngss7_event = ftdm_queue_dequeue(chan_info->event_queue))) { + ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); + ftdm_safe_free(sngss7_event); + } + } /* unlock the channel */ ftdm_mutex_unlock (ftdmchan->mutex); } - /* clean out all peer pending channel events */ - while ((peerchan = ftdm_queue_dequeue (sngss7_span->peer_chans))) { - /* note that the channels being dequeued here may not belong to this span - they may belong to just about any other span that one of our channels - happens to be bridged to */ - sngss7_chan_data_t *peer_info; - sngss7_chan_data_t *chan_info; - - peer_info = peerchan->call_data; - if (peer_info) { - chan_info = peer_info->peer_data; - if (chan_info) { - ftdmchan = chan_info->ftdmchan; - if (ftdmchan) { - - /* - if there is any state changes at all, those will be done in the opposite channel - to peerchan (where the original event was received), therefore we must lock ftdmchan, - but do not need to lock peerchan as we only read its event queue, which is already - locked when dequeueing */ - ftdm_channel_lock(ftdmchan); - - /* clean out all pending stack events in the peer channel */ - while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) { - ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); - ftdm_safe_free(sngss7_event); - } - - ftdm_channel_unlock(ftdmchan); - } - } - } - } - /* clean out all pending stack events */ while ((sngss7_event = ftdm_queue_dequeue(sngss7_span->event_queue))) { ftdm_sangoma_ss7_process_stack_event(sngss7_event); @@ -570,16 +538,16 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ftdm_channel_advance_states(ftdmchan); if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) { - /* this is the first event in a call, flush the event queue */ - sngss7_flush_queue(sngss7_info->event_queue); - /* clear the peer if any */ - sngss7_info->peer_data = NULL; clone_event++; } - /* if the call has already started and the event is not a release confirmation, clone the event */ - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_CALL_STARTED) && - sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { + /* If the call has already started (we only bridge events related to calls) + * and the event is not a release confirmation, then clone the event. + * We do not clone release cfm events because that is the only event (final event) that is not + * bridged to the other leg, the first Spirou customer we had explicitly requested to send + * release confirm as soon as the release is received and therefore not wait for the other leg + * to send release confirm (hence, not need to clone and enqueue in the other leg) */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_CALL_STARTED) && sngss7_event->event_id != SNGSS7_REL_CFM_EVENT) { clone_event++; } @@ -606,11 +574,38 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev event_clone = ftdm_calloc(1, sizeof(*sngss7_event)); if (event_clone) { memcpy(event_clone, sngss7_event, sizeof(*sngss7_event)); - ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); + /* if we have already a peer channel then enqueue the event in their queue */ if (sngss7_info->peer_data) { - sngss7_span_data_t *sngss7_peer_span = (sngss7_span_data_t *)sngss7_info->peer_data->ftdmchan->span->signal_data; + ftdm_span_t *peer_span = sngss7_info->peer_data->ftdmchan->span; + if (sngss7_info->peer_event_transfer_cnt) { + sngss7_event_data_t *peer_event = NULL; + int qi = 0; + /* looks like for the first time we found our peer, transfer any messages we enqueued */ + for (qi = 0; qi < sngss7_info->peer_event_transfer_cnt; qi++) { + peer_event = ftdm_queue_dequeue(sngss7_info->event_queue); + if (peer_event) { + ftdm_queue_enqueue(sngss7_info->peer_data->event_queue, peer_event); + } else { + /* This should never happen! */ + SS7_CRIT_CHAN(ftdmchan,"[CIC:%d]What!? someone stole my messages!\n", sngss7_info->circuit->cic); + } + } + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Transferred %d messages into my peer's queue\n", + sngss7_info->circuit->cic, sngss7_info->peer_event_transfer_cnt); + sngss7_info->peer_event_transfer_cnt = 0; + } /* we already have a peer attached, wake him up */ - ftdm_queue_enqueue(sngss7_peer_span->peer_chans, sngss7_info->ftdmchan); + ftdm_queue_enqueue(sngss7_info->peer_data->event_queue, event_clone); + ftdm_queue_enqueue(peer_span->pendingchans, sngss7_info->peer_data->ftdmchan); + } else { + /* we don't have a peer yet, save the event on our own queue for later + * only the first event in this queue is directly consumed by our peer (IAM), subsequent events + * must be transferred by us to their queue as soon as we find our peer */ + ftdm_queue_enqueue(sngss7_info->event_queue, event_clone); + if (sngss7_event->event_id != SNGSS7_CON_IND_EVENT) { + /* This could be an SAM, save it for transfer once we know who our peer is (if we ever find that) */ + sngss7_info->peer_event_transfer_cnt++; + } } } } @@ -623,25 +618,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING); break; case SNGSS7_REL_CFM_EVENT: - { - if (sngss7_info->peer_data) { - ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); - if (peer_chan) { - /* we need to unlock our chan or we risk deadlock */ - ftdm_channel_advance_states(ftdmchan); - ftdm_channel_unlock(ftdmchan); - - ftdm_channel_lock(peer_chan); - if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); - } - ftdm_channel_unlock(peer_chan); - - ftdm_channel_lock(ftdmchan); - } - } - } + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); break; default: break; @@ -1021,6 +998,7 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t sngss7_clear_ckt_flag(sngss7_info, FLAG_SUS_RECVD); sngss7_clear_ckt_flag(sngss7_info, FLAG_T6_CANCELED); sngss7_flush_queue(sngss7_info->event_queue); + sngss7_info->peer_data = NULL; ftdm_channel_close (&close_chan); } break; @@ -1035,9 +1013,22 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t case FTDM_CHANNEL_STATE_TERMINATING: { - ft_to_sngss7_rlc(ftdmchan); + /* Release confirm is sent immediately, since Spirou customer asked us not to wait for the second call leg + * to come back with a release confirm ... */ /* when receiving REL we move to TERMINATING and notify the user that the bridge is ending */ - sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_STOP); + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USER_HANGUP)) { + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_HANGUP); + } else { + /* Notify the user and wait for their ack before sending RLC */ + sngss7_send_signal(sngss7_info, FTDM_SIGEVENT_STOP); + } + } + break; + + case FTDM_CHANNEL_STATE_HANGUP: + { + ft_to_sngss7_rlc(ftdmchan); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); } break; @@ -1062,11 +1053,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) sngss7_info->blk_flags); if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { - /* DIALING is the only state we process normally when doing an outgoing call that is natively bridged */ + /* DIALING is the only state we process normally when doing an outgoing call that is natively bridged, + * all other states are run by a different state machine (and the freetdm core does not do any checking) */ if (ftdmchan->state != FTDM_CHANNEL_STATE_DIALING) { return ftdm_sangoma_ss7_native_bridge_state_change(ftdmchan); } - sngss7_info->peer_data = NULL; } /*check what state we are supposed to be in */ @@ -1521,24 +1512,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) { ftdm_channel_t *close_chan = ftdmchan; - - /* detach native bridging if needed (only the outbound leg is responsible for that) - Inbound leg was responsible of flushing its queue of events, but peer attach/detach - is left as an outbound leg responsibility - */ - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { - sngss7_chan_data_t *peer_info = sngss7_info->peer_data; - if (peer_info) { - sngss7_info->peer_data = NULL; - if (peer_info) { - peer_info->peer_data = NULL; - } - } - } - /* close the channel */ SS7_DEBUG_CHAN(ftdmchan,"FTDM Channel Close %s\n", ""); - sngss7_flush_queue(sngss7_info->event_queue); ftdm_channel_close (&close_chan); } @@ -2415,12 +2390,6 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) return FTDM_FAIL; } - /* create an peer channel queue for this span */ - if ((ftdm_queue_create(&(ss7_span_info)->peer_chans, SNGSS7_PEER_CHANS_QUEUE_SIZE)) != FTDM_SUCCESS) { - SS7_CRITICAL("Unable to create peer chans queue!\n"); - return FTDM_FAIL; - } - /*setup the span structure with the info so far */ g_ftdm_sngss7_data.sig_cb = sig_cb; span->start = ftdm_sangoma_ss7_start; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 63d4ded203..fcf7b8ef28 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -522,7 +522,8 @@ typedef struct sngss7_chan_data { sngss7_group_data_t tx_grs; sngss7_group_data_t ucic; ftdm_queue_t *event_queue; - struct sngss7_chan_data *peer_data; + struct sngss7_chan_data *peer_data; + uint8_t peer_event_transfer_cnt; } sngss7_chan_data_t; #define SNGSS7_RX_GRS_PENDING (1 << 0) @@ -536,7 +537,6 @@ typedef struct sngss7_span_data { sngss7_group_data_t rx_cgu; sngss7_group_data_t tx_cgu; ftdm_queue_t *event_queue; - ftdm_queue_t *peer_chans; } sngss7_span_data_t; typedef struct sngss7_event_data @@ -970,7 +970,7 @@ if (ftdmchan->state == new_state) { \ #define SS7_INFO_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_INFO, msg , ##args) #define SS7_WARN_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_WARNING, msg , ##args) #define SS7_ERROR_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_ERROR, msg , ##args) -#define SS7_CTRIT_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_CRIT, msg , ##args) +#define SS7_CRIT_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_CRIT, msg , ##args) #ifdef SS7_CODE_DEVEL #define SS7_DEVEL_DEBUG(a,...) ftdm_log(FTDM_LOG_DEBUG,a,##__VA_ARGS__ ); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index c44c7bd7b2..a228cb1ea1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -48,6 +48,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) SiConEvnt iam; ftdm_bool_t native_going_up = FTDM_FALSE; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; + sngss7_event_data_t *event_clone = NULL; SS7_FUNC_TRACE_ENTER (__FUNCTION__); @@ -72,33 +73,28 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) var, peer_span->signal_type); } else { peer_info = peer_chan->call_data; - if (peer_info) { - SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", - sngss7_info->circuit->cic, peer_info->circuit->cic); + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", + sngss7_info->circuit->cic, peer_info->circuit->cic); - /* make each one of us aware of the native bridge */ - peer_info->peer_data = sngss7_info; - sngss7_info->peer_data = peer_info; + /* retrieve only first message from the others guys queue (must be IAM) */ + event_clone = ftdm_queue_dequeue(peer_info->event_queue); - /* flush our own queue */ - sngss7_flush_queue(sngss7_info->event_queue); + /* make each one of us aware of the native bridge */ + peer_info->peer_data = sngss7_info; + sngss7_info->peer_data = peer_info; - /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, - We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function - because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped - and we still need those variables for further IAM processing */ - native_going_up = FTDM_TRUE; - } + /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, + We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function + because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped + and we still need those variables for further IAM processing */ + native_going_up = FTDM_TRUE; } } } - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE) && sngss7_info->peer_data) { - sngss7_span_data_t *span_data = ftdmchan->span->signal_data; - sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue); - /* Retrieve IAM from our peer */ + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { if (!event_clone) { - SS7_ERROR_CHAN(ftdmchan, "No event clone in peer queue!%s\n", ""); + SS7_ERROR_CHAN(ftdmchan, "No IAM event clone in peer queue!%s\n", ""); } else if (event_clone->event_id != SNGSS7_CON_IND_EVENT) { /* first message in the queue should ALWAYS be an IAM */ SS7_ERROR_CHAN(ftdmchan, "Invalid initial peer message type '%d'\n", event_clone->event_id); @@ -143,9 +139,6 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); } } - /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events, - this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */ - ftdm_queue_enqueue(span_data->peer_chans, sngss7_info->peer_data->ftdmchan); } else if (sngss7_info->circuit->transparent_iam && sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic); @@ -236,7 +229,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) the user sending FTDM_SIGEVENT_UP which can cause the application to misbehave (ie, no audio) */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP); ftdm_channel_advance_states(ftdmchan); - } + } + + ftdm_safe_free(event_clone); SS7_FUNC_TRACE_EXIT (__FUNCTION__); return; From 339c45b2cbfc8a07df3f06fdf483cce3aeb10022 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 3 Apr 2012 11:27:25 -0400 Subject: [PATCH 178/493] freetdm: Add documentation for SS7 native bridge --- libs/freetdm/docs/ss7-native-bridge.txt | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 libs/freetdm/docs/ss7-native-bridge.txt diff --git a/libs/freetdm/docs/ss7-native-bridge.txt b/libs/freetdm/docs/ss7-native-bridge.txt new file mode 100644 index 0000000000..d44b067b0a --- /dev/null +++ b/libs/freetdm/docs/ss7-native-bridge.txt @@ -0,0 +1,43 @@ +SS7 Native Bridge + +Native bridge is enabled on 2 conditions: + +* The SIP header FreeTDM-TransUUID is set in the originating leg and matches a freetdm channel +* The variable freetdm_native_sigbridge is true and the originating leg is also a freetdm channel + +Some coding rules apply to this feature: + +- Each channel is responsible for clearning its own peer_data and event queue + at the end of the call (when moving to DOWN state) + +- Each channel dequeues messages only from its own queue and enqueues messages + in the peer's queue, with the only exception being messages received before + the bridge is stablished (IAM for sure and possible SAM messages) because + if the bridge is not yet stablished the messages must be queued by the channel + in its own queue temporarily until the bridge is ready + +- When the bridge is ready it is the responsibility of the incoming channel to + move the messages that stored temporarily in its own queue to the bridged peer queue + +- During hangup, each channel is responsible for moving itself to DOWN. The procedure + however differs slightly depending on the hangup conditions + + If the user requests hangup (ie, FreeSWITCH) the request will be noted by setting the + FTDM_CHANNEL_USER_HANGUP flag but will not be processed yet because call control is + driven only by the link messages (so no hangup from ESL or command line allowed) + + When REL message comes, the channel receiving it must move to TERMINATING state and: + + - If the user has not hangup yet (FTDM_CHANNEL_USER_HANGUP flag not set) then + notify the user via SIGEVENT_STOP and wait for the user to move to HANGUP + state by calling ftdm_channel_call_hangup() before sending RLC + + - If the user did hangup already (FTDM_CHANNEL_USER_HANGUP flag is set) then + skip user notification and move to HANGUP state directly where the RLC message + will be sent + +- On HANGUP state the RLC is sent and the channel is moved to DOWN, final state + The peer channel will forward the REL message and wait for RLC from the network, when + RLC is received the channel can move straight to DOWN itself because the peer channel + is completing its own shutdown procedure when it received the REL message + From 7155001c864686dd005e25ef80bfa8b4aef05fc4 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 16 Jan 2012 12:45:25 -0600 Subject: [PATCH 179/493] FS-3810 --resolve --- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 0fc8c3acfb..ca489f6db7 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -443,7 +443,7 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) } if (!((use_my_cause = switch_channel_get_variable(channel, "sip_ignore_remote_cause")) && switch_true(use_my_cause))) { - ps_cause = switch_channel_get_variable(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE); + ps_cause = switch_channel_get_variable(channel, "last_bridge_" SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE); } if (!zstr(ps_cause) && (!strncasecmp(ps_cause, "sip:", 4) || !strncasecmp(ps_cause, "sips:", 5))) { From 16d4f1f06313a26d45d0b61a188af6d01e79e59b Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 11 Apr 2012 11:20:32 -0400 Subject: [PATCH 180/493] freetdm: INR/INF implementation - When NSG receives INR from network, send back INF with calling party category information IE and calling number information IE. - Introduced a new global setting of "force-inr" for testing purpose. Stinga generated INR/INF packets are not acceptable by trillium stack since it misses call related information in the packets. If configure force-inr to true in freetdm.conf.xml, when NSG receives an incoming IAM, it'll send out INR packet regardless of incoming IAM's IEs, and keep waiting for INF response from the calling side. - T.39 timer is introduced in order to handle INR timeout. The default value of T.39 is 12 seconds and is configurable according to spec. - Only supports calling number IE and calling party category IE in current fix. The customer only needs the calling number IE right now. In ISUP spec, there are 6 optional IEs. NSG only supports calling party number and calling category information IE since the other IEs are not configurable in freetdm.conf.xml or included in IAM message. - In collect state, INR/INF implementation needs to work with existed SAM messages. If NSG sent out INR and wait for SAM, collect state check both INF received and enough dialed numbers received. If one of these conditions are not met, it'll stay in collect state and wait until either conditions met or timeout. After received INF and enough dailed number, state moves to dailing and proceed as regular calls. --- .../ftmod_sangoma_ss7_handle.c | 37 +++++++ .../ftmod_sangoma_ss7_main.c | 104 ++++++++++++++++-- .../ftmod_sangoma_ss7_main.h | 24 ++++ .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 79 +++++++++++++ .../ftmod_sangoma_ss7_support.c | 2 +- .../ftmod_sangoma_ss7_timers.c | 45 +++++++- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 28 +++++ 7 files changed, 304 insertions(+), 15 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index d9816dfa0e..ac309ddc3e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -131,6 +131,16 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* KONRAD FIX ME : check in case there is a ckt and grp block */ } + + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_SENT); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_RX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_RX_DN); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_SENT); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_RX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_RX_DN); + sngss7_clear_ckt_flag(sngss7_info, FLAG_FULL_NUMBER); /* check whether the ftdm channel is in a state to accept a call */ switch (ftdmchan->state) { @@ -175,6 +185,12 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* fill in ANI */ ftdm_set_string(ftdmchan->caller_data.ani.digits, ftdmchan->caller_data.cid_num.digits); } + else { + if (g_ftdm_sngss7_data.cfg.force_inr) { + sngss7_set_ckt_flag(sngss7_info, FLAG_INR_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_SENT); + } + } if (siConEvnt->cgPtyNum.scrnInd.pres) { /* fill in the screening indication value */ @@ -186,6 +202,11 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ ftdmchan->caller_data.pres = siConEvnt->cgPtyNum.presRest.val; } } else { + if (g_ftdm_sngss7_data.cfg.force_inr) { + sngss7_set_ckt_flag(sngss7_info, FLAG_INR_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_SENT); + } + SS7_INFO_CHAN(ftdmchan,"No Calling party (ANI) information in IAM!%s\n", " "); } @@ -437,10 +458,26 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ /**************************************************************************/ case (INFORMATION): SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx INF\n", sngss7_info->circuit->cic); + + SS7_DEBUG_CHAN (ftdmchan, "Cancelling T.39 timer %s\n", " "); + /* check if t39 is active */ + if (sngss7_info->t39.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t39.sched, sngss7_info->t39.hb_timer_id); + SS7_DEBUG_CHAN (ftdmchan, "T.39 timer has been cancelled upon receiving INF message %s\n", " "); + } + + sngss7_set_ckt_flag(sngss7_info, FLAG_INF_RX_DN); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_IDLE); + break; /**************************************************************************/ case (INFORMATREQ): SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx INR\n", sngss7_info->circuit->cic); + + ft_to_sngss7_inf(ftdmchan); + + sngss7_set_ckt_flag(sngss7_info, FLAG_INR_RX); + break; /**************************************************************************/ case (SUBSADDR): diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 76266f0d53..d37a6111ab 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1080,23 +1080,91 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) } /* check if the end of pulsing (ST) character has arrived or the right number of digits */ - if (ftdmchan->caller_data.dnis.digits[i-1] == 'F') { + if (ftdmchan->caller_data.dnis.digits[i-1] == 'F' + || sngss7_test_ckt_flag(sngss7_info, FLAG_FULL_NUMBER) ) + { SS7_DEBUG_CHAN(ftdmchan, "Received the end of pulsing character %s\n", ""); - /* remove the ST */ - ftdmchan->caller_data.dnis.digits[i-1] = '\0'; - - /*now go to the RING state */ - state_flag = 0; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_FULL_NUMBER)) { + /* remove the ST */ + ftdmchan->caller_data.dnis.digits[i-1] = '\0'; + sngss7_set_ckt_flag(sngss7_info, FLAG_FULL_NUMBER); + } + if (sngss7_test_ckt_flag(sngss7_info, FLAG_INR_TX)) { + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_INR_SENT) ) { + ft_to_sngss7_inr(ftdmchan); + sngss7_set_ckt_flag(sngss7_info, FLAG_INR_SENT); + + SS7_DEBUG_CHAN (ftdmchan, "Scheduling T.39 timer %s \n", " "); + + /* start ISUP t39 */ + if (ftdm_sched_timer (sngss7_info->t39.sched, + "t39", + sngss7_info->t39.beat, + sngss7_info->t39.callback, + &sngss7_info->t39, + &sngss7_info->t39.hb_timer_id)) + { + + SS7_ERROR ("Unable to schedule timer T39, hanging up call!\n"); + + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE; + sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); + + /* end the call */ + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); + } + }else { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } + } else { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } } else if (i >= sngss7_info->circuit->min_digits) { SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits); - /*now go to the RING state */ - state_flag = 0; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); - + if (sngss7_test_ckt_flag(sngss7_info, FLAG_INR_TX)) { + if (!sngss7_test_ckt_flag(sngss7_info, FLAG_INR_SENT) ) { + ft_to_sngss7_inr(ftdmchan); + sngss7_set_ckt_flag(sngss7_info, FLAG_INR_SENT); + + SS7_DEBUG_CHAN (ftdmchan, "Scheduling T.39 timer %s\n", " " ); + + /* start ISUP t39 */ + if (ftdm_sched_timer (sngss7_info->t39.sched, + "t39", + sngss7_info->t39.beat, + sngss7_info->t39.callback, + &sngss7_info->t39, + &sngss7_info->t39.hb_timer_id)) + { + + SS7_ERROR ("Unable to schedule timer T39, hanging up call!\n"); + + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE; + sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL); + + /* end the call */ + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); + } + + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_IDLE); + }else { + if (sngss7_test_ckt_flag(sngss7_info, FLAG_INF_RX_DN) ) { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } + } + } else { + state_flag = 0; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING); + } } else { /* if we are coming from idle state then we have already been here once before */ if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { @@ -1152,6 +1220,15 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) /**************************************************************************/ case FTDM_CHANNEL_STATE_RING: /*incoming call request */ + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_SENT); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_RX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INR_RX_DN); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_TX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_SENT); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_RX); + sngss7_clear_ckt_flag(sngss7_info, FLAG_INF_RX_DN); + if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) { SS7_DEBUG("re-entering state from processing block/unblock request ... do nothing\n"); break; @@ -1162,6 +1239,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) ftdm_sched_cancel_timer (sngss7_info->t35.sched, sngss7_info->t35.hb_timer_id); } + /* cancel t39 timer */ + if (sngss7_info->t39.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t39.sched, sngss7_info->t39.hb_timer_id); + } + SS7_DEBUG_CHAN(ftdmchan, "Sending incoming call from %s to %s to FTDM core\n", ftdmchan->caller_data.ani.digits, ftdmchan->caller_data.dnis.digits); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index fcf7b8ef28..66732bf10e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -395,6 +395,7 @@ typedef struct sng_isup_ckt { uint16_t t16; uint16_t t17; uint32_t t35; + uint32_t t39; uint16_t tval; } sng_isup_ckt_t; @@ -466,6 +467,7 @@ typedef struct sng_ss7_cfg { sng_nsap_t nsap[MAX_NSAPS+1]; sng_isap_t isap[MAX_ISAPS+1]; sng_glare_resolution glareResolution; + uint32_t force_inr; } sng_ss7_cfg_t; typedef struct ftdm_sngss7_data { @@ -517,6 +519,7 @@ typedef struct sngss7_chan_data { sngss7_glare_data_t glare; sngss7_timer_data_t t35; sngss7_timer_data_t t10; + sngss7_timer_data_t t39; sngss7_group_data_t rx_grs; sngss7_group_data_t rx_gra; sngss7_group_data_t tx_grs; @@ -584,6 +587,15 @@ typedef enum { FLAG_SENT_CPG = (1 << 17), FLAG_SUS_RECVD = (1 << 18), FLAG_T6_CANCELED = (1 << 19), + FLAG_INR_TX = (1 << 20), + FLAG_INR_SENT = (1 << 21), + FLAG_INR_RX = (1 << 22), + FLAG_INR_RX_DN = (1 << 23), + FLAG_INF_TX = (1 << 24), + FLAG_INF_SENT = (1 << 25), + FLAG_INF_RX = (1 << 26), + FLAG_INF_RX_DN = (1 << 27), + FLAG_FULL_NUMBER = (1 << 28), FLAG_RELAY_DOWN = (1 << 30), FLAG_CKT_RECONFIG = (1 << 31) } sng_ckt_flag_t; @@ -606,6 +618,14 @@ typedef enum { "INF_RESUME", \ "INF_PAUSED", \ "TX_ACM_SENT" \ + "TX_INR" \ + "INR_SENT" \ + "RX_INR" \ + "RX_INR_DN" \ + "TX_INF" \ + "INF SENT" \ + "RX_INF" \ + "RX_INF_DN" \ "RELAY_DOWN", \ "CKT_RECONFIG" FTDM_STR2ENUM_P(ftmod_ss7_ckt_state2flag, ftmod_ss7_ckt_flag2str, sng_ckt_flag_t) @@ -820,6 +840,9 @@ void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan); void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan); void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan); void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan); +void ft_to_sngss7_inr(ftdm_channel_t * ftdmchan); +void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan); + /* in ftmod_sangoma_ss7_in.c */ @@ -949,6 +972,7 @@ ftdm_status_t sngss7_add_raw_data(sngss7_chan_data_t *sngss7_info, uint8_t* data /* in ftmod_sangoma_ss7_timers.c */ void handle_isup_t35(void *userdata); void handle_isup_t10(void *userdata); +void handle_isup_t39(void *userdata); /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index a228cb1ea1..b5431d8fe8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -237,6 +237,85 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) return; } +void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan) +{ + SiCnStEvnt evnt; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + /* + const char *CallerId = NULL; + const char *CallerCat = NULL; + const char *sipvar; + */ + + memset (&evnt, 0x0, sizeof (evnt)); + + evnt.infoInd.eh.pres = PRSNT_NODEF; + + evnt.infoInd.cgPtyAddrRespInd.pres = PRSNT_NODEF; + evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_INCL; + copy_cgPtyNum_to_sngss7 (ftdmchan, &evnt.cgPtyNum); + + + evnt.infoInd.cgPtyCatRespInd.pres = PRSNT_NODEF; + evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_INCL; + copy_cgPtyCat_to_sngss7 (ftdmchan, &evnt.cgPtyCat); + + evnt.infoInd.chrgInfoRespInd.pres = PRSNT_NODEF; + evnt.infoInd.chrgInfoRespInd.val = 0; + + evnt.infoInd.solInfoInd.pres = PRSNT_NODEF; + evnt.infoInd.solInfoInd.val = 0; + + evnt.infoInd.holdProvInd.pres = PRSNT_NODEF; + evnt.infoInd.holdProvInd.val = 0; + + evnt.infoInd.spare.pres = PRSNT_NODEF; + evnt.infoInd.spare.val = 0; + + sng_cc_inf(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &evnt, + INFORMATION); + + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx INF\n", sngss7_info->circuit->cic); + +} + +void ft_to_sngss7_inr(ftdm_channel_t *ftdmchan) +{ + SiCnStEvnt evnt; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + memset (&evnt, 0x0, sizeof (evnt)); + + evnt.infoReqInd.eh.pres = PRSNT_NODEF; + evnt.infoReqInd.cgPtyAdReqInd.pres = PRSNT_NODEF; + evnt.infoReqInd.cgPtyAdReqInd.val=CGPRTYADDREQ_REQ; + + evnt.infoReqInd.holdingInd.pres = PRSNT_NODEF; + evnt.infoReqInd.holdingInd.val = HOLD_NOTREQ; + + evnt.infoReqInd.cgPtyCatReqInd.pres = PRSNT_NODEF; + evnt.infoReqInd.cgPtyCatReqInd.val = CGPRTYCATREQ_REQ; + + evnt.infoReqInd.chrgInfoReqInd.pres = PRSNT_NODEF; + evnt.infoReqInd.chrgInfoReqInd.val = CHRGINFO_NOTREQ; + + evnt.infoReqInd.malCaIdReqInd.pres = PRSNT_NODEF; + evnt.infoReqInd.malCaIdReqInd.val = MLBG_INFONOTREQ; + + sng_cc_inr(1, + sngss7_info->suInstId, + sngss7_info->spInstId, + sngss7_info->circuit->id, + &evnt, + INFORMATREQ); + + SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx INR\n", sngss7_info->circuit->cic); +} + void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan) { SS7_FUNC_TRACE_ENTER (__FUNCTION__); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 4bfa5d2065..96359ba595 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -186,7 +186,7 @@ ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPt ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Calling NADI value \"%s\"\n", clg_nadi); cgPtyNum->natAddrInd.val = atoi(clg_nadi); } - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", cgPtyNum->presRest.val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number NADI value %d\n", cgPtyNum->natAddrInd.val); return copy_tknStr_to_sngss7(caller_data->cid_num.digits, &cgPtyNum->addrSig, &cgPtyNum->oddEven); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c index 6138ea34b0..8cac996213 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c @@ -49,7 +49,7 @@ /******************************************************************************/ /* PROTOTYPES *****************************************************************/ -void handle_isup_t35(void *userdata); + /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -76,10 +76,13 @@ void handle_isup_t35(void *userdata) /* end the call */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); - /* kill t10 if active */ + /* kill t10 t39 if active */ if (sngss7_info->t10.hb_timer_id) { ftdm_sched_cancel_timer (sngss7_info->t10.sched, sngss7_info->t10.hb_timer_id); } + if (sngss7_info->t39.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t39.sched, sngss7_info->t39.hb_timer_id); + } /*unlock*/ ftdm_channel_unlock(ftdmchan); @@ -108,7 +111,43 @@ void handle_isup_t10(void *userdata) SS7_FUNC_TRACE_EXIT(__FUNCTION__); } - + +void handle_isup_t39(void *userdata) +{ + SS7_FUNC_TRACE_ENTER(__FUNCTION__); + + sngss7_timer_data_t *timer = userdata; + sngss7_chan_data_t *sngss7_info = timer->sngss7_info; + ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan; + + /* now that we have the right channel...put a lock on it so no-one else can use it */ + ftdm_channel_lock(ftdmchan); + + /* Q.764 2.2.5 Address incomplete (T35 expiry action is hangup with cause 28 according to Table A.1/Q.764) */ + SS7_ERROR("[Call-Control] Timer 39 expired on CIC = %d\n", sngss7_info->circuit->cic); + + /* set the flag to indicate this hangup is started from the local side */ + sngss7_set_ckt_flag(sngss7_info, FLAG_LOCAL_REL); + + /* hang up on timer expiry */ + ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_INVALID_NUMBER_FORMAT; + + /* end the call */ + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_CANCEL); + + /* kill t10 t35 if active */ + if (sngss7_info->t10.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t10.sched, sngss7_info->t10.hb_timer_id); + } + if (sngss7_info->t35.hb_timer_id) { + ftdm_sched_cancel_timer (sngss7_info->t35.sched, sngss7_info->t35.hb_timer_id); + } + + /*unlock*/ + ftdm_channel_unlock(ftdmchan); + + SS7_FUNC_TRACE_EXIT(__FUNCTION__); +} /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 230476d8e1..ee726911af 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -146,6 +146,7 @@ typedef struct sng_ccSpan uint32_t t16; uint32_t t17; uint32_t t35; + uint32_t t39; uint32_t tval; } sng_ccSpan_t; @@ -487,6 +488,7 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) /* Set the transparent_iam_max_size to default value */ g_ftdm_sngss7_data.cfg.transparent_iam_max_size=800; + g_ftdm_sngss7_data.cfg.force_inr = 0; /* extract all the information from the parameters */ for (i = 0; i < num_parms; i++) { @@ -508,6 +510,14 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) ftmod_ss7_set_glare_resolution (parm->val); SS7_DEBUG("Found glare resolution configuration = %d %s\n", g_ftdm_sngss7_data.cfg.glareResolution, parm->val ); } + else if (!strcasecmp(parm->var, "force-inr")) { + if (!strcasecmp(parm->val, "true")) { + g_ftdm_sngss7_data.cfg.force_inr = 1; + } else { + g_ftdm_sngss7_data.cfg.force_inr = 0; + } + SS7_DEBUG("Found INR force configuration = %s\n", parm->val ); + } else { SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val); return FTDM_FAIL; @@ -2062,6 +2072,11 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span) sng_ccSpan.t35 = atoi(parm->val); SS7_DEBUG("Found isup t35 = %d\n",sng_ccSpan.t35); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "isup.t39")) { + /**********************************************************************/ + sng_ccSpan.t39 = atoi(parm->val); + SS7_DEBUG("Found isup t39 = %d\n",sng_ccSpan.t39); + /**********************************************************************/ } else if (!strcasecmp(parm->var, "isup.tval")) { /**********************************************************************/ sng_ccSpan.tval = atoi(parm->val); @@ -3044,6 +3059,12 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) } else { g_ftdm_sngss7_data.cfg.isupCkt[x].t35 = ccSpan->t35; } + if (ccSpan->t39 == 0) { + g_ftdm_sngss7_data.cfg.isupCkt[x].t39 = 120; + } else { + g_ftdm_sngss7_data.cfg.isupCkt[x].t39 = ccSpan->t39; + } + if (ccSpan->tval == 0) { g_ftdm_sngss7_data.cfg.isupCkt[x].tval = 10; } else { @@ -3148,6 +3169,13 @@ static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan) ss7_info->t10.callback = handle_isup_t10; ss7_info->t10.sngss7_info = ss7_info; + /* prepare the timer structures */ + ss7_info->t39.sched = ((sngss7_span_data_t *)(ftdmspan->signal_data))->sched; + ss7_info->t39.counter = 1; + ss7_info->t39.beat = (isupCkt->t39) * 100; /* beat is in ms, t39 is in 100ms */ + ss7_info->t39.callback = handle_isup_t39; + ss7_info->t39.sngss7_info = ss7_info; + /**************************************************************************/ } /* for (i == 1; i < ftdmspan->chan_count; i++) */ From 8d1c382632e86df9bcbdf290b1b702580e6e513f Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 11 Apr 2012 15:14:29 -0400 Subject: [PATCH 181/493] freetdm: INR/INF implementation - fill in IEs in INF according to INR request - print debug information if IE requested but not supported --- .../ftmod_sangoma_ss7_handle.c | 2 +- .../ftmod_sangoma_ss7_main.h | 2 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 58 ++++++++++++------- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index ac309ddc3e..04dff6ee5e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -474,7 +474,7 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ case (INFORMATREQ): SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx INR\n", sngss7_info->circuit->cic); - ft_to_sngss7_inf(ftdmchan); + ft_to_sngss7_inf(ftdmchan, siCnStEvnt); sngss7_set_ckt_flag(sngss7_info, FLAG_INR_RX); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 66732bf10e..4ccf4efe0e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -841,7 +841,7 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan); void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan); void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan); void ft_to_sngss7_inr(ftdm_channel_t * ftdmchan); -void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan); +void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index b5431d8fe8..9ba11ada58 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -237,41 +237,55 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) return; } -void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan) +void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr) { SiCnStEvnt evnt; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; - /* - const char *CallerId = NULL; - const char *CallerCat = NULL; - const char *sipvar; - */ - + memset (&evnt, 0x0, sizeof (evnt)); evnt.infoInd.eh.pres = PRSNT_NODEF; - evnt.infoInd.cgPtyAddrRespInd.pres = PRSNT_NODEF; - evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_INCL; - copy_cgPtyNum_to_sngss7 (ftdmchan, &evnt.cgPtyNum); - - evnt.infoInd.cgPtyCatRespInd.pres = PRSNT_NODEF; - evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_INCL; - copy_cgPtyCat_to_sngss7 (ftdmchan, &evnt.cgPtyCat); evnt.infoInd.chrgInfoRespInd.pres = PRSNT_NODEF; evnt.infoInd.chrgInfoRespInd.val = 0; - evnt.infoInd.solInfoInd.pres = PRSNT_NODEF; evnt.infoInd.solInfoInd.val = 0; - evnt.infoInd.holdProvInd.pres = PRSNT_NODEF; - evnt.infoInd.holdProvInd.val = 0; - + evnt.infoInd.holdProvInd.val = 0; evnt.infoInd.spare.pres = PRSNT_NODEF; evnt.infoInd.spare.val = 0; - + + if (inr->infoReqInd.eh.pres == PRSNT_NODEF) { + if ((inr->infoReqInd.holdingInd.pres == PRSNT_NODEF) && (inr->infoReqInd.holdingInd.val == HOLD_REQ)) { + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting holding information. Holding is not supported in INF.\n", sngss7_info->circuit->cic); + } + if ((inr->infoReqInd.chrgInfoReqInd.pres == PRSNT_NODEF) && (inr->infoReqInd.chrgInfoReqInd.val == CHRGINFO_REQ)) { + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting charging information. Charging is not supported in INF.\n", sngss7_info->circuit->cic); + } + if ((inr->infoReqInd.malCaIdReqInd.pres == PRSNT_NODEF) && (inr->infoReqInd.malCaIdReqInd.val == CHRGINFO_REQ)) { + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting malicious call id. Malicious call id is not supported in INF.\n", sngss7_info->circuit->cic); + } + + if ((inr->infoReqInd.cgPtyAdReqInd.pres == PRSNT_NODEF) && (inr->infoReqInd.cgPtyAdReqInd.val == CGPRTYADDREQ_REQ)) { + evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_INCL; + copy_cgPtyNum_to_sngss7 (ftdmchan, &evnt.cgPtyNum); + } else { + evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_NOTINCL; + } + + if ((inr->infoReqInd.cgPtyCatReqInd.pres == PRSNT_NODEF) && (inr->infoReqInd.cgPtyCatReqInd.val == CGPRTYCATREQ_REQ)) { + evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_INCL; + copy_cgPtyCat_to_sngss7 (ftdmchan, &evnt.cgPtyCat); + } else { + evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_NOTINCL; + } + } + else { + SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR with no information request. Sending back default INF.\n", sngss7_info->circuit->cic); + } + sng_cc_inf(1, sngss7_info->suInstId, sngss7_info->spInstId, @@ -295,16 +309,16 @@ void ft_to_sngss7_inr(ftdm_channel_t *ftdmchan) evnt.infoReqInd.cgPtyAdReqInd.val=CGPRTYADDREQ_REQ; evnt.infoReqInd.holdingInd.pres = PRSNT_NODEF; - evnt.infoReqInd.holdingInd.val = HOLD_NOTREQ; + evnt.infoReqInd.holdingInd.val = HOLD_REQ; evnt.infoReqInd.cgPtyCatReqInd.pres = PRSNT_NODEF; evnt.infoReqInd.cgPtyCatReqInd.val = CGPRTYCATREQ_REQ; evnt.infoReqInd.chrgInfoReqInd.pres = PRSNT_NODEF; - evnt.infoReqInd.chrgInfoReqInd.val = CHRGINFO_NOTREQ; + evnt.infoReqInd.chrgInfoReqInd.val = CHRGINFO_REQ; evnt.infoReqInd.malCaIdReqInd.pres = PRSNT_NODEF; - evnt.infoReqInd.malCaIdReqInd.val = MLBG_INFONOTREQ; + evnt.infoReqInd.malCaIdReqInd.val = MLBG_INFOREQ; sng_cc_inr(1, sngss7_info->suInstId, From a796c6849c4607c73d71e0080def3bda6b3e63b9 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 13 Apr 2012 11:18:53 -0400 Subject: [PATCH 182/493] freetdm: fixed no ACM/CPG sending in some situations after native bridge - clear up ACM_SENT & CPG_SENT flag in DOWN state in native bridge state machine --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index d37a6111ab..928db54d51 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -997,6 +997,9 @@ static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t ftdm_channel_t *close_chan = ftdmchan; sngss7_clear_ckt_flag(sngss7_info, FLAG_SUS_RECVD); sngss7_clear_ckt_flag(sngss7_info, FLAG_T6_CANCELED); + sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_ACM); + sngss7_clear_ckt_flag (sngss7_info, FLAG_SENT_CPG); + sngss7_flush_queue(sngss7_info->event_queue); sngss7_info->peer_data = NULL; ftdm_channel_close (&close_chan); From cd2d67ace17b036fcdc06e2a81a0dd0021c11c92 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 13 Apr 2012 17:26:48 -0400 Subject: [PATCH 183/493] freetdm: fixed group block/unblock state dead lock when signal link is down and recovered later To re-produce this bug: 1. do CGB on one side 2. unplug signaling link cable 3. plug signaling link cable back 4. do CGU on the blocking side 5. cic state stay in RESTART for ever Fix this problem by sending cic to SUSPENDED state after receiving/sending CGU message --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 36 +++++-------------- .../ftmod_sangoma_ss7_handle.c | 7 ++-- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 3f1a03f4d8..df872b260c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -35,7 +35,7 @@ * */ -#if 0 +#if 0 #define SMG_RELAY_DBG #endif @@ -1332,7 +1332,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, } #ifdef SMG_RELAY_DBG - stream->write_function(stream," blk_flag=%x | ckt_flag=%x | chan_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags, ftdmchan->flags); + stream->write_function(stream," | blk_flag=%x | ckt_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags); #endif stream->write_function(stream, "\n"); } /* if ( hole, sig, voice) */ @@ -1374,36 +1374,26 @@ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int c } if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) { - /* now that we have the right channel...put a lock on it so no-one else can use it */ ftdm_mutex_lock(ftdmchan->mutex); /* check if there is a pending state change|give it a bit to clear */ if (check_for_state_change(ftdmchan)) { SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); - /* check if we need to die */ ftdm_assert(0, "State change not completed\n"); - /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); - /* move to the next channel */ continue; } else { - /* throw the ckt block flag */ sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); - - /* set the channel to suspended state */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } - - /* unlock the channel again before we exit */ + ftdm_mutex_unlock(ftdmchan->mutex); + } - } /* if ( span and chan) */ + } - } /* if ( cic != 0) */ - - /* go the next circuit */ x++; - } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + } handle_show_blocks(stream, span, chan, verbose); @@ -1440,33 +1430,22 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c } if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) { - /* now that we have the right channel...put a lock on it so no-one else can use it */ ftdm_mutex_lock(ftdmchan->mutex); /* check if there is a pending state change|give it a bit to clear */ if (check_for_state_change(ftdmchan)) { SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic); - /* check if we need to die */ ftdm_assert(0, "State change not completed\n"); - /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); - /* move to the next channel */ continue; } else { - /* throw the ckt block flag */ sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_UNBLK_TX); - - /* clear the block flag */ sngss7_clear_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX); - - /* check group blocking */ sngss7_clear_ckt_blk_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX); - /* set the channel to suspended state */ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); } - /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); } @@ -1812,6 +1791,8 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c /* throw the grp maint. block flag */ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); + /* bring the sig status down */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); @@ -1945,6 +1926,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c /* bring the sig status up */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); /* if this is the first channel in the range */ if (!main_chan) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 04dff6ee5e..d0d6c32867 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -1181,11 +1181,12 @@ ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ break; /**************************************************************************/ case SIT_STA_CGBRSP: /* mntc. oriented CGB response */ - /*handle_cgb_req(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);*/ + SS7_INFO(" Rx CGBA \n"); break; /**************************************************************************/ case SIT_STA_CGURSP: /* mntc. oriented CGU response */ /*SS7_WARN(" %s indication not currently supported\n", DECODE_LCC_EVENT(evntType));*/ + SS7_INFO(" Rx CGUA \n"); break; /**************************************************************************/ case SIT_STA_GRSREQ: /* circuit group reset request */ @@ -2510,6 +2511,7 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ /* bring the sig status down */ sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_DOWN); + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); /* unlock the channel again before we exit */ ftdm_mutex_unlock(ftdmchan->mutex); @@ -2665,7 +2667,8 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ if (sngss7_channel_status_clear(sngss7_info)) { sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); } - + + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); ftdm_mutex_unlock(ftdmchan->mutex); /* update the bit and byte counter*/ From e2f1b4ab27ae10990d0db0537f3ee3300c8e9bd5 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Mon, 16 Apr 2012 13:48:35 -0400 Subject: [PATCH 184/493] freetdm: fix REL receiving leg always stay in TERMINATING stae in native bridge mode - This is supposed to be included in commit of b324f8679782957bc9db3bdfd6687aa42cba77dd. Somehow it's not included in that commit. Without this change, the REL receiving leg always stay in TERMINATING state when received an incoming REL message. --- libs/freetdm/src/ftdm_io.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 513fc0c595..1c05797102 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2199,9 +2199,12 @@ static ftdm_status_t _ftdm_channel_call_hangup_nl(const char *file, const char * { ftdm_status_t status = FTDM_SUCCESS; - if (ftdm_test_flag(chan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) { + /* In native sigbridge mode we ignore hangup requests from the user and hangup only when the signaling module decides it */ + if (ftdm_test_flag(chan, FTDM_CHANNEL_NATIVE_SIGBRIDGE) && chan->state != FTDM_CHANNEL_STATE_TERMINATING) { + ftdm_log_chan_ex(chan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Ignoring hangup in channel in state %s (native bridge enabled)\n", ftdm_channel_state2str(chan->state)); + ftdm_set_flag(chan, FTDM_CHANNEL_USER_HANGUP); goto done; } From 4f5a6557fce63fb739f734b87c50e09764f9cbef Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 18 Apr 2012 10:52:01 -0400 Subject: [PATCH 185/493] freetdm: fix queue full problem - restore flushing queue when channel state goes to down --- .../freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 928db54d51..1098126890 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -1599,6 +1599,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) ftdm_channel_t *close_chan = ftdmchan; /* close the channel */ SS7_DEBUG_CHAN(ftdmchan,"FTDM Channel Close %s\n", ""); + sngss7_flush_queue(sngss7_info->event_queue); ftdm_channel_close (&close_chan); } From d56aebcc13606e053f4c19bb64cf064ce2f59343 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 30 Apr 2012 14:22:42 -0400 Subject: [PATCH 186/493] Changed error message from CRIT to ERROR, because message is not CRITICAL --- src/switch_core_session.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 427eb64eb0..0c9252ebc5 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -1419,9 +1419,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_thread_launch(switch_core_se switch_mutex_lock(session->mutex); if (switch_test_flag(session, SSF_THREAD_RUNNING)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Cannot double-launch thread!\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot double-launch thread!\n"); } else if (switch_test_flag(session, SSF_THREAD_STARTED)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Cannot launch thread again after it has already been run!\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot launch thread again after it has already been run!\n"); } else { switch_set_flag(session, SSF_THREAD_RUNNING); switch_set_flag(session, SSF_THREAD_STARTED); From 67c43a075917e0de6273c6af883e29292d055c63 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 4 May 2012 18:42:59 -0400 Subject: [PATCH 187/493] Initial commit --- libs/freetdm/src/include/freetdm.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 48758f406f..e9040231b5 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -40,7 +40,6 @@ #ifndef FREETDM_H #define FREETDM_H - #include "ftdm_declare.h" #include "ftdm_call_utils.h" From 6a32e98c492f66fb5914e5f585c62f88bad09714 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 15 May 2012 19:37:41 -0400 Subject: [PATCH 188/493] Add mod_megaco skeleton with basic profile support and a lot of todos for Kapil --- libs/ldns/install-sh | 29 +++-- src/include/switch_apr.h | 3 +- src/mod/endpoints/mod_megaco/Makefile | 3 + src/mod/endpoints/mod_megaco/megaco.c | 132 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/mod_megaco.c | 141 ++++++++++++++++++++++ src/mod/endpoints/mod_megaco/mod_megaco.h | 56 +++++++++ 6 files changed, 352 insertions(+), 12 deletions(-) create mode 100644 src/mod/endpoints/mod_megaco/Makefile create mode 100644 src/mod/endpoints/mod_megaco/megaco.c create mode 100644 src/mod/endpoints/mod_megaco/mod_megaco.c create mode 100644 src/mod/endpoints/mod_megaco/mod_megaco.h diff --git a/libs/ldns/install-sh b/libs/ldns/install-sh index 6781b987bd..a9244eb078 100755 --- a/libs/ldns/install-sh +++ b/libs/ldns/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2009-04-28.21; # UTC +scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -156,6 +156,10 @@ while test $# -ne 0; do -s) stripcmd=$stripprog;; -t) dst_arg=$2 + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac shift;; -T) no_target_directory=true;; @@ -186,6 +190,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac done fi @@ -200,7 +208,11 @@ if test $# -eq 0; then fi if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. @@ -228,9 +240,9 @@ fi for src do - # Protect names starting with `-'. + # Protect names problematic for `test' and other utilities. case $src in - -*) src=./$src;; + -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then @@ -252,12 +264,7 @@ do echo "$0: no destination specified." >&2 exit 1 fi - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. @@ -385,7 +392,7 @@ do case $dstdir in /*) prefix='/';; - -*) prefix='./';; + [-=\(\)!]*) prefix='./';; *) prefix='';; esac @@ -403,7 +410,7 @@ do for d do - test -z "$d" && continue + test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index 0c8673570f..e125eb9390 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -773,7 +773,8 @@ typedef gid_t switch_gid_t; typedef ino_t switch_ino_t; typedef dev_t switch_dev_t; #endif - typedef off64_t switch_off_t; + +typedef off_t switch_off_t; /** * Structure for referencing file information diff --git a/src/mod/endpoints/mod_megaco/Makefile b/src/mod/endpoints/mod_megaco/Makefile new file mode 100644 index 0000000000..e65d0f78eb --- /dev/null +++ b/src/mod/endpoints/mod_megaco/Makefile @@ -0,0 +1,3 @@ +BASE=../../../.. +LOCAL_OBJS=megaco.o +include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c new file mode 100644 index 0000000000..72d03424f1 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + +#include "mod_megaco.h" + +megaco_profile_t *megaco_profile_locate(const char *name) +{ + megaco_profile_t *profile = switch_core_hash_find_rdlock(megaco_globals.profile_hash, name, megaco_globals.profile_rwlock); + + if (profile) { + if (switch_thread_rwlock_tryrdlock(profile->rwlock) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile %s is locked\n", name); + profile = NULL; + } + } + + return profile; +} + +void megaco_profile_release(megaco_profile_t *profile) +{ + switch_thread_rwlock_unlock(profile->rwlock); +} + +static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) +{ + switch_xml_t cfg, xml, x_profiles, x_profile, x_settings; + switch_status_t status = SWITCH_STATUS_FALSE; + switch_event_t *event = NULL; + int count; + const char *file = "megaco.conf"; + + if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); + goto done; + } + + if (!(x_profiles = switch_xml_child(cfg, "profiles"))) { + goto done; + } + + for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) { + const char *name = switch_xml_attr_soft(x_profile, "name"); + if (strcmp(name, profile->name)) { + continue; + } + + if (!(x_settings = switch_xml_child(x_profile, "settings"))) { + goto done; + } + count = switch_event_import_xml(switch_xml_child(x_settings, "param"), "name", "value", &event); + // status = switch_xml_config_parse_event(event, count, reload, instructions); + + /* TODO: Initialize stack configuration */ + } + +done: + if (xml) { + switch_xml_free(xml); + } + + if (event) { + switch_event_destroy(&event); + } + return status; +} + +switch_status_t megaco_profile_start(const char *profilename) +{ + switch_memory_pool_t *pool; + megaco_profile_t *profile; + + switch_assert(profilename); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Starting profile: %s\n", profilename); + + switch_core_new_memory_pool(&pool); + profile = switch_core_alloc(pool, sizeof(*profile)); + profile->pool = pool; + profile->name = switch_core_strdup(pool, profilename); + + switch_thread_rwlock_create(&profile->rwlock, pool); + + /* TODO: Kapil: Insert stack per-interface startup code here */ + + switch_core_hash_insert_wrlock(megaco_globals.profile_hash, profile->name, profile, megaco_globals.profile_rwlock); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started profile: %s\n", profile->name); + + return SWITCH_STATUS_SUCCESS; +fail: + switch_core_destroy_memory_pool(&pool); + return SWITCH_STATUS_FALSE; +} + + +switch_status_t megaco_profile_destroy(megaco_profile_t **profile) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopping profile: %s\n", (*profile)->name); + switch_thread_rwlock_wrlock((*profile)->rwlock); + + + /* TODO: Kapil: Insert stack per-interface shutdown code here */ + + + switch_thread_rwlock_unlock((*profile)->rwlock); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopped profile: %s\n", (*profile)->name); + switch_core_hash_delete_wrlock(megaco_globals.profile_hash, (*profile)->name, megaco_globals.profile_rwlock); + + switch_core_destroy_memory_pool(&(*profile)->pool); + + return SWITCH_STATUS_SUCCESS; +} + + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4: + */ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c new file mode 100644 index 0000000000..bf23077e00 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + +#include "mod_megaco.h" + +struct megaco_globals megaco_globals; + +SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); +SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); + + +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop]" +SWITCH_STANDARD_API(megaco_function) +{ + int argc; + char *argv[10]; + char *dup = NULL; + + if (zstr(cmd)) { + goto usage; + } + + dup = strdup(cmd); + argc = switch_split(dup, ' ', argv); + + if (argc < 1 || zstr(argv[0])) { + goto usage; + } + + if (!strcmp(argv[0], "profile")) { + if (zstr(argv[1]) || zstr(argv[2])) { + goto usage; + } + if (!strcmp(argv[2], "start")) { + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_release(profile); + stream->write_function(stream, "-ERR Profile %s is already started\n", argv[2]); + } else { + megaco_profile_start(argv[1]); + stream->write_function(stream, "+OK\n"); + } + } else if (!strcmp(argv[2], "stop")) { + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_release(profile); + megaco_profile_destroy(&profile); + stream->write_function(stream, "+OK\n"); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } + } + } + + goto done; + + usage: + stream->write_function(stream, "-ERR Usage: "MEGACO_FUNCTION_SYNTAX"\n"); + + done: + switch_safe_free(dup); + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t console_complete_hashtable(switch_hash_t *hash, const char *line, const char *cursor, switch_console_callback_match_t **matches) +{ + switch_hash_index_t *hi; + void *val; + const void *vvar; + switch_console_callback_match_t *my_matches = NULL; + switch_status_t status = SWITCH_STATUS_FALSE; + + for (hi = switch_hash_first(NULL, hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &vvar, NULL, &val); + switch_console_push_match(&my_matches, (const char *) vvar); + } + + if (my_matches) { + *matches = my_matches; + status = SWITCH_STATUS_SUCCESS; + } + + return status; +} + +static switch_status_t list_profiles(const char *line, const char *cursor, switch_console_callback_match_t **matches) +{ + switch_status_t status; + switch_thread_rwlock_rdlock(megaco_globals.profile_rwlock); + status = console_complete_hashtable(megaco_globals.profile_hash, line, cursor, matches); + switch_thread_rwlock_unlock(megaco_globals.profile_rwlock); + return status; +} + +SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) +{ + switch_api_interface_t *api_interface; + + memset(&megaco_globals, 0, sizeof(megaco_globals)); + megaco_globals.pool = pool; + + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + switch_core_hash_init(&megaco_globals.profile_hash, pool); + switch_thread_rwlock_create(&megaco_globals.profile_rwlock, pool); + + SWITCH_ADD_API(api_interface, "megaco", "megaco", megaco_function, MEGACO_FUNCTION_SYNTAX); + + switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); + switch_console_add_complete_func("::megaco::list_profiles", list_profiles); + + /* TODO: Kapil: Insert stack global startup code here */ + + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown) +{ + /* TODO: Kapil: Insert stack global shutdown code here */ + return SWITCH_STATUS_SUCCESS; +} + + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4: + */ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h new file mode 100644 index 0000000000..b12982de8c --- /dev/null +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + + +#ifndef MOD_MEGACO_H +#define MOD_MEGACO_H + +#include + +struct megaco_globals { + switch_memory_pool_t *pool; + switch_hash_t *profile_hash; + switch_thread_rwlock_t *profile_rwlock; + /* TODO: Kapil: add global variables here */ +}; +extern struct megaco_globals megaco_globals; /* < defined in mod_megaco.c */ + +typedef enum { + PF_RUNNING = (1 << 0) +} megaco_profile_flags_t; + +typedef struct megaco_profile_s { + char *name; + switch_memory_pool_t *pool; + switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ + megaco_profile_flags_t flags; + + /* TODO: Kapil: Insert interface-specific stack elements here */ +} megaco_profile_t; + + +megaco_profile_t *megaco_profile_locate(const char *name); +void megaco_profile_release(megaco_profile_t *profile); + +switch_status_t megaco_profile_start(const char *profilename); +switch_status_t megaco_profile_destroy(megaco_profile_t **profile); + + +#endif /* MOD_MEGACO_H */ + + +/* For Emacs: + * Local Variables: + * mode:c + * indent-tabs-mode:t + * tab-width:4 + * c-basic-offset:4 + * End: + * For VIM: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4: + */ From bb875ce6ff692c129647206ce8956a01fcb8f9d0 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 15 May 2012 19:45:36 -0400 Subject: [PATCH 189/493] mod_megaco: add sample config file and refuse to start a profile without a configuration --- src/mod/endpoints/mod_megaco/conf/megaco.conf.xml | 9 +++++++++ src/mod/endpoints/mod_megaco/megaco.c | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/mod/endpoints/mod_megaco/conf/megaco.conf.xml diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml new file mode 100644 index 0000000000..c219023dd8 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c index 72d03424f1..9ac7af4355 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -56,7 +56,8 @@ static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t r count = switch_event_import_xml(switch_xml_child(x_settings, "param"), "name", "value", &event); // status = switch_xml_config_parse_event(event, count, reload, instructions); - /* TODO: Initialize stack configuration */ + /* TODO: Kapil: Initialize stack configuration */ + status = SWITCH_STATUS_SUCCESS; } done: @@ -87,12 +88,17 @@ switch_status_t megaco_profile_start(const char *profilename) switch_thread_rwlock_create(&profile->rwlock, pool); /* TODO: Kapil: Insert stack per-interface startup code here */ + if (config_profile(profile, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error configuring profile %s\n", profile->name); + goto fail; + } switch_core_hash_insert_wrlock(megaco_globals.profile_hash, profile->name, profile, megaco_globals.profile_rwlock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started profile: %s\n", profile->name); return SWITCH_STATUS_SUCCESS; + fail: switch_core_destroy_memory_pool(&pool); return SWITCH_STATUS_FALSE; From dbd90db7196d98ca17eca90f216af5b0907295a3 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 15 May 2012 19:51:58 -0400 Subject: [PATCH 190/493] Add mod_megaco to modules.conf.in --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 1d27aaad1b..cc99d528f0 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -7,6 +7,7 @@ applications/mod_hash applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia +endpoints/mod_megaco ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket From f3fe2232f38534fdaa53fa91bca6256f2c474e12 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 15 May 2012 19:52:57 -0400 Subject: [PATCH 191/493] Remove stuff that should've been gitignored --- libs/ldns/install-sh | 29 +++++++++++------------------ src/include/switch_apr.h | 3 +-- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/libs/ldns/install-sh b/libs/ldns/install-sh index a9244eb078..6781b987bd 100755 --- a/libs/ldns/install-sh +++ b/libs/ldns/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-01-19.21; # UTC +scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -156,10 +156,6 @@ while test $# -ne 0; do -s) stripcmd=$stripprog;; -t) dst_arg=$2 - # Protect names problematic for `test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac shift;; -T) no_target_directory=true;; @@ -190,10 +186,6 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg - # Protect names problematic for `test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac done fi @@ -208,11 +200,7 @@ if test $# -eq 0; then fi if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 + trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. @@ -240,9 +228,9 @@ fi for src do - # Protect names problematic for `test' and other utilities. + # Protect names starting with `-'. case $src in - -* | [=\(\)!]) src=./$src;; + -*) src=./$src;; esac if test -n "$dir_arg"; then @@ -264,7 +252,12 @@ do echo "$0: no destination specified." >&2 exit 1 fi + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. @@ -392,7 +385,7 @@ do case $dstdir in /*) prefix='/';; - [-=\(\)!]*) prefix='./';; + -*) prefix='./';; *) prefix='';; esac @@ -410,7 +403,7 @@ do for d do - test X"$d" = X && continue + test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index e125eb9390..0c8673570f 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -773,8 +773,7 @@ typedef gid_t switch_gid_t; typedef ino_t switch_ino_t; typedef dev_t switch_dev_t; #endif - -typedef off_t switch_off_t; + typedef off64_t switch_off_t; /** * Structure for referencing file information From 32c5100e625f99c68f7979bddc24100aeea8e293 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 16 May 2012 18:36:26 +0530 Subject: [PATCH 192/493] Adding megaco stack configuration code and "megaco.conf.xml" --- src/mod/endpoints/mod_megaco/Makefile | 3 +- .../endpoints/mod_megaco/conf/megaco.conf.xml | 51 +++- src/mod/endpoints/mod_megaco/megaco.c | 61 ++++- src/mod/endpoints/mod_megaco/megaco_cfg.h | 98 ++++++++ src/mod/endpoints/mod_megaco/megaco_xml.c | 219 ++++++++++++++++++ src/mod/endpoints/mod_megaco/mod_megaco.c | 102 +++++++- src/mod/endpoints/mod_megaco/mod_megaco.h | 19 +- 7 files changed, 520 insertions(+), 33 deletions(-) create mode 100644 src/mod/endpoints/mod_megaco/megaco_cfg.h create mode 100644 src/mod/endpoints/mod_megaco/megaco_xml.c diff --git a/src/mod/endpoints/mod_megaco/Makefile b/src/mod/endpoints/mod_megaco/Makefile index e65d0f78eb..29349edca1 100644 --- a/src/mod/endpoints/mod_megaco/Makefile +++ b/src/mod/endpoints/mod_megaco/Makefile @@ -1,3 +1,4 @@ BASE=../../../.. -LOCAL_OBJS=megaco.o +LOCAL_OBJS=megaco.o megaco_cfg.o +LOCAL_LDFLAGS=-lsng_megaco include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml index c219023dd8..ed849030bf 100644 --- a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml +++ b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml @@ -1,9 +1,46 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c index 9ac7af4355..20024ace87 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -29,34 +29,73 @@ void megaco_profile_release(megaco_profile_t *profile) static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) { - switch_xml_t cfg, xml, x_profiles, x_profile, x_settings; + switch_xml_t cfg, xml, mg_interfaces, mg_interface, tpt_interfaces, tpt_interface, peer_interfaces, peer_interface; switch_status_t status = SWITCH_STATUS_FALSE; switch_event_t *event = NULL; - int count; const char *file = "megaco.conf"; + const char* mg_profile_tpt_id = NULL; + const char* mg_profile_peer_id = NULL; if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); goto done; } - if (!(x_profiles = switch_xml_child(cfg, "profiles"))) { + if (!(mg_interfaces = switch_xml_child(cfg, "sng_mg_interfaces"))) { goto done; } - for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) { - const char *name = switch_xml_attr_soft(x_profile, "name"); + /* iterate through MG Interface list to build all MG profiles */ + for (mg_interface = switch_xml_child(mg_interfaces, "sng_mg_interface"); mg_interface; mg_interface = mg_interface->next) { + + const char *name = switch_xml_attr_soft(mg_interface, "name"); if (strcmp(name, profile->name)) { continue; } - if (!(x_settings = switch_xml_child(x_profile, "settings"))) { + /* parse MG profile */ + if(SWITCH_STATUS_FALSE == sng_parse_mg_profile(mg_interface)) { goto done; } - count = switch_event_import_xml(switch_xml_child(x_settings, "param"), "name", "value", &event); - // status = switch_xml_config_parse_event(event, count, reload, instructions); - - /* TODO: Kapil: Initialize stack configuration */ + + mg_profile_tpt_id = switch_xml_attr_soft(mg_interface, "id"); + + /* Now get required transport profile against mg_profile_tpt_id*/ + if (!(tpt_interfaces = switch_xml_child(cfg, "sng_transport_interfaces"))) { + goto done; + } + + for (tpt_interface = switch_xml_child(tpt_interfaces, "sng_transport_interface"); tpt_interface; tpt_interface = tpt_interface->next) { + const char *id = switch_xml_attr_soft(tpt_interface, "id"); + if (strcmp(id, mg_profile_tpt_id)) { + continue; + } + + /* parse MG transport profile */ + if(SWITCH_STATUS_FALSE == sng_parse_mg_tpt_profile(tpt_interface)) { + goto done; + } + } + + /* as of now supporting only one peer */ + mg_profile_peer_id = switch_xml_attr_soft(mg_interface, "peerId"); + /* Now get required peer profile against mg_profile_peer_id*/ + if (!(peer_interfaces = switch_xml_child(cfg, "sng_mg_peer_interfaces"))) { + goto done; + } + + for (peer_interface = switch_xml_child(peer_interfaces, "sng_mg_peer_interface"); peer_interface; peer_interface = peer_interface->next) { + const char *id = switch_xml_attr_soft(peer_interface, "id"); + if (strcmp(id, mg_profile_peer_id)) { + continue; + } + + /* parse MG Peer profile */ + if(SWITCH_STATUS_FALSE == sng_parse_mg_peer_profile(peer_interface)) { + goto done; + } + } + status = SWITCH_STATUS_SUCCESS; } @@ -87,7 +126,6 @@ switch_status_t megaco_profile_start(const char *profilename) switch_thread_rwlock_create(&profile->rwlock, pool); - /* TODO: Kapil: Insert stack per-interface startup code here */ if (config_profile(profile, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error configuring profile %s\n", profile->name); goto fail; @@ -125,7 +163,6 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) return SWITCH_STATUS_SUCCESS; } - /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/endpoints/mod_megaco/megaco_cfg.h b/src/mod/endpoints/mod_megaco/megaco_cfg.h new file mode 100644 index 0000000000..54bf310b29 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco_cfg.h @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Kapil Gupta +* All rights reserved. +* +* +*/ + +#include "sng_megaco/sng_ss7.h" + +#ifndef _MEGACO_CFG_H_ +#define _MEGACO_CFG_H_ + +#define MAX_MID_LEN 30 +#define MAX_DOMAIN_LEN 30 +#define MAX_NAME_LEN 25 +#define MAX_MG_PROFILES 5 + +typedef struct sng_mg_peer{ + char name[MAX_NAME_LEN]; /* Peer Name as defined in config file */ + uint16_t id; /* Peer ID as defined in config file */ + uint8_t ipaddr[MAX_DOMAIN_LEN]; /* Peer IP */ + uint16_t port; /*Peer Port */ + uint8_t mid[MAX_MID_LEN]; /* Peer H.248 MID */ + uint16_t encoding_type; /* Encoding TEXT/Binary */ +}sng_mg_peer_t; + +typedef struct sng_mg_peers{ + uint16_t total_peer; /* Total number of MGC Peer */ + sng_mg_peer_t peers[MG_MAX_PEERS+1]; +}sng_mg_peers_t; + +typedef struct sng_mg_transport_profile{ + char name[MAX_NAME_LEN]; /* Peer Name as defined in config file */ + uint32_t id; /* map to tsap id */ + uint16_t transport_type; /* transport type */ +}sng_mg_transport_profile_t; + + +typedef enum{ + SNG_MG_TPT_NONE, + SNG_MG_TPT_UDP, + SNG_MG_TPT_TCP, + SNG_MG_TPT_SCTP, + SNG_MG_TPT_MTP3 +}sng_mg_transport_types_e; + +typedef enum{ + SNG_MG_NONE, + SNG_MG_MGCP, + SNG_MG_MEGACO, +}sng_mg_protocol_types_e; + +typedef enum{ + SNG_MG_ENCODING_NONE, + SNG_MG_ENCODING_TEXT, + SNG_MG_ENCODING_BINARY, +}sng_mg_encoding_types_e; + + + +/* each profile is corresponds to each MG Instance */ +typedef struct sng_mg_cfg{ + char name[MAX_NAME_LEN]; /* MG(Virtual MG) Name as defined in config file */ + uint32_t id; /* Id - map to MG SAP ID */ + uint8_t mid[MAX_MID_LEN]; /* MG H.248 MID */ + uint8_t my_domain[MAX_DOMAIN_LEN]; /* local domain name */ + uint8_t my_ipaddr[MAX_DOMAIN_LEN]; /* local domain name */ + uint32_t port; /* port */ + uint16_t peer_id; /* MGC Peer ID */ + uint16_t transport_prof_id; /* Transport profile id ..this also will be the spId for MG SAP*/ + uint16_t protocol_type; /* MEGACO/MGCP */ +}sng_mg_cfg_t; + + +typedef struct sng_mg_gbl_cfg{ + sng_mg_cfg_t mgCfg[MAX_MG_PROFILES + 1]; + sng_mg_transport_profile_t mgTptProf[MG_MAX_PEERS+1]; /* transport profile */ + sng_mg_peers_t mgPeer; +}sng_mg_gbl_cfg_t; + + +extern switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile); +extern switch_status_t sng_parse_mg_tpt_profile(switch_xml_t mg_tpt_profile); +extern switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface); + + +void handle_sng_log(uint8_t level, char *fmt, ...); +void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); +void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* msg); +void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* msg); +void handle_mgco_cntrl_cfm(Pst *pst, SuId suId, MgMgtCntrl* cntrl, Reason reason); +void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg); +void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason); +void handle_mg_alarm(Pst *pst, MgMngmt *sta); +void handle_tucl_alarm(Pst *pst, HiMngmt *sta); + +#endif /* _MEGACO_CFG_H_ */ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c new file mode 100644 index 0000000000..506cc3b29e --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Kapil Gupta +* All rights reserved. +* +* +*/ +#include "mod_megaco.h" + + +switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface) +{ + int i = 0x00; + const char *prof_name = NULL; + switch_xml_t param; + + /*************************************************************************/ + prof_name = switch_xml_attr_soft(mg_interface, "name"); + + /*************************************************************************/ + for (param = switch_xml_child(mg_interface, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + if (!var || !val) { + continue; + } + + /******************************************************************************************/ + if(!strcasecmp(var, "id")){ + i = atoi(val); + megaco_globals.g_mg_cfg.mgCfg[i].id = i; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface Id[%d] \n", i); + /*******************************************************************************************/ + }else if(!strcasecmp(var, "protocol")){ + /********************************************************************************************/ + if(!strcasecmp(val,"MEGACO")) { + megaco_globals.g_mg_cfg.mgCfg[i].protocol_type = SNG_MG_MEGACO; + }else if(!strcasecmp(val,"MGCP")){ + megaco_globals.g_mg_cfg.mgCfg[i].protocol_type = SNG_MG_MGCP; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGCP Protocol Not Yet Supported \n"); + return SWITCH_STATUS_FALSE; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",val); + return SWITCH_STATUS_FALSE; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface protocol[%d] \n", + megaco_globals.g_mg_cfg.mgCfg[i].protocol_type); + /********************************************************************************************/ + }else if(!strcasecmp(var, "transportProfileId")){ + /********************************************************************************************/ + megaco_globals.g_mg_cfg.mgCfg[i].transport_prof_id = atoi(val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface transport_prof_id[%d] \n", + megaco_globals.g_mg_cfg.mgCfg[i].transport_prof_id); + /********************************************************************************************/ + }else if(!strcasecmp(var, "localIp")){ + /***********************************************************************i*********************/ + strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].my_ipaddr[0],val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface my_ipaddr[%s] \n", + megaco_globals.g_mg_cfg.mgCfg[i].my_ipaddr); + /********************************************************************************************/ + }else if(!strcasecmp(var, "port")){ + /********************************************************************************************/ + megaco_globals.g_mg_cfg.mgCfg[i].port = atoi(val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_interface my_port[%d] \n", megaco_globals.g_mg_cfg.mgCfg[i].port); + /********************************************************************************************/ + }else if(!strcasecmp(var, "myDomainName")){ + /********************************************************************************************/ + strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].my_domain[0],val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_interface myDomainName[%s] \n", megaco_globals.g_mg_cfg.mgCfg[i].my_domain); + /********************************************************************************************/ + }else if(!strcasecmp(var, "mid")){ + /********************************************************************************************/ + strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].mid[0],val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_interface mid[%s] \n", megaco_globals.g_mg_cfg.mgCfg[i].mid); + /********************************************************************************************/ + }else if(!strcasecmp(var, "peerId")){ + /********************************************************************************************/ + megaco_globals.g_mg_cfg.mgCfg[i].peer_id = atoi(val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_interface peerId[%d] \n", megaco_globals.g_mg_cfg.mgCfg[i].peer_id); + /********************************************************************************************/ + }else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_interface \n", var); + return SWITCH_STATUS_FALSE; + } + } + + strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].name[0], prof_name); + + return SWITCH_STATUS_SUCCESS; +} + +/***********************************************************************************************************/ + +switch_status_t sng_parse_mg_tpt_profile(switch_xml_t mg_tpt_profile) +{ + int i = 0x00; + switch_xml_t param; + const char *prof_name = NULL; + + /*************************************************************************/ + prof_name = switch_xml_attr_soft(mg_tpt_profile, "name"); + + /*************************************************************************/ + for (param = switch_xml_child(mg_tpt_profile, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + if (!var || !val) { + continue; + } + + /******************************************************************************************/ + if(!strcasecmp(var, "id")){ + /*******************************************************************************************/ + i = atoi(val); + megaco_globals.g_mg_cfg.mgTptProf[i].id = i; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_tpt_profile Id[%d] \n", i); + /*******************************************************************************************/ + }else if(!strcasecmp(var, "transportType")){ + /*******************************************************************************************/ + if(!strcasecmp(val,"UDP")) { + megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_UDP; + }else if(!strcasecmp(val,"TCP")){ + megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_TCP; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "TCP Transport for H.248 Protocol Not Yet Supported \n"); + return SWITCH_STATUS_FALSE; + }else if(!strcasecmp(val,"STCP")){ + megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_SCTP; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STCP Transport for H.248 Protocol Not Yet Supported \n"); + return SWITCH_STATUS_FALSE; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",val); + return SWITCH_STATUS_FALSE; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_tpt_profile transport_type[%d] \n", + megaco_globals.g_mg_cfg.mgTptProf[i].transport_type); + /********************************************************************************************/ + }else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_transport \n", var); + return SWITCH_STATUS_FALSE; + } + } + + strcpy((char*)&megaco_globals.g_mg_cfg.mgTptProf[i].name[0], prof_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_tpt_profile Name[%s] \n", &megaco_globals.g_mg_cfg.mgTptProf[i].name[0]); + + return SWITCH_STATUS_SUCCESS; +} +/***********************************************************************************************************/ + +switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) +{ + int i = 0x00; + switch_xml_t param; + const char *prof_name = NULL; + + /*************************************************************************/ + prof_name = switch_xml_attr_soft(mg_peer_profile, "name"); + + for (param = switch_xml_child(mg_peer_profile, "param"); param; param = param->next) { + /***********************************************************************************************************/ + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + if (!var || !val) { + continue; + } + + /***********************************************************************************************************/ + if(!strcasecmp(var, "id")){ + /***********************************************************************************************************/ + i = atoi(val); + megaco_globals.g_mg_cfg.mgPeer.peers[i].id = i; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_peer_profile Id[%d] \n", i); + /***********************************************************************************************************/ + }else if(!strcasecmp(var, "port")){ + /***********************************************************************************************************/ + megaco_globals.g_mg_cfg.mgPeer.peers[i].port = atoi(val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_peer_profile port[%d] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].port); + /***********************************************************************************************************/ + }else if(!strcasecmp(var, "encodingScheme")){ + /***********************************************************************************************************/ + if(!strcasecmp(val, "TEXT")){ + megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type = SNG_MG_ENCODING_TEXT; + } else if(!strcasecmp(val, "BINARY")){ + megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type = SNG_MG_ENCODING_BINARY; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Encoding Type[%s] \n",val); + return SWITCH_STATUS_FALSE; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_peer_profile encodingScheme[%d] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type); + /***********************************************************************************************************/ + }else if(!strcasecmp(var, "mid")){ + /***********************************************************************************************************/ + strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].mid[0],val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_peer_profile mid[%s] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].mid); + /***********************************************************************************************************/ + }else if(!strcasecmp(var, "ip")){ + /***********************************************************************************************************/ + strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].ipaddr[0],val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + " mg_peer_profile ip[%s] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].ipaddr); + /***********************************************************************************************************/ + }else{ + /***********************************************************************************************************/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_peer \n", var); + return SWITCH_STATUS_FALSE; + } + } + + return SWITCH_STATUS_SUCCESS; +} +/***********************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index bf23077e00..bda8e53ec0 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -9,6 +9,7 @@ #include "mod_megaco.h" struct megaco_globals megaco_globals; +static sng_isup_event_interface_t sng_event; SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); @@ -115,9 +116,25 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); - - /* TODO: Kapil: Insert stack global startup code here */ - + + + /* Initialize MEGACO Stack */ + sng_event.mg.sng_mgco_txn_ind = handle_mgco_txn_ind; + sng_event.mg.sng_mgco_cmd_ind = handle_mgco_cmd_ind; + sng_event.mg.sng_mgco_txn_sta_ind = handle_mgco_txn_sta_ind; + sng_event.mg.sng_mgco_sta_ind = handle_mgco_sta_ind; + sng_event.mg.sng_mgco_cntrl_cfm = handle_mgco_cntrl_cfm; + sng_event.mg.sng_mgco_audit_cfm = handle_mgco_audit_cfm; + + /* Alarm CB */ + sng_event.sm.sng_mg_alarm = handle_mg_alarm; + sng_event.sm.sng_tucl_alarm = handle_tucl_alarm; + + /* Log */ + sng_event.sm.sng_log = handle_sng_log; + + /* initalize sng_mg library */ + sng_isup_init_gen(&sng_event); return SWITCH_STATUS_SUCCESS; } @@ -128,6 +145,85 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown) return SWITCH_STATUS_SUCCESS; } +/*****************************************************************************************************************************/ +void handle_sng_log(uint8_t level, char *fmt, ...) +{ + int log_level; + char print_buf[1024]; + va_list ptr; + + memset(&print_buf[0],0,sizeof(1024)); + + va_start(ptr, fmt); + + switch(level) + { + case SNG_LOGLEVEL_DEBUG: log_level = SWITCH_LOG_DEBUG; break; + case SNG_LOGLEVEL_INFO: log_level = SWITCH_LOG_INFO; break; + case SNG_LOGLEVEL_WARN: log_level = SWITCH_LOG_WARNING; break; + case SNG_LOGLEVEL_ERROR: log_level = SWITCH_LOG_ERROR; break; + case SNG_LOGLEVEL_CRIT: log_level = SWITCH_LOG_CRIT; break; + default: log_level = SWITCH_LOG_DEBUG; break; + }; + + vsprintf(&print_buf[0], fmt, ptr); + + switch_log_printf(SWITCH_CHANNEL_LOG, log_level, " MOD_MEGACO: %s \n", &print_buf[0]); + + va_end(ptr); +} + +/*****************************************************************************************************************************/ + +void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* sta) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ + +void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_mgco_cntrl_cfm(Pst *pst, SuId suId, MgMgtCntrl* cntrl, Reason reason) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_mg_alarm(Pst *pst, MgMngmt *sta) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ +void handle_tucl_alarm(Pst *pst, HiMngmt *sta) +{ + /*TODO*/ +} + +/*****************************************************************************************************************************/ /* For Emacs: * Local Variables: diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index b12982de8c..3efa48e3bc 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -11,12 +11,13 @@ #define MOD_MEGACO_H #include +#include "megaco_cfg.h" struct megaco_globals { - switch_memory_pool_t *pool; - switch_hash_t *profile_hash; - switch_thread_rwlock_t *profile_rwlock; - /* TODO: Kapil: add global variables here */ + switch_memory_pool_t *pool; + switch_hash_t *profile_hash; + switch_thread_rwlock_t *profile_rwlock; + sng_mg_gbl_cfg_t g_mg_cfg; }; extern struct megaco_globals megaco_globals; /* < defined in mod_megaco.c */ @@ -25,12 +26,10 @@ typedef enum { } megaco_profile_flags_t; typedef struct megaco_profile_s { - char *name; - switch_memory_pool_t *pool; - switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ - megaco_profile_flags_t flags; - - /* TODO: Kapil: Insert interface-specific stack elements here */ + char *name; + switch_memory_pool_t *pool; + switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ + megaco_profile_flags_t flags; } megaco_profile_t; From df76709e95241e7971e380e99f66853838902397 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 17 May 2012 16:14:05 +0530 Subject: [PATCH 193/493] Adding code to bring up MEGACO stack --- src/mod/endpoints/mod_megaco/Makefile | 10 +- src/mod/endpoints/mod_megaco/megaco.c | 13 +- src/mod/endpoints/mod_megaco/megaco_stack.c | 964 ++++++++++++++++++ .../{megaco_cfg.h => megaco_stack.h} | 39 +- src/mod/endpoints/mod_megaco/megaco_xml.c | 1 + src/mod/endpoints/mod_megaco/mod_megaco.c | 15 +- src/mod/endpoints/mod_megaco/mod_megaco.h | 2 +- 7 files changed, 1031 insertions(+), 13 deletions(-) create mode 100644 src/mod/endpoints/mod_megaco/megaco_stack.c rename src/mod/endpoints/mod_megaco/{megaco_cfg.h => megaco_stack.h} (71%) diff --git a/src/mod/endpoints/mod_megaco/Makefile b/src/mod/endpoints/mod_megaco/Makefile index 29349edca1..4564a420e9 100644 --- a/src/mod/endpoints/mod_megaco/Makefile +++ b/src/mod/endpoints/mod_megaco/Makefile @@ -1,4 +1,12 @@ +ifndef ARCH + ARCH=$(shell uname -m) +endif + +ifeq ($(ARCH),x86_64) + LOCAL_CFLAGS+=-DBIT_64 -DALIGN_64BIT +endif + BASE=../../../.. -LOCAL_OBJS=megaco.o megaco_cfg.o +LOCAL_OBJS=megaco.o megaco_stack.o megaco_xml.o LOCAL_LDFLAGS=-lsng_megaco include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c index 20024ace87..84bf70963b 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -96,7 +96,12 @@ static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t r } } - status = SWITCH_STATUS_SUCCESS; + + /* configure the MEGACO stack */ + status = sng_mgco_cfg(profile->name); + + /* we should break from here , profile name should be unique */ + break; } done: @@ -131,6 +136,12 @@ switch_status_t megaco_profile_start(const char *profilename) goto fail; } + /* start MEGACP stack */ + if(SWITCH_STATUS_FALSE == sng_mgco_start(profilename)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error starting MEGACO Stack for profile %s\n", profile->name); + goto fail; + } + switch_core_hash_insert_wrlock(megaco_globals.profile_hash, profile->name, profile, megaco_globals.profile_rwlock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Started profile: %s\n", profile->name); diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c new file mode 100644 index 0000000000..4ba2cd05f6 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -0,0 +1,964 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Kapil Gupta +* All rights reserved. +* +* +*/ + +/* INCLUDES *******************************************************************/ +#include "mod_megaco.h" +/******************************************************************************/ + +/* DEFINES ********************************************************************/ + +/* FUNCTION PROTOTYPES ********************************************************/ +int mgco_mg_gen_config(void); +int mgco_mu_gen_config(void); +int mgco_tucl_gen_config(void); +int mgco_mu_ssap_config(int idx); +int mgco_mg_tsap_config(int idx); +int mgco_mg_enble_debug(void); +int mgco_mg_ssap_config(int idx); +int mgco_mg_peer_config(int idx); +int mgco_mg_tpt_server_config(int idx); +int mgco_tucl_sap_config(int idx); + +int mgco_mg_tsap_bind_cntrl(int idx); +int mgco_mg_tsap_enable_cntrl(int idx); +int mgco_mg_ssap_cntrl(int idx); +int mgco_mu_ssap_cntrl(int idx); +int mgco_mg_tpt_server(int idx); + +switch_status_t sng_mgco_stack_gen_cfg(); + +/******************************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +switch_status_t sng_mgco_init(sng_isup_event_interface_t* event) +{ + uint32_t major, minor, build; + + switch_assert(event); + + /* initalize sng_mg library */ + sng_isup_init_gen(event); + + /* print the version of the library being used */ + sng_isup_version(&major, &minor, &build); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Loaded LibSng-MEGACO %d.%d.%d\n", major, minor, build); + + /* start up the stack manager */ + if (sng_isup_init_sm()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Failed to start Stack Manager\n"); + return SWITCH_STATUS_FALSE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started Stack Manager!\n"); + } + + if (sng_isup_init_tucl()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start TUCL\n"); + return SWITCH_STATUS_FALSE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started TUCL!\n"); + } + + if (sng_isup_init_mg()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start MG\n"); + return SWITCH_STATUS_FALSE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started MG!\n"); + } + + if (sng_isup_init_mu()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start MU\n"); + return SWITCH_STATUS_FALSE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started MU!\n"); + } + + + /* gen config for all the layers of megaco */ + return sng_mgco_stack_gen_cfg(); +} + +/*****************************************************************************************************************/ +switch_status_t sng_mgco_stack_shutdown() +{ + /* free MEGACO Application */ + sng_isup_free_mu(); + + /* free MEGACO */ + sng_isup_free_mg(); + + /* free TUCL */ + sng_isup_free_tucl(); + + /* free SM */ + sng_isup_free_sm(); + + /* free gen */ + sng_isup_free_gen(); + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************/ +switch_status_t sng_mgco_stack_gen_cfg() +{ + if(mgco_mg_gen_config()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"MG Gen Config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"MG Gen Config SUCCESS \n"); + } + + if(mgco_mu_gen_config()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"MU(MG-Application) Gen Config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"MU(MG-Application) Gen Config SUCCESS \n"); + } + + if(mgco_tucl_gen_config()) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," TUCL Gen Config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," TUCL Gen Config SUCCESS \n"); + } + + return SWITCH_STATUS_SUCCESS; +} + + +/*****************************************************************************************************************/ + +switch_status_t sng_mgco_cfg(const char* profilename) +{ + int idx = 0x00; + + switch_assert(profilename); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG configuration for idx[%d] against profilename[%s]\n", idx, profilename); + + if(mgco_tucl_sap_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_tucl_sap_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mgco_tucl_sap_config SUCCESS \n"); + } + + + if(mgco_mu_ssap_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_mu_ssap_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mgco_mu_ssap_config SUCCESS \n"); + } + + + if(mgco_mg_tsap_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_mg_tsap_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mgco_mg_tsap_config SUCCESS \n"); + } + + if(mgco_mg_ssap_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_ssap_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_ssap_config SUCCESS \n"); + } + + if(mgco_mg_peer_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_peer_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_peer_config SUCCESS \n"); + } + + if(mgco_mg_tpt_server_config(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tpt_server_config FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tpt_server_config SUCCESS \n"); + } + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************/ + +switch_status_t sng_mgco_start(const char* profilename) +{ + int idx = 0x00; + + switch_assert(profilename); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG stack for idx[%d] against profilename[%s]\n", idx, profilename); + + if(mgco_mu_ssap_cntrl(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mu_ssap_cntrl FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mu_ssap_cntrl SUCCESS \n"); + } + + if(mgco_mg_tsap_bind_cntrl(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tsap_bind_cntrl FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_bind_cntrl SUCCESS \n"); + } + + if(mgco_mg_ssap_cntrl(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_ssap_cntrl FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_ssap_cntrl SUCCESS \n"); + } + + if(mgco_mg_tsap_enable_cntrl(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tsap_enable_cntrl FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_enable_cntrl SUCCESS \n"); + } + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************/ +int mgco_mg_tsap_bind_cntrl(int idx) +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl *cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + cntrl = &(mgMngmt.t.cntrl); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STTSAP; + + cntrl->action = ABND_ENA; + cntrl->subAction = SAELMNT; + cntrl->spId = GET_TPT_ID(idx); + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} + +/*****************************************************************************************************************/ + +int mgco_mg_tsap_enable_cntrl(int idx) +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl *cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + cntrl = &(mgMngmt.t.cntrl); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STTSAP; + + cntrl->action = AENA; + cntrl->subAction = SAELMNT; + cntrl->spId = GET_TPT_ID(idx); + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} + +/*****************************************************************************************************************/ + +int mgco_mg_tpt_server(int idx) +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl *cntrl; + MgTptCntrl *tptCntrl = &mgMngmt.t.cntrl.s.tptCntrl; + CmInetIpAddr ipAddr = 0; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + + cntrl = &(mgMngmt.t.cntrl); + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + tptCntrl->transportType = GET_TPT_TYPE(idx); + + tptCntrl->serverAddr.type = CM_INET_IPV4ADDR_TYPE; + tptCntrl->serverAddr.u.ipv4TptAddr.port = mgCfg->port; + if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + { + tptCntrl->serverAddr.u.ipv4TptAddr.address = ntohl(ipAddr); + } + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSERVER; + + cntrl->action = AENA; + cntrl->subAction = SAELMNT; + cntrl->spId = (SpId)0x01; + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} + +/*****************************************************************************************************************/ + +int mgco_mu_ssap_cntrl(int idx) +{ + MuMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MuCntrl *cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + cntrl = &(mgMngmt.t.cntrl); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMU; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSSAP; + mgMngmt.hdr.elmId.elmntInst1 = GET_MU_SAP_ID(idx); + + cntrl->action = ABND_ENA; + cntrl->subAction = SAELMNT; + + return(sng_cntrl_mu(&pst, &mgMngmt)); +} + +/*****************************************************************************************************************/ + +int mgco_mg_ssap_cntrl(int idx) +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl *cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + cntrl = &(mgMngmt.t.cntrl); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSSAP; + + cntrl->action = AENA; + cntrl->subAction = SAELMNT; + cntrl->spId = (SpId)1; + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} +/******************************************************************************/ + +int mgco_mg_enble_debug() +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl* cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cntrl = &mgMngmt.t.cntrl; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTHI; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STGEN; + + cntrl->action = AENA; + cntrl->subAction = SADBG; + cntrl->s.dbg.genDbgMask = 0xfffffdff; + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ +int mgco_tucl_gen_config(void) +{ + HiMngmt cfg; + Pst pst; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTHI; + + /* clear the configuration structure */ + memset(&cfg, 0, sizeof(cfg)); + + /* fill in the post structure */ + set_dest_sm_pst(&cfg.t.cfg.s.hiGen.lmPst); + /*fill in the specific fields of the header */ + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTHI; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STGEN; + + cfg.t.cfg.s.hiGen.numSaps = HI_MAX_SAPS; /* number of SAPs */ + cfg.t.cfg.s.hiGen.numCons = HI_MAX_NUM_OF_CON; /* maximum num of connections */ + cfg.t.cfg.s.hiGen.numFdsPerSet = HI_MAX_NUM_OF_FD_PER_SET; /* maximum num of fds to use per set */ + cfg.t.cfg.s.hiGen.numFdBins = HI_MAX_NUM_OF_FD_HASH_BINS; /* for fd hash lists */ + cfg.t.cfg.s.hiGen.numClToAccept = HI_MAX_NUM_OF_CLIENT_TO_ACCEPT; /* clients to accept simultaneously */ + cfg.t.cfg.s.hiGen.permTsk = TRUE; /* schedule as perm task or timer */ + cfg.t.cfg.s.hiGen.schdTmrVal = HI_MAX_SCHED_TMR_VALUE; /* if !permTsk - probably ignored */ + cfg.t.cfg.s.hiGen.selTimeout = HI_MAX_SELECT_TIMEOUT_VALUE; /* select() timeout */ + + /* number of raw/UDP messages to read in one iteration */ + cfg.t.cfg.s.hiGen.numRawMsgsToRead = HI_MAX_RAW_MSG_TO_READ; + cfg.t.cfg.s.hiGen.numUdpMsgsToRead = HI_MAX_UDP_MSG_TO_READ; + + /* thresholds for congestion on the memory pool */ + cfg.t.cfg.s.hiGen.poolStrtThr = HI_MEM_POOL_START_THRESHOLD; + cfg.t.cfg.s.hiGen.poolDropThr = HI_MEM_POOL_DROP_THRESHOLD; + cfg.t.cfg.s.hiGen.poolStopThr = HI_MEM_POOL_STOP_THRESHOLD; + + cfg.t.cfg.s.hiGen.timeRes = SI_PERIOD; /* time resolution */ + +#ifdef HI_SPECIFY_GENSOCK_ADDR + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.address = CM_INET_INADDR_ANY; + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port = 0; /* DAVIDY - why 0? */ +#ifdef IPV6_SUPPORTED + cfg.t.cfg.s.hiGen.ipv6GenSockAddr.address = CM_INET_INADDR6_ANY; + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port = 0; +#endif +#endif + + return(sng_cfg_tucl(&pst, &cfg)); +} + +/******************************************************************************/ + +int mgco_tucl_sap_config(int idx) +{ + HiMngmt cfg; + Pst pst; + HiSapCfg *pCfg; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTHI; + + /* clear the configuration structure */ + memset(&cfg, 0, sizeof(cfg)); + + /* fill in the post structure */ + set_dest_sm_pst(&cfg.t.cfg.s.hiGen.lmPst); + /*fill in the specific fields of the header */ + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTHI; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STTSAP; + + pCfg = &cfg.t.cfg.s.hiSap; + + pCfg->spId = GET_TPT_ID(idx); + pCfg->uiSel = 0x00; /*loosley coupled */ + pCfg->flcEnb = TRUE; + pCfg->txqCongStrtLim = HI_SAP_TXN_QUEUE_CONG_START_LIMIT; + pCfg->txqCongDropLim = HI_SAP_TXN_QUEUE_CONG_DROP_LIMIT; + pCfg->txqCongStopLim = HI_SAP_TXN_QUEUE_CONG_STOP_LIMIT; + pCfg->numBins = 10; + + pCfg->uiMemId.region = S_REG; + pCfg->uiMemId.pool = S_POOL; + pCfg->uiPrior = PRIOR0; + pCfg->uiRoute = RTESPEC; + + return(sng_cfg_tucl(&pst, &cfg)); +} + +/******************************************************************************/ + +int mgco_mg_gen_config(void) +{ + MgMngmt mgMngmt; + MgGenCfg *cfg; + Pst pst; /* Post for layer manager */ + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cfg = &(mgMngmt.t.cfg.c.genCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /* fill in the post structure */ + set_dest_sm_pst(&mgMngmt.t.cfg.c.genCfg.lmPst); + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STGEN; + + + /*----------- Fill General Configuration Parameters ---------*/ + cfg->maxSSaps = (U16)MG_MAX_SSAPS; + cfg->maxTSaps = (U32)MG_MAX_TSAPS; + cfg->maxServers = (U16)MG_MAX_SERVERS; + cfg->maxConn = (U32)10; + cfg->maxTxn = (U16)MG_MAX_OUTSTANDING_TRANSACTIONS; + cfg->maxPeer = (U32)MG_MAX_PEER; + cfg->resThUpper = (Status)7; + cfg->resThLower = (Status)3; +#if (defined(GCP_MGCP) || defined(TDS_ROLL_UPGRADE_SUPPORT)) + cfg->timeResTTL = (Ticks)10000; +#endif + + cfg->timeRes = (Ticks)10; + cfg->reCfg.rspAckEnb = MG_LMG_GET_RSPACK_MGCO; + cfg->numBlks = (U32)MG_NUM_BLK; + cfg->maxBlkSize = (Size)MG_MAXBLKSIZE; + cfg->numBinsTxnIdHl = (U16)149; + cfg->numBinsNameHl = (U16)149; + cfg->entType = LMG_ENT_GW; + cfg->numBinsTptSrvrHl = (U16)149; + cfg->indicateRetx = TRUE; /* Assume environment to be lossy */ + cfg->resOrder = LMG_RES_IPV4; /* IPV4 only */ + +#ifdef CM_ABNF_MT_LIB + cfg->firstInst = 1; + cfg->edEncTmr.enb = FALSE; + cfg->edEncTmr.val = (U16)50; + cfg->edDecTmr.enb = TRUE; + cfg->edDecTmr.val = (U16)50; + cfg->noEDInst = 1; +#endif /* CM_ABNF_MT_LIB */ + +#ifdef GCP_CH + cfg->numBinsPeerCmdHl = 20; + cfg->numBinsTransReqHl = 50; + cfg->numBinsTransIndRspCmdHl = 50; +#endif /* GCP_CH */ + +#ifdef GCP_MG + cfg->maxMgCmdTimeOut.enb =TRUE; + cfg->maxMgCmdTimeOut.val =20; +#endif /* GCP_MG */ + +#ifdef GCP_MG + cfg->maxMgCmdTimeOut.enb =TRUE; + cfg->maxMgCmdTimeOut.val =20; +#endif /* GCP_MG */ + +#ifdef GCP_MGC + cfg->maxMgcCmdTimeOut.enb =TRUE; + cfg->maxMgcCmdTimeOut.val =20; +#endif /* GCP_MG */ + +#if (defined(GCP_MGCO) && (defined GCP_VER_2_1)) + cfg->reCfg.segRspTmr.enb = TRUE; + cfg->reCfg.segRspTmr.val = (U16)50; + cfg->reCfg.segRspAckTmr.enb = TRUE; + cfg->reCfg.segRspAckTmr.val = (U16)25; +#endif + +#ifdef GCP_PKG_MGCO_ROOT + cfg->limit.pres.pres = PRSNT_NODEF; + cfg->limit.mgcOriginatedPendingLimit = 20000; + cfg->limit.mgOriginatedPendingLimit = 20000; +#endif /* GCP_PKG_MGCO_ROOT */ + + return(sng_cfg_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ + +int mgco_mu_gen_config(void) +{ + MuMngmt mgmt; + MuGenCfg *cfg; + Pst pst; /* Post for layer manager */ + + memset(&mgmt, 0, sizeof(mgmt)); + cfg = &(mgmt.t.cfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMU; + + /*fill in the specific fields of the header */ + mgmt.hdr.msgType = TCFG; + mgmt.hdr.entId.ent = ENTMU; + mgmt.hdr.entId.inst = S_INST; + mgmt.hdr.elmId.elmnt = STGEN; + + return(sng_cfg_mu(&pst, &mgmt)); +} + +/******************************************************************************/ + +int mgco_mu_ssap_config(int idx) +{ + MuMngmt mgmt; + MuSAP_t *cfg; + Pst pst; /* Post for layer manager */ + + memset(&mgmt, 0, sizeof(mgmt)); + cfg = &(mgmt.t.sapCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMU; + + /*fill in the specific fields of the header */ + mgmt.hdr.msgType = TCFG; + mgmt.hdr.entId.ent = ENTMU; + mgmt.hdr.entId.inst = S_INST; + mgmt.hdr.elmId.elmnt = STSSAP; + + /* fill lower layer i.e. MG PST */ + cfg->ssapId = GET_MU_SAP_ID(idx); /* SSAP ID */ + cfg->spId = GET_MU_SAP_ID(idx); /* SSAP ID */ + + cfg->mem.region = S_REG; + cfg->mem.pool = S_POOL; + cfg->dstProcId = SFndProcId(); + cfg->dstEnt = ENTMG; + cfg->dstInst = S_INST; + cfg->dstPrior = PRIOR0; + cfg->dstRoute = RTESPEC; + cfg->selector = 0x00; /* Loosely coupled */ + + return(sng_cfg_mu(&pst, &mgmt)); +} + +/******************************************************************************/ + +int mgco_mg_ssap_config(int idx) +{ + MgMngmt mgMngmt; + MgSSAPCfg *pCfg; + Pst pst; /* Post for layer manager */ + CmInetIpAddr ipAddr; + int len = 0x00; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + pCfg = &(mgMngmt.t.cfg.c.sSAPCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSSAP; + + /* FILL SAP config */ + + pCfg->sSAPId = mgCfg->id; /* SSAP ID */ + pCfg->sel = 0x00 ; /* Loosely coupled */ + pCfg->memId.region = S_REG; + pCfg->memId.pool = S_POOL; + pCfg->prior = PRIOR0; + pCfg->route = RTESPEC; + + pCfg->protocol = mgCfg->protocol_type; + + pCfg->startTxnNum = 50; + pCfg->endTxnNum = 60; + + pCfg->initReg = TRUE; + pCfg->mwdTimer = (U16)10; + + pCfg->minMgcoVersion = LMG_VER_PROF_MGCO_H248_1_0; + pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_3_0; + + pCfg->userInfo.pres.pres = PRSNT_NODEF; + pCfg->userInfo.id.pres = NOTPRSNT; + pCfg->userInfo.mid.pres = PRSNT_NODEF; + pCfg->userInfo.dname.namePres.pres = PRSNT_NODEF; + + pCfg->userInfo.mid.len = (U8)strlen((char*)mgCfg->mid); + strncpy((char*)pCfg->userInfo.mid.val, (char*)mgCfg->mid, MAX_MID_LEN); + + len = (U32)strlen((char*)mgCfg->my_domain); + memcpy( (U8*)(pCfg->userInfo.dname.name), + (CONSTANT U8*)(mgCfg->my_domain), len ); + pCfg->userInfo.dname.name[len] = '\0'; + + pCfg->userInfo.dname.netAddr.type = CM_TPTADDR_IPV4; + memset(&ipAddr,'\0',sizeof(ipAddr)); + if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr,&ipAddr)) + { + pCfg->userInfo.dname.netAddr.u.ipv4NetAddr = ntohl(ipAddr); + } + + pCfg->reCfg.initRetxTmr.enb = TRUE; + pCfg->reCfg.initRetxTmr.val = MG_INIT_RTT; + pCfg->reCfg.provRspTmr.enb = TRUE; + pCfg->reCfg.provRspTmr.val = (U16)50; /* In timer resolution */ + pCfg->reCfg.provRspDelay = 2; + pCfg->reCfg.atMostOnceTmr.enb = TRUE; + pCfg->reCfg.atMostOnceTmr.val = (U16)30; + + return(sng_cfg_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ + +int mgco_mg_tsap_config(int idx) +{ + MgMngmt mgMngmt; + /* local variables */ + MgTSAPCfg *cfg; + Pst pst; /* Post for layer manager */ + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cfg = &(mgMngmt.t.cfg.c.tSAPCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STTSAP; + + /* FILL TSAP config */ + cfg->tSAPId = mgCfg->id; + cfg->spId = GET_TPT_ID(idx); + cfg->provType = GET_TPT_TYPE(idx); + + /* FILL TUCL Information */ + cfg->memId.region = S_REG; + cfg->memId.pool = S_POOL; + cfg->dstProcId = SFndProcId(); + cfg->dstEnt = ENTHI; + cfg->dstInst = S_INST; + cfg->dstPrior = PRIOR0; + cfg->dstRoute = RTESPEC; + cfg->dstSel = 0x00; /* Loosely coupled */ + cfg->bndTmrCfg.enb = TRUE; + cfg->bndTmrCfg.val = 5; /* 5 seconds */ + + + /* Disable DNS as of now */ + cfg->reCfg.idleTmr.enb = FALSE; + cfg->reCfg.dnsCfg.dnsAccess = LMG_DNS_DISABLED; + cfg->reCfg.dnsCfg.dnsAddr.type = CM_TPTADDR_IPV4; + cfg->reCfg.dnsCfg.dnsAddr.u.ipv4TptAddr.port = (U16)53; + cfg->reCfg.dnsCfg.dnsAddr.u.ipv4TptAddr.address = (CmInetIpAddr)MG_DNS_IP; + + cfg->reCfg.dnsCfg.dnsRslvTmr.enb = FALSE; + cfg->reCfg.dnsCfg.dnsRslvTmr.val = 60; /* 60 sec */ + cfg->reCfg.dnsCfg.maxRetxCnt = 4; + + cfg->reCfg.tMax = 1000; + cfg->reCfg.tptParam.type = CM_TPTPARAM_SOCK; + cfg->reCfg.tptParam.u.sockParam.listenQSize = 5; + cfg->reCfg.tptParam.u.sockParam.numOpts = 0; + + + return(sng_cfg_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ + +int mgco_mg_peer_config(int idx) +{ + MgMngmt mgMngmt; + MgGcpEntCfg *cfg; + Pst pst; /* Post for layer manager */ + U32 peerIdx = 0; + CmInetIpAddr ipAddr = 0; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + sng_mg_peer_t* mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cfg = &(mgMngmt.t.cfg.c.mgGcpEntCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STGCPENT; + + cfg->numPeer = megaco_globals.g_mg_cfg.mgPeer.total_peer; + cfg->peerCfg[peerIdx].sSAPId = mgCfg->id; /* SSAP ID */; + cfg->peerCfg[peerIdx].port = mgPeer->port; + cfg->peerCfg[peerIdx].tsapId = GET_TPT_ID(idx); + + cfg->peerCfg[peerIdx].mtuSize = MG_MAX_MTU_SIZE; + + + cfg->peerCfg[peerIdx].peerAddrTbl.count = 1; + cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].type = + CM_NETADDR_IPV4; + + if(ROK == cmInetAddr((S8*)&mgPeer->ipaddr[0],&ipAddr)) + { + cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].u.ipv4NetAddr = ntohl(ipAddr); + } + else + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "cmInetAddr failed \n"); + cfg->peerCfg[peerIdx].peerAddrTbl.count = 0; + } + +#ifdef GCP_MG + cfg->peerCfg[peerIdx].transportType = GET_TPT_TYPE(idx); + cfg->peerCfg[peerIdx].encodingScheme = GET_ENCODING_TYPE(idx); + cfg->peerCfg[peerIdx].mgcPriority = 0; + cfg->peerCfg[peerIdx].useAHScheme = FALSE; + cfg->peerCfg[peerIdx].mid.pres = PRSNT_NODEF; + cfg->peerCfg[peerIdx].mid.len = strlen((char*)mgPeer->mid); + cmMemcpy((U8 *)cfg->peerCfg[peerIdx].mid.val, + (CONSTANT U8*)(char*)mgPeer->mid, + cfg->peerCfg[peerIdx].mid.len); + +#endif /* GCP_MG */ + + return(sng_cfg_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ + +int mgco_mg_tpt_server_config(int idx) +{ + MgMngmt mgMngmt; + MgTptSrvrCfg *cfg; + Pst pst; /* Post for layer manager */ + CmInetIpAddr ipAddr = 0; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + int srvIdx = 0; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cfg = &(mgMngmt.t.cfg.c.tptSrvrCfg); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSERVER; + + cfg->count = 1; + cfg->srvr[srvIdx].isDefault = TRUE; + cfg->srvr[srvIdx].sSAPId = mgCfg->id; + cfg->srvr[srvIdx].tSAPId = GET_TPT_ID(idx); + cfg->srvr[srvIdx].protocol = mgCfg->protocol_type; + cfg->srvr[srvIdx].transportType = GET_TPT_TYPE(idx); + cfg->srvr[srvIdx].encodingScheme = GET_ENCODING_TYPE(idx); + + cfg->srvr[srvIdx].tptParam.type = CM_TPTPARAM_SOCK; + cfg->srvr[srvIdx].tptParam.u.sockParam.listenQSize = 5; + cfg->srvr[srvIdx].tptParam.u.sockParam.numOpts = 0; + cfg->srvr[srvIdx].lclTptAddr.type = CM_TPTADDR_IPV4; + cfg->srvr[srvIdx].lclTptAddr.u.ipv4TptAddr.port = mgCfg->port; + if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + { + cfg->srvr[srvIdx].lclTptAddr.u.ipv4TptAddr.address = ntohl(ipAddr); + } + + return(sng_cfg_mg(&pst, &mgMngmt)); +} + +/******************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_cfg.h b/src/mod/endpoints/mod_megaco/megaco_stack.h similarity index 71% rename from src/mod/endpoints/mod_megaco/megaco_cfg.h rename to src/mod/endpoints/mod_megaco/megaco_stack.h index 54bf310b29..24cf6e26ca 100644 --- a/src/mod/endpoints/mod_megaco/megaco_cfg.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -51,12 +51,21 @@ typedef enum{ SNG_MG_MEGACO, }sng_mg_protocol_types_e; +#define PRNT_PROTOCOL_TYPE(_val)\ + ((_val == SNG_MG_MGCP)?"SNG_MG_MGCP":\ + (_val == SNG_MG_MEGACO)?"SNG_MG_MEGACO":\ + "SNG_MG_NONE") + typedef enum{ SNG_MG_ENCODING_NONE, - SNG_MG_ENCODING_TEXT, SNG_MG_ENCODING_BINARY, + SNG_MG_ENCODING_TEXT, }sng_mg_encoding_types_e; +#define PRNT_ENCODING_TYPE(_val)\ + ((_val == SNG_MG_ENCODING_TEXT)?"SNG_MG_ENCODING_TEXT":\ + (_val == SNG_MG_ENCODING_BINARY)?"SNG_MG_ENCODING_BINARY":\ + "SNG_MG_ENCODING_NONE") /* each profile is corresponds to each MG Instance */ @@ -95,4 +104,32 @@ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason void handle_mg_alarm(Pst *pst, MgMngmt *sta); void handle_tucl_alarm(Pst *pst, HiMngmt *sta); + +switch_status_t sng_mgco_init(sng_isup_event_interface_t* event); +switch_status_t sng_mgco_cfg(const char* profilename); +switch_status_t sng_mgco_start(const char* profilename); +switch_status_t sng_mgco_stack_shutdown(void); + +/*****************************************************************************************************/ + +#define GET_MG_CFG_IDX(_profilename, _idx){\ + for(idx=0; idx < MAX_MG_PROFILES; idx++){\ + /* id zero is not acceptable */\ + if(megaco_globals.g_mg_cfg.mgCfg[idx].id){\ + if (strcmp(megaco_globals.g_mg_cfg.mgCfg[idx].name, profilename)) {\ + continue;\ + } else{\ + break;\ + }\ + }\ + }\ +} + +#define GET_TPT_ID(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].id +#define GET_MU_SAP_ID(_id) megaco_globals.g_mg_cfg.mgCfg[_id].id + +#define GET_TPT_TYPE(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].transport_type + +#define GET_ENCODING_TYPE(_id) megaco_globals.g_mg_cfg.mgPeer.peers[megaco_globals.g_mg_cfg.mgCfg[_id].peer_id].encoding_type + #endif /* _MEGACO_CFG_H_ */ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index 506cc3b29e..e7addf5875 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -214,6 +214,7 @@ switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) } } + megaco_globals.g_mg_cfg.mgPeer.total_peer++; return SWITCH_STATUS_SUCCESS; } /***********************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index bda8e53ec0..332392c59a 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -123,25 +123,22 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) sng_event.mg.sng_mgco_cmd_ind = handle_mgco_cmd_ind; sng_event.mg.sng_mgco_txn_sta_ind = handle_mgco_txn_sta_ind; sng_event.mg.sng_mgco_sta_ind = handle_mgco_sta_ind; - sng_event.mg.sng_mgco_cntrl_cfm = handle_mgco_cntrl_cfm; - sng_event.mg.sng_mgco_audit_cfm = handle_mgco_audit_cfm; - + sng_event.mg.sng_mgco_cntrl_cfm = handle_mgco_cntrl_cfm; + sng_event.mg.sng_mgco_audit_cfm = handle_mgco_audit_cfm; /* Alarm CB */ sng_event.sm.sng_mg_alarm = handle_mg_alarm; sng_event.sm.sng_tucl_alarm = handle_tucl_alarm; - /* Log */ sng_event.sm.sng_log = handle_sng_log; - /* initalize sng_mg library */ - sng_isup_init_gen(&sng_event); - - return SWITCH_STATUS_SUCCESS; + /* initualize MEGACO stack */ + return sng_mgco_init(&sng_event); } SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown) { - /* TODO: Kapil: Insert stack global shutdown code here */ + sng_mgco_stack_shutdown(); + return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index 3efa48e3bc..7c21610639 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -11,7 +11,7 @@ #define MOD_MEGACO_H #include -#include "megaco_cfg.h" +#include "megaco_stack.h" struct megaco_globals { switch_memory_pool_t *pool; From ce46a57b857c3648ec5518fcd23a7ad66fd16cd9 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 17 May 2012 17:56:50 -0400 Subject: [PATCH 194/493] ss7: Adding support of Access Transport IE in IAM message Adding sip x-header and channel variable to set the value of Access Transport IE --- libs/freetdm/mod_freetdm/mod_freetdm.c | 10 +++++ .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_main.h | 2 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 10 ++++- .../ftmod_sangoma_ss7_support.c | 43 +++++++++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 6a32098b44..51fbeca6cc 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1400,6 +1400,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_set_string(caller_data.loc.digits, sipvar); } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Access-Transport"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_access_transport_urlenc", sipvar); + } sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-LOC-Screen"); if (sipvar) { @@ -1865,6 +1870,11 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_access_transport_urlenc"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Access-Transport", "%s", var_value); + } + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_indicator"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDINF-Indicator", "%s", var_value); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index d0d6c32867..48e4bc4735 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -221,6 +221,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } + copy_access_transport_from_sngss7(ftdmchan, &siConEvnt->accTrnspt); copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); copy_redirgInfo_from_sngss7(ftdmchan, &siConEvnt->redirInfo); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 4ccf4efe0e..a6dde4d704 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -916,6 +916,8 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); +ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); +ftdm_status_t copy_access_transport_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index 9ba11ada58..bf693c0999 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -138,6 +138,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Original Called Number */ copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); } + copy_access_transport_to_sngss7(ftdmchan, &iam.accTrnspt); } } else if (sngss7_info->circuit->transparent_iam && sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) { @@ -160,6 +161,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Original Called Number */ copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); + + copy_access_transport_to_sngss7(ftdmchan, &iam.accTrnspt); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); @@ -199,8 +202,13 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) /* Original Called Number */ copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); - /* Access Transport */ + /* Access Transport - old implementation, taking from channel variable of ss7_clg_subaddr */ copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt); + + /* Access Transport - taking from channel variable of ss7_access_transport_urlenc. + This will overwirte the IE value set be above old implementation. + */ + copy_access_transport_to_sngss7(ftdmchan, &iam.accTrnspt); SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d), loc = %s (NADI=%d)\n", sngss7_info->circuit->cic, diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 96359ba595..fd70f13290 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -637,6 +637,49 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r return FTDM_SUCCESS; } +ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt) +{ + char *val=NULL; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + if (accTrnspt->eh.pres != PRSNT_NODEF || accTrnspt->infoElmts.pres !=PRSNT_NODEF) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Access Transport IE available\n"); + return FTDM_SUCCESS; + } + + val = ftdm_malloc(3*accTrnspt->infoElmts.len); + ftdm_url_encode((const char*)accTrnspt->infoElmts.val, val, accTrnspt->infoElmts.len); + sngss7_add_var (sngss7_info, "ss7_access_transport_urlenc", val); + ftdm_safe_free(val); + + return FTDM_SUCCESS; +} +ftdm_status_t copy_access_transport_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt) +{ + const char *val = NULL; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_access_transport_urlenc"); + if (ftdm_strlen_zero(val)) { + accTrnspt->eh.pres = NOTPRSNT; + accTrnspt->infoElmts.pres = NOTPRSNT; + } + else { + char *val_dec = NULL; + int val_len = strlen (val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found Access Transport IE encoded : %s\n", val); + + accTrnspt->eh.pres = PRSNT_NODEF; + accTrnspt->infoElmts.pres = PRSNT_NODEF; + + val_dec = ftdm_strdup(val); + ftdm_url_decode(val_dec, (ftdm_size_t*)&val_len); + memcpy (accTrnspt->infoElmts.val, val_dec, val_len); + accTrnspt->infoElmts.len = val_len; + ftdm_safe_free(val_dec); + } + return FTDM_SUCCESS; +} + ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum) { char val[20]; From 23ca7f8fed32b8679564e06fccf970f92ae645f3 Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 18 May 2012 12:05:25 +0530 Subject: [PATCH 195/493] adding m2ua stack config/control code --- libs/freetdm/Makefile.am | 2 + libs/freetdm/mod_freetdm/mod_freetdm.c | 100 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 166 +- .../ftmod_sangoma_ss7_cntrl.c | 54 +- .../ftmod_sangoma_ss7_logger.c | 30 + .../ftmod_sangoma_ss7_m2ua.c | 1335 +++++++++++++++++ .../ftmod_sangoma_ss7_m2ua.h | 125 ++ .../ftmod_sangoma_ss7_m2ua_xml.c | 671 +++++++++ .../ftmod_sangoma_ss7_main.c | 21 +- .../ftmod_sangoma_ss7_main.h | 41 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 153 +- 11 files changed, 2560 insertions(+), 138 deletions(-) create mode 100644 libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c create mode 100644 libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h create mode 100644 libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c diff --git a/libs/freetdm/Makefile.am b/libs/freetdm/Makefile.am index 35f1cecd1e..2038871de4 100644 --- a/libs/freetdm/Makefile.am +++ b/libs/freetdm/Makefile.am @@ -213,6 +213,8 @@ ftmod_sangoma_ss7_la_SOURCES = \ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c \ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c \ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c \ + $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c \ + $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c \ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c ftmod_sangoma_ss7_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) -D_GNU_SOURCE diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index b6a6f49ca1..2e4f7e1e5f 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -55,6 +55,8 @@ /* How many consecutive IO errors before giving up */ #define FTDM_MAX_READ_WRITE_ERRORS 10 +#define get_ss7_config_node(_cfg, _confname) _get_ss7_config_node(cfg, confname, "ISUP") + SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_freetdm_shutdown); SWITCH_MODULE_DEFINITION(mod_freetdm, mod_freetdm_load, mod_freetdm_shutdown, NULL); @@ -2865,11 +2867,12 @@ static int add_config_list_nodes(switch_xml_t swnode, ftdm_conf_node_t *rootnode return 0; } -static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confname) +static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *confname, const char *operatingMode) { switch_xml_t signode, ss7configs, isup, gen, param; ftdm_conf_node_t *rootnode, *list; char *var, *val; + int is_isup = 0x00; /* try to find the conf in the hash first */ rootnode = switch_core_hash_find(globals.ss7_configs, confname); @@ -2913,6 +2916,23 @@ static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confn return NULL; } + /* operating mode , M2UA or ISUP */ + if(operatingMode && ('\0' != operatingMode[0])) { + if(!strcasecmp(operatingMode, "ISUP")) { + is_isup = 0x01; + } + else if(!strcasecmp(operatingMode, "M2UA_SG")) { + is_isup = 0x00; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid operating Mode[%s] \n", operatingMode); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Operating mode not specified, default to ISUP \n"); + is_isup = 0x01; + } + /* add sng_gen */ gen = switch_xml_child(isup, "sng_gen"); if (gen == NULL) { @@ -2954,11 +2974,14 @@ static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confn return NULL; } - /* add mtp3 links */ - if (add_config_list_nodes(isup, rootnode, "mtp3_links", "mtp3_link", NULL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp3_links for sng_isup config %s\n", confname); - ftdm_conf_node_destroy(rootnode); - return NULL; + /* If ISUP is operating mode then only include mtp3_links/isup links */ + if(is_isup) { + /* add mtp3 links */ + if (add_config_list_nodes(isup, rootnode, "mtp3_links", "mtp3_link", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp3_links for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } } /* add mtp linksets */ @@ -2975,18 +2998,53 @@ static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confn return NULL; } - /* add isup interfaces */ - if (add_config_list_nodes(isup, rootnode, "isup_interfaces", "isup_interface", NULL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process isup_interfaces for sng_isup config %s\n", confname); - ftdm_conf_node_destroy(rootnode); - return NULL; - } + if(is_isup) { + /* add isup interfaces */ + if (add_config_list_nodes(isup, rootnode, "isup_interfaces", "isup_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process isup_interfaces for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + + /* add cc spans */ + if (add_config_list_nodes(isup, rootnode, "cc_spans", "cc_span", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process cc_spans for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + } + else { + /* add sctp links */ + if (add_config_list_nodes(isup, rootnode, "sng_sctp_interfaces", "sng_sctp_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_sctp_interface for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + + if (add_config_list_nodes(isup, rootnode, "sng_nif_interfaces", "sng_nif_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_nif_interfaces for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + + if (add_config_list_nodes(isup, rootnode, "sng_m2ua_interfaces", "sng_m2ua_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_interfaces for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + + if (add_config_list_nodes(isup, rootnode, "sng_m2ua_peer_interfaces", "sng_m2ua_peer_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_peer_interfaces for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } + + if (add_config_list_nodes(isup, rootnode, "sng_m2ua_cluster_interfaces", "sng_m2ua_cluster_interface", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_cluster_interfaces for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } - /* add cc spans */ - if (add_config_list_nodes(isup, rootnode, "cc_spans", "cc_span", NULL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process cc_spans for sng_isup config %s\n", confname); - ftdm_conf_node_destroy(rootnode); - return NULL; } switch_core_hash_insert(globals.ss7_configs, confname, rootnode); @@ -3223,6 +3281,7 @@ static switch_status_t load_config(void) char *id = (char *) switch_xml_attr(myspan, "id"); char *name = (char *) switch_xml_attr(myspan, "name"); char *configname = (char *) switch_xml_attr(myspan, "cfgprofile"); + char *operatingMode = (char *) switch_xml_attr(myspan, "operating_mode"); ftdm_span_t *span = NULL; uint32_t span_id = 0; unsigned paramindex = 0; @@ -3256,7 +3315,7 @@ static switch_status_t load_config(void) span_id = ftdm_span_get_id(span); } - ss7confnode = get_ss7_config_node(cfg, configname); + ss7confnode = _get_ss7_config_node(cfg, configname, operatingMode); if (!ss7confnode) { CONFIG_ERROR("Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); continue; @@ -3264,6 +3323,11 @@ static switch_status_t load_config(void) memset(spanparameters, 0, sizeof(spanparameters)); paramindex = 0; + if(operatingMode){ + spanparameters[paramindex].var = "operatingMode"; + spanparameters[paramindex].val = operatingMode; + paramindex++; + } spanparameters[paramindex].var = "confnode"; spanparameters[paramindex].ptr = ss7confnode; paramindex++; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index 327ca40f05..170f03f8f3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -262,94 +262,103 @@ int ft_to_sngss7_cfg_all(void) /* no configs above mtp2 for relay */ if (g_ftdm_sngss7_data.cfg.procId == 1) { x = 1; - while (x < (MAX_MTP_LINKS)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtp3Link[x].flags & SNGSS7_CONFIGURED))) { + while (x < (MAX_MTP_LINKS)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtp3Link[x].flags & SNGSS7_CONFIGURED))) { - /* configure mtp3 */ - if (ftmod_ss7_mtp3_dlsap_config(x)) { - SS7_CRITICAL("MTP3 DLSAP %d configuration FAILED!\n", x); - return 1;; - } else { - SS7_INFO("MTP3 DLSAP %d configuration DONE!\n", x); + /* configure mtp3 */ + if (ftmod_ss7_mtp3_dlsap_config(x)) { + SS7_CRITICAL("MTP3 DLSAP %d configuration FAILED!\n", x); + return 1;; + } else { + SS7_INFO("MTP3 DLSAP %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtp3Link[x].flags |= SNGSS7_CONFIGURED; } - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtp3Link[x].flags |= SNGSS7_CONFIGURED; + x++; + } /* while (x < (MAX_MTP_LINKS+1)) */ + + /* in M2UA_SG mode there will not be any MTP3 layer */ + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ + x = 1; + while (x < (MAX_NSAPS)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.nsap[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_CONFIGURED))) { + + ret = ftmod_ss7_mtp3_nsap_config(x); + if (ret) { + SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); + return 1; + } else { + SS7_INFO("MTP3 NSAP %d configuration DONE!\n", x); + } + + ret = ftmod_ss7_isup_nsap_config(x); + if (ret) { + SS7_CRITICAL("ISUP NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); + return 1; + } else { + SS7_INFO("ISUP NSAP %d configuration DONE!\n", x); + } + + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ + + x++; + } /* while (x < (MAX_NSAPS)) */ } - - x++; - } /* while (x < (MAX_MTP_LINKS+1)) */ - x = 1; - while (x < (MAX_NSAPS)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.nsap[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_CONFIGURED))) { + /* in M2UA_SG mode there will not be any MTP3 layer */ + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ + x = 1; + while (x < (MAX_MTP_LINKSETS+1)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_CONFIGURED))) { - ret = ftmod_ss7_mtp3_nsap_config(x); - if (ret) { - SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); - return 1; - } else { - SS7_INFO("MTP3 NSAP %d configuration DONE!\n", x); - } + if (ftmod_ss7_mtp3_linkset_config(x)) { + SS7_CRITICAL("MTP3 LINKSET %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("MTP3 LINKSET %d configuration DONE!\n", x); + } - ret = ftmod_ss7_isup_nsap_config(x); - if (ret) { - SS7_CRITICAL("ISUP NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret)); - return 1; - } else { - SS7_INFO("ISUP NSAP %d configuration DONE!\n", x); - } + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_NSAPS)) */ + x++; + } /* while (x < (MAX_MTP_LINKSETS+1)) */ + } - x = 1; - while (x < (MAX_MTP_LINKSETS+1)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_CONFIGURED))) { + /* in M2UA_SG mode there will not be any MTP3 layer */ + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ + x = 1; + while (x < (MAX_MTP_ROUTES+1)) { + /* check if this link has been configured already */ + if ((g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & SNGSS7_CONFIGURED))) { - if (ftmod_ss7_mtp3_linkset_config(x)) { - SS7_CRITICAL("MTP3 LINKSET %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("MTP3 LINKSET %d configuration DONE!\n", x); - } + if (ftmod_ss7_mtp3_route_config(x)) { + SS7_CRITICAL("MTP3 ROUTE %d configuration FAILED!\n", x); + return 1; + } else { + SS7_INFO("MTP3 ROUTE %d configuration DONE!\n",x); + } - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_MTP_LINKSETS+1)) */ + /* set the SNGSS7_CONFIGURED flag */ + g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= SNGSS7_CONFIGURED; + } /* if !SNGSS7_CONFIGURED */ - x = 1; - while (x < (MAX_MTP_ROUTES+1)) { - /* check if this link has been configured already */ - if ((g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & SNGSS7_CONFIGURED))) { - - if (ftmod_ss7_mtp3_route_config(x)) { - SS7_CRITICAL("MTP3 ROUTE %d configuration FAILED!\n", x); - return 1; - } else { - SS7_INFO("MTP3 ROUTE %d configuration DONE!\n",x); - } - - /* set the SNGSS7_CONFIGURED flag */ - g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= SNGSS7_CONFIGURED; - } /* if !SNGSS7_CONFIGURED */ - - x++; - } /* while (x < (MAX_MTP_ROUTES+1)) */ + x++; + } /* while (x < (MAX_MTP_ROUTES+1)) */ + } x = 1; while (x < (MAX_ISAPS)) { @@ -441,6 +450,11 @@ int ft_to_sngss7_cfg_all(void) } /* if !SNGSS7_CONFIGURED */ x++; } /* while (x < (MAX_RELAY_CHANNELS)) */ + + + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + return ftmod_ss7_m2ua_cfg(); + } return 0; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c index c5aca9aa73..0fcef7d90b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c @@ -60,7 +60,7 @@ int ft_to_sngss7_activate_all(void) while (x < (MAX_ISAPS)) { /* check if this link has already been actived */ if ((g_ftdm_sngss7_data.cfg.isap[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_ACTIVE))) { + (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_ACTIVE))) { if (ftmod_ss7_enable_isap(x)) { SS7_CRITICAL("ISAP %d Enable: NOT OK\n", x); @@ -72,15 +72,16 @@ int ft_to_sngss7_activate_all(void) /* set the SNGSS7_ACTIVE flag */ g_ftdm_sngss7_data.cfg.isap[x].flags |= SNGSS7_ACTIVE; } /* if !SNGSS7_ACTIVE */ - + x++; } /* while (x < (MAX_ISAPS)) */ + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ x = 1; while (x < (MAX_NSAPS)) { /* check if this link has already been actived */ if ((g_ftdm_sngss7_data.cfg.nsap[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_ACTIVE))) { + (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_ACTIVE))) { if (ftmod_ss7_enable_nsap(x)) { SS7_CRITICAL("NSAP %d Enable: NOT OK\n", x); @@ -92,30 +93,35 @@ int ft_to_sngss7_activate_all(void) /* set the SNGSS7_ACTIVE flag */ g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_ACTIVE; } /* if !SNGSS7_ACTIVE */ - + x++; } /* while (x < (MAX_NSAPS)) */ - if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) { - x = 1; - while (x < (MAX_MTP_LINKSETS+1)) { - /* check if this link has already been actived */ - if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && - (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_ACTIVE))) { - - if (ftmod_ss7_enable_mtpLinkSet(x)) { - SS7_CRITICAL("LinkSet \"%s\" Enable: NOT OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name); - return 1; - } else { - SS7_INFO("LinkSet \"%s\" Enable: OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name); - } - - /* set the SNGSS7_ACTIVE flag */ - g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_ACTIVE; - } /* if !SNGSS7_ACTIVE */ - - x++; - } /* while (x < (MAX_MTP_LINKSETS+1)) */ + if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) { + x = 1; + while (x < (MAX_MTP_LINKSETS+1)) { + /* check if this link has already been actived */ + if ((g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) && + (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_ACTIVE))) { + + if (ftmod_ss7_enable_mtpLinkSet(x)) { + SS7_CRITICAL("LinkSet \"%s\" Enable: NOT OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name); + return 1; + } else { + SS7_INFO("LinkSet \"%s\" Enable: OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name); + } + + /* set the SNGSS7_ACTIVE flag */ + g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_ACTIVE; + } /* if !SNGSS7_ACTIVE */ + + x++; + } /* while (x < (MAX_MTP_LINKSETS+1)) */ + } + } + + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + return ftmod_ss7_m2ua_start(); } return 0; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 176de9e627..5d4e183b20 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -824,6 +824,36 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) return; } +/******************************************************************************/ +void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta) +{ + ftdm_log(FTDM_LOG_ERROR," handle_sng_m2ua_alarm Not Yet Implement \n"); + +} /* handle_sng_m2ua_alarm */ + +/******************************************************************************/ +void handle_sng_nif_alarm(Pst *pst, NwMgmt *sta) +{ + ftdm_log(FTDM_LOG_ERROR," handle_sng_nif_alarm Not Yet Implement \n"); + +} /* handle_sng_nif_alarm */ + +/******************************************************************************/ +void handle_sng_tucl_alarm(Pst *pst, HiMngmt *sta) +{ + ftdm_log(FTDM_LOG_ERROR," handle_sng_tucl_alarm Not Yet Implement \n"); + +} /* handle_sng_tucl_alarm */ + +/******************************************************************************/ +void handle_sng_sctp_alarm(Pst *pst, SbMgmt *sta) +{ + ftdm_log(FTDM_LOG_ERROR," handle_sng_sctp_alarm Not Yet Implement \n"); + +} /* handle_sng_sctp_alarm */ +/******************************************************************************/ + + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c new file mode 100644 index 0000000000..375be9f35a --- /dev/null +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -0,0 +1,1335 @@ +/* + * Copyright (c) 2012, Kapil Gupta + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * + */ + +/* INCLUDE ********************************************************************/ +#include "ftmod_sangoma_ss7_main.h" +/******************************************************************************/ + +/* DEFINES ********************************************************************/ +/******************************************************************************/ +/* FUNCTION PROTOTYPES ********************************************************/ +static int ftmod_sigtran_tucl_gen_config(void); +static int ftmod_sigtran_tucl_sap_config(void); + +static int ftmod_sigtran_sctp_gen_config(void); +ftdm_status_t ftmod_sigtran_cfg_sctp(void); +int ftmod_sigtran_sctp_config(int id); +ftdm_status_t ftmod_sigtran_sctp_sap_config(int id); +ftdm_status_t ftmod_sigtran_sctp_tsap_config(int id); +static S16 ftmod_sigtran_m2ua_gen_config(void); +static S16 ftmod_sigtran_m2ua_sctsap_config(void); +static S16 ftmod_sigtran_m2ua_peer_config(void); +static S16 ftmod_sigtran_m2ua_cluster_config(void); +static S16 ftmod_sigtran_m2ua_dlsap_config(U32 idx); + +static S16 ftmod_sigtran_nif_gen_config(void); +static S16 ftmod_sigtran_nif_dlsap_config(U32 idx); + + +static U32 ftmod_parse_conv_ipaddr(S8 *ptr); + +ftdm_status_t sng_m2ua_init(void); +ftdm_status_t sng_m2ua_cfg(void); + + +static S16 ftmod_sigtran_tsap_bnd(void); +static S16 ftmod_sigtran_sctsap_bnd(void); +static S16 ftmod_sigtran_dlsap_bnd(U32 id); +static S16 ftmod_ss7_dlsap_bnd(U32 id); + +/******************************************************************************/ +/******************************************************************************/ + +ftdm_status_t ftmod_ss7_m2ua_cfg(void) +{ + + if(FTDM_SUCCESS != sng_m2ua_init()){ + ftdm_log (FTDM_LOG_ERROR, " sng_m2ua_init FAILED \n"); + return FTDM_FAIL; + } + + if(FTDM_SUCCESS != sng_m2ua_cfg()){ + ftdm_log (FTDM_LOG_ERROR, " sng_m2ua_cfg FAILED \n"); + return FTDM_FAIL; + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ + +ftdm_status_t sng_m2ua_init(void) +{ + if (sng_isup_init_nif()) { + ftdm_log (FTDM_LOG_ERROR , "Failed to start NIF\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"Started NIF!\n"); + } + + if (sng_isup_init_m2ua()) { + ftdm_log (FTDM_LOG_ERROR ,"Failed to start M2UA\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"Started M2UA!\n"); + } + + if (sng_isup_init_sctp()) { + ftdm_log (FTDM_LOG_ERROR ,"Failed to start SCTP\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"Started SCTP!\n"); + } + + if (sng_isup_init_tucl()) { + ftdm_log (FTDM_LOG_ERROR ,"Failed to start TUCL\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"Started TUCL!\n"); + } + + + return FTDM_SUCCESS; +} + +/******************************************************************************/ + +ftdm_status_t sng_m2ua_cfg(void) +{ + S16 ret = ROK; + + /* TUCL */ + if(ftmod_sigtran_tucl_gen_config()){ + ftdm_log (FTDM_LOG_ERROR ,"TUCL GEN configuration: NOT OK\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"TUCL GEN configuration: OK\n"); + } + + if(ftmod_sigtran_tucl_sap_config()){ + ftdm_log (FTDM_LOG_ERROR ,"TUCL SAP configuration: NOT OK\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"TUCL SAP configuration: OK\n"); + } + /*********************************************************************************************/ + + /* SCTP */ + if(ftmod_sigtran_sctp_gen_config()){ + ftdm_log (FTDM_LOG_ERROR ,"SCTP GEN configuration: NOT OK\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"SCTP GEN configuration: OK\n"); + } + + if(ftmod_sigtran_cfg_sctp()){ + ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_cfg_sctp : NOT OK\n"); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"ftmod_sigtran_cfg_sctp : OK\n"); + } + /*********************************************************************************************/ + + /* M2UA and NIF configurations */ + + /* Send the general configuration request for M2UA layer */ + if((ret = ftmod_sigtran_m2ua_gen_config()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"M2UA General configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"M2UA General configuration: OK\n"); + } + + /* Send the SCTSAP configuration request for M2UA layer */ + if((ret = ftmod_sigtran_m2ua_sctsap_config()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"M2UA SCTSAP configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"M2UA SCTSAP configuration: OK\n"); + } + + /* Send the peer configuration request for M2UA layer */ + if((ret = ftmod_sigtran_m2ua_peer_config()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"M2UA PEER configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"M2UA PEER configuration: OK\n"); + } + + /* Send the cluster configuration request for M2UA layer */ + if((ret = ftmod_sigtran_m2ua_cluster_config()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"M2UA CLUSTER configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"M2UA CLUSTER configuration: OK\n"); + } + + + /* Send the USAP (DLSAP) configuration request for M2UA layer; fill the number + * of saps required to be configured. Max is 3 */ + /*for( idx = 0; idx < 3; idx++)*/ + { + if((ret = ftmod_sigtran_m2ua_dlsap_config(1)) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"M2UA DLSAP configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"M2UA DLSAP configuration: OK\n"); + } + } + + /* Send the general configuration request for NIF */ + if((ret = ftmod_sigtran_nif_gen_config()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"NIF General configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"NIF General configuration: OK\n"); + } + + /* Send the USAP (DLSAP) configuration request for NIF layer; fill the number + * of saps required to be configured. Max is 3 + for( idx = 0; idx < 3; idx++) */ + { + if( (ret = ftmod_sigtran_nif_dlsap_config(1)) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"NIF DLSAP configuration: NOT OK\n"); + return FTDM_FAIL; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"NIF DLSAP configuration: OK\n"); + } + } + + + /********************************************************************************************/ + + return 0; +} + +/******************************************************************************/ +static int ftmod_sigtran_tucl_gen_config(void) +{ + HiMngmt cfg; + Pst pst; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTHI; + + /* clear the configuration structure */ + memset(&cfg, 0, sizeof(cfg)); + + /* fill in the post structure */ + smPstInit(&cfg.t.cfg.s.hiGen.lmPst); + /*fill in the specific fields of the header */ + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTHI; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STGEN; + + cfg.t.cfg.s.hiGen.numSaps = HI_MAX_SAPS; /* number of SAPs */ + cfg.t.cfg.s.hiGen.numCons = HI_MAX_NUM_OF_CON; /* maximum num of connections */ + cfg.t.cfg.s.hiGen.numFdsPerSet = HI_MAX_NUM_OF_FD_PER_SET; /* maximum num of fds to use per set */ + cfg.t.cfg.s.hiGen.numFdBins = HI_MAX_NUM_OF_FD_HASH_BINS; /* for fd hash lists */ + cfg.t.cfg.s.hiGen.numClToAccept = HI_MAX_NUM_OF_CLIENT_TO_ACCEPT; /* clients to accept simultaneously */ + cfg.t.cfg.s.hiGen.permTsk = TRUE; /* schedule as perm task or timer */ + cfg.t.cfg.s.hiGen.schdTmrVal = HI_MAX_SCHED_TMR_VALUE; /* if !permTsk - probably ignored */ + cfg.t.cfg.s.hiGen.selTimeout = HI_MAX_SELECT_TIMEOUT_VALUE; /* select() timeout */ + + /* number of raw/UDP messages to read in one iteration */ + cfg.t.cfg.s.hiGen.numRawMsgsToRead = HI_MAX_RAW_MSG_TO_READ; + cfg.t.cfg.s.hiGen.numUdpMsgsToRead = HI_MAX_UDP_MSG_TO_READ; + + /* thresholds for congestion on the memory pool */ + cfg.t.cfg.s.hiGen.poolStrtThr = HI_MEM_POOL_START_THRESHOLD; + cfg.t.cfg.s.hiGen.poolDropThr = HI_MEM_POOL_DROP_THRESHOLD; + cfg.t.cfg.s.hiGen.poolStopThr = HI_MEM_POOL_STOP_THRESHOLD; + + cfg.t.cfg.s.hiGen.timeRes = SI_PERIOD; /* time resolution */ + +#ifdef HI_SPECIFY_GENSOCK_ADDR + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.address = CM_INET_INADDR_ANY; + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port = 0; /* DAVIDY - why 0? */ +#ifdef IPV6_SUPPORTED + cfg.t.cfg.s.hiGen.ipv6GenSockAddr.address = CM_INET_INADDR6_ANY; + cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port = 0; +#endif +#endif + + return(sng_cfg_tucl(&pst, &cfg)); +} + +static int ftmod_sigtran_tucl_sap_config(void) +{ + HiMngmt cfg; + Pst pst; + HiSapCfg *pCfg; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTHI; + + /* clear the configuration structure */ + memset(&cfg, 0, sizeof(cfg)); + + /*fill LM post structure*/ + cfg.t.cfg.s.hiGen.lmPst.dstProcId = SFndProcId(); + cfg.t.cfg.s.hiGen.lmPst.dstInst = S_INST; + + cfg.t.cfg.s.hiGen.lmPst.dstProcId = SFndProcId(); + cfg.t.cfg.s.hiGen.lmPst.dstEnt = ENTSM; + cfg.t.cfg.s.hiGen.lmPst.dstInst = S_INST; + + cfg.t.cfg.s.hiGen.lmPst.prior = PRIOR0; + cfg.t.cfg.s.hiGen.lmPst.route = RTESPEC; + cfg.t.cfg.s.hiGen.lmPst.region = S_REG; + cfg.t.cfg.s.hiGen.lmPst.pool = S_POOL; + cfg.t.cfg.s.hiGen.lmPst.selector = 0; + + + /*fill in the specific fields of the header */ + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTHI; + cfg.hdr.entId.inst = 0; + cfg.hdr.elmId.elmnt = STTSAP; + + pCfg = &cfg.t.cfg.s.hiSap; + + pCfg->spId = 0x01 ; /* KAPIL - TODO - should be from configured value.but hardcoding as of now */ + pCfg->uiSel = 0x00; /*loosley coupled */ + pCfg->flcEnb = TRUE; + pCfg->txqCongStrtLim = HI_SAP_TXN_QUEUE_CONG_START_LIMIT; + pCfg->txqCongDropLim = HI_SAP_TXN_QUEUE_CONG_DROP_LIMIT; + pCfg->txqCongStopLim = HI_SAP_TXN_QUEUE_CONG_STOP_LIMIT; + pCfg->numBins = 10; + + pCfg->uiMemId.region = S_REG; + pCfg->uiMemId.pool = S_POOL; + pCfg->uiPrior = PRIOR0; + pCfg->uiRoute = RTESPEC; + + return(sng_cfg_tucl(&pst, &cfg)); +} + +static int ftmod_sigtran_sctp_gen_config(void) +{ + SbMgmt cfg; + Pst pst; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTSB; + + /* clear the configuration structure */ + memset(&cfg, 0, sizeof(cfg)); + + /* fill in the post structure */ + smPstInit(&cfg.t.cfg.s.genCfg.smPst); + /*fill in the specific fields of the header */ + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTSB; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STSBGEN; + +#ifdef SB_IPV6_SUPPORTED + /* U8 ipv6SrvcReqdFlg; */ /* IPV6 service required for sctp */ +#endif + + cfg.t.cfg.s.genCfg.serviceType = HI_SRVC_RAW_SCTP; /* Usr packetized TCP Data */ /* TUCL transport protocol (IP/UDP) */ + cfg.t.cfg.s.genCfg.maxNmbSctSaps = SB_MAX_SCT_SAPS; /* max no. SCT SAPS */ + cfg.t.cfg.s.genCfg.maxNmbTSaps = SB_MAX_T_SAPS; /* max no. Transport SAPS */ + cfg.t.cfg.s.genCfg.maxNmbEndp = SB_MAX_NUM_OF_ENDPOINTS; /* max no. endpoints */ + cfg.t.cfg.s.genCfg.maxNmbAssoc = SB_MAX_NUM_OF_ASSOC; /* max no. associations */ + cfg.t.cfg.s.genCfg.maxNmbDstAddr = SB_MAX_NUM_OF_DST_ADDR; /* max no. dest. addresses */ + cfg.t.cfg.s.genCfg.maxNmbSrcAddr = SB_MAX_NUM_OF_SRC_ADDR; /* max no. src. addresses */ + cfg.t.cfg.s.genCfg.maxNmbTxChunks = SB_MAX_NUM_OF_TX_CHUNKS; + cfg.t.cfg.s.genCfg.maxNmbRxChunks = SB_MAX_NUM_OF_RX_CHUNKS; + cfg.t.cfg.s.genCfg.maxNmbInStrms = SB_MAX_INC_STREAMS; + cfg.t.cfg.s.genCfg.maxNmbOutStrms = SB_MAX_OUT_STREAMS; + cfg.t.cfg.s.genCfg.initARwnd = SB_MAX_RWND_SIZE; + cfg.t.cfg.s.genCfg.mtuInitial = SB_MTU_INITIAL; + cfg.t.cfg.s.genCfg.mtuMinInitial = SB_MTU_MIN_INITIAL; + cfg.t.cfg.s.genCfg.mtuMaxInitial = SB_MTU_MAX_INITIAL; + cfg.t.cfg.s.genCfg.performMtu = FALSE; + cfg.t.cfg.s.genCfg.timeRes = 1; + sprintf((char*)cfg.t.cfg.s.genCfg.hostname, "www.sangoma.com"); /* DAVIDY - Fix this later, probably ignored */ + cfg.t.cfg.s.genCfg.useHstName = FALSE; /* Flag whether hostname is to be used in INIT and INITACK msg */ + cfg.t.cfg.s.genCfg.reConfig.maxInitReTx = 8; + cfg.t.cfg.s.genCfg.reConfig.maxAssocReTx = 10; + cfg.t.cfg.s.genCfg.reConfig.maxPathReTx = 10; + cfg.t.cfg.s.genCfg.reConfig.altAcceptFlg = TRUE; + cfg.t.cfg.s.genCfg.reConfig.keyTm = 600; /* initial value for MD5 Key expiry timer */ + cfg.t.cfg.s.genCfg.reConfig.alpha = 12; + cfg.t.cfg.s.genCfg.reConfig.beta = 25; +#ifdef SB_ECN + cfg.t.cfg.s.genCfg.reConfig.ecnFlg = TRUE; +#endif + + return(sng_cfg_sctp(&pst, &cfg)); +} + +ftdm_status_t ftmod_sigtran_cfg_sctp(void) +{ + int x=0; + for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) + { + if (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED)) { + + if ( ftmod_sigtran_sctp_config(x) == FTDM_FAIL) { + SS7_CRITICAL("SCTP %d configuration FAILED!\n", x); + return FTDM_FAIL; + } else { + SS7_INFO("SCTP %d configuration DONE!\n", x); + } + } + } + return FTDM_SUCCESS; +} + + +int ftmod_sigtran_sctp_config(int id) +{ + if (ftmod_sigtran_sctp_tsap_config(id) != FTDM_SUCCESS) + return FTDM_FAIL; + + if (ftmod_sigtran_sctp_sap_config(id) != FTDM_SUCCESS) + return FTDM_FAIL; + + return FTDM_SUCCESS; +} + +ftdm_status_t ftmod_sigtran_sctp_tsap_config(int id) +{ + Pst pst; + SbMgmt cfg; + SbTSapCfg *c; + + int i = 0; + int ret = -1; + + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; + + smPstInit(&pst); + pst.dstEnt = ENTSB; + + memset(&cfg, 0x0, sizeof(cfg)); + smHdrInit(&cfg.hdr); + + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTSB; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STSBTSAP; + cfg.hdr.elmId.elmntInst1= k->id; + + c = &cfg.t.cfg.s.tSapCfg; + c->swtch = LSB_SW_RFC_REL0; + c->suId = 1; + c->sel = 0; + c->ent = ENTHI; + c->inst = S_INST; + c->procId = g_ftdm_sngss7_data.cfg.procId; + c->memId.region = S_REG; + c->memId.pool = S_POOL; + c->prior = PRIOR1; + c->route = RTESPEC; + c->srcNAddrLst.nmb = k->numSrcAddr; + for (i=0; i <= (k->numSrcAddr-1); i++) { + c->srcNAddrLst.nAddr[i].type = CM_NETADDR_IPV4; + c->srcNAddrLst.nAddr[i].u.ipv4NetAddr = k->srcAddrList[i+1]; + } + + c->reConfig.spId = 1; + c->reConfig.maxBndRetry = 3; + c->reConfig.tIntTmr = 200; + + ret = sng_cfg_sctp(&pst, &cfg); + if (ret==0) { + SS7_INFO("SCTP TSAP %d configuration DONE!\n", id); + return FTDM_SUCCESS; + } else { + SS7_CRITICAL("SCTP TSAP %d configuration FAILED!\n", id); + return FTDM_FAIL; + } +} + +ftdm_status_t ftmod_sigtran_sctp_sap_config(int id) +{ + Pst pst; + SbMgmt cfg; + SbSctSapCfg *c; + + int ret = -1; + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; + + smPstInit(&pst); + pst.dstEnt = ENTSB; + + memset(&cfg, 0x0, sizeof(cfg)); + smHdrInit(&cfg.hdr); + + cfg.hdr.msgType = TCFG; + cfg.hdr.entId.ent = ENTSB; + cfg.hdr.entId.inst = S_INST; + cfg.hdr.elmId.elmnt = STSBSCTSAP; + cfg.hdr.elmId.elmntInst1= k->id; + + c = &cfg.t.cfg.s.sctSapCfg; + c->swtch = LSB_SW_RFC_REL0; + c->spId = 1; /* Service Provider SAP Id */ + c->sel = 0; + c->memId.region = S_REG; + c->memId.pool = S_POOL; + c->prior = PRIOR1; + c->route = RTESPEC; + + /* Maximum time to wait before the SCTP layer must send a Selective Acknowledgement (SACK) message. Valid range is 1 -165535. */ + c->reConfig.maxAckDelayTm = 200; + /* Maximum number of messages to receive before the SCTP layer must send a SACK message. Valid range is 1 - 165535. */ + c->reConfig.maxAckDelayDg = 2; + /* Initial value of the retransmission timer (RTO). The SCTP layer retransmits data after waiting for feedback during this time period. Valid range is 1 - 65535. */ + c->reConfig.rtoInitial = 3000; + /* Minimum value used for the RTO. If the computed value of RTO is less than rtoMin, the computed value is rounded up to this value. */ + c->reConfig.rtoMin = 1000; + /* Maxiumum value used for RTO. If the computed value of RTO is greater than rtoMax, the computed value is rounded down to this value. */ + c->reConfig.rtoMax = 10000; + /* Default Freeze timer value */ + c->reConfig.freezeTm = 3000; + /* Base cookie lifetime for the cookie in the Initiation Acknowledgement (INIT ACK) message. */ + c->reConfig.cookieLife = 60000; + /* Default heartbeat interval timer. Valid range is 1 - 65535. */ + c->reConfig.intervalTm = 3000; + /* Maximum burst value. Valid range is 1 - 65535. */ + c->reConfig.maxBurst = 4; + /*Maximum number of heartbeats sent at each retransmission timeout (RTO). Valid range is 1 - 65535. */ + c->reConfig.maxHbBurst = 1; + /*Shutdown guard timer value for graceful shutdowns. */ + c->reConfig.t5SdownGrdTm = 15000; + /* Action to take when the receiver's number of incoming streams is less than the sender's number of outgoing streams. Valid values are: + TRUE = Accept incoming stream and continue association. + FALSE = Abort the association. + */ + c->reConfig.negAbrtFlg = FALSE; + /* Whether to enable or disable heartbeat by default. Valid values are: + TRUE = Enable heartbeat. + FALSE = Disable heartbeat. + */ + c->reConfig.hBeatEnable = TRUE; + /* Flow control start threshold. When the number of messages in SCTPÂ’s message queue reaches this value, flow control starts. */ + c->reConfig.flcUpThr = 8; + /* Flow control stop threshold. When the number of messages in SCTPÂ’s message queue reaches this value, flow control stops. */ + c->reConfig.flcLowThr = 6; + + c->reConfig.handleInitFlg = FALSE; + + ret = sng_cfg_sctp(&pst, &cfg); + if (ret==0) { + SS7_INFO("SCTP SAP %d configuration DONE!\n", id); + return FTDM_SUCCESS; + } else { + SS7_CRITICAL("SCTP SAP %d configuration FAILED!\n", id); + return FTDM_FAIL; + } +} + +/**********************************************************************************************/ +/* M2UA - General configuration */ +static S16 ftmod_sigtran_m2ua_gen_config(void) +{ + Pst pst; + MwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTMW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STMWGEN; /* General */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + + + cfg.t.cfg.s.genCfg.nodeType = LMW_TYPE_SGP; /* NodeType == SGP or ASP */ + cfg.t.cfg.s.genCfg.maxNmbIntf = MW_MAX_NUM_OF_INTF; + cfg.t.cfg.s.genCfg.maxNmbCluster = MW_MAX_NUM_OF_CLUSTER; + cfg.t.cfg.s.genCfg.maxNmbPeer = MW_MAX_NUM_OF_PEER; + cfg.t.cfg.s.genCfg.maxNmbSctSap = MW_MAX_NUM_OF_SCT_SAPS; + cfg.t.cfg.s.genCfg.timeRes = 1; /* timer resolution */ + cfg.t.cfg.s.genCfg.maxClusterQSize = MW_MAX_CLUSTER_Q_SIZE; + cfg.t.cfg.s.genCfg.maxIntfQSize = MW_MAX_INTF_Q_SIZE; + +#ifdef LCMWMILMW + cfg.t.cfg.s.genCfg.reConfig.smPst.selector = 0; /* selector */ +#else /* LCSBMILSB */ + cfg.t.cfg.s.genCfg.reConfig.smPst.selector = 1; /* selector */ +#endif /* LCSBMILSB */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.region = S_REG; /* region */ + cfg.t.cfg.s.genCfg.reConfig.smPst.pool = S_POOL; /* pool */ + cfg.t.cfg.s.genCfg.reConfig.smPst.prior = PRIOR0; /* priority */ + cfg.t.cfg.s.genCfg.reConfig.smPst.route = RTESPEC; /* route */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.dstEnt = ENTSM; /* dst entity */ + cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst = 0; /* dst inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.dstProcId = SFndProcId(); /* src proc id */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.srcEnt = ENTMW; /* src entity */ + cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst = 0; /* src inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.srcProcId = SFndProcId(); /* src proc id */ + + cfg.t.cfg.s.genCfg.reConfig.tmrFlcPoll.enb = TRUE; /* SCTP Flc Poll timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrFlcPoll.val = 10; + +#ifdef MWASP + cfg.t.cfg.s.genCfg.reConfig.tmrAspm.enb = TRUE; /* ASPM timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrAspm.val = 10; + cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.enb = TRUE; /* Heartbeat timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.val = 10; +#endif + +#ifdef MWSG + cfg.t.cfg.s.genCfg.reConfig.tmrAsPend.enb = TRUE; /* AS-PENDING timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrAsPend.val = 10; + cfg.t.cfg.s.genCfg.reConfig.tmrCongPoll.enb = TRUE; /* SS7 Congestion poll timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrCongPoll.val = 10; + cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.enb = FALSE; /* HBtimer only at ASP */ +#endif + cfg.t.cfg.s.genCfg.reConfig.aspmRetry = 5; + + return (sng_cfg_m2ua (&pst, &cfg)); +} + +/**********************************************************************************************/ + + +/* M2UA - SCTSAP configuration */ +static S16 ftmod_sigtran_m2ua_sctsap_config(void) +{ + + Pst pst; + MwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTMW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STMWSCTSAP; /* SCTSAP */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + + + cfg.t.cfg.s.sctSapCfg.reConfig.selector = 0; + + /* service user SAP ID */ + cfg.t.cfg.s.sctSapCfg.suId = 0; + /* service provider ID */ + cfg.t.cfg.s.sctSapCfg.spId = 1; /* TUCL sct sap id is 1 */ + /* source port number */ + cfg.t.cfg.s.sctSapCfg.srcPort = 0; + /* interface address */ + /*For multiple IP address support */ +#ifdef SCT_ENDP_MULTI_IPADDR + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nmb = 1; + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100"); +#else + cfg.t.cfg.s.sctSapCfg.intfAddr.type = CM_NETADDR_IPV4; + cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100"); +#endif + + /* lower SAP primitive timer */ + cfg.t.cfg.s.sctSapCfg.reConfig.tmrPrim.enb = TRUE; + cfg.t.cfg.s.sctSapCfg.reConfig.tmrPrim.val = 10; + /* Association primitive timer */ + cfg.t.cfg.s.sctSapCfg.reConfig.tmrAssoc.enb = TRUE; + cfg.t.cfg.s.sctSapCfg.reConfig.tmrAssoc.val = 10; + /* maxnumber of retries */ + cfg.t.cfg.s.sctSapCfg.reConfig.nmbMaxPrimRetry = 5; + /* Life Time of Packets */ + cfg.t.cfg.s.sctSapCfg.reConfig.lifeTime = 200; + /* priority */ + cfg.t.cfg.s.sctSapCfg.reConfig.prior = PRIOR0; + /* route */ + cfg.t.cfg.s.sctSapCfg.reConfig.route = RTESPEC; + cfg.t.cfg.s.sctSapCfg.reConfig.ent = ENTSB; + cfg.t.cfg.s.sctSapCfg.reConfig.inst = 0; + cfg.t.cfg.s.sctSapCfg.reConfig.procId = SFndProcId(); + /* memory region and pool ID */ + cfg.t.cfg.s.sctSapCfg.reConfig.mem.region = S_REG; + cfg.t.cfg.s.sctSapCfg.reConfig.mem.pool = S_POOL; + + return (sng_cfg_m2ua (&pst, &cfg)); + +} + +/**********************************************************************************************/ + + +/* M2UA - Peer configuration */ +static S16 ftmod_sigtran_m2ua_peer_config(void) +{ + Pst pst; + MwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTMW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STMWPEER; /* Peer */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + + + cfg.t.cfg.s.peerCfg.peerId = 1; /* peer id */ + cfg.t.cfg.s.peerCfg.aspIdFlag = FALSE; /* aspId flag */ +#ifdef MWASP + cfg.t.cfg.s.peerCfg.selfAspId = 1; /* aspId */ +#endif + cfg.t.cfg.s.peerCfg.assocCfg.suId = 0; /* SCTSAP ID */ + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nmb = 1; /* destination address list*/ + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100");/* TODO */; +#if 0 + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].u.ipv4NetAddr = ftmod_parse_conv_ipaddr("172.25.0.93"); /* TODO */; +#endif +#ifdef MW_CFG_DSTPORT + cfg.t.cfg.s.peerCfg.assocCfg.dstPort = /* TODO */ 2904; /* Port on which M2UA runs */ +#endif + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = 1; /* source address list */ + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100");/* TODO */; + + cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.u.ipv4NetAddr = cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr; + + cfg.t.cfg.s.peerCfg.assocCfg.locOutStrms = 10; +#ifdef SCT3 + cfg.t.cfg.s.peerCfg.assocCfg.tos = 0; +#endif + + return (sng_cfg_m2ua (&pst, &cfg)); +} +/**********************************************************************************************/ + + +/* M2UA - Cluster configuration */ +static S16 ftmod_sigtran_m2ua_cluster_config(void) +{ + Pst pst; + MwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTMW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STMWCLUSTER; /* Cluster */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + + + cfg.t.cfg.s.clusterCfg.clusterId = 0; + cfg.t.cfg.s.clusterCfg.trfMode = LMW_TRF_MODE_LOADSHARE; + cfg.t.cfg.s.clusterCfg.loadshareMode = LMW_LOADSH_RR; + cfg.t.cfg.s.clusterCfg.reConfig.nmbPeer = 1; + cfg.t.cfg.s.clusterCfg.reConfig.peer[0] = 1; +#if 0 + cfg.t.cfg.s.clusterCfg.reConfig.peer[1] = 2; +#endif + + return (sng_cfg_m2ua (&pst, &cfg)); + +} +/**********************************************************************************************/ + +/* M2UA - DLSAP configuration */ +static S16 ftmod_sigtran_m2ua_dlsap_config(U32 id) +{ + Pst pst; + MwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTMW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STMWDLSAP; /* DLSAP */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + + switch(id) + { + case 0: + { + cfg.t.cfg.s.dlSapCfg.lnkNmb = 0; /* SapId */ + cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; + cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 0; + break; + } + case 1: + { + cfg.t.cfg.s.dlSapCfg.lnkNmb = 1; /* SapId */ + cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; + cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 1; + break; + } + + case 2: + { + cfg.t.cfg.s.dlSapCfg.lnkNmb = 2; /* SapId */ + cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; + cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 2; + break; + } + default: + break; + } + + cfg.t.cfg.s.dlSapCfg.swtch = LMW_SAP_ITU; + + + + cfg.t.cfg.s.dlSapCfg.reConfig.clusterId = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.selector = 0; /* Loosely couple mode */ + /* memory region and pool id*/ + cfg.t.cfg.s.dlSapCfg.reConfig.mem.region = S_REG; + cfg.t.cfg.s.dlSapCfg.reConfig.mem.pool = S_POOL; + /* priority */ + cfg.t.cfg.s.dlSapCfg.reConfig.prior = PRIOR0; + /* route */ + cfg.t.cfg.s.dlSapCfg.reConfig.route = RTESPEC; + + return (sng_cfg_m2ua (&pst, &cfg)); + +} +/*****************************************************************************/ + +/* NIF configurations */ + +/* NIF - General configuration */ +static S16 ftmod_sigtran_nif_gen_config(void) +{ + Pst pst; + NwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(NwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTNW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STNWGEN; /* DLSAP */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + + cfg.t.cfg.s.genCfg.maxNmbDlSap = NW_MAX_NUM_OF_DLSAPS; + cfg.t.cfg.s.genCfg.timeRes = 1; /* timer resolution */ + + cfg.t.cfg.s.genCfg.reConfig.maxNmbRetry = NW_MAX_NUM_OF_RETRY; + cfg.t.cfg.s.genCfg.reConfig.tmrRetry.enb = TRUE; /* SS7 Congestion poll timer */ + cfg.t.cfg.s.genCfg.reConfig.tmrRetry.val = NW_RETRY_TMR_VALUE; + +#ifdef LCNWMILNW + cfg.t.cfg.s.genCfg.reConfig.smPst.selector = 0; /* selector */ +#else /* LCSBMILSB */ + cfg.t.cfg.s.genCfg.reConfig.smPst.selector = 1; /* selector */ +#endif /* LCSBMILSB */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.region = S_REG; /* region */ + cfg.t.cfg.s.genCfg.reConfig.smPst.pool = S_POOL; /* pool */ + cfg.t.cfg.s.genCfg.reConfig.smPst.prior = PRIOR0; /* priority */ + cfg.t.cfg.s.genCfg.reConfig.smPst.route = RTESPEC; /* route */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.dstEnt = ENTSM; /* dst entity */ + cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst = 0; /* dst inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.dstProcId = SFndProcId(); /* src proc id */ + + cfg.t.cfg.s.genCfg.reConfig.smPst.srcEnt = ENTNW; /* src entity */ + cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst = 0; /* src inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.srcProcId = SFndProcId(); /* src proc id */ + + return (sng_cfg_nif (&pst, &cfg)); + +} + +/* NIF - DLSAP configuration */ +static S16 ftmod_sigtran_nif_dlsap_config(U32 id) +{ + Pst pst; + NwMgmt cfg; + + memset((U8 *)&cfg, 0, sizeof(NwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.entId.ent = ENTNW; /* entity */ + cfg.hdr.entId.inst = 0; /* instance */ + cfg.hdr.elmId.elmnt = STNWDLSAP; /* DLSAP */ + cfg.hdr.transId = 0; /* transaction identifier */ + + cfg.hdr.response.selector = 0; + cfg.hdr.response.prior = PRIOR0; + cfg.hdr.response.route = RTESPEC; + cfg.hdr.response.mem.region = S_REG; + cfg.hdr.response.mem.pool = S_POOL; + +#if 0 + switch(id) + { + case 0: + { + cfg.t.cfg.s.dlSapCfg.suId = 0; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 0; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = 0; /* ACC_DLSAP_0 */ + break; + } + case 1: + { + cfg.t.cfg.s.dlSapCfg.suId = 1; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 1; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = /* TODO */1; /* ACC_DLSAP_0 */ + break; + } + case 2: + { + cfg.t.cfg.s.dlSapCfg.suId = 2; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 2; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = /* TODO */ 2; /* ACC_DLSAP_0 */ + break; + } + + default: + break; + + } +#endif + + cfg.t.cfg.s.dlSapCfg.suId = 1; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 1; /*ACC_DLSAP_0 */ + cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = 1; /* TODO */ /* ACC_DLSAP_0 */ + + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.selector = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.region = S_REG; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.pool = S_POOL; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.route = RTESPEC; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.prior = PRIOR0; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcEnt = ENTNW; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcInst = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcProcId = SFndProcId(); + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstEnt = ENTMW; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstInst = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstProcId = SFndProcId(); + + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.selector = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.region = S_REG; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.pool = S_POOL; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.route = RTESPEC; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.prior = PRIOR0; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcEnt = ENTNW; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcInst = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcProcId = SFndProcId(); + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstEnt = ENTSD; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstInst = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstProcId = SFndProcId(); + + return (sng_cfg_nif (&pst, &cfg)); +} + +static U32 ftmod_atoi(S8 *str) +{ + U32 idx = 0; + U32 value = 0; + + while(str[idx] != '\0') + { + value = (10 * value) + (str[idx] - '0'); + idx++; + } + return(value); +} + +static U32 ftmod_parse_conv_ipaddr(S8 *ptr) +{ + + U32 ipAddr = 0; + U32 idx = 0; + U32 tmpCnt = 0; + U32 len_ipAddr = 0; + S8 tmpStr[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + len_ipAddr = strlen(ptr); + + idx = 0; + tmpCnt = 0; + while(idx < len_ipAddr) + { + if( ptr[idx] != '.' ) + { + tmpStr[tmpCnt++] = ptr[idx]; + } + else + { + tmpStr[tmpCnt] = '\0'; + ipAddr |= ftmod_atoi(tmpStr); + ipAddr <<= 8; + tmpCnt = 0; + } + idx++; + } + + tmpStr[tmpCnt] = '\0'; + ipAddr |= ftmod_atoi(tmpStr); + + return(ipAddr); +} + +uint32_t iptoul(const char *ip) +{ + char i,*tmp; + int strl; + char strIp[16]; + unsigned long val=0, cvt; + if (!ip) + return 0; + + memset(strIp, 0, sizeof(char)*16); + strl = strlen(ip); + strncpy(strIp, ip, strl>=15?15:strl); + + + tmp=strtok(strIp, "."); + for (i=0;i<4;i++) + { + sscanf(tmp, "%lu", &cvt); + val <<= 8; + val |= (unsigned char)cvt; + tmp=strtok(NULL,"."); + } + return (uint32_t)val; +} + +/***********************************************************************************************************************/ + +int ftmod_ss7_m2ua_start(void){ + + + S16 ret = 0x00; + + /* Send a control request to bind the TSAP between SCTP and TUCL */ + if( (ret = ftmod_sigtran_tsap_bnd()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"\nControl request to bind TSAP of SCTP and TUCL : NOT OK\n"); + return 1; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"\nControl request to bind TSAP of SCTP and TUCL: OK\n"); + } + + /* Send a control request to bind the SCTSAP between SCTP and M2UA */ + if( (ret = ftmod_sigtran_sctsap_bnd()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind SCTSAP of M2UA and SCTP : NOT OK\n"); + return 1; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind SCTSAP of M2UA and SCTP: OK\n"); + } + + /* Send a control request to bind the DLSAP between NIF, M2UA and MTP-2 + for(idx = 0; idx < 3; idx++) */ + { + if( (ret = ftmod_sigtran_dlsap_bnd(1)) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP between NIF and M2UA: NOT OK\n"); + return 1; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP between NIF and M2UA : OK\n"); + } + + if( (ret = ftmod_ss7_dlsap_bnd(0x01)) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP between NIF and MTP2 : NOT OK\n"); + return 1; + } + else + { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP between NIF and MTP2 : OK\n"); + } + } + return 0; +} + + + +static S16 ftmod_sigtran_tsap_bnd(void) +{ + + Pst pst; + SbMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(SbMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTSB; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTSB; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STSBTSAP; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ABND_ENA; + cntrl.t.cntrl.sapId = 1; /* SCT sap id configured at SCTP layer */ + + return (sng_cntrl_sctp (&pst, &cntrl)); + +} + +static S16 ftmod_sigtran_sctsap_bnd(void) +{ + Pst pst; + MwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWSCTSAP; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + + cntrl.t.cntrl.action = ABND; + cntrl.t.cntrl.s.suId = 0; /* M2UA sct sap Id */ + + return (sng_cntrl_m2ua (&pst, &cntrl)); + +} + + +static S16 ftmod_sigtran_dlsap_bnd(U32 id) +{ + Pst pst; + NwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(NwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTNW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STNWDLSAP; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ABND; + cntrl.t.cntrl.suId = id; /* NIF DL sap Id */ + cntrl.t.cntrl.entity = ENTMW; /* M2UA */ + + return (sng_cntrl_nif (&pst, &cntrl)); + +} + +static S16 ftmod_ss7_dlsap_bnd(U32 id) +{ + Pst pst; + NwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(NwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTNW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STNWDLSAP; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ABND; + cntrl.t.cntrl.suId = id; /* NIF DL sap Id */ + cntrl.t.cntrl.entity = ENTSD; /* MTP2 */ + + return (sng_cntrl_nif (&pst, &cntrl)); +} diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h new file mode 100644 index 0000000000..1dc9a1f944 --- /dev/null +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2012, Kapil Gupta + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + */ +/******************************************************************************/ +#ifndef __FTMOD_SNG_SS7_M2UA_H__ +#define __FTMOD_SNG_SS7_M2UA_H__ +/******************************************************************************/ +#include "private/ftdm_core.h" + +#define MAX_NAME_LEN 25 + +typedef struct sng_nif_cfg{ + char name[MAX_NAME_LEN]; + uint32_t flags; + uint32_t id; + uint32_t m2uaLnkNmb; + uint32_t mtp2LnkNmb; +}sng_nif_cfg_t; + +typedef enum{ + SNG_M2UA_NODE_TYPE_SGP = 1, /* type SG */ + SNG_M2UA_NODE_TYPE_ASP = 2, /* type ASP */ +}sng_m2ua_node_types_e; + +typedef struct sng_m2ua_cfg{ + char name[MAX_NAME_LEN]; + uint32_t flags; + uint32_t id; /* ID */ + uint8_t nodeType; /*Node Type SG/ASP */ + uint16_t sctpId; /* idx to sctp profile */ + uint16_t peerdId; /* idx to m2ua_peer profile */ + uint16_t clusterId; /* idx to m2ua_cluster profile */ +}sng_m2ua_cfg_t; + +typedef struct sng_m2ua_peer_cfg{ + char name[MAX_NAME_LEN]; + uint32_t flags; + uint32_t id; /* ID */ + uint8_t aspIdFlag; /* Flag used to indicate whether include the ASP ID in the ASP UP message */ + uint16_t selfAspId; /* Self ASP ID. ASP identifier for this ASP node if the aspIdFlag is TRUE. */ + uint32_t numDestAddr; /* Number of destination address defined */ + uint16_t sctpId; /* idx to sctp profile */ + uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ + uint16_t locOutStrms; /*Number of outgoing streams supported by this association*/ +}sng_m2ua_peer_cfg_t; + +typedef enum{ + SNG_M2UA_LOAD_SHARE_ALGO_RR = 0x1, /* Round Robin Mode*/ + SNG_M2UA_LOAD_SHARE_ALGO_LS = 0x2, /* Link Specified */ + SNG_M2UA_LOAD_SHARE_ALGO_CS = 0x3, /* Customer Specified */ +}sng_m2ua_load_share_algo_types_e; + + +/* Possible values of Traffic mode */ +typedef enum{ + SNG_M2UA_TRF_MODE_OVERRIDE = 0x1, /* Override Mode */ + SNG_M2UA_TRF_MODE_LOADSHARE = 0x2, /* Loadshare Mode */ + SNG_M2UA_TRF_MODE_BROADCAST = 0x3, /* Broadcast Mode */ + SNG_M2UA_TRF_MODE_ANY = 0x0, /* ANY Mode */ +}sng_m2ua_traffic_mode_types_e; + +typedef struct sng_m2ua_cluster_cfg{ + char name[MAX_NAME_LEN]; + uint32_t flags; + uint32_t id; /* ID */ + uint8_t trfMode; /* Traffic mode. This parameter defines the mode in which this m2ua cluster is supposed to work */ + uint8_t loadShareAlgo; /* This parameter defines the M2UA load share algorithm which is used to distribute the traffic */ + uint16_t numOfPeers; /* idx to m2ua_peer profile */ + uint16_t peerIdLst[MW_MAX_NUM_OF_PEER]; /* idx to m2ua_peer profile */ +}sng_m2ua_cluster_cfg_t; + +typedef struct sng_m2ua_gbl_cfg{ + sng_nif_cfg_t nif[MW_MAX_NUM_OF_INTF]; + sng_m2ua_cfg_t m2ua[MW_MAX_NUM_OF_INTF]; + sng_m2ua_peer_cfg_t m2ua_peer[MW_MAX_NUM_OF_PEER]; + sng_m2ua_cluster_cfg_t m2ua_clus[MW_MAX_NUM_OF_CLUSTER]; +}sng_m2ua_gbl_cfg_t; + +/* m2ua xml parsing APIs */ +int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces); +int ftmod_ss7_parse_m2ua_interfaces(ftdm_conf_node_t *m2ua_interfaces); +int ftmod_ss7_parse_m2ua_peer_interfaces(ftdm_conf_node_t *m2ua_peer_interfaces); +int ftmod_ss7_parse_m2ua_clust_interfaces(ftdm_conf_node_t *m2ua_clust_interfaces); +ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node); +uint32_t iptoul(const char *ip); + +int ftmod_ss7_m2ua_start(void); + +ftdm_status_t ftmod_ss7_m2ua_cfg(void); + + +#endif /*__FTMOD_SNG_SS7_M2UA_H__*/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c new file mode 100644 index 0000000000..70af479482 --- /dev/null +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -0,0 +1,671 @@ +/* + * Copyright (c) 2012, Kapil Gupta + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributors: + * + * + */ + +/* INCLUDE ********************************************************************/ +#include "ftmod_sangoma_ss7_main.h" +/******************************************************************************/ + +/* DEFINES ********************************************************************/ +/******************************************************************************/ + +static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface); +static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface); +static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_interface); +static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_clust_interface); +static int ftmod_ss7_fill_in_nif_interface(sng_nif_cfg_t *nif_iface); +static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface); +static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_face); +static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_cluster_face); + +static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node); + +/******************************************************************************/ +int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces) +{ + ftdm_conf_node_t *nif_interface = NULL; + + /* confirm that we are looking at sng_nif_interfaces */ + if (strcasecmp(nif_interfaces->name, "sng_nif_interfaces")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"sng_nif_interfaces\"!\n",nif_interfaces->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"nif_interfaces\"...\n"); + } + + /* extract the isup_interfaces */ + nif_interface = nif_interfaces->child; + + while (nif_interface != NULL) { + /* parse the found mtp_route */ + if (ftmod_ss7_parse_nif_interface(nif_interface)) { + SS7_ERROR("Failed to parse \"nif_interface\"\n"); + return FTDM_FAIL; + } + + /* go to the next nif_interface */ + nif_interface = nif_interface->next; + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ +static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface) +{ + sng_nif_cfg_t sng_nif; + ftdm_conf_parameter_t *parm = nif_interface->parameters; + int num_parms = nif_interface->n_parameters; + int i; + + /* initalize the nif intf and isap structure */ + memset(&sng_nif, 0x0, sizeof(sng_nif)); + + /* confirm that we are looking at an nif_interface */ + if (strcasecmp(nif_interface->name, "sng_nif_interface")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"nif_interface\"!\n",nif_interface->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"nif_interface\"...\n"); + } + + + for (i = 0; i < num_parms; i++) { + /**************************************************************************/ + + /* try to match the parameter to what we expect */ + if (!strcasecmp(parm->var, "name")) { + /**********************************************************************/ + strcpy((char *)sng_nif.name, parm->val); + SS7_DEBUG("Found an nif_interface named = %s\n", sng_nif.name); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "id")) { + /**********************************************************************/ + sng_nif.id = atoi(parm->val); + SS7_DEBUG("Found an nif id = %d\n", sng_nif.id); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "m2uaLnkNmb")) { + /**********************************************************************/ + sng_nif.m2uaLnkNmb = atoi(parm->val); + SS7_DEBUG("Found an nif m2uaLnkNmb = %d\n", sng_nif.m2uaLnkNmb); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "mtp2LnkNmb")) { + /**********************************************************************/ + sng_nif.mtp2LnkNmb=atoi(parm->val); + + SS7_DEBUG("Found an nif mtp2LnkNmb = %d\n", sng_nif.mtp2LnkNmb); + /**********************************************************************/ + } else { + /**********************************************************************/ + SS7_ERROR("Found an invalid parameter %s!\n", parm->var); + return FTDM_FAIL; + /**********************************************************************/ + } + + /* move to the next parameter */ + parm = parm + 1; + /**************************************************************************/ + } /* for (i = 0; i < num_parms; i++) */ + + /* default the interface to paused state */ + sngss7_set_flag(&sng_nif, SNGSS7_PAUSED); + + /* fill in the nif interface */ + ftmod_ss7_fill_in_nif_interface(&sng_nif); + + return FTDM_SUCCESS; +} +/******************************************************************************/ +static int ftmod_ss7_fill_in_nif_interface(sng_nif_cfg_t *nif_iface) +{ + int i = nif_iface->id; + + strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].name, (char *)nif_iface->name, MAX_NAME_LEN-1); + + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].id = nif_iface->id; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].m2uaLnkNmb = nif_iface->m2uaLnkNmb; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].mtp2LnkNmb = nif_iface->mtp2LnkNmb; + + return 0; +} + +/******************************************************************************/ +int ftmod_ss7_parse_m2ua_interfaces(ftdm_conf_node_t *m2ua_interfaces) +{ + ftdm_conf_node_t *m2ua_interface = NULL; + + /* confirm that we are looking at sng_m2ua_interfaces */ + if (strcasecmp(m2ua_interfaces->name, "sng_m2ua_interfaces")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_nif_interfaces\"!\n",m2ua_interfaces->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_interfaces\"...\n"); + } + + /* extract the isup_interfaces */ + m2ua_interface = m2ua_interfaces->child; + + while (m2ua_interface != NULL) { + /* parse the found mtp_route */ + if (ftmod_ss7_parse_m2ua_interface(m2ua_interface)) { + SS7_ERROR("Failed to parse \"m2ua_interface\"\n"); + return FTDM_FAIL; + } + + /* go to the next m2ua_interface */ + m2ua_interface = m2ua_interface->next; + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ +static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) +{ + sng_m2ua_cfg_t sng_m2ua; + ftdm_conf_parameter_t *parm = m2ua_interface->parameters; + int num_parms = m2ua_interface->n_parameters; + int i; + + /* initalize the m2ua intf */ + memset(&sng_m2ua, 0x0, sizeof(sng_m2ua)); + + /* confirm that we are looking at an nif_interface */ + if (strcasecmp(m2ua_interface->name, "sng_m2ua_interface")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_interface\"!\n",m2ua_interface->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_interface\"...\n"); + } + + + for (i = 0; i < num_parms; i++) { + /**************************************************************************/ + + /* try to match the parameter to what we expect */ + if (!strcasecmp(parm->var, "name")) { + /**********************************************************************/ + strcpy((char *)sng_m2ua.name, parm->val); + SS7_DEBUG("Found an m2ua_interface named = %s\n", sng_m2ua.name); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "id")) { + /**********************************************************************/ + sng_m2ua.id = atoi(parm->val); + SS7_DEBUG("Found an m2ua id = %d\n", sng_m2ua.id); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "nodeType")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "SGP")){ + sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP; + } else if(!strcasecmp(parm->val, "ASP")){ + SS7_ERROR(" NodeType = ASP Not Supported Yet \n"); + return FTDM_FAIL; + } else { + SS7_ERROR("Found an invalid NodeType Parameter Value[%s]\n", parm->val); + return FTDM_FAIL; + } + SS7_DEBUG("Found an nif nodeType = %d\n", sng_m2ua.nodeType); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "sctpId")) { + /**********************************************************************/ + sng_m2ua.sctpId=atoi(parm->val); + + SS7_DEBUG("Found an m2ua sctpId = %d\n", sng_m2ua.sctpId); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "peerdId")) { + /**********************************************************************/ + sng_m2ua.peerdId=atoi(parm->val); + + SS7_DEBUG("Found an m2ua peerdId = %d\n", sng_m2ua.peerdId); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "clusterId")) { + /**********************************************************************/ + sng_m2ua.clusterId=atoi(parm->val); + + SS7_DEBUG("Found an m2ua clusterId = %d\n", sng_m2ua.clusterId); + /**********************************************************************/ + } else { + /**********************************************************************/ + SS7_ERROR("Found an invalid parameter %s!\n", parm->var); + return FTDM_FAIL; + /**********************************************************************/ + } + + /* move to the next parameter */ + parm = parm + 1; + /**************************************************************************/ + } /* for (i = 0; i < num_parms; i++) */ + + /* default the interface to paused state */ + sngss7_set_flag(&sng_m2ua, SNGSS7_PAUSED); + + /* fill in the nif interface */ + ftmod_ss7_fill_in_m2ua_interface(&sng_m2ua); + + return FTDM_SUCCESS; +} +/******************************************************************************/ +static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) +{ + int i = m2ua_iface->id; + + strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].name, (char *)m2ua_iface->name, MAX_NAME_LEN-1); + + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].id = m2ua_iface->id; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].nodeType = m2ua_iface->nodeType; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].sctpId = m2ua_iface->sctpId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerdId = m2ua_iface->peerdId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; + + return 0; +} + +/******************************************************************************/ +int ftmod_ss7_parse_m2ua_peer_interfaces(ftdm_conf_node_t *m2ua_peer_interfaces) +{ + ftdm_conf_node_t *m2ua_peer_interface = NULL; + + /* confirm that we are looking at m2ua_peer_interfaces */ + if (strcasecmp(m2ua_peer_interfaces->name, "sng_m2ua_peer_interfaces")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_peer_interfaces\"!\n",m2ua_peer_interfaces->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_peer_interfaces\"...\n"); + } + + /* extract the m2ua_peer_interfaces */ + m2ua_peer_interface = m2ua_peer_interfaces->child; + + while (m2ua_peer_interface != NULL) { + /* parse the found mtp_route */ + if (ftmod_ss7_parse_m2ua_peer_interface(m2ua_peer_interface)) { + SS7_ERROR("Failed to parse \"m2ua_peer_interface\"\n"); + return FTDM_FAIL; + } + + /* go to the next m2ua_peer_interface */ + m2ua_peer_interface = m2ua_peer_interface->next; + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ +static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_interface) +{ + sng_m2ua_peer_cfg_t sng_m2ua_peer; + ftdm_conf_parameter_t *parm = m2ua_peer_interface->parameters; + int num_parms = m2ua_peer_interface->n_parameters; + int i; + + /* initalize the m2ua intf */ + memset(&sng_m2ua_peer, 0x0, sizeof(sng_m2ua_peer)); + + /* confirm that we are looking at an m2ua_peer_interface */ + if (strcasecmp(m2ua_peer_interface->name, "sng_m2ua_peer_interface")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_peer_interface\"!\n",m2ua_peer_interface->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_peer_interface\"...\n"); + } + + + for (i = 0; i < num_parms; i++) { + /**************************************************************************/ + + /* try to match the parameter to what we expect */ + if (!strcasecmp(parm->var, "name")) { + /**********************************************************************/ + strcpy((char *)sng_m2ua_peer.name, parm->val); + SS7_DEBUG("Found an sng_m2ua_peer named = %s\n", sng_m2ua_peer.name); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "id")) { + /**********************************************************************/ + sng_m2ua_peer.id = atoi(parm->val); + SS7_DEBUG("Found an sng_m2ua_peer id = %d\n", sng_m2ua_peer.id); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "aspIdFlag")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "TRUE")){ + sng_m2ua_peer.aspIdFlag = 0x01; + } else if(!strcasecmp(parm->val, "FALSE")){ + sng_m2ua_peer.aspIdFlag = 0x00; + } else { + SS7_ERROR("Found an invalid aspIdFlag Parameter Value[%s]\n", parm->val); + return FTDM_FAIL; + } + SS7_DEBUG("Found an sng_m2ua_peer aspIdFlag = %d\n", sng_m2ua_peer.aspIdFlag); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "selfAspId")) { + /**********************************************************************/ + sng_m2ua_peer.selfAspId=atoi(parm->val); + + SS7_DEBUG("Found an sng_m2ua_peer selfAspId = %d\n", sng_m2ua_peer.selfAspId); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "DestAddr")) { + /**********************************************************************/ + if (sng_m2ua_peer.numDestAddr < SCT_MAX_NET_ADDRS) { + sng_m2ua_peer.destAddrList[sng_m2ua_peer.numDestAddr] = iptoul (parm->val); + sng_m2ua_peer.numDestAddr++; + SS7_DEBUG("sng_m2ua_peer - Parsing with dest IP Address = %s\n", parm->val); + } else { + SS7_ERROR("sng_m2ua_peer - too many dest address configured. dropping %s \n", parm->val); + } + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "locOutStrms")) { + /**********************************************************************/ + sng_m2ua_peer.locOutStrms=atoi(parm->val); + + SS7_DEBUG("Found an sng_m2ua_peer locOutStrms = %d\n", sng_m2ua_peer.locOutStrms); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "sctpId")) { + /**********************************************************************/ + sng_m2ua_peer.sctpId=atoi(parm->val); + + SS7_DEBUG("Found an sng_m2ua_peer sctpId = %d\n", sng_m2ua_peer.sctpId); + /**********************************************************************/ + } else { + /**********************************************************************/ + SS7_ERROR("Found an invalid parameter %s!\n", parm->var); + return FTDM_FAIL; + /**********************************************************************/ + } + + /* move to the next parameter */ + parm = parm + 1; + /**************************************************************************/ + } /* for (i = 0; i < num_parms; i++) */ + + /* default the interface to paused state */ + sngss7_set_flag(&sng_m2ua_peer, SNGSS7_PAUSED); + + /* fill in the sng_m2ua_peer interface */ + ftmod_ss7_fill_in_m2ua_peer_interface(&sng_m2ua_peer); + + return FTDM_SUCCESS; +} +/******************************************************************************/ +static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_iface) +{ + int k = 0x00; + int i = m2ua_peer_iface->id; + + strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].name, (char *)m2ua_peer_iface->name, MAX_NAME_LEN-1); + + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].id = m2ua_peer_iface->id; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].aspIdFlag = m2ua_peer_iface->aspIdFlag; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].selfAspId = m2ua_peer_iface->selfAspId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].locOutStrms = m2ua_peer_iface->locOutStrms; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].numDestAddr = m2ua_peer_iface->numDestAddr; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].sctpId = m2ua_peer_iface->sctpId; + for (k=1; k<=m2ua_peer_iface->numDestAddr; k++) { + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k]; + } + + + return 0; +} + +/******************************************************************************/ +int ftmod_ss7_parse_m2ua_clust_interfaces(ftdm_conf_node_t *m2ua_cluster_interfaces) +{ + ftdm_conf_node_t *m2ua_cluster_interface = NULL; + + /* confirm that we are looking at m2ua_cluster_interfaces */ + if (strcasecmp(m2ua_cluster_interfaces->name, "sng_m2ua_cluster_interfaces")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_cluster_interfaces\"!\n",m2ua_cluster_interfaces->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_cluster_interfaces\"...\n"); + } + + /* extract the m2ua_cluster_interfaces */ + m2ua_cluster_interface = m2ua_cluster_interfaces->child; + + while (m2ua_cluster_interface != NULL) { + /* parse the found m2ua_cluster_interface */ + if (ftmod_ss7_parse_m2ua_clust_interface(m2ua_cluster_interface)) { + SS7_ERROR("Failed to parse \"m2ua_cluster_interface\"\n"); + return FTDM_FAIL; + } + + /* go to the next m2ua_cluster_interface */ + m2ua_cluster_interface = m2ua_cluster_interface->next; + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ +static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_interface) +{ + sng_m2ua_cluster_cfg_t sng_m2ua_cluster; + ftdm_conf_parameter_t *parm = m2ua_cluster_interface->parameters; + int num_parms = m2ua_cluster_interface->n_parameters; + int i; + + /* initalize the m2ua_cluster_interface */ + memset(&sng_m2ua_cluster, 0x0, sizeof(sng_m2ua_cluster)); + + /* confirm that we are looking at an m2ua_cluster_interface */ + if (strcasecmp(m2ua_cluster_interface->name, "sng_m2ua_cluster_interface")) { + SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_cluster_interface\"!\n",m2ua_cluster_interface->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("Parsing \"m2ua_cluster_interface\"...\n"); + } + + + for (i = 0; i < num_parms; i++) { + /**************************************************************************/ + + /* try to match the parameter to what we expect */ + if (!strcasecmp(parm->var, "name")) { + /**********************************************************************/ + strcpy((char *)sng_m2ua_cluster.name, parm->val); + SS7_DEBUG("Found an sng_m2ua_cluster named = %s\n", sng_m2ua_cluster.name); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "id")) { + /**********************************************************************/ + sng_m2ua_cluster.id = atoi(parm->val); + SS7_DEBUG("Found an sng_m2ua_cluster id = %d\n", sng_m2ua_cluster.id); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "trfMode")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "LOADSHARE")){ + sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_LOADSHARE; + } else if(!strcasecmp(parm->val, "OVERRIDE")){ + sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_OVERRIDE; + } else if(!strcasecmp(parm->val, "BROADCAST")){ + sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_BROADCAST; + } else { + SS7_ERROR("Found an invalid trfMode Parameter Value[%s]..adding default one[ANY]\n", parm->val); + sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_ANY; + } + SS7_DEBUG("Found an sng_m2ua_cluster.trfMode = %d\n", sng_m2ua_cluster.trfMode); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "loadShareAlgo")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "Round_Robin")){ + sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_RR; + } else if(!strcasecmp(parm->val, "Link_Specified")){ + sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_LS; + } else if(!strcasecmp(parm->val, "Customer_Specified")){ + sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_CS; + } else { + SS7_ERROR("Found an invalid loadShareAlgo Parameter Value[%s]\n", parm->val); + return FTDM_FAIL; + } + + SS7_DEBUG("Found an sng_m2ua_cluster.loadShareAlgo = %d\n", sng_m2ua_cluster.loadShareAlgo); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "peerId")) { + /**********************************************************************/ + if(sng_m2ua_cluster.numOfPeers < MW_MAX_NUM_OF_PEER) { + sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers] = atoi(parm->val); + sng_m2ua_cluster.numOfPeers++; + SS7_DEBUG("Found an sng_m2ua_cluster peerId[%d], Total numOfPeers[%d] \n", + sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers], + sng_m2ua_cluster.numOfPeers); + }else{ + SS7_ERROR("Peer List excedding max[%d] limit \n", MW_MAX_NUM_OF_PEER); + return FTDM_FAIL; + } + /**********************************************************************/ + } else { + /**********************************************************************/ + SS7_ERROR("Found an invalid parameter %s!\n", parm->var); + return FTDM_FAIL; + /**********************************************************************/ + } + + /* move to the next parameter */ + parm = parm + 1; + /**************************************************************************/ + } /* for (i = 0; i < num_parms; i++) */ + + /* default the interface to paused state */ + sngss7_set_flag(&sng_m2ua_cluster, SNGSS7_PAUSED); + + /* fill in the sng_m2ua_peer interface */ + ftmod_ss7_fill_in_m2ua_clust_interface(&sng_m2ua_cluster); + + return FTDM_SUCCESS; +} +/******************************************************************************/ +static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_cluster_iface) +{ + int k = 0x00; + int i = m2ua_cluster_iface->id; + + strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].name, (char *)m2ua_cluster_iface->name, MAX_NAME_LEN-1); + + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].id = m2ua_cluster_iface->id; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].trfMode = m2ua_cluster_iface->trfMode; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].loadShareAlgo = m2ua_cluster_iface->loadShareAlgo; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].numOfPeers = m2ua_cluster_iface->numOfPeers; + for(k=0;knumOfPeers;k++){ + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].peerIdLst[k] = m2ua_cluster_iface->peerIdLst[k]; + } + + return 0; +} + +/******************************************************************************/ +ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node) +{ + ftdm_conf_node_t *node_sctp_link = NULL; + + if (!node) + return FTDM_FAIL; + + if (strcasecmp(node->name, "sng_sctp_interfaces")) { + SS7_ERROR("SCTP - We're looking at <%s>...but we're supposed to be looking at !\n", node->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("SCTP - Parsing configurations\n"); + } + + for (node_sctp_link = node->child; node_sctp_link != NULL; node_sctp_link = node_sctp_link->next) { + if (ftmod_m3ua_parse_sctp_link(node_sctp_link) != FTDM_SUCCESS) { + SS7_ERROR("SCTP - Failed to parse . \n"); + return FTDM_FAIL; + } + } + + return FTDM_SUCCESS; +} + +/******************************************************************************/ +static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node) +{ + ftdm_conf_parameter_t *param = NULL; + int num_params = 0; + int i=0; + + if (!node) + return FTDM_FAIL; + + param = node->parameters; + num_params = node->n_parameters; + + sng_sctp_link_t t_link; + memset (&t_link, 0, sizeof(sng_sctp_link_t)); + + if (strcasecmp(node->name, "sng_sctp_interface")) { + SS7_ERROR("SCTP - We're looking at <%s>...but we're supposed to be looking at !\n", node->name); + return FTDM_FAIL; + } else { + SS7_DEBUG("SCTP - Parsing configurations\n"); + } + + for (i=0; ivar, "name")) { + int n_strlen = strlen(param->val); + strncpy((char*)t_link.name, param->val, (n_strlen>MAX_NAME_LEN)?MAX_NAME_LEN:n_strlen); + SS7_DEBUG("SCTP - Parsing with name = %s\n", param->val); + } + else if (!strcasecmp(param->var, "id")) { + t_link.id = atoi(param->val); + SS7_DEBUG("SCTP - Parsing with id = %s\n", param->val); + } + else if (!strcasecmp(param->var, "srcAddr")) { + if (t_link.numSrcAddr < SCT_MAX_NET_ADDRS) { + t_link.srcAddrList[t_link.numSrcAddr+1] = iptoul (param->val); + t_link.numSrcAddr++; + SS7_DEBUG("SCTP - Parsing with source IP Address = %s\n", param->val); + } else { + SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val); + } + } + else { + SS7_ERROR("SCTP - Found an unknown parameter <%s>. Skipping it.\n", param->var); + } + } + + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].id = t_link.id; + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].tuclId = t_link.id; + strncpy((char*)g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].name, t_link.name, strlen(t_link.name) ); + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].flags = 0; + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].numSrcAddr = t_link.numSrcAddr; + for (i=1; i<=t_link.numSrcAddr; i++) { + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].srcAddrList[i] = t_link.srcAddrList[i]; + } + + return FTDM_SUCCESS; +} +/******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 1098126890..3c71b67411 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -50,6 +50,7 @@ static sng_isup_event_interface_t sng_event; static ftdm_io_interface_t g_ftdm_sngss7_interface; ftdm_sngss7_data_t g_ftdm_sngss7_data; +ftdm_sngss7_opr_mode g_ftdm_operating_mode; /******************************************************************************/ @@ -355,6 +356,15 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* set IN_THREAD flag so that we know this thread is running */ ftdm_set_flag (ftdmspan, FTDM_SPAN_IN_THREAD); + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + ftdm_log (FTDM_LOG_INFO, "FreeTDM running as M2UA_SG mode, freetdm dont have to do anything \n"); + + while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { + continue; + } + goto ftdm_sangoma_ss7_stop; + } + /* get an interrupt queue for this span for channel state changes */ if (ftdm_queue_get_interrupt (ftdmspan->pendingchans, &ftdm_sangoma_ss7_int[0]) != FTDM_SUCCESS) { SS7_CRITICAL ("Failed to get a ftdm_interrupt for span = %d for channel state changes!\n", ftdmspan->span_id); @@ -497,10 +507,12 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /**********************************************************************/ } } +ftdm_sangoma_ss7_stop: /* clear the IN_THREAD flag so that we know the thread is done */ ftdm_clear_flag (ftdmspan, FTDM_SPAN_IN_THREAD); + ftdm_log (FTDM_LOG_INFO,"ftmod_sangoma_ss7 monitor thread for span=%u stopping.\n",ftdmspan->span_id); return NULL; @@ -2496,6 +2508,8 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) /* set the flag to indicate that this span uses sig event queues */ ftdm_set_flag (span, FTDM_SPAN_USE_SIGNALS_QUEUE); + + /* parse the configuration and apply to the global config structure */ if (ftmod_ss7_parse_xml(ftdm_parameters, span)) { ftdm_log (FTDM_LOG_CRIT, "Failed to parse configuration!\n"); @@ -2503,8 +2517,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) return FTDM_FAIL; } - /* configure libsngss7 */ - if (ft_to_sngss7_cfg_all()) { + if (ft_to_sngss7_cfg_all()) { /* configure libsngss7 */ ftdm_log (FTDM_LOG_CRIT, "Failed to configure LibSngSS7!\n"); ftdm_sleep (100); return FTDM_FAIL; @@ -2566,6 +2579,10 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init) sng_event.sm.sng_isup_alarm = handle_sng_isup_alarm; sng_event.sm.sng_cc_alarm = handle_sng_cc_alarm; sng_event.sm.sng_relay_alarm = handle_sng_relay_alarm; + sng_event.sm.sng_m2ua_alarm = handle_sng_m2ua_alarm; + sng_event.sm.sng_nif_alarm = handle_sng_nif_alarm; + sng_event.sm.sng_tucl_alarm = handle_sng_tucl_alarm; + sng_event.sm.sng_sctp_alarm = handle_sng_sctp_alarm; /* initalize sng_ss7 library */ sng_isup_init_gen(&sng_event); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 4ccf4efe0e..fc6a6e61b5 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -52,6 +52,7 @@ #include "private/ftdm_core.h" #include "sng_ss7/sng_ss7.h" +#include "ftmod_sangoma_ss7_m2ua.h" /******************************************************************************/ @@ -60,6 +61,7 @@ #define MAX_CIC_LENGTH 5 #define MAX_CIC_MAP_LENGTH 1000 +#define MAX_SCTP_LINK 100 #define SNGSS7_EVENT_QUEUE_SIZE 100 #define SNGSS7_PEER_CHANS_QUEUE_SIZE 100 @@ -449,6 +451,29 @@ typedef struct sng_relay { uint32_t procId; } sng_relay_t; +/********************************************** +sctp structures and data definitions +**********************************************/ + +typedef struct sng_sctp_gen_cfg { +} sng_sctp_gen_cfg_t; + +typedef struct sng_sctp_link { + char name[MAX_NAME_LEN]; + uint32_t flags; + uint32_t id; + uint32_t tuclId; + uint32_t numSrcAddr; + uint32_t srcAddrList[SCT_MAX_NET_ADDRS+1]; +} sng_sctp_link_t; + +typedef struct sng_sctp_cfg { + sng_sctp_gen_cfg_t genCfg; + sng_sctp_link_t linkCfg[MAX_SCTP_LINK+1]; +} sng_sctp_cfg_t; + + + typedef struct sng_ss7_cfg { uint32_t spc; uint32_t procId; @@ -468,6 +493,8 @@ typedef struct sng_ss7_cfg { sng_isap_t isap[MAX_ISAPS+1]; sng_glare_resolution glareResolution; uint32_t force_inr; + sng_m2ua_gbl_cfg_t g_m2ua_cfg; + sng_sctp_cfg_t sctpCfg; } sng_ss7_cfg_t; typedef struct ftdm_sngss7_data { @@ -480,6 +507,14 @@ typedef struct ftdm_sngss7_data { fio_signal_cb_t sig_cb; } ftdm_sngss7_data_t; +typedef enum{ + SNG_SS7_OPR_MODE_NONE, + SNG_SS7_OPR_MODE_M2UA_SG, + SNG_SS7_OPR_MODE_ISUP, +}ftdm_sngss7_operating_modes_e; + +typedef ftdm_sngss7_operating_modes_e ftdm_sngss7_opr_mode; + typedef struct sngss7_timer_data { ftdm_timer_id_t hb_timer_id; int beat; @@ -728,6 +763,7 @@ typedef enum { /* GLOBALS ********************************************************************/ extern ftdm_sngss7_data_t g_ftdm_sngss7_data; +extern ftdm_sngss7_opr_mode g_ftdm_operating_mode; extern sng_ssf_type_t sng_ssf_type_map[]; extern sng_switch_type_t sng_switch_type_map[]; extern sng_link_type_t sng_link_type_map[]; @@ -750,6 +786,10 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta); void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta); void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta); void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta); +void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta); +void handle_sng_nif_alarm(Pst *pst, NwMgmt *sta); +void handle_sng_tucl_alarm(Pst *pst, HiMngmt *sta); +void handle_sng_sctp_alarm(Pst *pst, SbMgmt *sta); /* in ftmod_sangoma_ss7_relay.c */ ftdm_status_t handle_relay_connect(RyMngmt *sta); @@ -974,6 +1014,7 @@ void handle_isup_t35(void *userdata); void handle_isup_t10(void *userdata); void handle_isup_t39(void *userdata); + /******************************************************************************/ /* MACROS *********************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index f64356dd1f..32ebdc52b9 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -220,11 +220,32 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa /* clean out the self route */ memset(&self_route, 0x0, sizeof(self_route)); + var = ftdm_parameters[i].var; + val = ftdm_parameters[i].val; + + printf("var[%s], val[%s]\n",var,val); + /* confirm that the first parameter is the "operatingMode" */ + if(!strcasecmp(var, "operatingMode")){ + /**********************************************************************/ + if(!strcasecmp(val, "ISUP")) { + g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; + } + else if(!strcasecmp(val, "M2UA_SG")) { + g_ftdm_operating_mode = SNG_SS7_OPR_MODE_M2UA_SG; + } else { + SS7_ERROR("Invalid operating Mode[%s] \n", val); + return FTDM_FAIL; + } + /**********************************************************************/ + } + + i++; + var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; ptr = (ftdm_conf_node_t *)ftdm_parameters[i].ptr; - /* confirm that the first parameter is the "confnode" */ + /* confirm that the 2nd parameter is the "confnode" */ if (!strcasecmp(var, "confnode")) { /* parse the confnode and fill in the global libsng_ss7 config structure */ if (ftmod_ss7_parse_sng_isup(ptr)) { @@ -239,6 +260,7 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa } i++; + while (ftdm_parameters[i].var != NULL) { /**************************************************************************/ @@ -269,10 +291,12 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa /* fill the pointer to span into isupCkt */ sngSpan.span = span; - /* setup the circuits structure */ - if(ftmod_ss7_fill_in_circuits(&sngSpan)) { - SS7_ERROR("Failed to fill in circuits structure!\n"); - goto ftmod_ss7_parse_xml_error; + if(SNG_SS7_OPR_MODE_ISUP == g_ftdm_operating_mode){ + /* setup the circuits structure */ + if(ftmod_ss7_fill_in_circuits(&sngSpan)) { + SS7_ERROR("Failed to fill in circuits structure!\n"); + goto ftmod_ss7_parse_xml_error; + } } return FTDM_SUCCESS; @@ -294,6 +318,11 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) ftdm_conf_node_t *isup_interfaces = NULL; ftdm_conf_node_t *cc_spans = NULL; ftdm_conf_node_t *tmp_node = NULL; + ftdm_conf_node_t *nif_ifaces = NULL; + ftdm_conf_node_t *m2ua_ifaces = NULL; + ftdm_conf_node_t *m2ua_peer_ifaces = NULL; + ftdm_conf_node_t *m2ua_clust_ifaces = NULL; + ftdm_conf_node_t *sctp_ifaces = NULL; /* confirm that we are looking at sng_isup */ if (strcasecmp(sng_isup->name, "sng_isup")) { @@ -399,12 +428,62 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_FAIL; } /**********************************************************************/ + } else if (!strcasecmp(tmp_node->name, "sng_nif_interfaces")) { + /**********************************************************************/ + if (nif_ifaces == NULL) { + nif_ifaces = tmp_node; + SS7_DEBUG("Found a \"sng_nif_interfaces\" section!\n"); + } else { + SS7_ERROR("Found a second \"sng_nif_interfaces\" section\n!"); + return FTDM_FAIL; + } + /**********************************************************************/ + } else if (!strcasecmp(tmp_node->name, "sng_m2ua_interfaces")) { + /**********************************************************************/ + if (m2ua_ifaces == NULL) { + m2ua_ifaces = tmp_node; + SS7_DEBUG("Found a \"sng_m2ua_interfaces\" section!\n"); + } else { + SS7_ERROR("Found a second \"sng_m2ua_interfaces\" section\n!"); + return FTDM_FAIL; + } + /**********************************************************************/ + } else if (!strcasecmp(tmp_node->name, "sng_m2ua_peer_interfaces")) { + /**********************************************************************/ + if (m2ua_peer_ifaces == NULL) { + m2ua_peer_ifaces = tmp_node; + SS7_DEBUG("Found a \"sng_m2ua_peer_interfaces\" section!\n"); + } else { + SS7_ERROR("Found a second \"sng_m2ua_peer_interfaces\" section\n!"); + return FTDM_FAIL; + } + /**********************************************************************/ + } else if (!strcasecmp(tmp_node->name, "sng_m2ua_cluster_interfaces")) { + /**********************************************************************/ + if (m2ua_clust_ifaces == NULL) { + m2ua_clust_ifaces = tmp_node; + SS7_DEBUG("Found a \"sng_m2ua_cluster_interfaces\" section!\n"); + } else { + SS7_ERROR("Found a second \"sng_m2ua_peer_interfaces\" section\n!"); + return FTDM_FAIL; + } + /**********************************************************************/ + } else if (!strcasecmp(tmp_node->name, "sng_sctp_interfaces")) { + /**********************************************************************/ + if (sctp_ifaces == NULL) { + sctp_ifaces = tmp_node; + SS7_DEBUG("Found a section!\n"); + } else { + SS7_ERROR("Found a second section!\n"); + return FTDM_FAIL; + } + /**********************************************************************/ } else { /**********************************************************************/ SS7_ERROR("\tFound an unknown section \"%s\"!\n", tmp_node->name); return FTDM_FAIL; /**********************************************************************/ - } + } /* go to the next sibling */ tmp_node = tmp_node->next; @@ -431,11 +510,6 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_FAIL; } - if (ftmod_ss7_parse_mtp3_links(mtp3_links)) { - SS7_ERROR("Failed to parse \"mtp3_links\"!\n"); - return FTDM_FAIL; - } - if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) { SS7_ERROR("Failed to parse \"mtp_linksets\"!\n"); return FTDM_FAIL; @@ -446,14 +520,57 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_FAIL; } - if (ftmod_ss7_parse_isup_interfaces(isup_interfaces)) { - SS7_ERROR("Failed to parse \"isup_interfaces\"!\n"); - return FTDM_FAIL; - } + switch(g_ftdm_operating_mode) + { + case SNG_SS7_OPR_MODE_ISUP: + { + if (mtp3_links && ftmod_ss7_parse_mtp3_links(mtp3_links)) { + SS7_ERROR("Failed to parse \"mtp3_links\"!\n"); + return FTDM_FAIL; + } + + if (isup_interfaces && ftmod_ss7_parse_isup_interfaces(isup_interfaces)) { + SS7_ERROR("Failed to parse \"isup_interfaces\"!\n"); + return FTDM_FAIL; + } + + if (cc_spans && ftmod_ss7_parse_cc_spans(cc_spans)) { + SS7_ERROR("Failed to parse \"cc_spans\"!\n"); + return FTDM_FAIL; + } + break; + } + case SNG_SS7_OPR_MODE_M2UA_SG: + { + if (ftmod_m3ua_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) { + SS7_ERROR("Failed to parse !\n"); + return FTDM_FAIL; + } + SS7_INFO("Finished ftmod_m3ua_parse_sctp_links!\n"); + + if (nif_ifaces && ftmod_ss7_parse_nif_interfaces(nif_ifaces)) { + SS7_ERROR("Failed to parse \"nif_ifaces\"!\n"); + return FTDM_FAIL; + } + + if (m2ua_ifaces && ftmod_ss7_parse_m2ua_interfaces(m2ua_ifaces)) { + SS7_ERROR("Failed to parse \"m2ua_ifaces\"!\n"); + return FTDM_FAIL; + } + if (m2ua_peer_ifaces && ftmod_ss7_parse_m2ua_peer_interfaces(m2ua_peer_ifaces)) { + SS7_ERROR("Failed to parse \"m2ua_peer_ifaces\"!\n"); + return FTDM_FAIL; + } + if (m2ua_clust_ifaces && ftmod_ss7_parse_m2ua_clust_interfaces(m2ua_clust_ifaces)) { + SS7_ERROR("Failed to parse \"m2ua_clust_ifaces\"!\n"); + return FTDM_FAIL; + } + break; + } + default: + SS7_ERROR("Invalid operating mode[%d]\n",g_ftdm_operating_mode); + break; - if (ftmod_ss7_parse_cc_spans(cc_spans)) { - SS7_ERROR("Failed to parse \"cc_spans\"!\n"); - return FTDM_FAIL; } return FTDM_SUCCESS; From 4a99dc7fc75155018f61769967fd346e124b7bbc Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 18 May 2012 12:24:27 +0530 Subject: [PATCH 196/493] added code to ftdm_sangoma_ss7_run api to avoid code execution for M2UA SG --- .../ftmod_sangoma_ss7_main.c | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 3c71b67411..dbb1c1974c 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -356,14 +356,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* set IN_THREAD flag so that we know this thread is running */ ftdm_set_flag (ftdmspan, FTDM_SPAN_IN_THREAD); - if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ - ftdm_log (FTDM_LOG_INFO, "FreeTDM running as M2UA_SG mode, freetdm dont have to do anything \n"); - while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { - continue; - } - goto ftdm_sangoma_ss7_stop; - } /* get an interrupt queue for this span for channel state changes */ if (ftdm_queue_get_interrupt (ftdmspan->pendingchans, &ftdm_sangoma_ss7_int[0]) != FTDM_SUCCESS) { @@ -377,6 +370,40 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) goto ftdm_sangoma_ss7_run_exit; } + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + ftdm_log (FTDM_LOG_INFO, "FreeTDM running as M2UA_SG mode, freetdm dont have to do anything \n"); + + while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { + + switch ((ftdm_interrupt_multiple_wait(ftdm_sangoma_ss7_int, ftdm_array_len(ftdm_sangoma_ss7_int), 100))) { + + case FTDM_SUCCESS: /* process all pending state changes */ + + SS7_DEVEL_DEBUG ("ftdm_interrupt_wait FTDM_SUCCESS on span = %d\n",ftdmspan->span_id); + + /**********************************************************************/ + case FTDM_TIMEOUT: + SS7_DEVEL_DEBUG ("ftdm_interrupt_wait timed-out on span = %d\n",ftdmspan->span_id); + + break; + /**********************************************************************/ + case FTDM_FAIL: + SS7_ERROR ("ftdm_interrupt_wait returned error!\non span = %d\n", ftdmspan->span_id); + + break; + /**********************************************************************/ + default: + SS7_ERROR("ftdm_interrupt_wait returned with unknown code on span = %d\n",ftdmspan->span_id); + + break; + /**********************************************************************/ + } + + + } + goto ftdm_sangoma_ss7_stop; + } + while (ftdm_running () && !(ftdm_test_flag (ftdmspan, FTDM_SPAN_STOP_THREAD))) { int x = 0; if (b_alarm_test) { From c36b5f0ccafd2c54a9a0782dfea5ced3f0027f14 Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 18 May 2012 13:46:50 +0530 Subject: [PATCH 197/493] fixing megaco conf xml error --- src/mod/endpoints/mod_megaco/conf/megaco.conf.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml index ed849030bf..d386e055a9 100644 --- a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml +++ b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml @@ -6,10 +6,10 @@ - + - + - + - + From e91e4d68163368371461e9db451790667c90947b Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 18 May 2012 09:57:51 -0400 Subject: [PATCH 198/493] renamed sip_h_X-FreeTDM-Access-Transport to sip_h_X-FreeTDM-Access-Transport-URLENC --- libs/freetdm/mod_freetdm/mod_freetdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 51fbeca6cc..90de796b43 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1401,7 +1401,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_set_string(caller_data.loc.digits, sipvar); } - sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Access-Transport"); + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Access-Transport-URLENC"); if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_access_transport_urlenc", sipvar); } @@ -1872,7 +1872,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_access_transport_urlenc"); if (!ftdm_strlen_zero(var_value)) { - switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Access-Transport", "%s", var_value); + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Access-Transport-URLENC", "%s", var_value); } var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdinfo_indicator"); From 91dfa062bf41ce8005696987a20f3c4648c0e888 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 28 May 2012 16:53:45 -0400 Subject: [PATCH 199/493] ss7: adding iam_fwd_ind_HEX channel variable to set forward indicator IE's heximal value. - add to dialplan with expected hex value. If the outgoing ftdm channel's forward indicator needs to be changed, "export" needs to be put in the incoming channel's dialplan to set this variable value accordingly. - this implementation takes bits of A, CB, D, E, F, HG, I from the hex value. Bits of KJ, L, P-M are not taken from the hex. - How to calculate hex value with wanted bits: . the hex value is H-A-P-I, H is the highest bit to A, and next is P-I. I is the lowest bit in the whole field, and H is the highest bit in the whole field. Refer to Q.763 chapter 3.23. . use a text pad to fill in the bits with 0 and 1. eventually fill all the 16 bits . copy the binary value into a calculator and convert it to hex --- libs/freetdm/mod_freetdm/mod_freetdm.c | 5 + .../ftmod_sangoma_ss7_support.c | 136 ++++++++++++++++-- 2 files changed, 128 insertions(+), 13 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 90de796b43..430ace829f 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1593,6 +1593,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if ((var = channel_get_variable(session, var_event, "freetdm_calling_party_category"))) { ftdm_set_calling_party_category(var, (uint8_t *)&caller_data.cpc); } + + if ((var = channel_get_variable(session, var_event, "iam_fwd_ind_HEX"))) { + ftdm_usrmsg_add_var(&usrmsg, "iam_fwd_ind_HEX", var); + } + if (!zstr(dest)) { ftdm_set_string(caller_data.dnis.digits, dest); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index fd70f13290..39134f9925 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -87,7 +87,7 @@ FTDM_STR2ENUM(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_fl /* FUNCTIONS ******************************************************************/ static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val); static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val); - +ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) ; /* Maps generic FreeTDM CPC codes to SS7 CPC codes */ @@ -248,9 +248,9 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; - if (!strcasecmp(caller_data->loc.digits, "NULL")) { - pres_val = NOTPRSNT; - } + if (!strcasecmp(caller_data->loc.digits, "NULL")) { + pres_val = NOTPRSNT; + } locPtyNum->eh.pres = pres_val; locPtyNum->natAddrInd.pres = pres_val; @@ -896,6 +896,86 @@ ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *na return FTDM_SUCCESS; } +ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) +{ + int i= 4; + char a, b, c, d; + if (!in || 4>strlen(in)) { + return FTDM_FAIL; + } + while(i) + { + switch((char)*(in+(4-i))) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (i==4) { + d = *(in+(4-i)) - 48; + } else if (i==3) { + c = *(in+(4-i)) - 48; + } else if (i==2) { + b = *(in+(4-i)) - 48; + } else { + a = *(in+(4-i)) - 48; + } + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + if (i==4) { + d = *(in+(4-i)) - 55; + } else if (i==3) { + c = *(in+(4-i)) - 55; + } else if (i==2) { + b = *(in+(4-i)) - 55; + } else { + a = *(in+(4-i)) - 55; + } + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + if (i==4) { + d = *(in+(4-i)) - 87; + } else if (i==3) { + c = *(in+(4-i)) - 87; + } else if (i==2) { + b = *(in+(4-i)) - 87; + } else { + a = *(in+(4-i)) - 87; + } + break; + default: + SS7_ERROR("Invalid character found when decoding hex string, %c!\n", *(in+(4-i)) ); + break; + } + i--; + }; + + *out |= d; + *out = *out<<4; + *out |= c; + *out = *out<<4; + *out |= b; + *out = *out<<4; + *out |= a; + + return FTDM_SUCCESS; +} + ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) { const char *val = NULL; @@ -904,27 +984,56 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * fwdCallInd->eh.pres = PRSNT_NODEF; fwdCallInd->natIntCallInd.pres = PRSNT_NODEF; - fwdCallInd->natIntCallInd.val = 0x00; fwdCallInd->end2EndMethInd.pres = PRSNT_NODEF; - fwdCallInd->end2EndMethInd.val = E2EMTH_NOMETH; fwdCallInd->intInd.pres = PRSNT_NODEF; - fwdCallInd->intInd.val = INTIND_NOINTW; fwdCallInd->end2EndInfoInd.pres = PRSNT_NODEF; - fwdCallInd->end2EndInfoInd.val = E2EINF_NOINFO; fwdCallInd->isdnUsrPrtInd.pres = PRSNT_NODEF; - fwdCallInd->isdnUsrPrtInd.val = ISUP_USED; fwdCallInd->isdnUsrPrtPrfInd.pres = PRSNT_NODEF; - fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW; fwdCallInd->isdnAccInd.pres = PRSNT_NODEF; + fwdCallInd->sccpMethInd.pres = PRSNT_NODEF; + fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_HEX"); + if (!ftdm_strlen_zero(val)) { + uint16_t val_hex = 0; + if (four_char_to_hex (val, &val_hex) == FTDM_FAIL) { + SS7_ERROR ("Wrong value set in iam_fwd_ind_HEX variable. Please correct the error. Setting to default values.\n" ); + } else { + fwdCallInd->natIntCallInd.val = (val_hex & 0x100)>>8; + fwdCallInd->end2EndMethInd.val = (val_hex & 0x600)>>9; + fwdCallInd->intInd.val = (val_hex & 0x800)>>11; + fwdCallInd->end2EndInfoInd.val = (val_hex & 0x1000)>>12; + fwdCallInd->isdnUsrPrtInd.val = (val_hex & 0x2000)>>13; + fwdCallInd->isdnUsrPrtPrfInd.val = (val_hex & 0xC000)>>14; + fwdCallInd->isdnUsrPrtPrfInd.val = (fwdCallInd->isdnUsrPrtPrfInd.val==0x03)?0x0:fwdCallInd->isdnUsrPrtPrfInd.val; + fwdCallInd->isdnAccInd.val = val_hex & 0x1; + + if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) || + (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS95)) { + + /* include only if we're running ANSI */ + fwdCallInd->transCallNInd.pres = PRSNT_NODEF; + fwdCallInd->transCallNInd.val = 0x0; + } + + return FTDM_SUCCESS; + } + } + + fwdCallInd->natIntCallInd.val = 0x00; + fwdCallInd->end2EndMethInd.val = E2EMTH_NOMETH; + fwdCallInd->intInd.val = INTIND_NOINTW; + fwdCallInd->end2EndInfoInd.val = E2EINF_NOINFO; + fwdCallInd->isdnUsrPrtInd.val = ISUP_USED; + fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW; val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_isdn_access_ind"); if (!ftdm_strlen_zero(val)) { acc_val = (int)atoi(val); } - fwdCallInd->isdnAccInd.val = acc_val; - fwdCallInd->sccpMethInd.pres = PRSNT_NODEF; - fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND; + fwdCallInd->isdnAccInd.val = acc_val; if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) || (g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) || @@ -934,6 +1043,7 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * fwdCallInd->transCallNInd.pres = PRSNT_NODEF; fwdCallInd->transCallNInd.val = 0x0; } + return FTDM_SUCCESS; } From a941cad15ddf0b144de47ae04c7d638cb0e7b889 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 29 May 2012 15:06:25 +0530 Subject: [PATCH 200/493] adding M2UA SG open endpoint request code --- .../ftmod_sangoma_ss7_m2ua.c | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 375be9f35a..c6c1689ddc 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -69,6 +69,7 @@ ftdm_status_t sng_m2ua_cfg(void); static S16 ftmod_sigtran_tsap_bnd(void); static S16 ftmod_sigtran_sctsap_bnd(void); +static S16 ftmod_sigtran_open_endpoint(void); static S16 ftmod_sigtran_dlsap_bnd(U32 id); static S16 ftmod_ss7_dlsap_bnd(U32 id); @@ -708,16 +709,16 @@ static S16 ftmod_sigtran_m2ua_sctsap_config(void) /* service provider ID */ cfg.t.cfg.s.sctSapCfg.spId = 1; /* TUCL sct sap id is 1 */ /* source port number */ - cfg.t.cfg.s.sctSapCfg.srcPort = 0; + cfg.t.cfg.s.sctSapCfg.srcPort = 2904; /* interface address */ /*For multiple IP address support */ #ifdef SCT_ENDP_MULTI_IPADDR cfg.t.cfg.s.sctSapCfg.srcAddrLst.nmb = 1; cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100"); + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102"); #else cfg.t.cfg.s.sctSapCfg.intfAddr.type = CM_NETADDR_IPV4; - cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100"); + cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102"); #endif /* lower SAP primitive timer */ @@ -784,7 +785,7 @@ static S16 ftmod_sigtran_m2ua_peer_config(void) cfg.t.cfg.s.peerCfg.assocCfg.suId = 0; /* SCTSAP ID */ cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nmb = 1; /* destination address list*/ cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100");/* TODO */; + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.101");/* TODO */; #if 0 cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].type = CM_NETADDR_IPV4; cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].u.ipv4NetAddr = ftmod_parse_conv_ipaddr("172.25.0.93"); /* TODO */; @@ -794,7 +795,7 @@ static S16 ftmod_sigtran_m2ua_peer_config(void) #endif cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = 1; /* source address list */ cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.100");/* TODO */; + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102");/* TODO */; cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.type = CM_NETADDR_IPV4; cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.u.ipv4NetAddr = cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr; @@ -1196,10 +1197,53 @@ int ftmod_ss7_m2ua_start(void){ ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP between NIF and MTP2 : OK\n"); } } + + /* Send a control request to open endpoint */ + if( (ret = ftmod_sigtran_open_endpoint()) != ROK) + { + ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_open_endpoint FAIL \n"); + return 1; + } + else + { + ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_open_endpoint SUCCESS \n"); + } + return 0; } +static S16 ftmod_sigtran_open_endpoint(void) +{ + Pst pst; + MwMgmt cntrl; + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWSCTSAP; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + + cntrl.t.cntrl.action = AMWENDPOPEN; + cntrl.t.cntrl.s.suId = 0; /* M2UA sct sap Id */ + + return (sng_cntrl_m2ua (&pst, &cntrl)); + +} static S16 ftmod_sigtran_tsap_bnd(void) { From 076d9fbe67ef4282d528ade20fe79fb69f7045e4 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 30 May 2012 07:45:59 +0530 Subject: [PATCH 201/493] M2UA xml configuration parsing code --- .../ftmod_sangoma_ss7_m2ua.h | 2 +- .../ftmod_sangoma_ss7_m2ua_xml.c | 106 +++++++++++------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 32 ++++-- 3 files changed, 86 insertions(+), 54 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 1dc9a1f944..db13a1635b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -114,7 +114,7 @@ int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces); int ftmod_ss7_parse_m2ua_interfaces(ftdm_conf_node_t *m2ua_interfaces); int ftmod_ss7_parse_m2ua_peer_interfaces(ftdm_conf_node_t *m2ua_peer_interfaces); int ftmod_ss7_parse_m2ua_clust_interfaces(ftdm_conf_node_t *m2ua_clust_interfaces); -ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node); +int ftmod_ss7_parse_sctp_links(ftdm_conf_node_t *node); uint32_t iptoul(const char *ip); int ftmod_ss7_m2ua_start(void); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 70af479482..333f616628 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -52,7 +52,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface); static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_face); static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_cluster_face); -static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node); +static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node); /******************************************************************************/ int ftmod_ss7_parse_nif_interfaces(ftdm_conf_node_t *nif_interfaces) @@ -95,6 +95,11 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface) /* initalize the nif intf and isap structure */ memset(&sng_nif, 0x0, sizeof(sng_nif)); + if(!nif_interface){ + SS7_ERROR("ftmod_ss7_parse_nif_interface: Null XML Node pointer \n"); + return FTDM_FAIL; + } + /* confirm that we are looking at an nif_interface */ if (strcasecmp(nif_interface->name, "sng_nif_interface")) { SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"nif_interface\"!\n",nif_interface->name); @@ -118,16 +123,16 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface) sng_nif.id = atoi(parm->val); SS7_DEBUG("Found an nif id = %d\n", sng_nif.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "m2uaLnkNmb")) { + } else if (!strcasecmp(parm->var, "m2ua_link_nmb")) { /**********************************************************************/ sng_nif.m2uaLnkNmb = atoi(parm->val); - SS7_DEBUG("Found an nif m2uaLnkNmb = %d\n", sng_nif.m2uaLnkNmb); + SS7_DEBUG("Found an nif m2ua_link_nmb = %d\n", sng_nif.m2uaLnkNmb); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "mtp2LnkNmb")) { + } else if (!strcasecmp(parm->var, "mtp2_link_nmb")) { /**********************************************************************/ sng_nif.mtp2LnkNmb=atoi(parm->val); - SS7_DEBUG("Found an nif mtp2LnkNmb = %d\n", sng_nif.mtp2LnkNmb); + SS7_DEBUG("Found an nif mtp2_link_nmb = %d\n", sng_nif.mtp2LnkNmb); /**********************************************************************/ } else { /**********************************************************************/ @@ -204,6 +209,11 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) /* initalize the m2ua intf */ memset(&sng_m2ua, 0x0, sizeof(sng_m2ua)); + if(!m2ua_interface){ + SS7_ERROR("ftmod_ss7_parse_m2ua_interface: Null XML Node pointer \n"); + return FTDM_FAIL; + } + /* confirm that we are looking at an nif_interface */ if (strcasecmp(m2ua_interface->name, "sng_m2ua_interface")) { SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_interface\"!\n",m2ua_interface->name); @@ -227,7 +237,7 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) sng_m2ua.id = atoi(parm->val); SS7_DEBUG("Found an m2ua id = %d\n", sng_m2ua.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "nodeType")) { + } else if (!strcasecmp(parm->var, "node_type")) { /**********************************************************************/ if(!strcasecmp(parm->val, "SGP")){ sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP; @@ -238,25 +248,25 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) SS7_ERROR("Found an invalid NodeType Parameter Value[%s]\n", parm->val); return FTDM_FAIL; } - SS7_DEBUG("Found an nif nodeType = %d\n", sng_m2ua.nodeType); + SS7_DEBUG("Found an nif node_type = %d\n", sng_m2ua.nodeType); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "sctpId")) { + } else if (!strcasecmp(parm->var, "sctp_id")) { /**********************************************************************/ sng_m2ua.sctpId=atoi(parm->val); - SS7_DEBUG("Found an m2ua sctpId = %d\n", sng_m2ua.sctpId); + SS7_DEBUG("Found an m2ua sctp_id = %d\n", sng_m2ua.sctpId); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "peerdId")) { + } else if (!strcasecmp(parm->var, "peerd_id")) { /**********************************************************************/ sng_m2ua.peerdId=atoi(parm->val); - SS7_DEBUG("Found an m2ua peerdId = %d\n", sng_m2ua.peerdId); + SS7_DEBUG("Found an m2ua peerd_id = %d\n", sng_m2ua.peerdId); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "clusterId")) { + } else if (!strcasecmp(parm->var, "cluster_id")) { /**********************************************************************/ sng_m2ua.clusterId=atoi(parm->val); - SS7_DEBUG("Found an m2ua clusterId = %d\n", sng_m2ua.clusterId); + SS7_DEBUG("Found an m2ua cluster_id = %d\n", sng_m2ua.clusterId); /**********************************************************************/ } else { /**********************************************************************/ @@ -335,6 +345,11 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter /* initalize the m2ua intf */ memset(&sng_m2ua_peer, 0x0, sizeof(sng_m2ua_peer)); + if(!m2ua_peer_interface){ + SS7_ERROR("ftmod_ss7_parse_m2ua_peer_interface: Null XML Node pointer \n"); + return FTDM_FAIL; + } + /* confirm that we are looking at an m2ua_peer_interface */ if (strcasecmp(m2ua_peer_interface->name, "sng_m2ua_peer_interface")) { SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_peer_interface\"!\n",m2ua_peer_interface->name); @@ -358,7 +373,7 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter sng_m2ua_peer.id = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_peer id = %d\n", sng_m2ua_peer.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "aspIdFlag")) { + } else if (!strcasecmp(parm->var, "asp_id_flag")) { /**********************************************************************/ if(!strcasecmp(parm->val, "TRUE")){ sng_m2ua_peer.aspIdFlag = 0x01; @@ -370,13 +385,19 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter } SS7_DEBUG("Found an sng_m2ua_peer aspIdFlag = %d\n", sng_m2ua_peer.aspIdFlag); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "selfAspId")) { + } else if (!strcasecmp(parm->var, "self_asp_id")) { /**********************************************************************/ sng_m2ua_peer.selfAspId=atoi(parm->val); - SS7_DEBUG("Found an sng_m2ua_peer selfAspId = %d\n", sng_m2ua_peer.selfAspId); + SS7_DEBUG("Found an sng_m2ua_peer self_asp_id = %d\n", sng_m2ua_peer.selfAspId); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "DestAddr")) { + } else if (!strcasecmp(parm->var, "sctp_id")) { + /**********************************************************************/ + sng_m2ua_peer.sctpId = atoi(parm->val); + + SS7_DEBUG("Found an sng_m2ua_peer sctp_id = %d\n", sng_m2ua_peer.sctpId); + /**********************************************************************/ + } else if (!strcasecmp(parm->var, "dest_addr")) { /**********************************************************************/ if (sng_m2ua_peer.numDestAddr < SCT_MAX_NET_ADDRS) { sng_m2ua_peer.destAddrList[sng_m2ua_peer.numDestAddr] = iptoul (parm->val); @@ -386,17 +407,11 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter SS7_ERROR("sng_m2ua_peer - too many dest address configured. dropping %s \n", parm->val); } /**********************************************************************/ - } else if (!strcasecmp(parm->var, "locOutStrms")) { + } else if (!strcasecmp(parm->var, "loc_out_strms")) { /**********************************************************************/ sng_m2ua_peer.locOutStrms=atoi(parm->val); - SS7_DEBUG("Found an sng_m2ua_peer locOutStrms = %d\n", sng_m2ua_peer.locOutStrms); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "sctpId")) { - /**********************************************************************/ - sng_m2ua_peer.sctpId=atoi(parm->val); - - SS7_DEBUG("Found an sng_m2ua_peer sctpId = %d\n", sng_m2ua_peer.sctpId); + SS7_DEBUG("Found an sng_m2ua_peer loc_out_strms = %d\n", sng_m2ua_peer.locOutStrms); /**********************************************************************/ } else { /**********************************************************************/ @@ -481,6 +496,11 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i /* initalize the m2ua_cluster_interface */ memset(&sng_m2ua_cluster, 0x0, sizeof(sng_m2ua_cluster)); + if (!m2ua_cluster_interface){ + SS7_ERROR("ftmod_ss7_parse_m2ua_clust_interface - NULL XML Node pointer \n"); + return FTDM_FAIL; + } + /* confirm that we are looking at an m2ua_cluster_interface */ if (strcasecmp(m2ua_cluster_interface->name, "sng_m2ua_cluster_interface")) { SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"m2ua_cluster_interface\"!\n",m2ua_cluster_interface->name); @@ -504,13 +524,13 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i sng_m2ua_cluster.id = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_cluster id = %d\n", sng_m2ua_cluster.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "trfMode")) { + } else if (!strcasecmp(parm->var, "trf_mode")) { /**********************************************************************/ - if(!strcasecmp(parm->val, "LOADSHARE")){ + if(!strcasecmp(parm->val, "loadshare")){ sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_LOADSHARE; - } else if(!strcasecmp(parm->val, "OVERRIDE")){ + } else if(!strcasecmp(parm->val, "override")){ sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_OVERRIDE; - } else if(!strcasecmp(parm->val, "BROADCAST")){ + } else if(!strcasecmp(parm->val, "broadcast")){ sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_BROADCAST; } else { SS7_ERROR("Found an invalid trfMode Parameter Value[%s]..adding default one[ANY]\n", parm->val); @@ -518,13 +538,13 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i } SS7_DEBUG("Found an sng_m2ua_cluster.trfMode = %d\n", sng_m2ua_cluster.trfMode); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "loadShareAlgo")) { + } else if (!strcasecmp(parm->var, "load_share_algo")) { /**********************************************************************/ - if(!strcasecmp(parm->val, "Round_Robin")){ + if(!strcasecmp(parm->val, "roundrobin")){ sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_RR; - } else if(!strcasecmp(parm->val, "Link_Specified")){ + } else if(!strcasecmp(parm->val, "linkspecified")){ sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_LS; - } else if(!strcasecmp(parm->val, "Customer_Specified")){ + } else if(!strcasecmp(parm->val, "customerspecified")){ sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_CS; } else { SS7_ERROR("Found an invalid loadShareAlgo Parameter Value[%s]\n", parm->val); @@ -533,7 +553,7 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i SS7_DEBUG("Found an sng_m2ua_cluster.loadShareAlgo = %d\n", sng_m2ua_cluster.loadShareAlgo); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "peerId")) { + } else if (!strcasecmp(parm->var, "peer_id")) { /**********************************************************************/ if(sng_m2ua_cluster.numOfPeers < MW_MAX_NUM_OF_PEER) { sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers] = atoi(parm->val); @@ -586,7 +606,7 @@ static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_c } /******************************************************************************/ -ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node) +int ftmod_ss7_parse_sctp_links(ftdm_conf_node_t *node) { ftdm_conf_node_t *node_sctp_link = NULL; @@ -601,7 +621,7 @@ ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node) } for (node_sctp_link = node->child; node_sctp_link != NULL; node_sctp_link = node_sctp_link->next) { - if (ftmod_m3ua_parse_sctp_link(node_sctp_link) != FTDM_SUCCESS) { + if (ftmod_ss7_parse_sctp_link(node_sctp_link) != FTDM_SUCCESS) { SS7_ERROR("SCTP - Failed to parse . \n"); return FTDM_FAIL; } @@ -611,14 +631,16 @@ ftdm_status_t ftmod_m3ua_parse_sctp_links(ftdm_conf_node_t *node) } /******************************************************************************/ -static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node) +static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) { ftdm_conf_parameter_t *param = NULL; int num_params = 0; int i=0; - if (!node) + if (!node){ + SS7_ERROR("SCTP - NULL XML Node pointer \n"); return FTDM_FAIL; + } param = node->parameters; num_params = node->n_parameters; @@ -637,17 +659,17 @@ static ftdm_status_t ftmod_m3ua_parse_sctp_link(ftdm_conf_node_t *node) if (!strcasecmp(param->var, "name")) { int n_strlen = strlen(param->val); strncpy((char*)t_link.name, param->val, (n_strlen>MAX_NAME_LEN)?MAX_NAME_LEN:n_strlen); - SS7_DEBUG("SCTP - Parsing with name = %s\n", param->val); + SS7_DEBUG("SCTP - Parsing with name = %s\n", param->val); } else if (!strcasecmp(param->var, "id")) { t_link.id = atoi(param->val); - SS7_DEBUG("SCTP - Parsing with id = %s\n", param->val); + SS7_DEBUG("SCTP - Parsing with id = %s\n", param->val); } - else if (!strcasecmp(param->var, "srcAddr")) { + else if (!strcasecmp(param->var, "src_addr")) { if (t_link.numSrcAddr < SCT_MAX_NET_ADDRS) { t_link.srcAddrList[t_link.numSrcAddr+1] = iptoul (param->val); t_link.numSrcAddr++; - SS7_DEBUG("SCTP - Parsing with source IP Address = %s\n", param->val); + SS7_DEBUG("SCTP - Parsing with source IP Address = %s\n", param->val); } else { SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 32ebdc52b9..4b51bfc0e7 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -510,15 +510,6 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_FAIL; } - if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) { - SS7_ERROR("Failed to parse \"mtp_linksets\"!\n"); - return FTDM_FAIL; - } - - if (ftmod_ss7_parse_mtp_routes(mtp_routes)) { - SS7_ERROR("Failed to parse \"mtp_routes\"!\n"); - return FTDM_FAIL; - } switch(g_ftdm_operating_mode) { @@ -529,6 +520,16 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) return FTDM_FAIL; } + if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) { + SS7_ERROR("Failed to parse \"mtp_linksets\"!\n"); + return FTDM_FAIL; + } + + if (ftmod_ss7_parse_mtp_routes(mtp_routes)) { + SS7_ERROR("Failed to parse \"mtp_routes\"!\n"); + return FTDM_FAIL; + } + if (isup_interfaces && ftmod_ss7_parse_isup_interfaces(isup_interfaces)) { SS7_ERROR("Failed to parse \"isup_interfaces\"!\n"); return FTDM_FAIL; @@ -542,11 +543,20 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) } case SNG_SS7_OPR_MODE_M2UA_SG: { - if (ftmod_m3ua_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) { + if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) { + SS7_ERROR("Failed to parse \"mtp_linksets\"!\n"); + return FTDM_FAIL; + } + + if (ftmod_ss7_parse_mtp_routes(mtp_routes)) { + SS7_ERROR("Failed to parse \"mtp_routes\"!\n"); + return FTDM_FAIL; + } + + if (ftmod_ss7_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) { SS7_ERROR("Failed to parse !\n"); return FTDM_FAIL; } - SS7_INFO("Finished ftmod_m3ua_parse_sctp_links!\n"); if (nif_ifaces && ftmod_ss7_parse_nif_interfaces(nif_ifaces)) { SS7_ERROR("Failed to parse \"nif_ifaces\"!\n"); From 69501d091c9e1816829fa5b4500dfc073b0e0b92 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 30 May 2012 12:31:25 +0530 Subject: [PATCH 202/493] adding M2UA configuration/alarm handling code --- libs/freetdm/configure.ac | 2 +- .../ftmod_sangoma_ss7_logger.c | 273 +++++- .../ftmod_sangoma_ss7_m2ua.c | 844 +++++++++--------- .../ftmod_sangoma_ss7_m2ua.h | 2 +- .../ftmod_sangoma_ss7_m2ua_xml.c | 6 +- 5 files changed, 676 insertions(+), 451 deletions(-) diff --git a/libs/freetdm/configure.ac b/libs/freetdm/configure.ac index 292c1e7cfa..80f0c73070 100644 --- a/libs/freetdm/configure.ac +++ b/libs/freetdm/configure.ac @@ -316,7 +316,7 @@ if test "${HAVE_SNG_SS7}" = "yes"; then case "${host}" in x86_64-*) # X86_64 machines need additional flags when compiling against libsng_isdn - CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT" + CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT -DDEBUGP" ;; esac fi diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 5d4e183b20..5a6cc31907 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -827,28 +827,293 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) /******************************************************************************/ void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta) { - ftdm_log(FTDM_LOG_ERROR," handle_sng_m2ua_alarm Not Yet Implement \n"); + /* To print the general information */ + ftdm_log(FTDM_LOG_INFO, "Recieved a status indication from M2UA layer \n\n"); + ftdm_log(FTDM_LOG_INFO," Category = %d , event = %d , cause = %d\n", + sta->t.usta.alarm.category, sta->t.usta.alarm.event, sta->t.usta.alarm.cause); + + + /* To print the affected element value */ + switch(sta->hdr.elmId.elmnt) + { + case STMWDLSAP: + { + ftdm_log(FTDM_LOG_INFO," STMWDLSAP: with lnkNmb (%d) \n\n", + sta->t.usta.s.lnkNmb); + break; + } + case STMWSCTSAP: + { + ftdm_log(FTDM_LOG_INFO," STMWSCTSAP: suId (%d) \n\n", + sta->t.usta.s.suId); + break; + } + case STMWPEER: + { + ftdm_log(FTDM_LOG_INFO," STMWPEER: peerId (%d) \n\n", + sta->t.usta.s.peerId); + break; + } + case STMWCLUSTER: + { + ftdm_log(FTDM_LOG_INFO," STMWCLUSTER: clusterId (%d) \n\n", + sta->t.usta.s.peerId); + break; + } + default: + { + ftdm_log(FTDM_LOG_ERROR, "[MW_USTA]: Invalid element \n\n"); + break; + } + } + + /* To print the event specific information */ + switch(sta->t.usta.alarm.event) + { + case LMW_EVENT_ESTABLISH_OK: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ESTABLISH_OK Event raised on peerId[%d]\n",sta->t.usta.s.peerId); + break; + } + case LMW_EVENT_ESTABLISH_FAIL: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ESTABLISH_FAIL Event raised on peerId[%d]\n",sta->t.usta.s.peerId); + break; + } + case LMW_EVENT_ASPM: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ASPM Event raised with peerId (%d), aspId (%d)," + " msgType (%d)\n\n",sta->t.usta.s.peerId, + sta->t.usta.t.aspm.msgType); + break; + } + case LMW_EVENT_CLUSTER: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_CLUSTER Event raised on clusterId (%d), state (%d)\n\n", + sta->t.usta.s.clusterId, sta->t.usta.t.cluster.state); + + break; + } + case LMW_EVENT_NOTIFY: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_NOTIFY: peerId (%d), aspId (%d), ntfy status type (%d)," + " ntfy status id (%d)\n\n", sta->t.usta.s.peerId, + sta->t.usta.t.ntfy.aspId, sta->t.usta.t.ntfy.stType, + sta->t.usta.t.ntfy.stId); + + break; + } + + + case LMW_EVENT_M2UA_PROTO_ERROR: + { + ftdm_log(FTDM_LOG_ERROR, " M2UA : LMW_EVENT_M2UA_PROTO_ERROR with errorCode (%d)\n\n", + sta->t.usta.t.error.errCode); + break; + } + default: + break; + } } /* handle_sng_m2ua_alarm */ /******************************************************************************/ void handle_sng_nif_alarm(Pst *pst, NwMgmt *sta) { - ftdm_log(FTDM_LOG_ERROR," handle_sng_nif_alarm Not Yet Implement \n"); + /* To print the general information */ + ftdm_log(FTDM_LOG_INFO," Recieved a status indication from NIF layer\n"); + ftdm_log(FTDM_LOG_INFO," Category = %d , event = %d , cause = %d\n", sta->t.usta.alarm.category, + sta->t.usta.alarm.event, sta->t.usta.alarm.cause); + switch(sta->hdr.elmId.elmnt) + { + case STNWDLSAP: + { + ftdm_log(FTDM_LOG_INFO," Recieved STNWDLSAP status indication for suId (%d) \n", sta->t.usta.suId); + switch(sta->t.usta.alarm.event) + { + case LCM_EVENT_LI_INV_EVT: + { + switch(sta->t.usta.alarm.cause) + { + case LCM_CAUSE_INV_SAP: + { + ftdm_log(FTDM_LOG_ERROR, " LCM_CAUSE_INV_SAP Alarm \n"); + break; + } + case LCM_CAUSE_INV_STATE: + { + ftdm_log(FTDM_LOG_ERROR, " LCM_CAUSE_INV_STATE Alarm \n"); + break; + } + default: + break; + } + break; + } + case LCM_EVENT_BND_OK: + { + ftdm_log(FTDM_LOG_INFO," NIF: LCM_EVENT_BND_OK Alarm \n"); + break; + } + case LCM_EVENT_BND_FAIL: + { + ftdm_log(FTDM_LOG_INFO," NIF: LCM_EVENT_BND_FAIL Alarm \n"); + break; + } + default: + break; + } + break; + } + default: + break; + } } /* handle_sng_nif_alarm */ /******************************************************************************/ void handle_sng_tucl_alarm(Pst *pst, HiMngmt *sta) { - ftdm_log(FTDM_LOG_ERROR," handle_sng_tucl_alarm Not Yet Implement \n"); + /* To print the general information */ + ftdm_log(FTDM_LOG_INFO, "Recieved a status indication from TUCL layer \n\n"); + ftdm_log(FTDM_LOG_INFO, " Category = %d , event = %d , cause = %d\n", + sta->t.usta.alarm.category, + sta->t.usta.alarm.event, sta->t.usta.alarm.cause); + + switch(sta->t.usta.alarm.event) + { + case LCM_EVENT_INV_EVT: + { + ftdm_log(FTDM_LOG_INFO," [HI_USTA]: LCM_EVENT_INV_EVT with type (%d)\n\n", + sta->t.usta.info.type); + break; + } + case LHI_EVENT_BNDREQ: + { + ftdm_log(FTDM_LOG_INFO," [HI_USTA]: LHI_EVENT_BNDREQ with type (%d) spId (%d)\n\n", + sta->t.usta.info.type, sta->t.usta.info.spId); + break; + } + case LHI_EVENT_SERVOPENREQ: + case LHI_EVENT_DATREQ: + case LHI_EVENT_UDATREQ: + case LHI_EVENT_CONREQ: + case LHI_EVENT_DISCREQ: +#if(defined(HI_TLS) && defined(HI_TCP_TLS)) + case LHI_EVENT_TLS_ESTREQ: +#endif + { + ftdm_log(FTDM_LOG_INFO," [HI_USTA]: partype (%d) type(%d)\n\n", + sta->t.usta.info.inf.parType, sta->t.usta.info.type); + break; + } + case LCM_EVENT_DMEM_ALLOC_FAIL: + case LCM_EVENT_SMEM_ALLOC_FAIL: + { + ftdm_log(FTDM_LOG_ERROR," [HI_USTA]: MEM_ALLOC_FAIL with region(%d) pool (%d) type(%d)\n\n", + sta->t.usta.info.inf.mem.region, sta->t.usta.info.inf.mem.pool, + sta->t.usta.info.type); + break; + } + default: + break; + } } /* handle_sng_tucl_alarm */ /******************************************************************************/ void handle_sng_sctp_alarm(Pst *pst, SbMgmt *sta) { - ftdm_log(FTDM_LOG_ERROR," handle_sng_sctp_alarm Not Yet Implement \n"); + ftdm_log(FTDM_LOG_INFO, "Recieved a status indication from SCTP layer \n\n"); + ftdm_log(FTDM_LOG_INFO," Category = %d , event = %d , cause = %d " + " [SB_USTA]: sapId (%d) and swtch (%d)\n", + sta->t.usta.alarm.category, + sta->t.usta.alarm.event, sta->t.usta.alarm.cause, + sta->t.usta.sapId, sta->t.usta.swtch); + + switch(sta->t.usta.alarm.category) + { + case LCM_CATEGORY_INTERFACE: + { + switch(sta->t.usta.alarm.cause) + { + case LCM_CAUSE_INV_SPID: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_INV_SPID Alarm \n"); + break; + } + case LCM_CAUSE_SWVER_NAVAIL: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_SWVER_NAVAIL Alarm\n"); + break; + } + case LCM_CAUSE_INV_PAR_VAL: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_INV_PAR_VAL Alarm\n"); + break; + } + case LCM_CAUSE_INV_SUID: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_INV_SUID Alarm\n"); + break; + } + case LCM_CAUSE_INV_SAP: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_INV_SAP Alarm\n"); + break; + } + default: + break; + } + + break; + } + case LCM_CATEGORY_RESOURCE: + { + switch(sta->t.usta.alarm.cause) + { + case LCM_CAUSE_MEM_ALLOC_FAIL: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LCM_CAUSE_MEM_ALLOC_FAIL Alarm \n"); + break; + } + case LSB_CAUSE_NUM_ADDR_EXCEED: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LSB_CAUSE_NUM_ADDR_EXCEED Alarm\n"); + break; + } + default: + break; + } + break; + } + case LCM_CATEGORY_PROTOCOL: + { + switch(sta->t.usta.alarm.cause) + { + case LSB_CAUSE_PATH_FAILURE: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LSB_CAUSE_PATH_FAILURE Alarm \n"); + break; + } + case LSB_CAUSE_PATH_ACTIVE: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LSB_CAUSE_PATH_ACTIVE Alarm \n"); + break; + } + case LSB_CAUSE_UNRSLVD_ADDR: + { + ftdm_log(FTDM_LOG_ERROR, "SCTP : LSB_CAUSE_UNRSLVD_ADDR Alarm \n"); + break; + } + default: + break; + } + break; + } + default: + break; + } } /* handle_sng_sctp_alarm */ /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index c6c1689ddc..f7836ed629 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -43,42 +43,35 @@ /* DEFINES ********************************************************************/ /******************************************************************************/ /* FUNCTION PROTOTYPES ********************************************************/ -static int ftmod_sigtran_tucl_gen_config(void); -static int ftmod_sigtran_tucl_sap_config(void); - -static int ftmod_sigtran_sctp_gen_config(void); -ftdm_status_t ftmod_sigtran_cfg_sctp(void); -int ftmod_sigtran_sctp_config(int id); -ftdm_status_t ftmod_sigtran_sctp_sap_config(int id); -ftdm_status_t ftmod_sigtran_sctp_tsap_config(int id); -static S16 ftmod_sigtran_m2ua_gen_config(void); -static S16 ftmod_sigtran_m2ua_sctsap_config(void); -static S16 ftmod_sigtran_m2ua_peer_config(void); -static S16 ftmod_sigtran_m2ua_cluster_config(void); -static S16 ftmod_sigtran_m2ua_dlsap_config(U32 idx); - -static S16 ftmod_sigtran_nif_gen_config(void); -static S16 ftmod_sigtran_nif_dlsap_config(U32 idx); - - -static U32 ftmod_parse_conv_ipaddr(S8 *ptr); +static int ftmod_tucl_gen_config(void); +static int ftmod_tucl_sap_config(int id); +static int ftmod_sctp_gen_config(void); +static int ftmod_cfg_sctp(void); +static int ftmod_sctp_config(int id); +static ftdm_status_t ftmod_sctp_sap_config(int id); +static ftdm_status_t ftmod_sctp_tsap_config(int id); +static int ftmod_m2ua_gen_config(void); +static int ftmod_m2ua_sctsap_config(int id); +static int ftmod_m2ua_peer_config(int id); +static int ftmod_m2ua_cluster_config(int idx); +static int ftmod_m2ua_dlsap_config(int idx); +static int ftmod_nif_gen_config(void); +static int ftmod_nif_dlsap_config(int idx); +static int ftmod_sctp_tucl_tsap_bind(int idx); +static int ftmod_m2ua_sctp_sctsap_bind(int idx); +static int ftmod_open_endpoint(int idx); +static int ftmod_nif_m2ua_dlsap_bind(int id); +static int ftmod_nif_mtp2_dlsap_bind(int id); +static int ftmod_m2ua_enable_debug(void); +static int ftmod_tucl_enable_debug(void); ftdm_status_t sng_m2ua_init(void); ftdm_status_t sng_m2ua_cfg(void); - -static S16 ftmod_sigtran_tsap_bnd(void); -static S16 ftmod_sigtran_sctsap_bnd(void); -static S16 ftmod_sigtran_open_endpoint(void); -static S16 ftmod_sigtran_dlsap_bnd(U32 id); -static S16 ftmod_ss7_dlsap_bnd(U32 id); - -/******************************************************************************/ /******************************************************************************/ ftdm_status_t ftmod_ss7_m2ua_cfg(void) { - if(FTDM_SUCCESS != sng_m2ua_init()){ ftdm_log (FTDM_LOG_ERROR, " sng_m2ua_init FAILED \n"); return FTDM_FAIL; @@ -124,144 +117,122 @@ ftdm_status_t sng_m2ua_init(void) ftdm_log (FTDM_LOG_INFO ,"Started TUCL!\n"); } - return FTDM_SUCCESS; } -/******************************************************************************/ +/****************************************************************************************************/ ftdm_status_t sng_m2ua_cfg(void) { - S16 ret = ROK; + int x=0; + /****************************************************************************************************/ /* TUCL */ - if(ftmod_sigtran_tucl_gen_config()){ + if(ftmod_tucl_gen_config()){ ftdm_log (FTDM_LOG_ERROR ,"TUCL GEN configuration: NOT OK\n"); return FTDM_FAIL; } else { ftdm_log (FTDM_LOG_INFO ,"TUCL GEN configuration: OK\n"); } - if(ftmod_sigtran_tucl_sap_config()){ - ftdm_log (FTDM_LOG_ERROR ,"TUCL SAP configuration: NOT OK\n"); - return FTDM_FAIL; - } else { - ftdm_log (FTDM_LOG_INFO ,"TUCL SAP configuration: OK\n"); - } - /*********************************************************************************************/ - + /****************************************************************************************************/ /* SCTP */ - if(ftmod_sigtran_sctp_gen_config()){ + if(ftmod_sctp_gen_config()){ ftdm_log (FTDM_LOG_ERROR ,"SCTP GEN configuration: NOT OK\n"); return FTDM_FAIL; } else { ftdm_log (FTDM_LOG_INFO ,"SCTP GEN configuration: OK\n"); } - - if(ftmod_sigtran_cfg_sctp()){ - ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_cfg_sctp : NOT OK\n"); + /****************************************************************************************************/ + /* SCTP configuration */ + if(ftmod_cfg_sctp()){ + ftdm_log (FTDM_LOG_ERROR ,"SCTP Configuration : NOT OK\n"); return FTDM_FAIL; } else { - ftdm_log (FTDM_LOG_INFO ,"ftmod_sigtran_cfg_sctp : OK\n"); + ftdm_log (FTDM_LOG_INFO ,"SCTP Configuration : OK\n"); } - /*********************************************************************************************/ + /****************************************************************************************************/ + /* M2UA configurations */ - /* M2UA and NIF configurations */ - - /* Send the general configuration request for M2UA layer */ - if((ret = ftmod_sigtran_m2ua_gen_config()) != ROK) - { + if(ftmod_m2ua_gen_config()) { ftdm_log (FTDM_LOG_ERROR ,"M2UA General configuration: NOT OK\n"); return FTDM_FAIL; - } - else - { + }else { ftdm_log (FTDM_LOG_INFO ,"M2UA General configuration: OK\n"); } + /****************************************************************************************************/ + /* M2UA SCTP SAP configurations */ + for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) { - /* Send the SCTSAP configuration request for M2UA layer */ - if((ret = ftmod_sigtran_m2ua_sctsap_config()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"M2UA SCTSAP configuration: NOT OK\n"); - return FTDM_FAIL; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"M2UA SCTSAP configuration: OK\n"); - } + if(ftmod_m2ua_sctsap_config(x)) { + ftdm_log (FTDM_LOG_ERROR ,"M2UA SCTSAP[%d] configuration: NOT OK\n", x); + return FTDM_FAIL; + }else { + ftdm_log (FTDM_LOG_INFO ,"M2UA SCTSAP[%d] configuration: OK\n", x); + } - /* Send the peer configuration request for M2UA layer */ - if((ret = ftmod_sigtran_m2ua_peer_config()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"M2UA PEER configuration: NOT OK\n"); - return FTDM_FAIL; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"M2UA PEER configuration: OK\n"); - } + /****************************************************************************************************/ + /* M2UA PEER configurations */ - /* Send the cluster configuration request for M2UA layer */ - if((ret = ftmod_sigtran_m2ua_cluster_config()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"M2UA CLUSTER configuration: NOT OK\n"); - return FTDM_FAIL; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"M2UA CLUSTER configuration: OK\n"); - } - - - /* Send the USAP (DLSAP) configuration request for M2UA layer; fill the number - * of saps required to be configured. Max is 3 */ - /*for( idx = 0; idx < 3; idx++)*/ - { - if((ret = ftmod_sigtran_m2ua_dlsap_config(1)) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"M2UA DLSAP configuration: NOT OK\n"); + if(ftmod_m2ua_peer_config(x)) { + ftdm_log (FTDM_LOG_ERROR ,"M2UA PEER configuration for M2UA INTF[%d] : NOT OK\n", x); return FTDM_FAIL; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"M2UA DLSAP configuration: OK\n"); + }else { + ftdm_log (FTDM_LOG_INFO ,"M2UA PEER configuration for M2UA INTF[%d] : OK\n", x); } - } + /****************************************************************************************************/ + /* M2UA Cluster configurations */ - /* Send the general configuration request for NIF */ - if((ret = ftmod_sigtran_nif_gen_config()) != ROK) - { + if(ftmod_m2ua_cluster_config(x)) { + ftdm_log (FTDM_LOG_ERROR ,"M2UA CLUSTER configuration for M2UA INTF[%d] : NOT OK\n", x); + return FTDM_FAIL; + }else { + ftdm_log (FTDM_LOG_INFO ,"M2UA CLUSTER configuration for M2UA INTF[%d]: OK\n", x); + } + + /****************************************************************************************************/ + + /* Send the USAP (DLSAP) configuration request for M2UA layer; fill the number + * of saps required to be configured. Max is 3 */ + if(ftmod_m2ua_dlsap_config(x)) { + ftdm_log (FTDM_LOG_ERROR ,"M2UA DLSAP[%d] configuration: NOT OK\n", x); + return FTDM_FAIL; + }else { + ftdm_log (FTDM_LOG_INFO ,"M2UA DLSAP[%d] configuration: OK\n", x); + } + } /* END - SNGSS7_CONFIGURED */ + }/* END - M2UA Interfaces for loop*/ +/****************************************************************************************************/ + /* NIF */ + if(ftmod_nif_gen_config()){ ftdm_log (FTDM_LOG_ERROR ,"NIF General configuration: NOT OK\n"); return FTDM_FAIL; - } - else - { + }else { ftdm_log (FTDM_LOG_INFO ,"NIF General configuration: OK\n"); } - /* Send the USAP (DLSAP) configuration request for NIF layer; fill the number - * of saps required to be configured. Max is 3 - for( idx = 0; idx < 3; idx++) */ - { - if( (ret = ftmod_sigtran_nif_dlsap_config(1)) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"NIF DLSAP configuration: NOT OK\n"); - return FTDM_FAIL; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"NIF DLSAP configuration: OK\n"); +/****************************************************************************************************/ + /* NIF DLSAP */ + + for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_CONFIGURED)) { + if(ftmod_nif_dlsap_config(x)) { + ftdm_log (FTDM_LOG_ERROR ,"NIF DLSAP[%d] configuration: NOT OK\n", x); + return FTDM_FAIL; + }else{ + ftdm_log (FTDM_LOG_INFO ,"NIF DLSAP[%d] configuration: OK\n", x); + } } } - - /********************************************************************************************/ +/****************************************************************************************************/ return 0; } -/******************************************************************************/ -static int ftmod_sigtran_tucl_gen_config(void) +/****************************************************************************************************/ +static int ftmod_tucl_gen_config(void) { HiMngmt cfg; Pst pst; @@ -314,13 +285,16 @@ static int ftmod_sigtran_tucl_gen_config(void) return(sng_cfg_tucl(&pst, &cfg)); } +/****************************************************************************************************/ -static int ftmod_sigtran_tucl_sap_config(void) +static int ftmod_tucl_sap_config(int id) { HiMngmt cfg; Pst pst; HiSapCfg *pCfg; + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; + /* initalize the post structure */ smPstInit(&pst); @@ -353,8 +327,8 @@ static int ftmod_sigtran_tucl_sap_config(void) pCfg = &cfg.t.cfg.s.hiSap; - pCfg->spId = 0x01 ; /* KAPIL - TODO - should be from configured value.but hardcoding as of now */ - pCfg->uiSel = 0x00; /*loosley coupled */ + pCfg->spId = k->id ; /* each SCTP link there will be one tucl sap */ + pCfg->uiSel = 0x00; /*loosley coupled */ pCfg->flcEnb = TRUE; pCfg->txqCongStrtLim = HI_SAP_TXN_QUEUE_CONG_START_LIMIT; pCfg->txqCongDropLim = HI_SAP_TXN_QUEUE_CONG_DROP_LIMIT; @@ -368,8 +342,10 @@ static int ftmod_sigtran_tucl_sap_config(void) return(sng_cfg_tucl(&pst, &cfg)); } + +/****************************************************************************************************/ -static int ftmod_sigtran_sctp_gen_config(void) +static int ftmod_sctp_gen_config(void) { SbMgmt cfg; Pst pst; @@ -428,14 +404,14 @@ static int ftmod_sigtran_sctp_gen_config(void) return(sng_cfg_sctp(&pst, &cfg)); } -ftdm_status_t ftmod_sigtran_cfg_sctp(void) +/****************************************************************************************************/ +static int ftmod_cfg_sctp(void) { int x=0; - for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) - { + for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) { if (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED)) { - if ( ftmod_sigtran_sctp_config(x) == FTDM_FAIL) { + if ( ftmod_sctp_config(x) == FTDM_FAIL) { SS7_CRITICAL("SCTP %d configuration FAILED!\n", x); return FTDM_FAIL; } else { @@ -446,19 +422,28 @@ ftdm_status_t ftmod_sigtran_cfg_sctp(void) return FTDM_SUCCESS; } - -int ftmod_sigtran_sctp_config(int id) +/****************************************************************************************************/ +int ftmod_sctp_config(int id) { - if (ftmod_sigtran_sctp_tsap_config(id) != FTDM_SUCCESS) - return FTDM_FAIL; - - if (ftmod_sigtran_sctp_sap_config(id) != FTDM_SUCCESS) - return FTDM_FAIL; - - return FTDM_SUCCESS; -} + if (FTDM_SUCCESS != ftmod_sctp_tsap_config(id)) + return FTDM_FAIL; -ftdm_status_t ftmod_sigtran_sctp_tsap_config(int id) + if (FTDM_SUCCESS != ftmod_sctp_sap_config(id)) + return FTDM_FAIL; + + /* each sctp link there will be one tucl sap */ + if(ftmod_tucl_sap_config(id)){ + ftdm_log (FTDM_LOG_ERROR ,"TUCL SAP[%d] configuration: NOT OK\n", id); + return FTDM_FAIL; + } else { + ftdm_log (FTDM_LOG_INFO ,"TUCL SAP[%d] configuration: OK\n", id); + } + + return FTDM_SUCCESS; +} +/****************************************************************************************************/ + +ftdm_status_t ftmod_sctp_tsap_config(int id) { Pst pst; SbMgmt cfg; @@ -475,44 +460,46 @@ ftdm_status_t ftmod_sigtran_sctp_tsap_config(int id) memset(&cfg, 0x0, sizeof(cfg)); smHdrInit(&cfg.hdr); - cfg.hdr.msgType = TCFG; + cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTSB; cfg.hdr.entId.inst = S_INST; - cfg.hdr.elmId.elmnt = STSBTSAP; - cfg.hdr.elmId.elmntInst1= k->id; + cfg.hdr.elmId.elmnt = STSBTSAP; + cfg.hdr.elmId.elmntInst1 = k->id; c = &cfg.t.cfg.s.tSapCfg; - c->swtch = LSB_SW_RFC_REL0; - c->suId = 1; - c->sel = 0; - c->ent = ENTHI; - c->inst = S_INST; - c->procId = g_ftdm_sngss7_data.cfg.procId; - c->memId.region = S_REG; - c->memId.pool = S_POOL; - c->prior = PRIOR1; - c->route = RTESPEC; - c->srcNAddrLst.nmb = k->numSrcAddr; + c->swtch = LSB_SW_RFC_REL0; + c->suId = k->id; + c->sel = 0; + c->ent = ENTHI; + c->inst = S_INST; + c->procId = g_ftdm_sngss7_data.cfg.procId; + c->memId.region = S_REG; + c->memId.pool = S_POOL; + c->prior = PRIOR1; + c->route = RTESPEC; + c->srcNAddrLst.nmb = k->numSrcAddr; for (i=0; i <= (k->numSrcAddr-1); i++) { c->srcNAddrLst.nAddr[i].type = CM_NETADDR_IPV4; c->srcNAddrLst.nAddr[i].u.ipv4NetAddr = k->srcAddrList[i+1]; } - c->reConfig.spId = 1; - c->reConfig.maxBndRetry = 3; - c->reConfig.tIntTmr = 200; + c->reConfig.spId = k->id; + c->reConfig.maxBndRetry = 3; + c->reConfig.tIntTmr = 200; ret = sng_cfg_sctp(&pst, &cfg); - if (ret==0) { - SS7_INFO("SCTP TSAP %d configuration DONE!\n", id); + if (0 == ret) { + SS7_INFO("SCTP TSAP [%d] configuration DONE!\n", id); return FTDM_SUCCESS; } else { - SS7_CRITICAL("SCTP TSAP %d configuration FAILED!\n", id); + SS7_CRITICAL("SCTP TSAP [%d] configuration FAILED!\n", id); return FTDM_FAIL; } } -ftdm_status_t ftmod_sigtran_sctp_sap_config(int id) +/****************************************************************************************************/ + +ftdm_status_t ftmod_sctp_sap_config(int id) { Pst pst; SbMgmt cfg; @@ -527,73 +514,73 @@ ftdm_status_t ftmod_sigtran_sctp_sap_config(int id) memset(&cfg, 0x0, sizeof(cfg)); smHdrInit(&cfg.hdr); - cfg.hdr.msgType = TCFG; + cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTSB; cfg.hdr.entId.inst = S_INST; - cfg.hdr.elmId.elmnt = STSBSCTSAP; - cfg.hdr.elmId.elmntInst1= k->id; + cfg.hdr.elmId.elmnt = STSBSCTSAP; + cfg.hdr.elmId.elmntInst1 = k->id; c = &cfg.t.cfg.s.sctSapCfg; - c->swtch = LSB_SW_RFC_REL0; - c->spId = 1; /* Service Provider SAP Id */ - c->sel = 0; - c->memId.region = S_REG; - c->memId.pool = S_POOL; - c->prior = PRIOR1; - c->route = RTESPEC; + c->swtch = LSB_SW_RFC_REL0; + c->spId = k->id; /* Service Provider SAP Id */ + c->sel = 0; + c->memId.region = S_REG; + c->memId.pool = S_POOL; + c->prior = PRIOR1; + c->route = RTESPEC; /* Maximum time to wait before the SCTP layer must send a Selective Acknowledgement (SACK) message. Valid range is 1 -165535. */ - c->reConfig.maxAckDelayTm = 200; + c->reConfig.maxAckDelayTm = 200; /* Maximum number of messages to receive before the SCTP layer must send a SACK message. Valid range is 1 - 165535. */ - c->reConfig.maxAckDelayDg = 2; + c->reConfig.maxAckDelayDg = 2; /* Initial value of the retransmission timer (RTO). The SCTP layer retransmits data after waiting for feedback during this time period. Valid range is 1 - 65535. */ - c->reConfig.rtoInitial = 3000; + c->reConfig.rtoInitial = 3000; /* Minimum value used for the RTO. If the computed value of RTO is less than rtoMin, the computed value is rounded up to this value. */ - c->reConfig.rtoMin = 1000; + c->reConfig.rtoMin = 1000; /* Maxiumum value used for RTO. If the computed value of RTO is greater than rtoMax, the computed value is rounded down to this value. */ - c->reConfig.rtoMax = 10000; + c->reConfig.rtoMax = 10000; /* Default Freeze timer value */ - c->reConfig.freezeTm = 3000; + c->reConfig.freezeTm = 3000; /* Base cookie lifetime for the cookie in the Initiation Acknowledgement (INIT ACK) message. */ - c->reConfig.cookieLife = 60000; + c->reConfig.cookieLife = 60000; /* Default heartbeat interval timer. Valid range is 1 - 65535. */ - c->reConfig.intervalTm = 3000; + c->reConfig.intervalTm = 3000; /* Maximum burst value. Valid range is 1 - 65535. */ - c->reConfig.maxBurst = 4; + c->reConfig.maxBurst = 4; /*Maximum number of heartbeats sent at each retransmission timeout (RTO). Valid range is 1 - 65535. */ - c->reConfig.maxHbBurst = 1; + c->reConfig.maxHbBurst = 1; /*Shutdown guard timer value for graceful shutdowns. */ - c->reConfig.t5SdownGrdTm = 15000; + c->reConfig.t5SdownGrdTm = 15000; /* Action to take when the receiver's number of incoming streams is less than the sender's number of outgoing streams. Valid values are: TRUE = Accept incoming stream and continue association. FALSE = Abort the association. */ - c->reConfig.negAbrtFlg = FALSE; + c->reConfig.negAbrtFlg = FALSE; /* Whether to enable or disable heartbeat by default. Valid values are: TRUE = Enable heartbeat. FALSE = Disable heartbeat. */ - c->reConfig.hBeatEnable = TRUE; + c->reConfig.hBeatEnable = TRUE; /* Flow control start threshold. When the number of messages in SCTPÂ’s message queue reaches this value, flow control starts. */ - c->reConfig.flcUpThr = 8; + c->reConfig.flcUpThr = 8; /* Flow control stop threshold. When the number of messages in SCTPÂ’s message queue reaches this value, flow control stops. */ - c->reConfig.flcLowThr = 6; + c->reConfig.flcLowThr = 6; - c->reConfig.handleInitFlg = FALSE; + c->reConfig.handleInitFlg = FALSE; ret = sng_cfg_sctp(&pst, &cfg); - if (ret==0) { - SS7_INFO("SCTP SAP %d configuration DONE!\n", id); + if (0 == ret) { + SS7_INFO("SCTP SAP [%d] configuration DONE!\n", id); return FTDM_SUCCESS; } else { - SS7_CRITICAL("SCTP SAP %d configuration FAILED!\n", id); + SS7_CRITICAL("SCTP SAP [%d] configuration FAILED!\n", id); return FTDM_FAIL; } } /**********************************************************************************************/ /* M2UA - General configuration */ -static S16 ftmod_sigtran_m2ua_gen_config(void) +static int ftmod_m2ua_gen_config(void) { Pst pst; MwMgmt cfg; @@ -641,11 +628,11 @@ static S16 ftmod_sigtran_m2ua_gen_config(void) cfg.t.cfg.s.genCfg.reConfig.smPst.route = RTESPEC; /* route */ cfg.t.cfg.s.genCfg.reConfig.smPst.dstEnt = ENTSM; /* dst entity */ - cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst = 0; /* dst inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst = S_INST; /* dst inst */ cfg.t.cfg.s.genCfg.reConfig.smPst.dstProcId = SFndProcId(); /* src proc id */ cfg.t.cfg.s.genCfg.reConfig.smPst.srcEnt = ENTMW; /* src entity */ - cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst = 0; /* src inst */ + cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst = S_INST; /* src inst */ cfg.t.cfg.s.genCfg.reConfig.smPst.srcProcId = SFndProcId(); /* src proc id */ cfg.t.cfg.s.genCfg.reConfig.tmrFlcPoll.enb = TRUE; /* SCTP Flc Poll timer */ @@ -671,14 +658,13 @@ static S16 ftmod_sigtran_m2ua_gen_config(void) } /**********************************************************************************************/ - - -/* M2UA - SCTSAP configuration */ -static S16 ftmod_sigtran_m2ua_sctsap_config(void) +static int ftmod_m2ua_sctsap_config(int id) { - + int i; Pst pst; MwMgmt cfg; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[m2ua->sctpId]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -700,25 +686,26 @@ static S16 ftmod_sigtran_m2ua_sctsap_config(void) cfg.hdr.response.mem.region = S_REG; cfg.hdr.response.mem.pool = S_POOL; - - cfg.t.cfg.s.sctSapCfg.reConfig.selector = 0; /* service user SAP ID */ - cfg.t.cfg.s.sctSapCfg.suId = 0; + cfg.t.cfg.s.sctSapCfg.suId = m2ua->id; /* service provider ID */ - cfg.t.cfg.s.sctSapCfg.spId = 1; /* TUCL sct sap id is 1 */ + cfg.t.cfg.s.sctSapCfg.spId = m2ua->sctpId; /* source port number */ cfg.t.cfg.s.sctSapCfg.srcPort = 2904; /* interface address */ /*For multiple IP address support */ #ifdef SCT_ENDP_MULTI_IPADDR - cfg.t.cfg.s.sctSapCfg.srcAddrLst.nmb = 1; - cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102"); + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nmb = sctp->numSrcAddr; + for (i=0; i <= (sctp->numSrcAddr-1); i++) { + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[i].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[i].u.ipv4NetAddr = sctp->srcAddrList[i+1]; + } #else + /* for single ip support ,src address will always be one */ cfg.t.cfg.s.sctSapCfg.intfAddr.type = CM_NETADDR_IPV4; - cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102"); + cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = sctp->srcAddrList[1]; #endif /* lower SAP primitive timer */ @@ -746,14 +733,17 @@ static S16 ftmod_sigtran_m2ua_sctsap_config(void) } -/**********************************************************************************************/ - +/****************************************************************************************************/ /* M2UA - Peer configuration */ -static S16 ftmod_sigtran_m2ua_peer_config(void) +static int ftmod_m2ua_peer_config(int id) { + int i; Pst pst; MwMgmt cfg; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[m2ua->peerId]; + sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[peer->sctpId]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -763,7 +753,7 @@ static S16 ftmod_sigtran_m2ua_peer_config(void) pst.dstEnt = ENTMW; /* prepare header */ - cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.msgType = TCFG; /* message type */ cfg.hdr.entId.ent = ENTMW; /* entity */ cfg.hdr.entId.inst = 0; /* instance */ cfg.hdr.elmId.elmnt = STMWPEER; /* Peer */ @@ -777,30 +767,30 @@ static S16 ftmod_sigtran_m2ua_peer_config(void) - cfg.t.cfg.s.peerCfg.peerId = 1; /* peer id */ - cfg.t.cfg.s.peerCfg.aspIdFlag = FALSE; /* aspId flag */ + cfg.t.cfg.s.peerCfg.peerId = peer->id; /* peer id */ + cfg.t.cfg.s.peerCfg.aspIdFlag = peer->aspIdFlag; /* aspId flag */ #ifdef MWASP - cfg.t.cfg.s.peerCfg.selfAspId = 1; /* aspId */ + cfg.t.cfg.s.peerCfg.selfAspId = peer->selfAspId; /* aspId */ #endif - cfg.t.cfg.s.peerCfg.assocCfg.suId = 0; /* SCTSAP ID */ - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nmb = 1; /* destination address list*/ - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.101");/* TODO */; -#if 0 - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[1].u.ipv4NetAddr = ftmod_parse_conv_ipaddr("172.25.0.93"); /* TODO */; -#endif + cfg.t.cfg.s.peerCfg.assocCfg.suId = peer->sctpId; /* SCTSAP ID */ + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nmb = peer->numDestAddr; + for (i=0; i <= (peer->numDestAddr); i++) { + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[i].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[i].u.ipv4NetAddr = peer->destAddrList[i]; + } #ifdef MW_CFG_DSTPORT cfg.t.cfg.s.peerCfg.assocCfg.dstPort = /* TODO */ 2904; /* Port on which M2UA runs */ #endif - cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = 1; /* source address list */ - cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].type = CM_NETADDR_IPV4; - cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[0].u.ipv4NetAddr = ftmod_parse_conv_ipaddr((S8*)"192.168.1.102");/* TODO */; + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = sctp->numSrcAddr; /* source address list */ + for (i=0; i <= (sctp->numSrcAddr-1); i++) { + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[i].type = CM_NETADDR_IPV4; + cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[i].u.ipv4NetAddr = sctp->srcAddrList[i+1]; + } cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.type = CM_NETADDR_IPV4; cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.u.ipv4NetAddr = cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr; - cfg.t.cfg.s.peerCfg.assocCfg.locOutStrms = 10; + cfg.t.cfg.s.peerCfg.assocCfg.locOutStrms = peer->locOutStrms; #ifdef SCT3 cfg.t.cfg.s.peerCfg.assocCfg.tos = 0; #endif @@ -808,13 +798,14 @@ static S16 ftmod_sigtran_m2ua_peer_config(void) return (sng_cfg_m2ua (&pst, &cfg)); } /**********************************************************************************************/ - - /* M2UA - Cluster configuration */ -static S16 ftmod_sigtran_m2ua_cluster_config(void) +static int ftmod_m2ua_cluster_config(int id) { + int i; Pst pst; MwMgmt cfg; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -824,7 +815,7 @@ static S16 ftmod_sigtran_m2ua_cluster_config(void) pst.dstEnt = ENTMW; /* prepare header */ - cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.msgType = TCFG; /* message type */ cfg.hdr.entId.ent = ENTMW; /* entity */ cfg.hdr.entId.inst = 0; /* instance */ cfg.hdr.elmId.elmnt = STMWCLUSTER; /* Cluster */ @@ -837,26 +828,25 @@ static S16 ftmod_sigtran_m2ua_cluster_config(void) cfg.hdr.response.mem.pool = S_POOL; - - cfg.t.cfg.s.clusterCfg.clusterId = 0; - cfg.t.cfg.s.clusterCfg.trfMode = LMW_TRF_MODE_LOADSHARE; - cfg.t.cfg.s.clusterCfg.loadshareMode = LMW_LOADSH_RR; - cfg.t.cfg.s.clusterCfg.reConfig.nmbPeer = 1; - cfg.t.cfg.s.clusterCfg.reConfig.peer[0] = 1; -#if 0 - cfg.t.cfg.s.clusterCfg.reConfig.peer[1] = 2; -#endif + cfg.t.cfg.s.clusterCfg.clusterId = clust->id; + cfg.t.cfg.s.clusterCfg.trfMode = clust->trfMode; + cfg.t.cfg.s.clusterCfg.loadshareMode = clust->loadShareAlgo; + cfg.t.cfg.s.clusterCfg.reConfig.nmbPeer = clust->numOfPeers; + for(i=0; i<(clust->numOfPeers);i++) { + cfg.t.cfg.s.clusterCfg.reConfig.peer[i] = clust->peerIdLst[i]; + } return (sng_cfg_m2ua (&pst, &cfg)); - } + /**********************************************************************************************/ /* M2UA - DLSAP configuration */ -static S16 ftmod_sigtran_m2ua_dlsap_config(U32 id) +static int ftmod_m2ua_dlsap_config(int id) { Pst pst; MwMgmt cfg; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -866,7 +856,7 @@ static S16 ftmod_sigtran_m2ua_dlsap_config(U32 id) pst.dstEnt = ENTMW; /* prepare header */ - cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.msgType = TCFG; /* message type */ cfg.hdr.entId.ent = ENTMW; /* entity */ cfg.hdr.entId.inst = 0; /* instance */ cfg.hdr.elmId.elmnt = STMWDLSAP; /* DLSAP */ @@ -879,39 +869,13 @@ static S16 ftmod_sigtran_m2ua_dlsap_config(U32 id) cfg.hdr.response.mem.pool = S_POOL; - switch(id) - { - case 0: - { - cfg.t.cfg.s.dlSapCfg.lnkNmb = 0; /* SapId */ - cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; - cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 0; - break; - } - case 1: - { - cfg.t.cfg.s.dlSapCfg.lnkNmb = 1; /* SapId */ - cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; - cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 1; - break; - } - - case 2: - { - cfg.t.cfg.s.dlSapCfg.lnkNmb = 2; /* SapId */ - cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; - cfg.t.cfg.s.dlSapCfg.intfId.id.intId = 2; - break; - } - default: - break; - } + cfg.t.cfg.s.dlSapCfg.lnkNmb = id; /* SapId */ + cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; + cfg.t.cfg.s.dlSapCfg.intfId.id.intId = id; cfg.t.cfg.s.dlSapCfg.swtch = LMW_SAP_ITU; - - - cfg.t.cfg.s.dlSapCfg.reConfig.clusterId = 0; + cfg.t.cfg.s.dlSapCfg.reConfig.clusterId = m2ua->clusterId; cfg.t.cfg.s.dlSapCfg.reConfig.selector = 0; /* Loosely couple mode */ /* memory region and pool id*/ cfg.t.cfg.s.dlSapCfg.reConfig.mem.region = S_REG; @@ -925,11 +889,8 @@ static S16 ftmod_sigtran_m2ua_dlsap_config(U32 id) } /*****************************************************************************/ - -/* NIF configurations */ - /* NIF - General configuration */ -static S16 ftmod_sigtran_nif_gen_config(void) +static int ftmod_nif_gen_config(void) { Pst pst; NwMgmt cfg; @@ -942,7 +903,7 @@ static S16 ftmod_sigtran_nif_gen_config(void) pst.dstEnt = ENTNW; /* prepare header */ - cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.msgType = TCFG; /* message type */ cfg.hdr.entId.ent = ENTNW; /* entity */ cfg.hdr.entId.inst = 0; /* instance */ cfg.hdr.elmId.elmnt = STNWGEN; /* DLSAP */ @@ -984,11 +945,14 @@ static S16 ftmod_sigtran_nif_gen_config(void) } +/*****************************************************************************/ + /* NIF - DLSAP configuration */ -static S16 ftmod_sigtran_nif_dlsap_config(U32 id) +static int ftmod_nif_dlsap_config(int id) { Pst pst; NwMgmt cfg; + sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id]; memset((U8 *)&cfg, 0, sizeof(NwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -998,7 +962,7 @@ static S16 ftmod_sigtran_nif_dlsap_config(U32 id) pst.dstEnt = ENTNW; /* prepare header */ - cfg.hdr.msgType = TCFG; /* message type */ + cfg.hdr.msgType = TCFG; /* message type */ cfg.hdr.entId.ent = ENTNW; /* entity */ cfg.hdr.entId.inst = 0; /* instance */ cfg.hdr.elmId.elmnt = STNWDLSAP; /* DLSAP */ @@ -1009,42 +973,10 @@ static S16 ftmod_sigtran_nif_dlsap_config(U32 id) cfg.hdr.response.route = RTESPEC; cfg.hdr.response.mem.region = S_REG; cfg.hdr.response.mem.pool = S_POOL; - -#if 0 - switch(id) - { - case 0: - { - cfg.t.cfg.s.dlSapCfg.suId = 0; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 0; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = 0; /* ACC_DLSAP_0 */ - break; - } - case 1: - { - cfg.t.cfg.s.dlSapCfg.suId = 1; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 1; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = /* TODO */1; /* ACC_DLSAP_0 */ - break; - } - case 2: - { - cfg.t.cfg.s.dlSapCfg.suId = 2; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 2; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = /* TODO */ 2; /* ACC_DLSAP_0 */ - break; - } - - default: - break; - - } -#endif - - cfg.t.cfg.s.dlSapCfg.suId = 1; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = 1; /*ACC_DLSAP_0 */ - cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = 1; /* TODO */ /* ACC_DLSAP_0 */ - + cfg.t.cfg.s.dlSapCfg.suId = nif->id; + cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb = nif->m2uaLnkNmb; + cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb = nif->mtp2LnkNmb; + cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.selector = 0; cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.region = S_REG; cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.pool = S_POOL; @@ -1072,54 +1004,7 @@ static S16 ftmod_sigtran_nif_dlsap_config(U32 id) return (sng_cfg_nif (&pst, &cfg)); } -static U32 ftmod_atoi(S8 *str) -{ - U32 idx = 0; - U32 value = 0; - - while(str[idx] != '\0') - { - value = (10 * value) + (str[idx] - '0'); - idx++; - } - return(value); -} - -static U32 ftmod_parse_conv_ipaddr(S8 *ptr) -{ - - U32 ipAddr = 0; - U32 idx = 0; - U32 tmpCnt = 0; - U32 len_ipAddr = 0; - S8 tmpStr[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; - - len_ipAddr = strlen(ptr); - - idx = 0; - tmpCnt = 0; - while(idx < len_ipAddr) - { - if( ptr[idx] != '.' ) - { - tmpStr[tmpCnt++] = ptr[idx]; - } - else - { - tmpStr[tmpCnt] = '\0'; - ipAddr |= ftmod_atoi(tmpStr); - ipAddr <<= 8; - tmpCnt = 0; - } - idx++; - } - - tmpStr[tmpCnt] = '\0'; - ipAddr |= ftmod_atoi(tmpStr); - - return(ipAddr); -} - +/*****************************************************************************/ uint32_t iptoul(const char *ip) { char i,*tmp; @@ -1144,78 +1029,85 @@ uint32_t iptoul(const char *ip) } return (uint32_t)val; } - /***********************************************************************************************************************/ int ftmod_ss7_m2ua_start(void){ + int x=0; +/***********************************************************************************************************************/ + /* Enable DEBUGs*/ + ftmod_m2ua_enable_debug(); + ftmod_tucl_enable_debug(); - S16 ret = 0x00; - - /* Send a control request to bind the TSAP between SCTP and TUCL */ - if( (ret = ftmod_sigtran_tsap_bnd()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"\nControl request to bind TSAP of SCTP and TUCL : NOT OK\n"); - return 1; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"\nControl request to bind TSAP of SCTP and TUCL: OK\n"); - } +/***********************************************************************************************************************/ + for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED)) { - /* Send a control request to bind the SCTSAP between SCTP and M2UA */ - if( (ret = ftmod_sigtran_sctsap_bnd()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"Control request to bind SCTSAP of M2UA and SCTP : NOT OK\n"); - return 1; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"Control request to bind SCTSAP of M2UA and SCTP: OK\n"); - } + /* Send a control request to bind the TSAP between SCTP and TUCL */ + if(ftmod_sctp_tucl_tsap_bind(x)) { + ftdm_log (FTDM_LOG_ERROR ,"\nControl request to bind TSAP[%d] of SCTP and TUCL : NOT OK\n", x); + return 1; + } else { + ftdm_log (FTDM_LOG_INFO ,"\nControl request to bind TSAP[%d] of SCTP and TUCL: OK\n", x); + } + } + } - /* Send a control request to bind the DLSAP between NIF, M2UA and MTP-2 - for(idx = 0; idx < 3; idx++) */ - { - if( (ret = ftmod_sigtran_dlsap_bnd(1)) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP between NIF and M2UA: NOT OK\n"); - return 1; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP between NIF and M2UA : OK\n"); - } +/***********************************************************************************************************************/ + /* Send a control request to bind the SCTSAP between SCTP and M2UA */ + for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) { + if(ftmod_m2ua_sctp_sctsap_bind(x)) { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind SCTSAP[%d] of M2UA and SCTP : NOT OK\n", x); + return 1; + } else { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind SCTSAP[%d] of M2UA and SCTP: OK\n", x); + } + } + }/* END - M2UA Interfaces for loop*/ +/***********************************************************************************************************************/ - if( (ret = ftmod_ss7_dlsap_bnd(0x01)) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP between NIF and MTP2 : NOT OK\n"); - return 1; - } - else - { - ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP between NIF and MTP2 : OK\n"); - } - } + for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_CONFIGURED)) { + /* Send a control request to bind the DLSAP between NIF, M2UA and MTP-2 */ + if(ftmod_nif_m2ua_dlsap_bind(x)) { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP[%d] between NIF and M2UA: NOT OK\n", x); + return 1; + }else { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP[%d] between NIF and M2UA : OK\n", x); + } + if(ftmod_nif_mtp2_dlsap_bind(x)) { + ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP[%d] between NIF and MTP2: NOT OK\n", x); + return 1; + }else { + ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP[%d] between NIF and MTP2 : OK\n", x); + } + } + }/* END - NIF Interfaces for loop*/ - /* Send a control request to open endpoint */ - if( (ret = ftmod_sigtran_open_endpoint()) != ROK) - { - ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_open_endpoint FAIL \n"); - return 1; - } - else - { - ftdm_log (FTDM_LOG_ERROR ,"ftmod_sigtran_open_endpoint SUCCESS \n"); - } +/***********************************************************************************************************************/ - return 0; + for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) { + if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) { + /* Send a control request to open endpoint */ + if(ftmod_open_endpoint(x)) { + ftdm_log (FTDM_LOG_ERROR ,"ftmod_open_endpoint FAIL \n"); + return 1; + }else { + ftdm_log (FTDM_LOG_INFO ,"ftmod_open_endpoint SUCCESS \n"); + } + } + } + + return 0; } +/***********************************************************************************************************************/ -static S16 ftmod_sigtran_open_endpoint(void) +static int ftmod_open_endpoint(int id) { Pst pst; MwMgmt cntrl; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1239,17 +1131,18 @@ static S16 ftmod_sigtran_open_endpoint(void) cntrl.t.cntrl.action = AMWENDPOPEN; - cntrl.t.cntrl.s.suId = 0; /* M2UA sct sap Id */ + cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */ return (sng_cntrl_m2ua (&pst, &cntrl)); } -static S16 ftmod_sigtran_tsap_bnd(void) +/***********************************************************************************************************************/ +static int ftmod_sctp_tucl_tsap_bind(int id) { - Pst pst; SbMgmt cntrl; + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(SbMgmt)); @@ -1273,16 +1166,17 @@ static S16 ftmod_sigtran_tsap_bnd(void) cntrl.hdr.response.mem.pool = S_POOL; cntrl.t.cntrl.action = ABND_ENA; - cntrl.t.cntrl.sapId = 1; /* SCT sap id configured at SCTP layer */ + cntrl.t.cntrl.sapId = k->id; /* SCT sap id configured at SCTP layer */ return (sng_cntrl_sctp (&pst, &cntrl)); - } +/***********************************************************************************************************************/ -static S16 ftmod_sigtran_sctsap_bnd(void) +static int ftmod_m2ua_sctp_sctsap_bind(int id) { Pst pst; MwMgmt cntrl; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1304,19 +1198,18 @@ static S16 ftmod_sigtran_sctsap_bnd(void) cntrl.hdr.response.mem.region = S_REG; cntrl.hdr.response.mem.pool = S_POOL; - cntrl.t.cntrl.action = ABND; - cntrl.t.cntrl.s.suId = 0; /* M2UA sct sap Id */ + cntrl.t.cntrl.s.suId = m2ua->id; return (sng_cntrl_m2ua (&pst, &cntrl)); } - - -static S16 ftmod_sigtran_dlsap_bnd(U32 id) +/***********************************************************************************************************************/ +static int ftmod_nif_m2ua_dlsap_bind(int id) { Pst pst; NwMgmt cntrl; + sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(NwMgmt)); @@ -1326,7 +1219,7 @@ static S16 ftmod_sigtran_dlsap_bnd(U32 id) pst.dstEnt = ENTNW; /* prepare header */ - cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.msgType = TCNTRL; /* message type */ cntrl.hdr.entId.ent = ENTNW; /* entity */ cntrl.hdr.entId.inst = 0; /* instance */ cntrl.hdr.elmId.elmnt = STNWDLSAP; /* General */ @@ -1339,27 +1232,29 @@ static S16 ftmod_sigtran_dlsap_bnd(U32 id) cntrl.hdr.response.mem.pool = S_POOL; cntrl.t.cntrl.action = ABND; - cntrl.t.cntrl.suId = id; /* NIF DL sap Id */ + cntrl.t.cntrl.suId = nif->id; /* NIF DL sap Id */ cntrl.t.cntrl.entity = ENTMW; /* M2UA */ return (sng_cntrl_nif (&pst, &cntrl)); } -static S16 ftmod_ss7_dlsap_bnd(U32 id) +/***********************************************************************************************************************/ +static int ftmod_nif_mtp2_dlsap_bind(int id) { - Pst pst; - NwMgmt cntrl; + Pst pst; + NwMgmt cntrl; + sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id]; - memset((U8 *)&pst, 0, sizeof(Pst)); - memset((U8 *)&cntrl, 0, sizeof(NwMgmt)); + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(NwMgmt)); - smPstInit(&pst); + smPstInit(&pst); - pst.dstEnt = ENTNW; + pst.dstEnt = ENTNW; - /* prepare header */ - cntrl.hdr.msgType = TCNTRL; /* message type */ + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ cntrl.hdr.entId.ent = ENTNW; /* entity */ cntrl.hdr.entId.inst = 0; /* instance */ cntrl.hdr.elmId.elmnt = STNWDLSAP; /* General */ @@ -1372,8 +1267,73 @@ static S16 ftmod_ss7_dlsap_bnd(U32 id) cntrl.hdr.response.mem.pool = S_POOL; cntrl.t.cntrl.action = ABND; - cntrl.t.cntrl.suId = id; /* NIF DL sap Id */ - cntrl.t.cntrl.entity = ENTSD; /* MTP2 */ + cntrl.t.cntrl.suId = nif->id; /* NIF DL sap Id */ + cntrl.t.cntrl.entity = ENTSD; /* MTP2 */ return (sng_cntrl_nif (&pst, &cntrl)); + } + +/***********************************************************************************************************************/ +static int ftmod_m2ua_enable_debug() +{ + Pst pst; + MwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.subAction = SADBG; + cntrl.t.cntrl.s.dbgMask = 0xFFFF; + + return (sng_cntrl_m2ua (&pst, &cntrl)); +} +/***********************************************************************************************************************/ +static int ftmod_tucl_enable_debug() +{ + Pst pst; + HiMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(HiMngmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTHI; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTHI; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.subAction = SADBG; + cntrl.t.cntrl.ctlType.hiDbg.dbgMask = 0xFFFF; + + return (sng_cntrl_tucl (&pst, &cntrl)); +} +/***********************************************************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index db13a1635b..9eb727ea02 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -61,7 +61,7 @@ typedef struct sng_m2ua_cfg{ uint32_t id; /* ID */ uint8_t nodeType; /*Node Type SG/ASP */ uint16_t sctpId; /* idx to sctp profile */ - uint16_t peerdId; /* idx to m2ua_peer profile */ + uint16_t peerId; /* idx to m2ua_peer profile */ uint16_t clusterId; /* idx to m2ua_cluster profile */ }sng_m2ua_cfg_t; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 333f616628..96f3cafc97 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -258,9 +258,9 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) /**********************************************************************/ } else if (!strcasecmp(parm->var, "peerd_id")) { /**********************************************************************/ - sng_m2ua.peerdId=atoi(parm->val); + sng_m2ua.peerId=atoi(parm->val); - SS7_DEBUG("Found an m2ua peerd_id = %d\n", sng_m2ua.peerdId); + SS7_DEBUG("Found an m2ua peerd_id = %d\n", sng_m2ua.peerId); /**********************************************************************/ } else if (!strcasecmp(parm->var, "cluster_id")) { /**********************************************************************/ @@ -298,7 +298,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].id = m2ua_iface->id; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].nodeType = m2ua_iface->nodeType; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].sctpId = m2ua_iface->sctpId; - g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerdId = m2ua_iface->peerdId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerId = m2ua_iface->peerId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; return 0; From 889a0be2b3fa9ccb6a02af5a8a1b8b800d2f37b6 Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 30 May 2012 16:41:31 +0530 Subject: [PATCH 203/493] issue fix --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 96f3cafc97..9d47a33dbb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -447,7 +447,7 @@ static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_ g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].locOutStrms = m2ua_peer_iface->locOutStrms; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].numDestAddr = m2ua_peer_iface->numDestAddr; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].sctpId = m2ua_peer_iface->sctpId; - for (k=1; k<=m2ua_peer_iface->numDestAddr; k++) { + for (k=0; knumDestAddr; k++) { g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k]; } From f1f78a86537bad866a6eb70bdee20fa1a52acb9e Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 30 May 2012 20:20:58 +0530 Subject: [PATCH 204/493] adding m2ua stack free code while unloading freetdm module --- .../ftmod_sangoma_ss7_logger.c | 5 + .../ftmod_sangoma_ss7_m2ua.c | 137 ++++++++++++++++++ .../ftmod_sangoma_ss7_m2ua.h | 1 + .../ftmod_sangoma_ss7_main.c | 4 + 4 files changed, 147 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 5a6cc31907..922200629f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -870,6 +870,11 @@ void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta) /* To print the event specific information */ switch(sta->t.usta.alarm.event) { + case LMW_EVENT_ENDPOPEN_OK: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ENDPOPEN_OK: \n"); + break; + } case LMW_EVENT_ESTABLISH_OK: { ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ESTABLISH_OK Event raised on peerId[%d]\n",sta->t.usta.s.peerId); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index f7836ed629..39e9bba658 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -64,10 +64,114 @@ static int ftmod_nif_m2ua_dlsap_bind(int id); static int ftmod_nif_mtp2_dlsap_bind(int id); static int ftmod_m2ua_enable_debug(void); static int ftmod_tucl_enable_debug(void); +static int ftmod_sctp_enable_debug(void); + +static int ftmod_ss7_sctp_shutdown(void); +static int ftmod_ss7_m2ua_shutdown(void); +static int ftmod_ss7_tucl_shutdown(void); ftdm_status_t sng_m2ua_init(void); ftdm_status_t sng_m2ua_cfg(void); +/******************************************************************************/ +void ftmod_ss7_m2ua_free() +{ + ftmod_ss7_m2ua_shutdown(); + ftmod_ss7_sctp_shutdown(); + ftmod_ss7_tucl_shutdown(); + + sng_isup_free_m2ua(); + sng_isup_free_sctp(); + sng_isup_free_tucl(); +} +/******************************************************************************/ +static int ftmod_ss7_tucl_shutdown() +{ + Pst pst; + HiMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(HiMngmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTHI; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTHI; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ASHUTDOWN; + + return (sng_cntrl_tucl (&pst, &cntrl)); +} +/******************************************************************************/ +static int ftmod_ss7_m2ua_shutdown() +{ + Pst pst; + MwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ASHUTDOWN; + + return (sng_cntrl_m2ua (&pst, &cntrl)); +} +/***********************************************************************************************************************/ +static int ftmod_ss7_sctp_shutdown() +{ + Pst pst; + SbMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(SbMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTSB; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTSB; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STSBGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ASHUTDOWN; + + return (sng_cntrl_sctp (&pst, &cntrl)); +} + /******************************************************************************/ ftdm_status_t ftmod_ss7_m2ua_cfg(void) @@ -1036,6 +1140,7 @@ int ftmod_ss7_m2ua_start(void){ /***********************************************************************************************************************/ /* Enable DEBUGs*/ + ftmod_sctp_enable_debug(); ftmod_m2ua_enable_debug(); ftmod_tucl_enable_debug(); @@ -1275,6 +1380,38 @@ static int ftmod_nif_mtp2_dlsap_bind(int id) } /***********************************************************************************************************************/ +static int ftmod_sctp_enable_debug() +{ + Pst pst; + SbMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(SbMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTSB; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTSB; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STSBGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.subAction = SADBG; + cntrl.t.cntrl.dbgMask = 0xFFFF; + + return (sng_cntrl_sctp (&pst, &cntrl)); +} +/***********************************************************************************************************************/ + static int ftmod_m2ua_enable_debug() { Pst pst; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 9eb727ea02..a988b9c8db 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -118,6 +118,7 @@ int ftmod_ss7_parse_sctp_links(ftdm_conf_node_t *node); uint32_t iptoul(const char *ip); int ftmod_ss7_m2ua_start(void); +void ftmod_ss7_m2ua_free(void); ftdm_status_t ftmod_ss7_m2ua_cfg(void); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index dbb1c1974c..90202d3989 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -2687,6 +2687,10 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload) sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED); } + if(SNG_SS7_OPR_MODE_ISUP != g_ftdm_operating_mode){ + ftmod_ss7_m2ua_free(); + } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED)) { sng_isup_free_sm(); From e05bd3fae8ed8edaddee6271b3d246a16a0b4234 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 30 May 2012 13:10:04 -0400 Subject: [PATCH 205/493] Some changes to ss7 variables to be more consistent --- libs/freetdm/mod_freetdm/mod_freetdm.c | 9 ++++----- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 9 +++++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 430ace829f..e889d1ebba 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1554,6 +1554,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_ocn_pres", sipvar); } + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-IAM-FWD-IND-HEX"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_iam_fwd_ind_hex", sipvar); + } } if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) { @@ -1594,11 +1598,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_set_calling_party_category(var, (uint8_t *)&caller_data.cpc); } - if ((var = channel_get_variable(session, var_event, "iam_fwd_ind_HEX"))) { - ftdm_usrmsg_add_var(&usrmsg, "iam_fwd_ind_HEX", var); - } - - if (!zstr(dest)) { ftdm_set_string(caller_data.dnis.digits, dest); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 39134f9925..b2edc2b497 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -993,7 +993,7 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * fwdCallInd->sccpMethInd.pres = PRSNT_NODEF; fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_HEX"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_fwd_ind_hex"); if (!ftdm_strlen_zero(val)) { uint16_t val_hex = 0; if (four_char_to_hex (val, &val_hex) == FTDM_FAIL) { @@ -1028,7 +1028,12 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * fwdCallInd->isdnUsrPrtInd.val = ISUP_USED; fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW; - val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_isdn_access_ind"); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_fwd_ind_isdn_access_ind"); + if (ftdm_strlen_zero(val)) { + /* Kept for backward compatibility */ + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "iam_fwd_ind_isdn_access_ind"); + } + if (!ftdm_strlen_zero(val)) { acc_val = (int)atoi(val); } From a7ac272595e16542ca1218aab61da66c8d6b1263 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 31 May 2012 17:31:06 +0530 Subject: [PATCH 206/493] adding MEGACO Stack STOP/SHUTDOWN code --- src/mod/endpoints/mod_megaco/megaco.c | 8 +- src/mod/endpoints/mod_megaco/megaco_stack.c | 225 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/megaco_stack.h | 1 + 3 files changed, 231 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c index 84bf70963b..b73eaefec0 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -45,7 +45,7 @@ static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t r goto done; } - /* iterate through MG Interface list to build all MG profiles */ + /* iterate through MG Interface list to build requested MG profile */ for (mg_interface = switch_xml_child(mg_interfaces, "sng_mg_interface"); mg_interface; mg_interface = mg_interface->next) { const char *name = switch_xml_attr_soft(mg_interface, "name"); @@ -161,9 +161,11 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) switch_thread_rwlock_wrlock((*profile)->rwlock); - /* TODO: Kapil: Insert stack per-interface shutdown code here */ + /* stop MEGACP stack */ + if(SWITCH_STATUS_FALSE == sng_mgco_stop((*profile)->name)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error stopping MEGACO Stack for profile %s\n", (*profile)->name); + } - switch_thread_rwlock_unlock((*profile)->rwlock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopped profile: %s\n", (*profile)->name); diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 4ba2cd05f6..86d1f80268 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -29,6 +29,11 @@ int mgco_mg_tsap_enable_cntrl(int idx); int mgco_mg_ssap_cntrl(int idx); int mgco_mu_ssap_cntrl(int idx); int mgco_mg_tpt_server(int idx); +int sng_mgco_tucl_shutdown(); +int sng_mgco_mg_shutdown(); +int sng_mgco_mg_ssap_stop(int sapId); +int sng_mgco_mg_tpt_server_stop(int idx); +int sng_mgco_mg_app_ssap_stop(int idx); switch_status_t sng_mgco_stack_gen_cfg(); @@ -86,6 +91,12 @@ switch_status_t sng_mgco_init(sng_isup_event_interface_t* event) /*****************************************************************************************************************/ switch_status_t sng_mgco_stack_shutdown() { + /* shutdown MG */ + sng_mgco_mg_shutdown(); + + /* shutdown TUCL */ + sng_mgco_tucl_shutdown(); + /* free MEGACO Application */ sng_isup_free_mu(); @@ -258,6 +269,159 @@ switch_status_t sng_mgco_start(const char* profilename) } /*****************************************************************************************************************/ + +switch_status_t sng_mgco_stop(const char* profilename) +{ + int idx = 0x00; + sng_mg_cfg_t* mgCfg = NULL; + + switch_assert(profilename); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Stopping MG stack for idx[%d] against profilename[%s]\n", idx, profilename); + + mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + + /* MG STOP is as good as deleting that perticular mg(virtual mg instance) data from megaco stack */ + /* currently we are not supporting enable/disable MG stack */ + + if(sng_mgco_mg_ssap_stop(mgCfg->id)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " sng_mgco_mg_ssap_stop FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " sng_mgco_mg_ssap_stop SUCCESS \n"); + } + + if(sng_mgco_mg_tpt_server_stop(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " sng_mgco_mg_tpt_server_stop FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " sng_mgco_mg_tpt_server_stop SUCCESS \n"); + } + + if(sng_mgco_mg_app_ssap_stop(idx)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " sng_mgco_mg_app_ssap_stop FAILED \n"); + return SWITCH_STATUS_FALSE; + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " sng_mgco_mg_app_ssap_stop SUCCESS \n"); + } + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************/ +int sng_mgco_mg_app_ssap_stop(int idx) +{ + MuMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MuCntrl *cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + cntrl = &(mgMngmt.t.cntrl); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMU; + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSSAP; + mgMngmt.hdr.elmId.elmntInst1 = GET_MU_SAP_ID(idx); + + cntrl->action = ADEL; + cntrl->subAction = SAELMNT; + + return(sng_cntrl_mu(&pst, &mgMngmt)); +} +/*****************************************************************************************************************/ + +int sng_mgco_mg_ssap_stop(int sapId) +{ + Pst pst; + MgMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MgCntrl)); + + smPstInit(&pst); + + pst.dstEnt = ENTMG; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMG; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STSSAP; /* SSAP */ + cntrl.hdr.elmId.elmntInst1 = sapId; /* sap id */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ADEL; + cntrl.t.cntrl.subAction = SAELMNT; + cntrl.t.cntrl.spId = sapId; + return (sng_cntrl_mg (&pst, &cntrl)); +} + +/*****************************************************************************************************************/ +int sng_mgco_mg_tpt_server_stop(int idx) +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl *cntrl; + MgTptCntrl *tptCntrl = &mgMngmt.t.cntrl.s.tptCntrl; + CmInetIpAddr ipAddr = 0; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + + cntrl = &(mgMngmt.t.cntrl); + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + + tptCntrl->transportType = GET_TPT_TYPE(idx); + + tptCntrl->serverAddr.type = CM_INET_IPV4ADDR_TYPE; + tptCntrl->serverAddr.u.ipv4TptAddr.port = mgCfg->port; + if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + { + tptCntrl->serverAddr.u.ipv4TptAddr.address = ntohl(ipAddr); + } + + /*fill in the specific fields of the header */ + mgMngmt.hdr.msgType = TCNTRL; + mgMngmt.hdr.entId.ent = ENTMG; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STSERVER; + + cntrl->action = ADEL; + cntrl->subAction = SAELMNT; + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} +/*****************************************************************************************************************/ + int mgco_mg_tsap_bind_cntrl(int idx) { MgMngmt mgMngmt; @@ -962,3 +1126,64 @@ int mgco_mg_tpt_server_config(int idx) } /******************************************************************************/ +int sng_mgco_tucl_shutdown() +{ + Pst pst; + HiMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(HiMngmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTHI; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTHI; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ASHUTDOWN; + + return (sng_cntrl_tucl (&pst, &cntrl)); +} +/******************************************************************************/ +int sng_mgco_mg_shutdown() +{ + Pst pst; + MgMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MgCntrl)); + + smPstInit(&pst); + + pst.dstEnt = ENTMG; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMG; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = ASHUTDOWN; + cntrl.t.cntrl.subAction = SAELMNT; + + return (sng_cntrl_mg (&pst, &cntrl)); +} +/******************************************************************************/ + + diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index 24cf6e26ca..e7ef56db49 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -108,6 +108,7 @@ void handle_tucl_alarm(Pst *pst, HiMngmt *sta); switch_status_t sng_mgco_init(sng_isup_event_interface_t* event); switch_status_t sng_mgco_cfg(const char* profilename); switch_status_t sng_mgco_start(const char* profilename); +switch_status_t sng_mgco_stop(const char* profilename); switch_status_t sng_mgco_stack_shutdown(void); /*****************************************************************************************************/ From 529e7fd24a7db5708d201b454549985f8be5eca5 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 31 May 2012 18:36:10 +0530 Subject: [PATCH 207/493] adding code to make "version" as configurable parameter --- .../endpoints/mod_megaco/conf/megaco.conf.xml | 5 +++-- src/mod/endpoints/mod_megaco/megaco_stack.c | 16 +++++++++++++++- src/mod/endpoints/mod_megaco/megaco_stack.h | 1 + src/mod/endpoints/mod_megaco/megaco_xml.c | 11 +++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml index d386e055a9..e21ab3a074 100644 --- a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml +++ b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml @@ -5,8 +5,9 @@ + - + @@ -35,7 +36,7 @@ - + diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 86d1f80268..d650aaa48a 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -917,7 +917,21 @@ int mgco_mg_ssap_config(int idx) pCfg->mwdTimer = (U16)10; pCfg->minMgcoVersion = LMG_VER_PROF_MGCO_H248_1_0; - pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_3_0; + switch(mgCfg->protocol_version) + { + case 1: + pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_1_0; + break; + case 2: + pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_2_0; + break; + case 3: + pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_3_0; + break; + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol version[%d] \n",mgCfg->protocol_version); + return SWITCH_STATUS_FALSE; + } pCfg->userInfo.pres.pres = PRSNT_NODEF; pCfg->userInfo.id.pres = NOTPRSNT; diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index e7ef56db49..64ef1f1ff2 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -76,6 +76,7 @@ typedef struct sng_mg_cfg{ uint8_t my_domain[MAX_DOMAIN_LEN]; /* local domain name */ uint8_t my_ipaddr[MAX_DOMAIN_LEN]; /* local domain name */ uint32_t port; /* port */ + uint16_t protocol_version; /* Protocol supported version */ uint16_t peer_id; /* MGC Peer ID */ uint16_t transport_prof_id; /* Transport profile id ..this also will be the spId for MG SAP*/ uint16_t protocol_type; /* MEGACO/MGCP */ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index e7addf5875..a886546b9b 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -46,6 +46,17 @@ switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface protocol[%d] \n", megaco_globals.g_mg_cfg.mgCfg[i].protocol_type); /********************************************************************************************/ + }else if(!strcasecmp(var, "version")){ + /********************************************************************************************/ + megaco_globals.g_mg_cfg.mgCfg[i].protocol_version = atoi(val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface protocol version[%s] \n",val); + if((megaco_globals.g_mg_cfg.mgCfg[i].protocol_version < 1) + || (megaco_globals.g_mg_cfg.mgCfg[i].protocol_version > 3)) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol version[%s] , Supported values are [1/2/3] \n",val); + return SWITCH_STATUS_FALSE; + } + /********************************************************************************************/ }else if(!strcasecmp(var, "transportProfileId")){ /********************************************************************************************/ megaco_globals.g_mg_cfg.mgCfg[i].transport_prof_id = atoi(val); From a16ee3618732b26ec4c6bb89718056f8422d3121 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 31 May 2012 20:20:51 +0530 Subject: [PATCH 208/493] adding code to handle TUCL/MEGACO Status(Alarm) Indication from MEGACO Stack --- src/mod/endpoints/mod_megaco/megaco_stack.c | 474 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/mod_megaco.c | 10 - 2 files changed, 474 insertions(+), 10 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index d650aaa48a..516d857ec9 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -1199,5 +1199,479 @@ int sng_mgco_mg_shutdown() return (sng_cntrl_mg (&pst, &cntrl)); } /******************************************************************************/ +void handle_mg_alarm(Pst *pst, MgMngmt *usta) +{ + U16 ret; + int len = 0x00; + char prBuf[10024]; + memset(&prBuf[0], 0, sizeof(prBuf)); + + len = len + sprintf(prBuf+len,"MG Status Indication: received with Category = %d, Event = %d, Cause = %d \n", + usta->t.usta.alarm.category, usta->t.usta.alarm.event, + usta->t.usta.alarm.cause); + + len = len + sprintf(prBuf+len, "Category ( "); + + switch (usta->t.usta.alarm.category) + { + case LCM_CATEGORY_PROTOCOL: + { + len = len + sprintf(prBuf+len, "protocol related "); + break; + } + case LCM_CATEGORY_INTERFACE: + { + len = len + sprintf(prBuf+len, "interface related "); + break; + } + case LCM_CATEGORY_INTERNAL: + { + len = len + sprintf(prBuf+len, "internal "); + break; + } + case LCM_CATEGORY_RESOURCE: + { + len = len + sprintf(prBuf+len, "system resources related "); + break; + } + case LCM_CATEGORY_PSF_FTHA: + { + len = len + sprintf(prBuf+len, "fault tolerance / high availability PSF related "); + break; + } + case LCM_CATEGORY_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP related "); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown: %d", (int)(usta->t.usta.alarm.category)); + break; + } + } + len = len + sprintf(prBuf+len, ") "); + + len = len + sprintf(prBuf+len, " Event ( "); + switch (usta->t.usta.alarm.event) + { + case LMG_EVENT_TSAP_RECVRY_SUCCESS: + { + len = len + sprintf(prBuf+len, "TSAP recovery success"); + break; + } + case LMG_EVENT_TSAP_RECVRY_FAILED: + { + len = len + sprintf(prBuf+len, "TSAP recovery failed"); + break; + } + case LCM_EVENT_UI_INV_EVT: + { + len = len + sprintf(prBuf+len, "upper interface invalid event"); + break; + } + case LCM_EVENT_LI_INV_EVT: + { + len = len + sprintf(prBuf+len, "lower interface invalid event"); + break; + } + case LCM_EVENT_PI_INV_EVT: + { + len = len + sprintf(prBuf+len, "peer interface invalid event"); + break; + } + case LCM_EVENT_INV_EVT: + { + len = len + sprintf(prBuf+len, "general invalid event"); + break; + } + case LCM_EVENT_INV_STATE: + { + len = len + sprintf(prBuf+len, "invalid internal state"); + break; + } + case LCM_EVENT_INV_TMR_EVT: + { + len = len + sprintf(prBuf+len, "invalid timer event"); + break; + } + case LCM_EVENT_MI_INV_EVT: + { + len = len + sprintf(prBuf+len, "management interface invalid event"); + break; + } + case LCM_EVENT_BND_FAIL: + { + len = len + sprintf(prBuf+len, "bind failure"); + break; + } + case LCM_EVENT_NAK: + { + len = len + sprintf(prBuf+len, "destination nack"); + break; + } + case LCM_EVENT_TIMEOUT: + { + len = len + sprintf(prBuf+len, "timeout"); + break; + } + case LCM_EVENT_BND_OK: + { + len = len + sprintf(prBuf+len, "bind ok"); + break; + } + case LCM_EVENT_SMEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "static memory allocation failed"); + break; + } + case LCM_EVENT_DMEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "dynamic mmemory allocation failed"); + break; + } + case LCM_EVENT_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP specific"); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown event %d", (int)(usta->t.usta.alarm.event)); + break; + } + case LMG_EVENT_HIT_BNDCFM: + { + len = len + sprintf(prBuf+len, "HIT bind confirm"); + break; + } + case LMG_EVENT_HIT_CONCFM: + { + len = len + sprintf(prBuf+len, "HIT connect confirm"); + break; + } + case LMG_EVENT_HIT_DISCIND: + { + len = len + sprintf(prBuf+len, "HIT disconnect indication"); + break; + } + case LMG_EVENT_HIT_UDATIND: + { + len = len + sprintf(prBuf+len, "HIT unit data indication"); + break; + } + case LMG_EVENT_MGT_BNDREQ: + { + len = len + sprintf(prBuf+len, "MGT bind request"); + break; + } + case LMG_EVENT_PEER_CFG_FAIL: + { + len = len + sprintf(prBuf+len, "Peer Configuration Failed"); + break; + } + case LMG_EVENT_MGT_UBNDREQ: + { + len = len + sprintf(prBuf+len, "MGT unbind request"); + break; + } + case LMG_EVENT_MGT_MGCPTXNREQ: + { + len = len + sprintf(prBuf+len, "MGT MGCP transaction request"); + break; + } + case LMG_EVENT_MGT_MGCPTXNIND: + { + len = len + sprintf(prBuf+len, "MGT MGCP transaction indication"); + break; + } + + case LMG_EVENT_PEER_ENABLED: + { + len = len + sprintf(prBuf+len, "gateway enabled"); + break; + } + case LMG_EVENT_PEER_DISCOVERED: + { + len = len + sprintf(prBuf+len, "gateway discovered , notified entity"); + break; + } + case LMG_EVENT_PEER_REMOVED: + { + len = len + sprintf(prBuf+len, "gateway removed"); + break; + } + case LMG_EVENT_RES_CONG_ON: + { + len = len + sprintf(prBuf+len, "resource congestion ON"); + break; + } + case LMG_EVENT_RES_CONG_OFF: + { + len = len + sprintf(prBuf+len, "resource congestion OFF"); + break; + } + case LMG_EVENT_TPTSRV: + { + len = len + sprintf(prBuf+len, "transport service"); + break; + } + case LMG_EVENT_SSAP_ENABLED: + { + len = len + sprintf(prBuf+len, "SSAP enabled"); + break; + } + case LMG_EVENT_NS_NOT_RESPONDING: + { + len = len + sprintf(prBuf+len, "name server not responding"); + break; + } + case LMG_EVENT_TPT_FAILED: + { + len = len + sprintf(prBuf+len, "transport failure"); + break; + } + } + + len = len + sprintf(prBuf+len, " ) "); + + len = len + sprintf(prBuf+len, " cause ( "); + switch (usta->t.usta.alarm.cause) + { + case LCM_CAUSE_UNKNOWN: + { + len = len + sprintf(prBuf+len, "unknown"); + break; + } + case LCM_CAUSE_OUT_OF_RANGE: + { + len = len + sprintf(prBuf+len, "out of range"); + break; + } + case LCM_CAUSE_INV_SAP: + { + len = len + sprintf(prBuf+len, "NULL/unknown sap"); + break; + } + case LCM_CAUSE_INV_SPID: + { + len = len + sprintf(prBuf+len, "invalid service provider"); + break; + } + case LCM_CAUSE_INV_SUID: + { + len = len + sprintf(prBuf+len, "invalid service user"); + break; + } + case LCM_CAUSE_INV_NETWORK_MSG: + { + len = len + sprintf(prBuf+len, "invalid network message"); + break; + } + case LCM_CAUSE_DECODE_ERR: + { + len = len + sprintf(prBuf+len, "message decoding problem"); + break; + } + case LCM_CAUSE_USER_INITIATED: + { + len = len + sprintf(prBuf+len, "user initiated"); + break; + } + case LCM_CAUSE_MGMT_INITIATED: + { + len = len + sprintf(prBuf+len, "management initiated"); + break; + } + case LCM_CAUSE_INV_STATE: /* cause and event! */ + { + len = len + sprintf(prBuf+len, "invalid state"); + break; + } + case LCM_CAUSE_TMR_EXPIRED: /* cause and event! */ + { + len = len + sprintf(prBuf+len, "timer expired"); + break; + } + case LCM_CAUSE_INV_MSG_LENGTH: + { + len = len + sprintf(prBuf+len, "invalid message length"); + break; + } + case LCM_CAUSE_PROT_NOT_ACTIVE: + { + len = len + sprintf(prBuf+len, "protocol layer not active"); + break; + } + case LCM_CAUSE_INV_PAR_VAL: + { + len = len + sprintf(prBuf+len, "invalid parameter value"); + break; + } + case LCM_CAUSE_NEG_CFM: + { + len = len + sprintf(prBuf+len, "negative confirmation"); + break; + } + case LCM_CAUSE_MEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "memory allocation failure"); + break; + } + case LCM_CAUSE_HASH_FAIL: + { + len = len + sprintf(prBuf+len, "hashing failure"); + break; + } + case LCM_CAUSE_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP specific"); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown %d", (int)(usta->t.usta.alarm.cause)); + break; + } + case LMG_CAUSE_TPT_FAILURE: /* make up your mind - cause or event? */ + { + len = len + sprintf(prBuf+len, "transport failure"); + break; + } + case LMG_CAUSE_NS_NOT_RESPONDING: + { + len = len + sprintf(prBuf+len, "name server not responding"); + break; + } + } + len = len + sprintf(prBuf+len, " ) "); + + len = len + sprintf(prBuf+len, " Alarm parameters ( "); + ret = smmgGetAlarmInfoField(&usta->t.usta); + switch (ret) + { + case SMMG_UNKNOWNFIELD: + { + len = len + sprintf(prBuf+len, "invalid "); + + break; + } + case SMMG_PEERINFO: + { + /* + * Invoke the new function for printing the MgPeerInfo & + * delete all print code here + */ + smmgPrntPeerInfo(&(usta->t.usta.alarmInfo.u.peerInfo)); + break; + } + case SMMG_SAPID: + { + len = len + sprintf(prBuf+len, "SAP ID %d\n", (int)(usta->t.usta.alarmInfo.u.sapId)); + break; + } + case SMMG_MEM: + { + len = len + sprintf(prBuf+len, "memory region %d pool %d\n", + (int)(usta->t.usta.alarmInfo.u.mem.region), + (int)(usta->t.usta.alarmInfo.u.mem.pool)); + + break; + } + case SMMG_SRVSTA: + { + smmgPrntSrvSta(&usta->t.usta.alarmInfo.u.srvSta); + break; + } + case SMMG_PEERSTA: + { + smmgPrntPeerSta(&usta->t.usta.alarmInfo.u.peerSta); + break; + } + case SMMG_SSAPSTA: + { + smmgPrntSsapSta(&usta->t.usta.alarmInfo.u.ssapSta); + break; + } + case SMMG_PARID: + { + len = len + sprintf(prBuf+len, "parameter type: "); + switch (usta->t.usta.alarmInfo.u.parId.parType) + { + case LMG_PAR_TPTADDR: len = len + sprintf(prBuf+len, "transport address"); break; + case LMG_PAR_MBUF: len = len + sprintf(prBuf+len, "message buffer"); break; + case LMG_PAR_CHOICE: len = len + sprintf(prBuf+len, "choice"); break; + case LMG_PAR_SPID: len = len + sprintf(prBuf+len, "spId"); break; + default: len = len + sprintf(prBuf+len, "unknown"); break; + } + + len = len + sprintf(prBuf+len, ", value %d\n", + (int)(usta->t.usta.alarmInfo.u.parId.u.sapId)); + + break; + } + case SMMG_NOT_APPL: + { + len = len + sprintf(prBuf+len, "not applicable\n"); + break; + } + + /*TODO*/ + } + len = len + sprintf(prBuf+len, " ) "); + len = len + sprintf(prBuf+len, " \n "); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s \n", prBuf); +} + +/*****************************************************************************************************************************/ +void handle_tucl_alarm(Pst *pst, HiMngmt *sta) +{ + /* To print the general information */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Recieved a status indication from TUCL layer \n\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Category = %d , event = %d , cause = %d\n", + sta->t.usta.alarm.category, + sta->t.usta.alarm.event, sta->t.usta.alarm.cause); + + switch(sta->t.usta.alarm.event) + { + case LCM_EVENT_INV_EVT: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LCM_EVENT_INV_EVT with type (%d)\n\n", + sta->t.usta.info.type); + break; + } + case LHI_EVENT_BNDREQ: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LHI_EVENT_BNDREQ with type (%d) spId (%d)\n\n", + sta->t.usta.info.type, sta->t.usta.info.spId); + break; + } + case LHI_EVENT_SERVOPENREQ: + case LHI_EVENT_DATREQ: + case LHI_EVENT_UDATREQ: + case LHI_EVENT_CONREQ: + case LHI_EVENT_DISCREQ: +#if(defined(HI_TLS) && defined(HI_TCP_TLS)) + case LHI_EVENT_TLS_ESTREQ: +#endif + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: partype (%d) type(%d)\n\n", + sta->t.usta.info.inf.parType, sta->t.usta.info.type); + break; + } + case LCM_EVENT_DMEM_ALLOC_FAIL: + case LCM_EVENT_SMEM_ALLOC_FAIL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " [HI_USTA]: MEM_ALLOC_FAIL with region(%d) pool (%d) type(%d)\n\n", + sta->t.usta.info.inf.mem.region, sta->t.usta.info.inf.mem.pool, + sta->t.usta.info.type); + break; + } + default: + break; + } + +} /* handle_sng_tucl_alarm */ +/******************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index 332392c59a..3d9dc26b8d 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -209,16 +209,6 @@ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason } /*****************************************************************************************************************************/ -void handle_mg_alarm(Pst *pst, MgMngmt *sta) -{ - /*TODO*/ -} - -/*****************************************************************************************************************************/ -void handle_tucl_alarm(Pst *pst, HiMngmt *sta) -{ - /*TODO*/ -} /*****************************************************************************************************************************/ From bac3b3bd365f1e58df7ce93e9d35888669a9d1dd Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 1 Jun 2012 20:35:38 +0530 Subject: [PATCH 209/493] adding status CLI command to fetch peer/sap/transport-server information from Trillium MEGACO stack. --- src/mod/endpoints/mod_megaco/megaco_stack.c | 138 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/megaco_stack.h | 3 + src/mod/endpoints/mod_megaco/mod_megaco.c | 10 +- 3 files changed, 150 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 516d857ec9..e5572c19ef 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -1675,3 +1675,141 @@ void handle_tucl_alarm(Pst *pst, HiMngmt *sta) } /* handle_sng_tucl_alarm */ /******************************************************************************/ +int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx) +{ + Pst pst; + MgMngmt cntrl; + sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[mg_cfg_idx]; + sng_mg_peer_t* mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + CmInetIpAddr ipAddr = 0; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MgCntrl)); + + smPstInit(&pst); + + pst.dstEnt = ENTMG; + + /* prepare header */ + /*cntrl.hdr.msgType = TCNTRL; */ /* message type */ + cntrl.hdr.entId.ent = ENTMG; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = elemId; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + switch(elemId) + { + case STGCPENT: + { + cntrl.t.ssta.s.mgPeerSta.peerId.pres = PRSNT_NODEF; + cntrl.t.ssta.s.mgPeerSta.peerId.val = mgCfg->peer_id; + + cntrl.t.ssta.s.mgPeerSta.mid.pres = PRSNT_NODEF; + cntrl.t.ssta.s.mgPeerSta.mid.len = strlen((char*)mgPeer->mid); + cmMemcpy((U8 *)cntrl.t.ssta.s.mgPeerSta.mid.val, + (CONSTANT U8*)(char*)mgPeer->mid, + cntrl.t.ssta.s.mgPeerSta.mid.len); + break; + } + case STSSAP: + { + cntrl.t.ssta.s.mgSSAPSta.sapId = mgCfg->id; + break; + } + case STTSAP: + { + cntrl.t.ssta.s.mgTSAPSta.tSapId = GET_TPT_ID(mg_cfg_idx); + break; + } + case STSERVER: + { + cntrl.t.ssta.s.mgTptSrvSta.tptAddr.type = CM_INET_IPV4ADDR_TYPE; + cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port = ntohl(ipAddr); + if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + { + cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address = ntohl(ipAddr); + } + + + break; + } + default: + break; + } + + return (sng_sta_mg (&pst, &cntrl, cfm)); +} +/******************************************************************************/ +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char prntBuf[1024]; + + switch_assert(profilename); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ + + /* Fetch data from Trillium MEGACO Stack * + * SystemId - Software version information * + * SSAP - MG SAP Information * + * TSAP - MG Transport SAP Information * + * Peer - MG Peer Information * + * TPT-Server - MG Transport Server information * + */ + +#if 0 + /* get System ID */ + sng_mgco_mg_get_status(STSID, &cfm, idx); + stream->write_function(stream, "***********************************************\n"); + stream->write_function(stream, "**** TRILLIUM MEGACO Software Information *****\n"); + stream->write_function(stream, "Version = %d \n", cfm.t.ssta.s.systemId.mVer); + stream->write_function(stream, "Version Revision = %d \n", cfm.t.ssta.s.systemId.mRev); + stream->write_function(stream, "Branch Version = %d \n", cfm.t.ssta.s.systemId.bVer); + stream->write_function(stream, "Branch Revision = %d \n", cfm.t.ssta.s.systemId.bRev); + stream->write_function(stream, "Part Number = %d \n", cfm.t.ssta.s.systemId.ptNmb); + stream->write_function(stream, "***********************************************\n"); +#endif + + /* MG Peer Information */ + sng_mgco_mg_get_status(STGCPENT, &cfm, idx); + smmgPrntPeerSta(&cfm.t.ssta.s.mgPeerSta); + + /* MG Peer Information */ + sng_mgco_mg_get_status(STSSAP, &cfm, idx); + smmgPrntSsapSta(&cfm.t.ssta.s.mgSSAPSta); + + /* MG Transport SAP Information */ + sng_mgco_mg_get_status(STTSAP, &cfm, idx); + len = len + sprintf(prntBuf+len,"***********************************************\n"); + len = len + sprintf(prntBuf+len,"**********MG TRANSPORT SAP Information**********\n"); + len = len + sprintf(prntBuf+len,"TSAP status:\n"); + len = len + sprintf(prntBuf+len,"state = %d, number of listeners %u\n", + (int)(cfm.t.ssta.s.mgTSAPSta.state), + (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); + len = len + sprintf(prntBuf+len,"***********************************************\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"%s\n",prntBuf); + + /* MG Transport Server Information */ + sng_mgco_mg_get_status(STSERVER, &cfm, idx); + smmgPrntSrvSta(&cfm.t.ssta.s.mgTptSrvSta); + + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index 64ef1f1ff2..d8a1b55e47 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -84,6 +84,7 @@ typedef struct sng_mg_cfg{ typedef struct sng_mg_gbl_cfg{ + int num_of_mg_profiles; sng_mg_cfg_t mgCfg[MAX_MG_PROFILES + 1]; sng_mg_transport_profile_t mgTptProf[MG_MAX_PEERS+1]; /* transport profile */ sng_mg_peers_t mgPeer; @@ -111,6 +112,8 @@ switch_status_t sng_mgco_cfg(const char* profilename); switch_status_t sng_mgco_start(const char* profilename); switch_status_t sng_mgco_stop(const char* profilename); switch_status_t sng_mgco_stack_shutdown(void); +int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx); +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); /*****************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index 3d9dc26b8d..7bc6320df9 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -16,7 +16,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop]" +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status]" SWITCH_STANDARD_API(megaco_function) { int argc; @@ -56,6 +56,13 @@ SWITCH_STANDARD_API(megaco_function) } else { stream->write_function(stream, "-ERR No such profile\n"); } + }else if(!strcmp(argv[2], "status")) { + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_status(stream, profile->name); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } } } @@ -115,6 +122,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); From cffe95a97881ae62f23e0278ae6490a98fcb9f8b Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 4 Jun 2012 17:23:33 +0530 Subject: [PATCH 210/493] adding "xmlstatus" CLI command to dump MEGACO Stack data --- src/mod/endpoints/mod_megaco/megaco_stack.c | 275 ++++++++++++++++++++ src/mod/endpoints/mod_megaco/megaco_stack.h | 1 + src/mod/endpoints/mod_megaco/megaco_xml.c | 2 + src/mod/endpoints/mod_megaco/mod_megaco.c | 11 +- 4 files changed, 288 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index e5572c19ef..f3a2015016 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -37,6 +37,8 @@ int sng_mgco_mg_app_ssap_stop(int idx); switch_status_t sng_mgco_stack_gen_cfg(); +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); + /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -1764,6 +1766,7 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char return SWITCH_STATUS_FALSE; } + /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ /* Fetch data from Trillium MEGACO Stack * @@ -1813,3 +1816,275 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char* xmlhdr = ""; + char prntBuf[10024]; + sng_mg_cfg_t* mgCfg = NULL; + sng_mg_peer_t* mgPeer = NULL; + int i = 0x00; + + switch_assert(profilename); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + GET_MG_CFG_IDX(profilename, idx); + + if(!idx || (idx == MAX_MG_PROFILES)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + + mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + + + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); + + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mgCfg->name); + len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); +/****************************************************************************************************************/ +/* Print Peer Information ***************************************************************************************/ + + /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n",mgPeer->name); + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, idx); + + get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + + +/****************************************************************************************************************/ +/* Print MG SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + + /* MG SAP Information */ + sng_mgco_mg_get_status(STSSAP, &cfm, idx); + + len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + for (i = 0; i < cfm.t.ssta.s.mgSSAPSta.numAssocPeer; i++) + { + len = len + sprintf(&prntBuf[0] + len,"\n"); + if(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.namePres.pres == PRSNT_NODEF) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.name)); + } + switch(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.type) + { + case CM_NETADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "%lu\n", (long unsigned int)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr)); + break; + } + default: + len = len + sprintf(prntBuf+len, "invalid type \n"); + break; + } + +#ifdef GCP_MGCO + if (PRSNT_NODEF == cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.val)); + } +#endif /* GCP_MGCO */ + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + len = len + sprintf(&prntBuf[0] + len,"\n"); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + /* MG Transport SAP Information */ + sng_mgco_mg_get_status(STTSAP, &cfm, idx); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTSAPSta.state)); + len = len + sprintf(&prntBuf[0] + len," %u \n", (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport Server Information ***************************************************************************************/ + + if(sng_mgco_mg_get_status(STSERVER, &cfm, idx)){ + len = len + sprintf(&prntBuf[0] + len," no established server found \n"); + } + else { + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTptSrvSta.state)); + len = len + sprintf(prntBuf+len, ""); + + switch (cfm.t.ssta.s.mgTptSrvSta.tptAddr.type) + { + case CM_TPTADDR_NOTPRSNT: + { + len = len + sprintf(prntBuf+len, "none"); + break; + } + case CM_TPTADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "IPv4 IP address #%lu, port %u", + (unsigned long)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address), + (unsigned int)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port)); + + break; + } + default: + len = len + sprintf(prntBuf+len, "unknown"); + break; + } + len = len + sprintf(prntBuf+len, "\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + +/****************************************************************************************************************/ + len = len + sprintf(&prntBuf[0] + len,"\n"); + + stream->write_function(stream, "\n%s\n",&prntBuf[0]); + + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ + +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) +{ + int len = 0x00; + int i = 0x00; + if(PRSNT_NODEF == cfm->namePres.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm->name)); + } + else + { + len = len + sprintf(prntBuf+len, " Not Present \n"); + } + + /* + * Print all IP addresses in the IP addr table + */ + for(i=0; ipeerAddrTbl.count; i++) + { + switch (cfm->peerAddrTbl.netAddr[i].type) + { + case CM_NETADDR_IPV4: + { + len = len + sprintf(prntBuf+len, "%lu\n", (unsigned long) + (cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr)); + break; + } + case CM_NETADDR_IPV6: + { + char ipv6_buf[128]; + int len1= 0; + int j = 0; + memset(&ipv6_buf[0], 0, sizeof(ipv6_buf)); + len1 = len1 + sprintf(ipv6_buf+len1, "IP V6 address : %2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[0])); + + for (j = 1; j < CM_IPV6ADDR_SIZE; j++) + { + len1 = len1 + sprintf(ipv6_buf+len1, ":%2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[j])); + } + len1 = len1 + sprintf(ipv6_buf+len1, "\n"); + len = len + sprintf(prntBuf+len, "%s\n", ipv6_buf); + break; + } + default: + { + len = len + sprintf(prntBuf+len, " Invalid address type[%d]\n", cfm->peerAddrTbl.netAddr[i].type); + break; + } + } + } /* End of for */ + + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendOgTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendIcTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->rttEstimate)); + + switch(cfm->protocol) + { + case LMG_PROTOCOL_MGCP: + len = len + sprintf(prntBuf+len," MGCP \n"); + break; + + case LMG_PROTOCOL_MGCO: + len = len + sprintf(prntBuf+len," MEGACO \n"); + break; + + case LMG_PROTOCOL_NONE: + len = len + sprintf(prntBuf+len," MGCP/MEGACO \n"); + break; + + default: + len = len + sprintf(prntBuf+len," invalid \n"); + break; + } + + switch(cfm->transportType) + { + case LMG_TPT_UDP: + len = len + sprintf(prntBuf+len, "UDP\n"); + break; + + case LMG_TPT_TCP: + len = len + sprintf(prntBuf+len, "TCP\n"); + break; + + case LMG_TPT_NONE: + len = len + sprintf(prntBuf+len, "UDP/TCP\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } +#ifdef GCP_MGCO + switch(cfm->encodingScheme) + { + case LMG_ENCODE_BIN: + len = len + sprintf(prntBuf+len, "BINARY\n"); + break; + + case LMG_ENCODE_TXT: + len = len + sprintf(prntBuf+len, "TEXT\n"); + break; + + case LMG_ENCODE_NONE: + len = len + sprintf(prntBuf+len, "TEXT/BINARY\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } + + if(LMG_VER_PROF_MGCO_H248_1_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "1.0 \n"); + } else if(LMG_VER_PROF_MGCO_H248_2_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "2.0 \n"); + }else if(LMG_VER_PROF_MGCO_H248_3_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "3.0 \n"); + } else{ + len = len + sprintf(prntBuf+len, "invalid \n"); + } +#endif + +} diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index d8a1b55e47..8e1bc12bc1 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -114,6 +114,7 @@ switch_status_t sng_mgco_stop(const char* profilename); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx); switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); /*****************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index a886546b9b..23ff23468d 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -225,6 +225,8 @@ switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) } } + strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].name[0], prof_name); + megaco_globals.g_mg_cfg.mgPeer.total_peer++; return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index 7bc6320df9..f8fa65a8ee 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -16,7 +16,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status]" +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" SWITCH_STANDARD_API(megaco_function) { int argc; @@ -63,7 +63,15 @@ SWITCH_STANDARD_API(megaco_function) } else { stream->write_function(stream, "-ERR No such profile\n"); } + }else if(!strcmp(argv[2], "xmlstatus")) { + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_xmlstatus(stream, profile->name); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } } + } goto done; @@ -123,6 +131,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); From d914d99abe39f813d7dc6525d083aea7d314c820 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 4 Jun 2012 17:29:07 +0530 Subject: [PATCH 211/493] fixing typo error --- src/mod/endpoints/mod_megaco/megaco_stack.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index f3a2015016..5036797ddb 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -1877,10 +1877,10 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numServers)); - len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); for (i = 0; i < cfm.t.ssta.s.mgSSAPSta.numAssocPeer; i++) { - len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); if(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.namePres.pres == PRSNT_NODEF) { len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.name)); @@ -1903,9 +1903,9 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.val)); } #endif /* GCP_MGCO */ - len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); } - len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); len = len + sprintf(&prntBuf[0] + len,"\n"); From 67373e787dff34a649163b9d258047956637a377 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 4 Jun 2012 22:48:12 +0530 Subject: [PATCH 212/493] fixing ip address cli print --- src/mod/endpoints/mod_megaco/megaco_stack.c | 22 ++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 5036797ddb..74874e75d5 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -1205,7 +1205,7 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) { U16 ret; int len = 0x00; - char prBuf[10024]; + char prBuf[3048]; memset(&prBuf[0], 0, sizeof(prBuf)); @@ -1826,6 +1826,8 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c sng_mg_cfg_t* mgCfg = NULL; sng_mg_peer_t* mgPeer = NULL; int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; switch_assert(profilename); @@ -1845,7 +1847,6 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); - len = len + sprintf(&prntBuf[0] + len,"\n"); len = len + sprintf(&prntBuf[0] + len,"%s\n",mgCfg->name); len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); @@ -1889,7 +1890,9 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c { case CM_NETADDR_IPV4: { - len = len + sprintf(prntBuf+len, "%lu\n", (long unsigned int)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr)); + ip = ntohl(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); break; } default: @@ -1939,8 +1942,9 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c } case CM_TPTADDR_IPV4: { - len = len + sprintf(prntBuf+len, "IPv4 IP address #%lu, port %u", - (unsigned long)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address), + ip = ntohl(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "IPv4 IP address #%s, port %u",asciiAddr, (unsigned int)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port)); break; @@ -1967,6 +1971,9 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) { int len = 0x00; int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + if(PRSNT_NODEF == cfm->namePres.pres) { len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm->name)); @@ -1985,8 +1992,9 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) { case CM_NETADDR_IPV4: { - len = len + sprintf(prntBuf+len, "%lu\n", (unsigned long) - (cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr)); + ip = ntohl(cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); break; } case CM_NETADDR_IPV6: From 117cbc1bf5e157982f6dc9d304f287e3b24b9d2f Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 4 Jun 2012 22:52:26 +0530 Subject: [PATCH 213/493] adding SCTP status CLI command --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 255 +++++++++++++++- .../ftmod_sangoma_ss7_m2ua.c | 283 +++++++++++++++--- .../ftmod_sangoma_ss7_m2ua.h | 15 +- .../ftmod_sangoma_ss7_m2ua_xml.c | 19 ++ .../ftmod_sangoma_ss7_main.h | 13 + 5 files changed, 536 insertions(+), 49 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index df872b260c..cfcfafac7b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -119,6 +119,9 @@ static ftdm_status_t cli_ss7_show_all_channels_of_span(ftdm_stream_handle_t *str static ftdm_status_t cli_ss7_show_span_by_id(ftdm_stream_handle_t *stream, char *span_id); static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream); static ftdm_status_t cli_ss7_show_all_spans_detail(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream); +int get_assoc_resp_buf(char* buf,SbMgmt* cfm); /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -383,6 +386,15 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha } else if (!strcasecmp(argv[c], "procid")) { /**********************************************************************/ handle_show_procId(stream); + + /**********************************************************************/ + } else if (!strcasecmp(argv[c], "m2ua")) { + /**********************************************************************/ + handle_show_m2ua(stream); + /**********************************************************************/ + } else if (!strcasecmp(argv[c], "sctp")) { + /**********************************************************************/ + handle_show_sctp(stream); /**********************************************************************/ } else { /**********************************************************************/ @@ -831,6 +843,13 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 show relay\n"); stream->write_function(stream, "\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 M2UA status:\n"); + stream->write_function(stream, "ftdm ss7 show sctp \n"); + stream->write_function(stream, "ftdm ss7 show sctp \n"); + stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "\n"); + stream->write_function(stream, "\n"); return FTDM_SUCCESS; @@ -2717,20 +2736,22 @@ static ftdm_status_t cli_ss7_show_general(ftdm_stream_handle_t *stream) stream->write_function(stream, "MTP2 status: \n"); cli_ss7_show_all_mtp2link(stream); - stream->write_function(stream, "\nMTP3 status: \n"); - cli_ss7_show_all_mtp3link(stream); + if(SNG_SS7_OPR_MODE_M2UA_SG != g_ftdm_operating_mode){ + stream->write_function(stream, "\nMTP3 status: \n"); + cli_ss7_show_all_mtp3link(stream); - stream->write_function(stream, "\nMTP3 linkset status: \n"); - cli_ss7_show_all_linkset(stream); + stream->write_function(stream, "\nMTP3 linkset status: \n"); + cli_ss7_show_all_linkset(stream); #if 0 - stream->write_function(stream, "\nMTP3 link route status: \n"); + stream->write_function(stream, "\nMTP3 link route status: \n"); - stream->write_function(stream, "\nISUP status: \n"); + stream->write_function(stream, "\nISUP status: \n"); #endif - stream->write_function(stream, "\nRelay status: \n"); - cli_ss7_show_all_relay(stream); + stream->write_function(stream, "\nRelay status: \n"); + cli_ss7_show_all_relay(stream); + } return FTDM_SUCCESS; } @@ -2947,6 +2968,224 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream return FTDM_FAIL; } +/******************************************************************************/ +static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream) +{ + /*char* xmlhdr = "";*/ + + /*iterate through all the m2ua links and prints all information */ + + return FTDM_FAIL; + +} +/******************************************************************************/ +static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int len = 0x00; + SbMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(SbMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + len = len + sprintf(buf + len, "\n"); + + if(ftmod_sctp_ssta_req(STSBGEN, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbAssoc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbEndp); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbLocalAddr); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbPeerAddr); + len = len + sprintf(buf + len, "\n"); + } + +#ifdef LSB12 + if(ftmod_sctp_ssta_req(STSBTMR, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.lifetimeTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.ackDelayTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.cookieTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.keyTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.freezeTmr); +#ifdef LSB4 + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.bundleTmr); +#endif + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t1InitTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t2ShutdownTmr); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.hbeat); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.t3rtx); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.tmrSta.tIntTmr); + } + +#endif + + + /*iterate through all the sctp links and prints all information */ + x = 1; + while(x\n"); + + if(ftmod_sctp_ssta_req(STSBSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + get_assoc_resp_buf(buf + len, &cfm); + len = len + sprintf(buf + len, "\n"); + } + + /* TODO - STSBDTA */ + + len = len + sprintf(buf + len, "\n"); + } + x++; + } + + len = len + sprintf(buf + len, "\n"); + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; +} + +int get_assoc_resp_buf(char* buf,SbMgmt* cfm) +{ + int len = 0x00; + int idx = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.assocId); + len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState)); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstPort); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcPort); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstNAddrLst.nmb); + for(idx =0; idx < cfm->t.ssta.s.assocSta.dstNAddrLst.nmb; idx++) + { + len = len + sprintf(buf + len, " \n"); + len = len + sprintf(buf + len, " %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].type)); + if(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n",asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.dstNAddrLst.nAddr[idx].u.ipv6NetAddr); + } + len = len + sprintf(buf + len, " \n"); + } + + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcNAddrLst.nmb); + for(idx =0; idx < cfm->t.ssta.s.assocSta.srcNAddrLst.nmb; idx++) + { + len = len + sprintf(buf + len, " \n"); + len = len + sprintf(buf + len, " %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].type)); + if(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n", asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.srcNAddrLst.nAddr[idx].u.ipv6NetAddr); + } + len = len + sprintf(buf + len, " \n"); + } + + len = len + sprintf(buf + len, "\n %s \n", PRNT_CM_ADDR_TYPE(cfm->t.ssta.s.assocSta.priNAddr.type)); + + if(cfm->t.ssta.s.assocSta.priNAddr.type == CM_IPV4ADDR_TYPE) + { + ip = ntohl(cfm->t.ssta.s.assocSta.priNAddr.u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(buf + len, " %s \n",asciiAddr); + } + else + { + len = len + sprintf(buf + len, " %s \n", cfm->t.ssta.s.assocSta.priNAddr.u.ipv6NetAddr); + } + +#ifdef LSB11 + /* TODO - this flag is not enable as of now.. so later on will convert below prints to XML tags */ + len = len + sprintf(buf + len, " The number of unsent datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUnsentDgms); + len = len + sprintf(buf + len, " The number of unack datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUnackDgms); + len = len + sprintf(buf + len, " The number of undelivered datagrams : %d\n", cfm->t.ssta.s.assocSta.nmbUndelDgms); + len = len + sprintf(buf + len, " The number of retransmissions count : %d\n", cfm->t.ssta.s.assocSta.rtxCnt); + len = len + sprintf(buf + len, " The receive window size is: %d\n\n", cfm->t.ssta.s.assocSta.SctWinSize); + for(idx =0; idx < LSB_MAX_TMRS ; idx++) + { + len = len + sprintf(buf + len, " %d) Timer state is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].state); + len = len + sprintf(buf + len, " %d) Timer value is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].tmrVal); + len = len + sprintf(buf + len, " %d) No of paths is %d\n", idx, cfm->t.ssta.s.assocSta.tmr[idx].numPaths); + for(idx1 =0; idx1 < cfm->t.ssta.s.assocSta.tmr[idx].numPaths; idx1++) + { + if( cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.type == CM_IPV4ADDR_TYPE) + { + len = len + sprintf(buf + len, " %d) the local Addr is %d\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.u.ipv4NetAddr); + } + else + { + len = len + sprintf(buf + len, " %d) the local Addr is %s\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].localAddr.u.ipv6NetAddr); + } + + if( cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.type == CM_IPV4ADDR_TYPE) + { + len = len + sprintf(buf + len, " %d) the peer Addr is %d\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.u.ipv4NetAddr); + } + else + { + len = len + sprintf(buf + len, " %d) the peer Addr is %s\n", idx1, + cfm->t.ssta.s.assocSta.tmr[idx].path[idx1].peerAddr.u.ipv6NetAddr); + } + } /* Loop for paths */ + } /* Loop for timers */ +#endif + + return len; +} + +/******************************************************************************/ + /******************************************************************************/ /* For Emacs: * Local Variables: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 39e9bba658..9730bc2df2 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -60,6 +60,7 @@ static int ftmod_nif_dlsap_config(int idx); static int ftmod_sctp_tucl_tsap_bind(int idx); static int ftmod_m2ua_sctp_sctsap_bind(int idx); static int ftmod_open_endpoint(int idx); +static int ftmod_init_sctp_assoc(int peer_id); static int ftmod_nif_m2ua_dlsap_bind(int id); static int ftmod_nif_mtp2_dlsap_bind(int id); static int ftmod_m2ua_enable_debug(void); @@ -76,13 +77,18 @@ ftdm_status_t sng_m2ua_cfg(void); /******************************************************************************/ void ftmod_ss7_m2ua_free() { - ftmod_ss7_m2ua_shutdown(); - ftmod_ss7_sctp_shutdown(); - ftmod_ss7_tucl_shutdown(); - - sng_isup_free_m2ua(); - sng_isup_free_sctp(); - sng_isup_free_tucl(); + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_STARTED)) { + ftmod_ss7_m2ua_shutdown(); + sng_isup_free_m2ua(); + } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_STARTED)) { + ftmod_ss7_sctp_shutdown(); + sng_isup_free_sctp(); + } + if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_STARTED)) { + ftmod_ss7_tucl_shutdown(); + sng_isup_free_tucl(); + } } /******************************************************************************/ static int ftmod_ss7_tucl_shutdown() @@ -186,6 +192,12 @@ ftdm_status_t ftmod_ss7_m2ua_cfg(void) return FTDM_FAIL; } + /* SET STARTED FLAGS */ + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_NIF_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_STARTED); + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_STARTED); + return FTDM_SUCCESS; } @@ -1145,8 +1157,10 @@ int ftmod_ss7_m2ua_start(void){ ftmod_tucl_enable_debug(); /***********************************************************************************************************************/ - for (x=1; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0; x++) { - if (!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED)) { + x = 1; + while(xid; /* M2UA sct sap Id */ + cntrl.t.cntrl.action = AMWENDPOPEN; + cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */ - return (sng_cntrl_m2ua (&pst, &cntrl)); + return (sng_cntrl_m2ua (&pst, &cntrl)); +} +/***********************************************************************************************************************/ +static int ftmod_init_sctp_assoc(int peer_id) +{ + + Pst pst; + MwMgmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTMW; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STMWPEER; /* General */ + cntrl.hdr.transId = 1; /* transaction identifier */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + + cntrl.t.cntrl.action = AMWESTABLISH; + /*cntrl.t.cntrl.s.suId = 1;*/ + + cntrl.t.cntrl.s.peerId = (MwPeerId) peer_id; + + return (sng_cntrl_m2ua (&pst, &cntrl)); } /***********************************************************************************************************************/ @@ -1474,3 +1554,132 @@ static int ftmod_tucl_enable_debug() return (sng_cntrl_tucl (&pst, &cntrl)); } /***********************************************************************************************************************/ + +/***********************************************************************************************************************/ +int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm) +{ + SbMgmt ssta; + Pst pst; + sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id]; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(SbMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTSB; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTSB; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + ssta.hdr.elmId.elmnt = elemt; /* STSBGEN */ /* Others are STSBTSAP, STSBSCTSAP, STSBASSOC, STSBDTA, STSBTMR */ + ssta.hdr.transId = 1; /* transaction identifier */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + if((ssta.hdr.elmId.elmnt == STSBSCTSAP) || (ssta.hdr.elmId.elmnt == STSBTSAP)) + { + ssta.t.ssta.sapId = k->id; /* SapId */ + } + if(ssta.hdr.elmId.elmnt == STSBASSOC) + { + ssta.t.ssta.s.assocSta.assocId = 0; /* association id */ + } + return(sng_sta_sctp(&pst,&ssta,cfm)); +} + +#if 0 +int ftmod_m2ua_ssta_req(int elemt) +{ + MwMgmt ssta; + MwMgmt cfm; + Pst pst; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(MwMgmt)); + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTMW; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTMW; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + ssta.hdr.elmId.elmnt = elemt; /*STMWGEN */ /* Others are STMWSCTSAP, STMWCLUSTER, STMWPEER,STMWSID, STMWDLSAP */ + ssta.hdr.transId = 1; /* transaction identifier */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + switch(ssta.hdr.elmId.elmnt) + { + case STMWSCTSAP: + { + ssta.t.ssta.id.suId = 0 ; /* lower sap Id */ + break; + } + case STMWDLSAP: + { + ssta.t.ssta.id.lnkNmb = 0 ; /* upper sap Id */ + break; + } + case STMWPEER: + { + ssta.t.ssta.id.peerId = 1 ; /* peer Id */ + break; + } + case STMWCLUSTER: + { + ssta.t.ssta.id.clusterId = 1 ; /* cluster Id */ + break; + } + default: + break; + } + + return(sng_sta_m2ua(&pst,&ssta,&cfm)); +} + +int ftmod_nif_ssta_req(int elemt) +{ + NwMgmt ssta; + NwMgmt cfm; + Pst pst; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&ssta, 0, sizeof(NwMgmt)); + memset((U8 *)&cfm, 0, sizeof(NwMgmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTNW; + + /* prepare header */ + ssta.hdr.msgType = TSSTA; /* message type */ + ssta.hdr.entId.ent = ENTNW; /* entity */ + ssta.hdr.entId.inst = 0; /* instance */ + + ssta.hdr.response.selector = 0; + ssta.hdr.response.prior = PRIOR0; + ssta.hdr.response.route = RTESPEC; + ssta.hdr.response.mem.region = S_REG; + ssta.hdr.response.mem.pool = S_POOL; + + if(ssta.hdr.elmId.elmnt == STNWDLSAP) + { + ssta.t.ssta.suId = 0; /* Lower sapId */ + } + + return(sng_sta_nif(&pst,&ssta,&cfm)); +} +#endif diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index a988b9c8db..a14db63189 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -75,6 +75,7 @@ typedef struct sng_m2ua_peer_cfg{ uint16_t sctpId; /* idx to sctp profile */ uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ uint16_t locOutStrms; /*Number of outgoing streams supported by this association*/ + int init_sctp_assoc; /* flag to tell if we need to initiate SCTP association */ }sng_m2ua_peer_cfg_t; typedef enum{ @@ -103,10 +104,10 @@ typedef struct sng_m2ua_cluster_cfg{ }sng_m2ua_cluster_cfg_t; typedef struct sng_m2ua_gbl_cfg{ - sng_nif_cfg_t nif[MW_MAX_NUM_OF_INTF]; - sng_m2ua_cfg_t m2ua[MW_MAX_NUM_OF_INTF]; - sng_m2ua_peer_cfg_t m2ua_peer[MW_MAX_NUM_OF_PEER]; - sng_m2ua_cluster_cfg_t m2ua_clus[MW_MAX_NUM_OF_CLUSTER]; + sng_nif_cfg_t nif[MW_MAX_NUM_OF_INTF+1]; + sng_m2ua_cfg_t m2ua[MW_MAX_NUM_OF_INTF+1]; + sng_m2ua_peer_cfg_t m2ua_peer[MW_MAX_NUM_OF_PEER+1]; + sng_m2ua_cluster_cfg_t m2ua_clus[MW_MAX_NUM_OF_CLUSTER+1]; }sng_m2ua_gbl_cfg_t; /* m2ua xml parsing APIs */ @@ -122,5 +123,11 @@ void ftmod_ss7_m2ua_free(void); ftdm_status_t ftmod_ss7_m2ua_cfg(void); +int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm); +#if 0 +int ftmod_m2ua_ssta_req(int elemt); +int ftmod_nif_ssta_req(int elemt); +#endif + #endif /*__FTMOD_SNG_SS7_M2UA_H__*/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 9d47a33dbb..a3785cc01d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -165,6 +165,8 @@ static int ftmod_ss7_fill_in_nif_interface(sng_nif_cfg_t *nif_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].m2uaLnkNmb = nif_iface->m2uaLnkNmb; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[i].mtp2LnkNmb = nif_iface->mtp2LnkNmb; + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_NIF_PRESENT); + return 0; } @@ -300,6 +302,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].sctpId = m2ua_iface->sctpId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerId = m2ua_iface->peerId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_PRESENT); return 0; } @@ -413,6 +416,19 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter SS7_DEBUG("Found an sng_m2ua_peer loc_out_strms = %d\n", sng_m2ua_peer.locOutStrms); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "init_sctp_assoc")) { + /**********************************************************************/ + if(!strcasecmp(parm->val, "TRUE")){ + sng_m2ua_peer.init_sctp_assoc = 0x01; + } else if(!strcasecmp(parm->val, "FALSE")){ + sng_m2ua_peer.init_sctp_assoc = 0x00; + } else { + SS7_ERROR("Found an invalid init_sctp_assoc Parameter Value[%s]\n", parm->val); + return FTDM_FAIL; + } + + SS7_DEBUG("Found an sng_m2ua_peer init_sctp_assoc = %d\n", sng_m2ua_peer.init_sctp_assoc); + /**********************************************************************/ } else { /**********************************************************************/ SS7_ERROR("Found an invalid parameter %s!\n", parm->var); @@ -447,6 +463,7 @@ static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_ g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].locOutStrms = m2ua_peer_iface->locOutStrms; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].numDestAddr = m2ua_peer_iface->numDestAddr; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].sctpId = m2ua_peer_iface->sctpId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].init_sctp_assoc = m2ua_peer_iface->init_sctp_assoc; for (k=0; knumDestAddr; k++) { g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k]; } @@ -687,6 +704,8 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) for (i=1; i<=t_link.numSrcAddr; i++) { g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].srcAddrList[i] = t_link.srcAddrList[i]; } + + sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_PRESENT); return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index fc6a6e61b5..90fb3e5b7f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -758,6 +758,19 @@ typedef enum { SNGSS7_CC_PRESENT = (1 << 12), SNGSS7_CC_STARTED = (1 << 13), + + SNGSS7_TUCL_PRESENT = (1 << 14), + SNGSS7_TUCL_STARTED = (1 << 15), + + SNGSS7_SCTP_PRESENT = (1 << 16), + SNGSS7_SCTP_STARTED = (1 << 17), + + SNGSS7_M2UA_PRESENT = (1 << 18), + SNGSS7_M2UA_STARTED = (1 << 19), + + SNGSS7_NIF_PRESENT = (1 << 20), + SNGSS7_NIF_STARTED = (1 << 21), + } sng_task_flag_t; /******************************************************************************/ From 2b5875a2586e787159bc26733f213d5b7a188bc1 Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 5 Jun 2012 17:12:16 +0530 Subject: [PATCH 214/493] adding M2UA/NIF CLI commands --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 430 +++++++++++++++++- .../ftmod_sangoma_ss7_m2ua.c | 99 ++-- .../ftmod_sangoma_ss7_m2ua.h | 6 +- 3 files changed, 472 insertions(+), 63 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index cfcfafac7b..f4399d708d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -119,8 +119,12 @@ static ftdm_status_t cli_ss7_show_all_channels_of_span(ftdm_stream_handle_t *str static ftdm_status_t cli_ss7_show_span_by_id(ftdm_stream_handle_t *stream, char *span_id); static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream); static ftdm_status_t cli_ss7_show_all_spans_detail(ftdm_stream_handle_t *stream); -static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream); -static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name); +static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name); +static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream); +static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* profile_name); int get_assoc_resp_buf(char* buf,SbMgmt* cfm); /******************************************************************************/ @@ -390,11 +394,30 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha /**********************************************************************/ } else if (!strcasecmp(argv[c], "m2ua")) { /**********************************************************************/ - handle_show_m2ua(stream); + if (check_arg_count(argc, 3)){ + handle_show_m2ua_profiles(stream); + }else{ + c++; + handle_show_m2ua_profile(stream, argv[c]); + } + /**********************************************************************/ + } else if (!strcasecmp(argv[c], "nif")) { + /**********************************************************************/ + if (check_arg_count(argc, 3)){ + handle_show_nif_profiles(stream); + }else{ + c++; + handle_show_nif_profile(stream, argv[c]); + } /**********************************************************************/ } else if (!strcasecmp(argv[c], "sctp")) { /**********************************************************************/ - handle_show_sctp(stream); + if (check_arg_count(argc, 3)){ + handle_show_sctp_profiles(stream); + }else{ + c++; + handle_show_sctp_profile(stream, argv[c]); + } /**********************************************************************/ } else { /**********************************************************************/ @@ -845,9 +868,11 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftmod_sangoma_ss7 M2UA status:\n"); stream->write_function(stream, "ftdm ss7 show sctp \n"); - stream->write_function(stream, "ftdm ss7 show sctp \n"); + stream->write_function(stream, "ftdm ss7 show sctp \n"); stream->write_function(stream, "ftdm ss7 show m2ua \n"); - stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "ftdm ss7 show nif \n"); + stream->write_function(stream, "ftdm ss7 show nif \n"); stream->write_function(stream, "\n"); stream->write_function(stream, "\n"); @@ -2969,17 +2994,222 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream } /******************************************************************************/ -static ftdm_status_t handle_show_m2ua(ftdm_stream_handle_t *stream) +static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) { - /*char* xmlhdr = "";*/ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int idx = 0x00; + int len = 0x00; + MwMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + len = len + sprintf(buf + len, "\n"); + + if(ftmod_m2ua_ssta_req(STMWGEN, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium M2UA layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbClusters); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbPeers); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbIntf); + len = len + sprintf(buf + len, "\n"); + } /*iterate through all the m2ua links and prints all information */ + x = 1; + while(x\n"); + + if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.dlSapSta.state)); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_LINK_STATE(cfm.t.ssta.s.dlSapSta.lnkState)); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.rpoEnable); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.lpoEnable); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.congLevel); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWCLUSTER,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_CLUSTER_STATE(cfm.t.ssta.s.clusterSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbPeer); + len = len + sprintf(buf + len, "\n"); + for(idx = 0; idx < cfm.t.ssta.s.clusterSta.nmbPeer; idx++) + { + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.clusterSta.peerSt[idx].peerId); + len = len + sprintf(buf + len, " %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.clusterSta.peerSt[idx].peerState)); + } + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbActPeer); + + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); + len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); + len = len + sprintf(buf + len, "\n"); + } + + len = len + sprintf(buf + len, "\n"); + } + x++; + } + + len = len + sprintf(buf + len, "\n"); + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; + +} + +static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int idx = 0x00; + int found = 0x00; + int len = 0x00; + MwMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + + /*iterate through all the m2ua links and get required profile */ + x = 1; + while(xwrite_function(stream,"Requested M2UA profile[%s] not configured\n", m2ua_profile_name); + return FTDM_FAIL; + } + + + len = len + sprintf(buf + len, "\n"); + + if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.dlSapSta.state)); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_LINK_STATE(cfm.t.ssta.s.dlSapSta.lnkState)); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.rpoEnable); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.lpoEnable); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.congLevel); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWCLUSTER,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_CLUSTER_STATE(cfm.t.ssta.s.clusterSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbPeer); + len = len + sprintf(buf + len, "\n"); + for(idx = 0; idx < cfm.t.ssta.s.clusterSta.nmbPeer; idx++) + { + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.clusterSta.peerSt[idx].peerId); + len = len + sprintf(buf + len, " %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.clusterSta.peerSt[idx].peerState)); + } + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbActPeer); + + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); + len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); + len = len + sprintf(buf + len, "\n"); + } + + len = len + sprintf(buf + len, "\n"); + + stream->write_function(stream,"\n%s\n",buf); return FTDM_FAIL; } /******************************************************************************/ -static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream) +static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; char buf[2048]; @@ -3079,7 +3309,7 @@ static ftdm_status_t handle_show_sctp(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; } int get_assoc_resp_buf(char* buf,SbMgmt* cfm) @@ -3184,6 +3414,186 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) return len; } + +static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int len = 0x00; + SbMgmt cfm; + int found = 0x00; + + memset((U8 *)&cfm, 0, sizeof(SbMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + + /*iterate through all the sctp links and prints all information */ + x = 1; + while(xwrite_function(stream,"Requested SCTP profile[%s] not configured\n", sctp_profile_name); + return FTDM_FAIL; + } + + len = len + sprintf(buf + len, "\n"); + + if(ftmod_sctp_ssta_req(STSBSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_SAP_STATE(cfm.t.ssta.s.sapSta.hlSt)); + len = len + sprintf(buf + len," %s \n", PRNT_SCTP_PROTO_SWITCH(cfm.t.ssta.s.sapSta.swtch)); + len = len + sprintf(buf + len, "\n"); + } + + if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + get_assoc_resp_buf(buf + len, &cfm); + len = len + sprintf(buf + len, "\n"); + } + + /* TODO - STSBDTA */ + + len = len + sprintf(buf + len, "\n"); + + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_SUCCESS; +} + +static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int len = 0x00; + NwMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(NwMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + len = len + sprintf(buf + len, "\n"); + + if(ftmod_nif_ssta_req(STNWGEN, 0x00, &cfm)) { + stream->write_function(stream," Request to Trillium NIF layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, "\n"); + } + + /*iterate through all the NIF links and prints all information */ + x = 1; + while(x\n"); + + if(ftmod_nif_ssta_req(STNWDLSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); + len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len, "\n"); + } + + len = len + sprintf(buf + len, "\n"); + } + x++; + } + + len = len + sprintf(buf + len, "\n"); + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; +} + +static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* nif_profile_name) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int found = 0x00; + int len = 0x00; + NwMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(NwMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + + /*iterate through all the m2ua links and get required profile */ + x = 1; + while(xwrite_function(stream,"Requested NIF profile[%s] not configured\n", nif_profile_name); + return FTDM_FAIL; + } + + + len = len + sprintf(buf + len, "\n"); + + if(ftmod_nif_ssta_req(STNWDLSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); + len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len, "\n"); + } + + len = len + sprintf(buf + len, "\n"); + + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; +} + /******************************************************************************/ /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 9730bc2df2..76db4d637e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -278,8 +278,10 @@ ftdm_status_t sng_m2ua_cfg(void) } /****************************************************************************************************/ /* M2UA SCTP SAP configurations */ - for (x=1; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0; x++) { - if (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED)) { + x = 1; + while(xclusterId]; + sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[m2ua->peerId]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&ssta, 0, sizeof(MwMgmt)); - memset((U8 *)&cfm, 0, sizeof(MwMgmt)); smPstInit(&pst); @@ -1625,40 +1631,39 @@ int ftmod_m2ua_ssta_req(int elemt) { case STMWSCTSAP: { - ssta.t.ssta.id.suId = 0 ; /* lower sap Id */ + ssta.t.ssta.id.suId = m2ua->id ; /* lower sap Id */ break; } case STMWDLSAP: { - ssta.t.ssta.id.lnkNmb = 0 ; /* upper sap Id */ + ssta.t.ssta.id.lnkNmb = id ; /* upper sap Id */ break; } case STMWPEER: { - ssta.t.ssta.id.peerId = 1 ; /* peer Id */ + ssta.t.ssta.id.peerId = peer->id ; /* peer Id */ break; } case STMWCLUSTER: { - ssta.t.ssta.id.clusterId = 1 ; /* cluster Id */ + ssta.t.ssta.id.clusterId = clust->id ; /* cluster Id */ break; } default: break; } - return(sng_sta_m2ua(&pst,&ssta,&cfm)); + return(sng_sta_m2ua(&pst,&ssta,cfm)); } -int ftmod_nif_ssta_req(int elemt) +int ftmod_nif_ssta_req(int elemt, int id, NwMgmt* cfm) { NwMgmt ssta; - NwMgmt cfm; Pst pst; + sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id]; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&ssta, 0, sizeof(NwMgmt)); - memset((U8 *)&cfm, 0, sizeof(NwMgmt)); smPstInit(&pst); @@ -1668,18 +1673,14 @@ int ftmod_nif_ssta_req(int elemt) ssta.hdr.msgType = TSSTA; /* message type */ ssta.hdr.entId.ent = ENTNW; /* entity */ ssta.hdr.entId.inst = 0; /* instance */ + ssta.hdr.elmId.elmnt = elemt; ssta.hdr.response.selector = 0; ssta.hdr.response.prior = PRIOR0; ssta.hdr.response.route = RTESPEC; ssta.hdr.response.mem.region = S_REG; ssta.hdr.response.mem.pool = S_POOL; + ssta.t.ssta.suId = nif->id; /* Lower sapId */ - if(ssta.hdr.elmId.elmnt == STNWDLSAP) - { - ssta.t.ssta.suId = 0; /* Lower sapId */ - } - - return(sng_sta_nif(&pst,&ssta,&cfm)); + return(sng_sta_nif(&pst,&ssta,cfm)); } -#endif diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index a14db63189..9e13b32e4b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -124,10 +124,8 @@ void ftmod_ss7_m2ua_free(void); ftdm_status_t ftmod_ss7_m2ua_cfg(void); int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm); -#if 0 -int ftmod_m2ua_ssta_req(int elemt); -int ftmod_nif_ssta_req(int elemt); -#endif +int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm); +int ftmod_nif_ssta_req(int elemt, int id, NwMgmt* cfm); #endif /*__FTMOD_SNG_SS7_M2UA_H__*/ From e4bd524b7d4a335854600ee6014846240336ae35 Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 5 Jun 2012 21:33:13 +0530 Subject: [PATCH 215/493] adding peerstatus and logging enable/disable CLI command --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 168 +++++++++++++++++- .../ftmod_sangoma_ss7_m2ua.c | 42 +++-- .../ftmod_sangoma_ss7_m2ua.h | 2 + 3 files changed, 188 insertions(+), 24 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index f4399d708d..bec6e020ac 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -123,6 +123,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name); static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name); +static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name); static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* profile_name); int get_assoc_resp_buf(char* buf,SbMgmt* cfm); @@ -394,12 +395,36 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha /**********************************************************************/ } else if (!strcasecmp(argv[c], "m2ua")) { /**********************************************************************/ - if (check_arg_count(argc, 3)){ - handle_show_m2ua_profiles(stream); - }else{ - c++; - handle_show_m2ua_profile(stream, argv[c]); + switch(argc) + { + case 2: /* show m2ua */ + { + handle_show_m2ua_profiles(stream); + break; + } + case 3: /* show m2ua */ + { + c++; + handle_show_m2ua_profile(stream, argv[c]); + break; + } + case 4: + { + char* profile_name = argv[++c]; + c++; + if(!strcasecmp(argv[c],"peerstatus")){ + handle_show_m2ua_peer_status(stream, profile_name); + } + else{ + stream->write_function(stream, "Unknown \"show m2ua \" command..\n"); + goto handle_cli_error_argc; + } + break; + } + default: + goto handle_cli_error_argc; } + /**********************************************************************/ } else if (!strcasecmp(argv[c], "nif")) { /**********************************************************************/ @@ -786,6 +811,28 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha /**********************************************************************/ } /**************************************************************************/ + } else if (!strcasecmp(argv[c], "m2ua")) { + /**************************************************************************/ + if (check_arg_count(argc, 3)) { + stream->write_function(stream, "Invalid \"m2ua option\", please use \"m2ua logging [enable|disable] \n"); + goto handle_cli_error_argc; + } + c++; + if(!strcasecmp(argv[c],"logging")){ + c++; + if(!strcasecmp(argv[c],"enable")){ + ftmod_ss7_enable_m2ua_sg_logging(); + }else if(!strcasecmp(argv[c],"disable")){ + ftmod_ss7_disable_m2ua_sg_logging(); + } else{ + stream->write_function(stream, "Unknown \"m2ua logging %s option\", supported values enable/disable\n",argv[c]); + goto handle_cli_error_argc; + } + }else{ + stream->write_function(stream, "Unknown \"m2ua %s option\", supported values \"logging\"\n",argv[c]); + goto handle_cli_error_argc; + } + /**************************************************************************/ } else { /**************************************************************************/ goto handle_cli_error; @@ -866,15 +913,20 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 show relay\n"); stream->write_function(stream, "\n"); - stream->write_function(stream, "ftmod_sangoma_ss7 M2UA status:\n"); + stream->write_function(stream, "ftmod_sangoma_ss7 M2UA :\n"); stream->write_function(stream, "ftdm ss7 show sctp \n"); stream->write_function(stream, "ftdm ss7 show sctp \n"); stream->write_function(stream, "ftdm ss7 show m2ua \n"); stream->write_function(stream, "ftdm ss7 show m2ua \n"); + stream->write_function(stream, "ftdm ss7 show m2ua peerstatus\n"); stream->write_function(stream, "ftdm ss7 show nif \n"); stream->write_function(stream, "ftdm ss7 show nif \n"); stream->write_function(stream, "\n"); + + stream->write_function(stream, "ftmod_sangoma_ss7 M2UA logging:\n"); + stream->write_function(stream, "ftdm ss7 m2ua logging [enable|disable] \n"); + stream->write_function(stream, "\n"); return FTDM_SUCCESS; @@ -2993,7 +3045,15 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream return FTDM_FAIL; } -/******************************************************************************/ + +/****************************************************************************** +* Fun: handle_show_m2ua_profiles() +* Desc: display all m2ua profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ + static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; @@ -3103,6 +3163,14 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) } +/****************************************************************************** +* Fun: handle_show_m2ua_profile() +* Desc: display requested m2ua profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ + static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name) { char* xmlhdr = (char*)""; @@ -3208,7 +3276,14 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char return FTDM_FAIL; } -/******************************************************************************/ + +/****************************************************************************** +* Fun: handle_show_sctp_profiles() +* Desc: display all sctp profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; @@ -3414,7 +3489,13 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) return len; } - +/****************************************************************************** +* Fun: handle_show_sctp_profile() +* Desc: display requested sctp profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name) { char* xmlhdr = (char*)""; @@ -3486,6 +3567,13 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char return FTDM_SUCCESS; } +/****************************************************************************** +* Fun: handle_show_nif_profiles() +* Desc: display all nif profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; @@ -3540,6 +3628,13 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } +/****************************************************************************** +* Fun: handle_show_nif_profile() +* Desc: display requested nif profile information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* nif_profile_name) { char* xmlhdr = (char*)""; @@ -3595,6 +3690,61 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* } /******************************************************************************/ +/****************************************************************************** +* Fun: handle_show_m2ua_peer_status() +* Desc: display requested m2ua profile peer information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ + +static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name) +{ + char* xmlhdr = (char*)""; + char buf[2048]; + int x = 0x00; + int found = 0x00; + int len = 0x00; + MwMgmt cfm; + + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + + /*iterate through all the m2ua links and get required profile */ + x = 1; + while(xwrite_function(stream,"Requested M2UA profile[%s] not configured\n", m2ua_profile_name); + return FTDM_FAIL; + } + + if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { + stream->write_function(stream," Request to Trillium M2UA layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, "\n"); + } + + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_FAIL; +} /******************************************************************************/ /* For Emacs: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 76db4d637e..f0ae00fa5a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -63,9 +63,9 @@ static int ftmod_open_endpoint(int idx); static int ftmod_init_sctp_assoc(int peer_id); static int ftmod_nif_m2ua_dlsap_bind(int id); static int ftmod_nif_mtp2_dlsap_bind(int id); -static int ftmod_m2ua_enable_debug(void); -static int ftmod_tucl_enable_debug(void); -static int ftmod_sctp_enable_debug(void); +static int ftmod_m2ua_debug(int action); +static int ftmod_tucl_debug(int action); +static int ftmod_sctp_debug(int action); static int ftmod_ss7_sctp_shutdown(void); static int ftmod_ss7_m2ua_shutdown(void); @@ -1152,15 +1152,26 @@ uint32_t iptoul(const char *ip) return (uint32_t)val; } /***********************************************************************************************************************/ +void ftmod_ss7_enable_m2ua_sg_logging(void){ -int ftmod_ss7_m2ua_start(void){ - int x=0; + /* Enable DEBUGs*/ + ftmod_sctp_debug(AENA); + ftmod_m2ua_debug(AENA); + ftmod_tucl_debug(AENA); +} /***********************************************************************************************************************/ - /* Enable DEBUGs*/ - ftmod_sctp_enable_debug(); - ftmod_m2ua_enable_debug(); - ftmod_tucl_enable_debug(); +void ftmod_ss7_disable_m2ua_sg_logging(void){ + + /* DISABLE DEBUGs*/ + ftmod_sctp_debug(ADISIMM); + ftmod_m2ua_debug(ADISIMM); + ftmod_tucl_debug(ADISIMM); +} + +/***********************************************************************************************************************/ +int ftmod_ss7_m2ua_start(void){ + int x=0; /***********************************************************************************************************************/ x = 1; @@ -1466,7 +1477,7 @@ static int ftmod_nif_mtp2_dlsap_bind(int id) } /***********************************************************************************************************************/ -static int ftmod_sctp_enable_debug() +static int ftmod_sctp_debug(int action) { Pst pst; SbMgmt cntrl; @@ -1490,7 +1501,7 @@ static int ftmod_sctp_enable_debug() cntrl.hdr.response.mem.region = S_REG; cntrl.hdr.response.mem.pool = S_POOL; - cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.action = action; cntrl.t.cntrl.subAction = SADBG; cntrl.t.cntrl.dbgMask = 0xFFFF; @@ -1498,7 +1509,7 @@ static int ftmod_sctp_enable_debug() } /***********************************************************************************************************************/ -static int ftmod_m2ua_enable_debug() +static int ftmod_m2ua_debug(int action) { Pst pst; MwMgmt cntrl; @@ -1522,14 +1533,14 @@ static int ftmod_m2ua_enable_debug() cntrl.hdr.response.mem.region = S_REG; cntrl.hdr.response.mem.pool = S_POOL; - cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.action = action; cntrl.t.cntrl.subAction = SADBG; cntrl.t.cntrl.s.dbgMask = 0xFFFF; return (sng_cntrl_m2ua (&pst, &cntrl)); } /***********************************************************************************************************************/ -static int ftmod_tucl_enable_debug() +static int ftmod_tucl_debug(int action) { Pst pst; HiMngmt cntrl; @@ -1553,7 +1564,7 @@ static int ftmod_tucl_enable_debug() cntrl.hdr.response.mem.region = S_REG; cntrl.hdr.response.mem.pool = S_POOL; - cntrl.t.cntrl.action = AENA; + cntrl.t.cntrl.action = action; cntrl.t.cntrl.subAction = SADBG; cntrl.t.cntrl.ctlType.hiDbg.dbgMask = 0xFFFF; @@ -1594,6 +1605,7 @@ int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm) } if(ssta.hdr.elmId.elmnt == STSBASSOC) { + /*TODO - how to get assoc Id*/ ssta.t.ssta.s.assocSta.assocId = 0; /* association id */ } return(sng_sta_sctp(&pst,&ssta,cfm)); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 9e13b32e4b..8f85ac3536 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -126,6 +126,8 @@ ftdm_status_t ftmod_ss7_m2ua_cfg(void); int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm); int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm); int ftmod_nif_ssta_req(int elemt, int id, NwMgmt* cfm); +void ftmod_ss7_enable_m2ua_sg_logging(void); +void ftmod_ss7_disable_m2ua_sg_logging(void); #endif /*__FTMOD_SNG_SS7_M2UA_H__*/ From d535563abbb166496d34547550f8020bd1c714b7 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 6 Jun 2012 14:44:20 +0530 Subject: [PATCH 216/493] modifying XML parsing / configuration code --- src/mod/endpoints/mod_megaco/megaco.c | 115 ++----- src/mod/endpoints/mod_megaco/megaco_stack.c | 341 ++++++++++++-------- src/mod/endpoints/mod_megaco/megaco_stack.h | 15 +- src/mod/endpoints/mod_megaco/megaco_xml.c | 160 +++++++++ src/mod/endpoints/mod_megaco/mod_megaco.c | 19 +- src/mod/endpoints/mod_megaco/mod_megaco.h | 34 +- 6 files changed, 446 insertions(+), 238 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/megaco.c index b73eaefec0..aa8fd8ede1 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_megaco/megaco.c @@ -8,7 +8,7 @@ #include "mod_megaco.h" -megaco_profile_t *megaco_profile_locate(const char *name) +megaco_profile_t *megaco_profile_locate(const char *name) { megaco_profile_t *profile = switch_core_hash_find_rdlock(megaco_globals.profile_hash, name, megaco_globals.profile_rwlock); @@ -22,97 +22,28 @@ megaco_profile_t *megaco_profile_locate(const char *name) return profile; } +mg_peer_profile_t *megaco_peer_profile_locate(const char *name) +{ + mg_peer_profile_t *profile = switch_core_hash_find_rdlock(megaco_globals.peer_profile_hash, name, megaco_globals.peer_profile_rwlock); + + if (profile) { + if (switch_thread_rwlock_tryrdlock(profile->rwlock) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile %s is locked\n", name); + profile = NULL; + } + } + + return profile; +} + void megaco_profile_release(megaco_profile_t *profile) { switch_thread_rwlock_unlock(profile->rwlock); } -static switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) +void megaco_peer_profile_release(mg_peer_profile_t *profile) { - switch_xml_t cfg, xml, mg_interfaces, mg_interface, tpt_interfaces, tpt_interface, peer_interfaces, peer_interface; - switch_status_t status = SWITCH_STATUS_FALSE; - switch_event_t *event = NULL; - const char *file = "megaco.conf"; - const char* mg_profile_tpt_id = NULL; - const char* mg_profile_peer_id = NULL; - - if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); - goto done; - } - - if (!(mg_interfaces = switch_xml_child(cfg, "sng_mg_interfaces"))) { - goto done; - } - - /* iterate through MG Interface list to build requested MG profile */ - for (mg_interface = switch_xml_child(mg_interfaces, "sng_mg_interface"); mg_interface; mg_interface = mg_interface->next) { - - const char *name = switch_xml_attr_soft(mg_interface, "name"); - if (strcmp(name, profile->name)) { - continue; - } - - /* parse MG profile */ - if(SWITCH_STATUS_FALSE == sng_parse_mg_profile(mg_interface)) { - goto done; - } - - mg_profile_tpt_id = switch_xml_attr_soft(mg_interface, "id"); - - /* Now get required transport profile against mg_profile_tpt_id*/ - if (!(tpt_interfaces = switch_xml_child(cfg, "sng_transport_interfaces"))) { - goto done; - } - - for (tpt_interface = switch_xml_child(tpt_interfaces, "sng_transport_interface"); tpt_interface; tpt_interface = tpt_interface->next) { - const char *id = switch_xml_attr_soft(tpt_interface, "id"); - if (strcmp(id, mg_profile_tpt_id)) { - continue; - } - - /* parse MG transport profile */ - if(SWITCH_STATUS_FALSE == sng_parse_mg_tpt_profile(tpt_interface)) { - goto done; - } - } - - /* as of now supporting only one peer */ - mg_profile_peer_id = switch_xml_attr_soft(mg_interface, "peerId"); - /* Now get required peer profile against mg_profile_peer_id*/ - if (!(peer_interfaces = switch_xml_child(cfg, "sng_mg_peer_interfaces"))) { - goto done; - } - - for (peer_interface = switch_xml_child(peer_interfaces, "sng_mg_peer_interface"); peer_interface; peer_interface = peer_interface->next) { - const char *id = switch_xml_attr_soft(peer_interface, "id"); - if (strcmp(id, mg_profile_peer_id)) { - continue; - } - - /* parse MG Peer profile */ - if(SWITCH_STATUS_FALSE == sng_parse_mg_peer_profile(peer_interface)) { - goto done; - } - } - - - /* configure the MEGACO stack */ - status = sng_mgco_cfg(profile->name); - - /* we should break from here , profile name should be unique */ - break; - } - -done: - if (xml) { - switch_xml_free(xml); - } - - if (event) { - switch_event_destroy(&event); - } - return status; + switch_thread_rwlock_unlock(profile->rwlock); } switch_status_t megaco_profile_start(const char *profilename) @@ -130,14 +61,13 @@ switch_status_t megaco_profile_start(const char *profilename) profile->name = switch_core_strdup(pool, profilename); switch_thread_rwlock_create(&profile->rwlock, pool); - - if (config_profile(profile, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { + + if (SWITCH_STATUS_SUCCESS != config_profile(profile, SWITCH_FALSE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error configuring profile %s\n", profile->name); goto fail; } - /* start MEGACP stack */ - if(SWITCH_STATUS_FALSE == sng_mgco_start(profilename)) { + if(SWITCH_STATUS_FALSE == sng_mgco_start(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error starting MEGACO Stack for profile %s\n", profile->name); goto fail; } @@ -161,8 +91,7 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) switch_thread_rwlock_wrlock((*profile)->rwlock); - /* stop MEGACP stack */ - if(SWITCH_STATUS_FALSE == sng_mgco_stop((*profile)->name)) { + if(SWITCH_STATUS_FALSE == sng_mgco_stop((*profile))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error stopping MEGACO Stack for profile %s\n", (*profile)->name); } @@ -171,6 +100,8 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopped profile: %s\n", (*profile)->name); switch_core_hash_delete_wrlock(megaco_globals.profile_hash, (*profile)->name, megaco_globals.profile_rwlock); + mg_config_cleanup(*profile); + switch_core_destroy_memory_pool(&(*profile)->pool); return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 74874e75d5..103f8726e7 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -8,6 +8,7 @@ /* INCLUDES *******************************************************************/ #include "mod_megaco.h" +#include "megaco_stack.h" /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -17,28 +18,32 @@ int mgco_mg_gen_config(void); int mgco_mu_gen_config(void); int mgco_tucl_gen_config(void); int mgco_mu_ssap_config(int idx); -int mgco_mg_tsap_config(int idx); +int mgco_mg_tsap_config(megaco_profile_t* profile); int mgco_mg_enble_debug(void); -int mgco_mg_ssap_config(int idx); -int mgco_mg_peer_config(int idx); -int mgco_mg_tpt_server_config(int idx); +int mgco_mg_ssap_config(megaco_profile_t* profile); +int mgco_mg_peer_config(megaco_profile_t* profile); +int mgco_mg_tpt_server_config(megaco_profile_t* profile); int mgco_tucl_sap_config(int idx); int mgco_mg_tsap_bind_cntrl(int idx); int mgco_mg_tsap_enable_cntrl(int idx); int mgco_mg_ssap_cntrl(int idx); int mgco_mu_ssap_cntrl(int idx); -int mgco_mg_tpt_server(int idx); int sng_mgco_tucl_shutdown(); int sng_mgco_mg_shutdown(); int sng_mgco_mg_ssap_stop(int sapId); -int sng_mgco_mg_tpt_server_stop(int idx); +int sng_mgco_mg_tpt_server_stop(megaco_profile_t* profile); int sng_mgco_mg_app_ssap_stop(int idx); switch_status_t sng_mgco_stack_gen_cfg(); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); +sng_mg_transport_types_e mg_get_tpt_type(megaco_profile_t* mg_cfg); +sng_mg_transport_types_e mg_get_tpt_type_from_str(char* tpt_type); +sng_mg_encoding_types_e mg_get_enc_type_from_str(char* enc_type); +sng_mg_protocol_types_e mg_get_proto_type_from_str(char* proto_type); + /******************************************************************************/ /* FUNCTIONS ******************************************************************/ @@ -150,20 +155,15 @@ switch_status_t sng_mgco_stack_gen_cfg() /*****************************************************************************************************************/ -switch_status_t sng_mgco_cfg(const char* profilename) +switch_status_t sng_mgco_cfg(megaco_profile_t* profile) { int idx = 0x00; - switch_assert(profilename); + switch_assert(profile); - GET_MG_CFG_IDX(profilename, idx); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG configuration for idx[%d] against profilename[%s]\n", profile->idx, profile->name); - if(!idx || (idx == MAX_MG_PROFILES)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG configuration for idx[%d] against profilename[%s]\n", idx, profilename); + idx = profile->idx; if(mgco_tucl_sap_config(idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_tucl_sap_config FAILED \n"); @@ -183,7 +183,7 @@ switch_status_t sng_mgco_cfg(const char* profilename) } - if(mgco_mg_tsap_config(idx)) { + if(mgco_mg_tsap_config(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_mg_tsap_config FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -191,7 +191,7 @@ switch_status_t sng_mgco_cfg(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mgco_mg_tsap_config SUCCESS \n"); } - if(mgco_mg_ssap_config(idx)) { + if(mgco_mg_ssap_config(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_ssap_config FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -199,7 +199,7 @@ switch_status_t sng_mgco_cfg(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_ssap_config SUCCESS \n"); } - if(mgco_mg_peer_config(idx)) { + if(mgco_mg_peer_config(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_peer_config FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -207,7 +207,7 @@ switch_status_t sng_mgco_cfg(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_peer_config SUCCESS \n"); } - if(mgco_mg_tpt_server_config(idx)) { + if(mgco_mg_tpt_server_config(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tpt_server_config FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -220,22 +220,11 @@ switch_status_t sng_mgco_cfg(const char* profilename) /*****************************************************************************************************************/ -switch_status_t sng_mgco_start(const char* profilename) +switch_status_t sng_mgco_start(megaco_profile_t* profile ) { - int idx = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG stack for idx[%d] against profilename[%s]\n", profile->idx, profile->name); - switch_assert(profilename); - - GET_MG_CFG_IDX(profilename, idx); - - if(!idx || (idx == MAX_MG_PROFILES)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting MG stack for idx[%d] against profilename[%s]\n", idx, profilename); - - if(mgco_mu_ssap_cntrl(idx)) { + if(mgco_mu_ssap_cntrl(profile->idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mu_ssap_cntrl FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -243,7 +232,7 @@ switch_status_t sng_mgco_start(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mu_ssap_cntrl SUCCESS \n"); } - if(mgco_mg_tsap_bind_cntrl(idx)) { + if(mgco_mg_tsap_bind_cntrl(profile->idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tsap_bind_cntrl FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -251,7 +240,7 @@ switch_status_t sng_mgco_start(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_bind_cntrl SUCCESS \n"); } - if(mgco_mg_ssap_cntrl(idx)) { + if(mgco_mg_ssap_cntrl(profile->idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_ssap_cntrl FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -259,7 +248,7 @@ switch_status_t sng_mgco_start(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_ssap_cntrl SUCCESS \n"); } - if(mgco_mg_tsap_enable_cntrl(idx)) { + if(mgco_mg_tsap_enable_cntrl(profile->idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mgco_mg_tsap_enable_cntrl FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -272,28 +261,20 @@ switch_status_t sng_mgco_start(const char* profilename) /*****************************************************************************************************************/ -switch_status_t sng_mgco_stop(const char* profilename) +switch_status_t sng_mgco_stop(megaco_profile_t* profile ) { - int idx = 0x00; - sng_mg_cfg_t* mgCfg = NULL; + int idx = 0x00; - switch_assert(profilename); + switch_assert(profile); - GET_MG_CFG_IDX(profilename, idx); + idx = profile->idx; - if(!idx || (idx == MAX_MG_PROFILES)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Stopping MG stack for idx[%d] against profilename[%s]\n", idx, profilename); - - mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Stopping MG stack for idx[%d] against profilename[%s]\n", idx, profile->name); /* MG STOP is as good as deleting that perticular mg(virtual mg instance) data from megaco stack */ /* currently we are not supporting enable/disable MG stack */ - if(sng_mgco_mg_ssap_stop(mgCfg->id)) { + if(sng_mgco_mg_ssap_stop(idx)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " sng_mgco_mg_ssap_stop FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -301,7 +282,7 @@ switch_status_t sng_mgco_stop(const char* profilename) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " sng_mgco_mg_ssap_stop SUCCESS \n"); } - if(sng_mgco_mg_tpt_server_stop(idx)) { + if(sng_mgco_mg_tpt_server_stop(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " sng_mgco_mg_tpt_server_stop FAILED \n"); return SWITCH_STATUS_FALSE; } @@ -342,7 +323,7 @@ int sng_mgco_mg_app_ssap_stop(int idx) mgMngmt.hdr.entId.ent = ENTMG; mgMngmt.hdr.entId.inst = S_INST; mgMngmt.hdr.elmId.elmnt = STSSAP; - mgMngmt.hdr.elmId.elmntInst1 = GET_MU_SAP_ID(idx); + mgMngmt.hdr.elmId.elmntInst1 = idx; cntrl->action = ADEL; cntrl->subAction = SAELMNT; @@ -383,14 +364,13 @@ int sng_mgco_mg_ssap_stop(int sapId) } /*****************************************************************************************************************/ -int sng_mgco_mg_tpt_server_stop(int idx) +int sng_mgco_mg_tpt_server_stop(megaco_profile_t* mg_cfg) { MgMngmt mgMngmt; Pst pst; /* Post for layer manager */ MgCntrl *cntrl; MgTptCntrl *tptCntrl = &mgMngmt.t.cntrl.s.tptCntrl; CmInetIpAddr ipAddr = 0; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; cntrl = &(mgMngmt.t.cntrl); @@ -402,11 +382,11 @@ int sng_mgco_mg_tpt_server_stop(int idx) /* insert the destination Entity */ pst.dstEnt = ENTMG; - tptCntrl->transportType = GET_TPT_TYPE(idx); + tptCntrl->transportType = mg_get_tpt_type(mg_cfg); tptCntrl->serverAddr.type = CM_INET_IPV4ADDR_TYPE; - tptCntrl->serverAddr.u.ipv4TptAddr.port = mgCfg->port; - if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + tptCntrl->serverAddr.u.ipv4TptAddr.port = atoi(mg_cfg->port); + if(ROK == cmInetAddr((S8*)mg_cfg->my_ipaddr, &ipAddr)) { tptCntrl->serverAddr.u.ipv4TptAddr.address = ntohl(ipAddr); } @@ -448,7 +428,7 @@ int mgco_mg_tsap_bind_cntrl(int idx) cntrl->action = ABND_ENA; cntrl->subAction = SAELMNT; - cntrl->spId = GET_TPT_ID(idx); + cntrl->spId = idx; return(sng_cntrl_mg(&pst, &mgMngmt)); } @@ -479,13 +459,14 @@ int mgco_mg_tsap_enable_cntrl(int idx) cntrl->action = AENA; cntrl->subAction = SAELMNT; - cntrl->spId = GET_TPT_ID(idx); + cntrl->spId = idx; return(sng_cntrl_mg(&pst, &mgMngmt)); } /*****************************************************************************************************************/ +#if 0 int mgco_mg_tpt_server(int idx) { MgMngmt mgMngmt; @@ -493,7 +474,7 @@ int mgco_mg_tpt_server(int idx) MgCntrl *cntrl; MgTptCntrl *tptCntrl = &mgMngmt.t.cntrl.s.tptCntrl; CmInetIpAddr ipAddr = 0; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + sng_mg_cfg_t* mg_cfg = &megaco_globals.g_mg_cfg.mg_cfg[idx]; cntrl = &(mgMngmt.t.cntrl); @@ -508,8 +489,8 @@ int mgco_mg_tpt_server(int idx) tptCntrl->transportType = GET_TPT_TYPE(idx); tptCntrl->serverAddr.type = CM_INET_IPV4ADDR_TYPE; - tptCntrl->serverAddr.u.ipv4TptAddr.port = mgCfg->port; - if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + tptCntrl->serverAddr.u.ipv4TptAddr.port = mg_cfg->port; + if(ROK == cmInetAddr((S8*)mg_cfg->my_ipaddr, &ipAddr)) { tptCntrl->serverAddr.u.ipv4TptAddr.address = ntohl(ipAddr); } @@ -526,6 +507,7 @@ int mgco_mg_tpt_server(int idx) return(sng_cntrl_mg(&pst, &mgMngmt)); } +#endif /*****************************************************************************************************************/ @@ -550,7 +532,7 @@ int mgco_mu_ssap_cntrl(int idx) mgMngmt.hdr.entId.ent = ENTMG; mgMngmt.hdr.entId.inst = S_INST; mgMngmt.hdr.elmId.elmnt = STSSAP; - mgMngmt.hdr.elmId.elmntInst1 = GET_MU_SAP_ID(idx); + mgMngmt.hdr.elmId.elmntInst1 = idx; cntrl->action = ABND_ENA; cntrl->subAction = SAELMNT; @@ -584,7 +566,7 @@ int mgco_mg_ssap_cntrl(int idx) cntrl->action = AENA; cntrl->subAction = SAELMNT; - cntrl->spId = (SpId)1; + cntrl->spId = (SpId)idx; return(sng_cntrl_mg(&pst, &mgMngmt)); } @@ -698,7 +680,7 @@ int mgco_tucl_sap_config(int idx) pCfg = &cfg.t.cfg.s.hiSap; - pCfg->spId = GET_TPT_ID(idx); + pCfg->spId = idx; pCfg->uiSel = 0x00; /*loosley coupled */ pCfg->flcEnb = TRUE; pCfg->txqCongStrtLim = HI_SAP_TXN_QUEUE_CONG_START_LIMIT; @@ -860,8 +842,8 @@ int mgco_mu_ssap_config(int idx) mgmt.hdr.elmId.elmnt = STSSAP; /* fill lower layer i.e. MG PST */ - cfg->ssapId = GET_MU_SAP_ID(idx); /* SSAP ID */ - cfg->spId = GET_MU_SAP_ID(idx); /* SSAP ID */ + cfg->ssapId = idx; + cfg->spId = idx; cfg->mem.region = S_REG; cfg->mem.pool = S_POOL; @@ -877,14 +859,13 @@ int mgco_mu_ssap_config(int idx) /******************************************************************************/ -int mgco_mg_ssap_config(int idx) +int mgco_mg_ssap_config(megaco_profile_t* profile) { MgMngmt mgMngmt; MgSSAPCfg *pCfg; Pst pst; /* Post for layer manager */ CmInetIpAddr ipAddr; int len = 0x00; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; memset(&mgMngmt, 0, sizeof(mgMngmt)); pCfg = &(mgMngmt.t.cfg.c.sSAPCfg); @@ -903,14 +884,14 @@ int mgco_mg_ssap_config(int idx) /* FILL SAP config */ - pCfg->sSAPId = mgCfg->id; /* SSAP ID */ + pCfg->sSAPId = profile->idx; /* SSAP ID */ pCfg->sel = 0x00 ; /* Loosely coupled */ pCfg->memId.region = S_REG; pCfg->memId.pool = S_POOL; pCfg->prior = PRIOR0; pCfg->route = RTESPEC; - pCfg->protocol = mgCfg->protocol_type; + pCfg->protocol = mg_get_proto_type_from_str(profile->protocol_type); pCfg->startTxnNum = 50; pCfg->endTxnNum = 60; @@ -919,7 +900,7 @@ int mgco_mg_ssap_config(int idx) pCfg->mwdTimer = (U16)10; pCfg->minMgcoVersion = LMG_VER_PROF_MGCO_H248_1_0; - switch(mgCfg->protocol_version) + switch(profile->protocol_version) { case 1: pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_1_0; @@ -931,7 +912,7 @@ int mgco_mg_ssap_config(int idx) pCfg->maxMgcoVersion = LMG_VER_PROF_MGCO_H248_3_0; break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol version[%d] \n",mgCfg->protocol_version); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol version[%d] \n",profile->protocol_version); return SWITCH_STATUS_FALSE; } @@ -940,17 +921,17 @@ int mgco_mg_ssap_config(int idx) pCfg->userInfo.mid.pres = PRSNT_NODEF; pCfg->userInfo.dname.namePres.pres = PRSNT_NODEF; - pCfg->userInfo.mid.len = (U8)strlen((char*)mgCfg->mid); - strncpy((char*)pCfg->userInfo.mid.val, (char*)mgCfg->mid, MAX_MID_LEN); + pCfg->userInfo.mid.len = (U8)strlen((char*)profile->mid); + strncpy((char*)pCfg->userInfo.mid.val, (char*)profile->mid, MAX_MID_LEN); - len = (U32)strlen((char*)mgCfg->my_domain); + len = (U32)strlen((char*)profile->my_domain); memcpy( (U8*)(pCfg->userInfo.dname.name), - (CONSTANT U8*)(mgCfg->my_domain), len ); + (CONSTANT U8*)(profile->my_domain), len ); pCfg->userInfo.dname.name[len] = '\0'; pCfg->userInfo.dname.netAddr.type = CM_TPTADDR_IPV4; memset(&ipAddr,'\0',sizeof(ipAddr)); - if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr,&ipAddr)) + if(ROK == cmInetAddr((S8*)profile->my_ipaddr,&ipAddr)) { pCfg->userInfo.dname.netAddr.u.ipv4NetAddr = ntohl(ipAddr); } @@ -968,13 +949,11 @@ int mgco_mg_ssap_config(int idx) /******************************************************************************/ -int mgco_mg_tsap_config(int idx) +int mgco_mg_tsap_config(megaco_profile_t* profile) { MgMngmt mgMngmt; - /* local variables */ MgTSAPCfg *cfg; - Pst pst; /* Post for layer manager */ - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; + Pst pst; memset(&mgMngmt, 0, sizeof(mgMngmt)); cfg = &(mgMngmt.t.cfg.c.tSAPCfg); @@ -992,9 +971,9 @@ int mgco_mg_tsap_config(int idx) mgMngmt.hdr.elmId.elmnt = STTSAP; /* FILL TSAP config */ - cfg->tSAPId = mgCfg->id; - cfg->spId = GET_TPT_ID(idx); - cfg->provType = GET_TPT_TYPE(idx); + cfg->tSAPId = profile->idx; + cfg->spId = profile->idx; + cfg->provType = mg_get_tpt_type(profile); /* FILL TUCL Information */ cfg->memId.region = S_REG; @@ -1031,15 +1010,14 @@ int mgco_mg_tsap_config(int idx) /******************************************************************************/ -int mgco_mg_peer_config(int idx) +int mgco_mg_peer_config(megaco_profile_t* mg_cfg) { MgMngmt mgMngmt; MgGcpEntCfg *cfg; Pst pst; /* Post for layer manager */ U32 peerIdx = 0; CmInetIpAddr ipAddr = 0; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; - sng_mg_peer_t* mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + mg_peer_profile_t* mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); memset(&mgMngmt, 0, sizeof(mgMngmt)); cfg = &(mgMngmt.t.cfg.c.mgGcpEntCfg); @@ -1056,10 +1034,10 @@ int mgco_mg_peer_config(int idx) mgMngmt.hdr.entId.inst = S_INST; mgMngmt.hdr.elmId.elmnt = STGCPENT; - cfg->numPeer = megaco_globals.g_mg_cfg.mgPeer.total_peer; - cfg->peerCfg[peerIdx].sSAPId = mgCfg->id; /* SSAP ID */; - cfg->peerCfg[peerIdx].port = mgPeer->port; - cfg->peerCfg[peerIdx].tsapId = GET_TPT_ID(idx); + cfg->numPeer = mg_cfg->total_peers; + cfg->peerCfg[peerIdx].sSAPId = mg_cfg->idx; /* SSAP ID */; + cfg->peerCfg[peerIdx].port = atoi(mg_peer->port); + cfg->peerCfg[peerIdx].tsapId = mg_cfg->idx; cfg->peerCfg[peerIdx].mtuSize = MG_MAX_MTU_SIZE; @@ -1068,7 +1046,7 @@ int mgco_mg_peer_config(int idx) cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].type = CM_NETADDR_IPV4; - if(ROK == cmInetAddr((S8*)&mgPeer->ipaddr[0],&ipAddr)) + if(ROK == cmInetAddr((S8*)&mg_peer->ipaddr[0],&ipAddr)) { cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].u.ipv4NetAddr = ntohl(ipAddr); } @@ -1079,14 +1057,14 @@ int mgco_mg_peer_config(int idx) } #ifdef GCP_MG - cfg->peerCfg[peerIdx].transportType = GET_TPT_TYPE(idx); - cfg->peerCfg[peerIdx].encodingScheme = GET_ENCODING_TYPE(idx); + cfg->peerCfg[peerIdx].transportType = mg_get_tpt_type_from_str(mg_peer->transport_type); + cfg->peerCfg[peerIdx].encodingScheme = mg_get_enc_type_from_str(mg_peer->encoding_type); cfg->peerCfg[peerIdx].mgcPriority = 0; cfg->peerCfg[peerIdx].useAHScheme = FALSE; cfg->peerCfg[peerIdx].mid.pres = PRSNT_NODEF; - cfg->peerCfg[peerIdx].mid.len = strlen((char*)mgPeer->mid); + cfg->peerCfg[peerIdx].mid.len = strlen((char*)mg_peer->mid); cmMemcpy((U8 *)cfg->peerCfg[peerIdx].mid.val, - (CONSTANT U8*)(char*)mgPeer->mid, + (CONSTANT U8*)(char*)mg_peer->mid, cfg->peerCfg[peerIdx].mid.len); #endif /* GCP_MG */ @@ -1096,14 +1074,14 @@ int mgco_mg_peer_config(int idx) /******************************************************************************/ -int mgco_mg_tpt_server_config(int idx) +int mgco_mg_tpt_server_config(megaco_profile_t* mg_cfg) { MgMngmt mgMngmt; MgTptSrvrCfg *cfg; Pst pst; /* Post for layer manager */ CmInetIpAddr ipAddr = 0; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; int srvIdx = 0; + mg_peer_profile_t* mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); memset(&mgMngmt, 0, sizeof(mgMngmt)); cfg = &(mgMngmt.t.cfg.c.tptSrvrCfg); @@ -1122,18 +1100,18 @@ int mgco_mg_tpt_server_config(int idx) cfg->count = 1; cfg->srvr[srvIdx].isDefault = TRUE; - cfg->srvr[srvIdx].sSAPId = mgCfg->id; - cfg->srvr[srvIdx].tSAPId = GET_TPT_ID(idx); - cfg->srvr[srvIdx].protocol = mgCfg->protocol_type; - cfg->srvr[srvIdx].transportType = GET_TPT_TYPE(idx); - cfg->srvr[srvIdx].encodingScheme = GET_ENCODING_TYPE(idx); + cfg->srvr[srvIdx].sSAPId = mg_cfg->idx; + cfg->srvr[srvIdx].tSAPId = mg_cfg->idx; + cfg->srvr[srvIdx].protocol = mg_get_proto_type_from_str(mg_cfg->protocol_type); + cfg->srvr[srvIdx].transportType = mg_get_tpt_type(mg_cfg); + cfg->srvr[srvIdx].encodingScheme = mg_get_enc_type_from_str(mg_peer->encoding_type); cfg->srvr[srvIdx].tptParam.type = CM_TPTPARAM_SOCK; cfg->srvr[srvIdx].tptParam.u.sockParam.listenQSize = 5; cfg->srvr[srvIdx].tptParam.u.sockParam.numOpts = 0; cfg->srvr[srvIdx].lclTptAddr.type = CM_TPTADDR_IPV4; - cfg->srvr[srvIdx].lclTptAddr.u.ipv4TptAddr.port = mgCfg->port; - if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + cfg->srvr[srvIdx].lclTptAddr.u.ipv4TptAddr.port = atoi(mg_cfg->port); + if(ROK == cmInetAddr((S8*)mg_cfg->my_ipaddr, &ipAddr)) { cfg->srvr[srvIdx].lclTptAddr.u.ipv4TptAddr.address = ntohl(ipAddr); } @@ -1677,12 +1655,10 @@ void handle_tucl_alarm(Pst *pst, HiMngmt *sta) } /* handle_sng_tucl_alarm */ /******************************************************************************/ -int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx) +int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer) { Pst pst; MgMngmt cntrl; - sng_mg_cfg_t* mgCfg = &megaco_globals.g_mg_cfg.mgCfg[mg_cfg_idx]; - sng_mg_peer_t* mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; CmInetIpAddr ipAddr = 0; memset((U8 *)&pst, 0, sizeof(Pst)); @@ -1709,30 +1685,30 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx) case STGCPENT: { cntrl.t.ssta.s.mgPeerSta.peerId.pres = PRSNT_NODEF; - cntrl.t.ssta.s.mgPeerSta.peerId.val = mgCfg->peer_id; + cntrl.t.ssta.s.mgPeerSta.peerId.val = mg_cfg->idx; cntrl.t.ssta.s.mgPeerSta.mid.pres = PRSNT_NODEF; - cntrl.t.ssta.s.mgPeerSta.mid.len = strlen((char*)mgPeer->mid); + cntrl.t.ssta.s.mgPeerSta.mid.len = strlen((char*)mg_peer->mid); cmMemcpy((U8 *)cntrl.t.ssta.s.mgPeerSta.mid.val, - (CONSTANT U8*)(char*)mgPeer->mid, + (CONSTANT U8*)(char*)mg_peer->mid, cntrl.t.ssta.s.mgPeerSta.mid.len); break; } case STSSAP: { - cntrl.t.ssta.s.mgSSAPSta.sapId = mgCfg->id; + cntrl.t.ssta.s.mgSSAPSta.sapId = mg_cfg->idx; break; } case STTSAP: { - cntrl.t.ssta.s.mgTSAPSta.tSapId = GET_TPT_ID(mg_cfg_idx); + cntrl.t.ssta.s.mgTSAPSta.tSapId = mg_cfg->idx; break; } case STSERVER: { cntrl.t.ssta.s.mgTptSrvSta.tptAddr.type = CM_INET_IPV4ADDR_TYPE; cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port = ntohl(ipAddr); - if(ROK == cmInetAddr((S8*)mgCfg->my_ipaddr, &ipAddr)) + if(ROK == cmInetAddr((S8*)mg_cfg->my_ipaddr, &ipAddr)) { cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address = ntohl(ipAddr); } @@ -1753,19 +1729,27 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char int len = 0x00; MgMngmt cfm; char prntBuf[1024]; + megaco_profile_t* mg_cfg = NULL; + mg_peer_profile_t* mg_peer = NULL; switch_assert(profilename); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - GET_MG_CFG_IDX(profilename, idx); - - if(!idx || (idx == MAX_MG_PROFILES)){ + mg_cfg = megaco_profile_locate(profilename); + if(!mg_cfg){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); return SWITCH_STATUS_FALSE; } + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + return SWITCH_STATUS_FALSE; + } + + idx = mg_cfg->idx; /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ @@ -1791,15 +1775,15 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char #endif /* MG Peer Information */ - sng_mgco_mg_get_status(STGCPENT, &cfm, idx); + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); smmgPrntPeerSta(&cfm.t.ssta.s.mgPeerSta); /* MG Peer Information */ - sng_mgco_mg_get_status(STSSAP, &cfm, idx); + sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); smmgPrntSsapSta(&cfm.t.ssta.s.mgSSAPSta); /* MG Transport SAP Information */ - sng_mgco_mg_get_status(STTSAP, &cfm, idx); + sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); len = len + sprintf(prntBuf+len,"***********************************************\n"); len = len + sprintf(prntBuf+len,"**********MG TRANSPORT SAP Information**********\n"); len = len + sprintf(prntBuf+len,"TSAP status:\n"); @@ -1810,7 +1794,7 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"%s\n",prntBuf); /* MG Transport Server Information */ - sng_mgco_mg_get_status(STSERVER, &cfm, idx); + sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer); smmgPrntSrvSta(&cfm.t.ssta.s.mgTptSrvSta); return SWITCH_STATUS_SUCCESS; @@ -1822,33 +1806,37 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c int len = 0x00; MgMngmt cfm; char* xmlhdr = ""; - char prntBuf[10024]; - sng_mg_cfg_t* mgCfg = NULL; - sng_mg_peer_t* mgPeer = NULL; + char prntBuf[3048]; int i = 0x00; char *asciiAddr; CmInetIpAddr ip; + megaco_profile_t* mg_cfg = NULL; + mg_peer_profile_t* mg_peer = NULL; switch_assert(profilename); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - GET_MG_CFG_IDX(profilename, idx); - - if(!idx || (idx == MAX_MG_PROFILES)){ + mg_cfg = megaco_profile_locate(profilename); + if(!mg_cfg){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); return SWITCH_STATUS_FALSE; } + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); - mgCfg = &megaco_globals.g_mg_cfg.mgCfg[idx]; - mgPeer = &megaco_globals.g_mg_cfg.mgPeer.peers[mgCfg->peer_id]; + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + return SWITCH_STATUS_FALSE; + } + idx = mg_cfg->idx; + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"%s\n",mgCfg->name); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->name); len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); /****************************************************************************************************************/ /* Print Peer Information ***************************************************************************************/ @@ -1856,10 +1844,10 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"\n",mgPeer->name); + len = len + sprintf(&prntBuf[0] + len,"\n",mg_peer->name); /* send request to MEGACO Trillium stack to get peer information*/ - sng_mgco_mg_get_status(STGCPENT, &cfm, idx); + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); @@ -1873,7 +1861,7 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(&prntBuf[0] + len,"\n"); /* MG SAP Information */ - sng_mgco_mg_get_status(STSSAP, &cfm, idx); + sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); @@ -1917,7 +1905,7 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(&prntBuf[0] + len,"\n"); /* MG Transport SAP Information */ - sng_mgco_mg_get_status(STTSAP, &cfm, idx); + sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTSAPSta.state)); len = len + sprintf(&prntBuf[0] + len," %u \n", (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); len = len + sprintf(&prntBuf[0] + len,"\n"); @@ -1925,7 +1913,7 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c /****************************************************************************************************************/ /* Print MG Transport Server Information ***************************************************************************************/ - if(sng_mgco_mg_get_status(STSERVER, &cfm, idx)){ + if(sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer)){ len = len + sprintf(&prntBuf[0] + len," no established server found \n"); } else { @@ -2096,3 +2084,84 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) #endif } +/**********************************************************************************************************************************/ +sng_mg_transport_types_e mg_get_tpt_type(megaco_profile_t* mg_profile) +{ + mg_peer_profile_t* mg_peer_profile = NULL; + + if(NULL == mg_profile){ + return SNG_MG_TPT_NONE; + } + + if(!mg_profile->total_peers){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " No peer configured against profilename[%s]\n",mg_profile->name); + return SNG_MG_TPT_NONE; + } + + if( NULL == (mg_peer_profile = megaco_peer_profile_locate(mg_profile->peer_list[0]))){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Not able to get peer_profile node based on profilename[%s]\n",mg_profile->peer_list[0]); + return SNG_MG_TPT_NONE; + } + + return mg_get_tpt_type_from_str(mg_peer_profile->transport_type); +} +/**********************************************************************************************************************************/ + +sng_mg_transport_types_e mg_get_tpt_type_from_str(char* tpt_type) +{ + if(!tpt_type) return SNG_MG_TPT_NONE; + + if(!strcasecmp(tpt_type, "UDP")){ + return SNG_MG_TPT_UDP; + }else if(!strcasecmp(tpt_type,"TCP")){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "TCP Transport for H.248 Protocol Not Yet Supported \n"); + return SNG_MG_TPT_TCP; + }else if(!strcasecmp(tpt_type,"STCP")){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STCP Transport for H.248 Protocol Not Yet Supported \n"); + return SNG_MG_TPT_SCTP; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",tpt_type); + return SNG_MG_TPT_NONE; + } + + return SNG_MG_TPT_NONE; +} +/**********************************************************************************************************************************/ + +sng_mg_encoding_types_e mg_get_enc_type_from_str(char* enc_type) +{ + if(!enc_type) return SNG_MG_ENCODING_NONE; + + if(!strcasecmp(enc_type, "TEXT")){ + return SNG_MG_ENCODING_TEXT; + } else if(!strcasecmp(enc_type, "BINARY")){ + return SNG_MG_ENCODING_BINARY; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Encoding Type[%s] \n", enc_type); + return SNG_MG_ENCODING_NONE; + } + + return SNG_MG_ENCODING_NONE; +} + +/**********************************************************************************************************************************/ + +sng_mg_protocol_types_e mg_get_proto_type_from_str(char* proto_type) +{ + if(!proto_type) return SNG_MG_NONE; + + if(!strcasecmp(proto_type,"MEGACO")) { + return SNG_MG_MEGACO; + }else if(!strcasecmp(proto_type,"MGCP")){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGCP Protocol Not Yet Supported \n"); + return SNG_MG_MGCP; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",proto_type); + return SNG_MG_NONE; + } + + return SNG_MG_NONE; +} + + +/**********************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index 8e1bc12bc1..dabf4a5551 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -6,7 +6,7 @@ * */ -#include "sng_megaco/sng_ss7.h" +#include "mod_megaco.h" #ifndef _MEGACO_CFG_H_ #define _MEGACO_CFG_H_ @@ -16,6 +16,7 @@ #define MAX_NAME_LEN 25 #define MAX_MG_PROFILES 5 +#if 0 typedef struct sng_mg_peer{ char name[MAX_NAME_LEN]; /* Peer Name as defined in config file */ uint16_t id; /* Peer ID as defined in config file */ @@ -36,6 +37,7 @@ typedef struct sng_mg_transport_profile{ uint16_t transport_type; /* transport type */ }sng_mg_transport_profile_t; +#endif typedef enum{ SNG_MG_TPT_NONE, @@ -68,6 +70,7 @@ typedef enum{ "SNG_MG_ENCODING_NONE") +#if 0 /* each profile is corresponds to each MG Instance */ typedef struct sng_mg_cfg{ char name[MAX_NAME_LEN]; /* MG(Virtual MG) Name as defined in config file */ @@ -94,6 +97,7 @@ typedef struct sng_mg_gbl_cfg{ extern switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile); extern switch_status_t sng_parse_mg_tpt_profile(switch_xml_t mg_tpt_profile); extern switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface); +#endif void handle_sng_log(uint8_t level, char *fmt, ...); @@ -107,17 +111,16 @@ void handle_mg_alarm(Pst *pst, MgMngmt *sta); void handle_tucl_alarm(Pst *pst, HiMngmt *sta); +switch_status_t sng_mgco_cfg(megaco_profile_t* profile); switch_status_t sng_mgco_init(sng_isup_event_interface_t* event); -switch_status_t sng_mgco_cfg(const char* profilename); -switch_status_t sng_mgco_start(const char* profilename); -switch_status_t sng_mgco_stop(const char* profilename); switch_status_t sng_mgco_stack_shutdown(void); -int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, int mg_cfg_idx); +int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); /*****************************************************************************************************/ +#if 0 #define GET_MG_CFG_IDX(_profilename, _idx){\ for(idx=0; idx < MAX_MG_PROFILES; idx++){\ /* id zero is not acceptable */\ @@ -130,12 +133,12 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c }\ }\ } - #define GET_TPT_ID(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].id #define GET_MU_SAP_ID(_id) megaco_globals.g_mg_cfg.mgCfg[_id].id #define GET_TPT_TYPE(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].transport_type #define GET_ENCODING_TYPE(_id) megaco_globals.g_mg_cfg.mgPeer.peers[megaco_globals.g_mg_cfg.mgCfg[_id].peer_id].encoding_type +#endif #endif /* _MEGACO_CFG_H_ */ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index 23ff23468d..52b1294cb2 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -6,8 +6,167 @@ * */ #include "mod_megaco.h" +#include "megaco_stack.h" +/****************************************************************************************************************************/ +static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) ; +static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) ; +static int mg_sap_id; +/****************************************************************************************************************************/ +switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) +{ + switch_xml_t cfg, xml, param, mg_interfaces, mg_interface, mg_peers, mg_peer, peer_interfaces ; + switch_status_t status = SWITCH_STATUS_FALSE; + switch_event_t *event = NULL; + const char *file = "megaco.conf"; + switch_xml_config_item_t *instructions = (profile ? get_instructions(profile) : NULL); + int count; + int idx; + char *var, *val; + mg_peer_profile_t* peer_profile = NULL; + switch_xml_config_item_t *instructions1 = NULL; + + if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); + goto done; + } + + if (!(mg_interfaces = switch_xml_child(cfg, "mg_profiles"))) { + goto done; + } + + for (mg_interface = switch_xml_child(mg_interfaces, "mg_profile"); mg_interface; mg_interface = mg_interface->next) { + const char *name = switch_xml_attr_soft(mg_interface, "name"); + if (strcmp(name, profile->name)) { + continue; + } + + count = switch_event_import_xml(switch_xml_child(mg_interface, "param"), "name", "value", &event); + status = switch_xml_config_parse_event(event, count, reload, instructions); + + /* now build peer list */ + if (!(peer_interfaces = switch_xml_child(mg_interface, "peers"))) { + goto done; + } + + for (param = switch_xml_child(peer_interfaces, "param"); param; param = param->next) { + var = (char *) switch_xml_attr_soft(param, "name"); + val = (char *) switch_xml_attr_soft(param, "value"); + profile->peer_list[profile->total_peers] = switch_core_strdup(profile->pool, val); + profile->total_peers++; + } + + profile->idx = ++mg_sap_id; + + /* we should break from here , profile name should be unique */ + break; + } + + /* go through the peer configuration and get the mg profile associated peers only */ + if (!(mg_peers = switch_xml_child(cfg, "mg_peers"))) { + goto done; + } + + count = 0x00; + event = NULL; + for (mg_peer = switch_xml_child(mg_peers, "mg_peer"); mg_peer; mg_peer = mg_peer->next) { + const char *name = switch_xml_attr_soft(mg_peer, "name"); + for(idx=0; idxtotal_peers; idx++){ + if (!strcmp(name, profile->peer_list[idx])) { + /* peer profile */ + peer_profile = switch_core_alloc(profile->pool, sizeof(*peer_profile)); + peer_profile->pool = profile->pool; + peer_profile->name = switch_core_strdup(peer_profile->pool, name); + switch_thread_rwlock_create(&peer_profile->rwlock, peer_profile->pool); + instructions1 = (peer_profile ? get_peer_instructions(peer_profile) : NULL); + + count = switch_event_import_xml(switch_xml_child(mg_peer, "param"), "name", "value", &event); + if(SWITCH_STATUS_FALSE == (status = switch_xml_config_parse_event(event, count, reload, instructions1))){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Peer XML Parsing failed \n"); + goto done; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"peer_profile name[%s], ipaddr[%s] port[%s], mid[%s] transport_type[%s], encoding_type[%s] \n", + peer_profile->name, peer_profile->ipaddr, peer_profile->port,peer_profile->mid, peer_profile->transport_type, peer_profile->encoding_type); + + switch_core_hash_insert_wrlock(megaco_globals.peer_profile_hash, peer_profile->name, peer_profile, megaco_globals.peer_profile_rwlock); + } + } + } + + /* configure the MEGACO stack */ + status = sng_mgco_cfg(profile); + +done: + if (xml) { + switch_xml_free(xml); + } + + if (event) { + switch_event_destroy(&event); + } + return status; +} + +/****************************************************************************************************************************/ +switch_status_t mg_config_cleanup(megaco_profile_t* profile) +{ + switch_xml_config_item_t *instructions = (profile ? get_instructions(profile) : NULL); + switch_xml_config_cleanup(instructions); + + return SWITCH_STATUS_SUCCESS; +} + +/****************************************************************************************************************************/ +static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) { + switch_xml_config_item_t *dup; + + switch_xml_config_item_t instructions[] = { + /* parameter name type reloadable pointer default value options structure */ + SWITCH_CONFIG_ITEM("ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ipaddr, "", &switch_config_string_strdup, "", "Peer IP"), + SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "", &switch_config_string_strdup, "", "peer port"), + SWITCH_CONFIG_ITEM("encoding-scheme", SWITCH_CONFIG_STRING, 0, &profile->encoding_type, "TEXT", &switch_config_string_strdup, "", "peer encoding type"), + SWITCH_CONFIG_ITEM("transport-type", SWITCH_CONFIG_STRING, 0, &profile->transport_type, "", &switch_config_string_strdup, "", "peer transport type "), + SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "peer message identifier "), + SWITCH_CONFIG_ITEM_END() + }; + + dup = malloc(sizeof(instructions)); + memcpy(dup, instructions, sizeof(instructions)); + return dup; +} + +/****************************************************************************************************************************/ + +static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { + switch_xml_config_item_t *dup; + static switch_xml_config_int_options_t opt_version = { + SWITCH_TRUE, /* enforce min */ + 1, + SWITCH_TRUE, /* Enforce Max */ + 3 + }; + + switch_xml_config_item_t instructions[] = { + /* parameter name type reloadable pointer default value options structure */ + SWITCH_CONFIG_ITEM("protocol", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->protocol_type, "MEGACO", &switch_config_string_strdup, "", "MG Protocol type"), + SWITCH_CONFIG_ITEM("version", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->protocol_version, 2, &opt_version, "", "MG Protocol version"), + SWITCH_CONFIG_ITEM("local-ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->my_ipaddr, "127.0.0.1", &switch_config_string_strdup, "", "local ip"), + SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "2944", &switch_config_string_strdup, "", "port"), + SWITCH_CONFIG_ITEM("domain-name", SWITCH_CONFIG_STRING, 0, &profile->my_domain, "", &switch_config_string_strdup, "", "domain name"), + SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "message identifier "), + SWITCH_CONFIG_ITEM_END() + }; + + dup = malloc(sizeof(instructions)); + memcpy(dup, instructions, sizeof(instructions)); + return dup; +} + +/****************************************************************************************************************************/ + +#if 0 switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface) { int i = 0x00; @@ -230,4 +389,5 @@ switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) megaco_globals.g_mg_cfg.mgPeer.total_peer++; return SWITCH_STATUS_SUCCESS; } +#endif /***********************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index f8fa65a8ee..94a0f64d13 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -7,6 +7,7 @@ */ #include "mod_megaco.h" +#include "megaco_stack.h" struct megaco_globals megaco_globals; static sng_isup_event_interface_t sng_event; @@ -15,7 +16,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); - #define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" SWITCH_STANDARD_API(megaco_function) { @@ -34,11 +34,14 @@ SWITCH_STANDARD_API(megaco_function) goto usage; } +/**********************************************************************************/ if (!strcmp(argv[0], "profile")) { if (zstr(argv[1]) || zstr(argv[2])) { goto usage; } +/**********************************************************************************/ if (!strcmp(argv[2], "start")) { +/**********************************************************************************/ megaco_profile_t *profile = megaco_profile_locate(argv[1]); if (profile) { megaco_profile_release(profile); @@ -47,7 +50,9 @@ SWITCH_STANDARD_API(megaco_function) megaco_profile_start(argv[1]); stream->write_function(stream, "+OK\n"); } +/**********************************************************************************/ } else if (!strcmp(argv[2], "stop")) { +/**********************************************************************************/ megaco_profile_t *profile = megaco_profile_locate(argv[1]); if (profile) { megaco_profile_release(profile); @@ -56,22 +61,29 @@ SWITCH_STANDARD_API(megaco_function) } else { stream->write_function(stream, "-ERR No such profile\n"); } +/**********************************************************************************/ }else if(!strcmp(argv[2], "status")) { +/**********************************************************************************/ megaco_profile_t *profile = megaco_profile_locate(argv[1]); if (profile) { megaco_profile_status(stream, profile->name); } else { stream->write_function(stream, "-ERR No such profile\n"); } +/**********************************************************************************/ }else if(!strcmp(argv[2], "xmlstatus")) { +/**********************************************************************************/ megaco_profile_t *profile = megaco_profile_locate(argv[1]); if (profile) { megaco_profile_xmlstatus(stream, profile->name); } else { stream->write_function(stream, "-ERR No such profile\n"); } +/**********************************************************************************/ + }else { +/**********************************************************************************/ + goto usage; } - } goto done; @@ -125,6 +137,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_core_hash_init(&megaco_globals.profile_hash, pool); switch_thread_rwlock_create(&megaco_globals.profile_rwlock, pool); + + switch_core_hash_init(&megaco_globals.peer_profile_hash, pool); + switch_thread_rwlock_create(&megaco_globals.peer_profile_rwlock, pool); SWITCH_ADD_API(api_interface, "megaco", "megaco", megaco_function, MEGACO_FUNCTION_SYNTAX); diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index 7c21610639..a277a1f840 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -10,14 +10,17 @@ #ifndef MOD_MEGACO_H #define MOD_MEGACO_H +#include "sng_megaco/sng_ss7.h" #include -#include "megaco_stack.h" + +#define MG_MAX_PEERS 5 struct megaco_globals { switch_memory_pool_t *pool; switch_hash_t *profile_hash; + switch_hash_t *peer_profile_hash; switch_thread_rwlock_t *profile_rwlock; - sng_mg_gbl_cfg_t g_mg_cfg; + switch_thread_rwlock_t *peer_profile_rwlock; }; extern struct megaco_globals megaco_globals; /* < defined in mod_megaco.c */ @@ -25,19 +28,46 @@ typedef enum { PF_RUNNING = (1 << 0) } megaco_profile_flags_t; +typedef struct mg_peer_profile_s{ + char *name; + switch_memory_pool_t *pool; + switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ + megaco_profile_flags_t flags; + char* ipaddr; /* Peer IP */ + char* port; /*Peer Port */ + char* mid; /* Peer H.248 MID */ + char* transport_type; /* UDP/TCP */ + char* encoding_type; /* Encoding TEXT/Binary */ +}mg_peer_profile_t; + + typedef struct megaco_profile_s { char *name; switch_memory_pool_t *pool; switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ megaco_profile_flags_t flags; + int idx; /* Trillium MEGACO SAP identification*/ + char* mid; /* MG H.248 MID */ + char* my_domain; /* local domain name */ + char* my_ipaddr; /* local domain name */ + char* port; /* port */ + char* protocol_type; /* MEGACO/MGCP */ + int protocol_version; /* Protocol supported version */ + int total_peers; + char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ } megaco_profile_t; megaco_profile_t *megaco_profile_locate(const char *name); +mg_peer_profile_t *megaco_peer_profile_locate(const char *name); void megaco_profile_release(megaco_profile_t *profile); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); +switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload); +switch_status_t sng_mgco_start(megaco_profile_t* profile); +switch_status_t sng_mgco_stop(megaco_profile_t* profile); +switch_status_t mg_config_cleanup(megaco_profile_t* profile); #endif /* MOD_MEGACO_H */ From 293a65c9c05d4d02ab0746734e979320fabbe1c9 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 6 Jun 2012 14:45:39 +0530 Subject: [PATCH 217/493] updating final xml config file --- .../endpoints/mod_megaco/conf/megaco.conf.xml | 65 +++++++------------ 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml index e21ab3a074..91f8f0cc63 100644 --- a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml +++ b/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml @@ -1,47 +1,28 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + From ba051e1007d76d7774448ac980e31e3346fa0d12 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 6 Jun 2012 15:11:55 +0530 Subject: [PATCH 218/493] reorgnazing code , adding below two files * megaco_cli.c - contains CLI commands APIs * megaco_stack_alarms.c - contains Alarm indication APIs from Trillium MEGACO layer --- src/mod/endpoints/mod_megaco/Makefile | 2 +- src/mod/endpoints/mod_megaco/megaco_cli.c | 465 ++++++++++ src/mod/endpoints/mod_megaco/megaco_stack.c | 840 +----------------- src/mod/endpoints/mod_megaco/megaco_stack.h | 87 +- .../mod_megaco/megaco_stack_alarms.c | 495 +++++++++++ src/mod/endpoints/mod_megaco/megaco_xml.c | 226 ----- src/mod/endpoints/mod_megaco/mod_megaco.c | 77 +- src/mod/endpoints/mod_megaco/mod_megaco.h | 3 + 8 files changed, 969 insertions(+), 1226 deletions(-) create mode 100644 src/mod/endpoints/mod_megaco/megaco_cli.c create mode 100644 src/mod/endpoints/mod_megaco/megaco_stack_alarms.c diff --git a/src/mod/endpoints/mod_megaco/Makefile b/src/mod/endpoints/mod_megaco/Makefile index 4564a420e9..228d3f88e8 100644 --- a/src/mod/endpoints/mod_megaco/Makefile +++ b/src/mod/endpoints/mod_megaco/Makefile @@ -7,6 +7,6 @@ ifeq ($(ARCH),x86_64) endif BASE=../../../.. -LOCAL_OBJS=megaco.o megaco_stack.o megaco_xml.o +LOCAL_OBJS=megaco.o megaco_stack.o megaco_xml.o megaco_cli.o megaco_stack_alarms.o LOCAL_LDFLAGS=-lsng_megaco include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_megaco/megaco_cli.c b/src/mod/endpoints/mod_megaco/megaco_cli.c new file mode 100644 index 0000000000..e7d0794c49 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco_cli.c @@ -0,0 +1,465 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Kapil Gupta +* All rights reserved. +* +* +*/ + +/* INCLUDES *******************************************************************/ +#include "mod_megaco.h" +#include "megaco_stack.h" +/******************************************************************************/ + +/* FUNCTION PROTOTYPES ********************************************************/ +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); + +/******************************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream) +{ + int argc; + char *argv[10]; + char *dup = NULL; + + if (zstr(cmd)) { + goto usage; + } + + dup = strdup(cmd); + argc = switch_split(dup, ' ', argv); + + if (argc < 1 || zstr(argv[0])) { + goto usage; + } + + /**********************************************************************************/ + if (!strcmp(argv[0], "profile")) { + if (zstr(argv[1]) || zstr(argv[2])) { + goto usage; + } + /**********************************************************************************/ + if (!strcmp(argv[2], "start")) { + /**********************************************************************************/ + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_release(profile); + stream->write_function(stream, "-ERR Profile %s is already started\n", argv[2]); + } else { + megaco_profile_start(argv[1]); + stream->write_function(stream, "+OK\n"); + } + /**********************************************************************************/ + } else if (!strcmp(argv[2], "stop")) { + /**********************************************************************************/ + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_release(profile); + megaco_profile_destroy(&profile); + stream->write_function(stream, "+OK\n"); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } + /**********************************************************************************/ + }else if(!strcmp(argv[2], "status")) { + /**********************************************************************************/ + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_status(stream, profile->name); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } + /**********************************************************************************/ + }else if(!strcmp(argv[2], "xmlstatus")) { + /**********************************************************************************/ + megaco_profile_t *profile = megaco_profile_locate(argv[1]); + if (profile) { + megaco_profile_xmlstatus(stream, profile->name); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } + /**********************************************************************************/ + }else { + /**********************************************************************************/ + goto usage; + } + } + + goto done; + +usage: + stream->write_function(stream, "-ERR Usage: "MEGACO_FUNCTION_SYNTAX"\n"); + +done: + switch_safe_free(dup); + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char* xmlhdr = ""; + char prntBuf[3048]; + int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + megaco_profile_t* mg_cfg = NULL; + mg_peer_profile_t* mg_peer = NULL; + + switch_assert(profilename); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + mg_cfg = megaco_profile_locate(profilename); + if(!mg_cfg){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + return SWITCH_STATUS_FALSE; + } + + + idx = mg_cfg->idx; + + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->name); + len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); +/****************************************************************************************************************/ +/* Print Peer Information ***************************************************************************************/ + + /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n",mg_peer->name); + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + + get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + + +/****************************************************************************************************************/ +/* Print MG SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + + /* MG SAP Information */ + sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); + + len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); + len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + for (i = 0; i < cfm.t.ssta.s.mgSSAPSta.numAssocPeer; i++) + { + len = len + sprintf(&prntBuf[0] + len,"\n"); + if(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.namePres.pres == PRSNT_NODEF) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.name)); + } + switch(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.type) + { + case CM_NETADDR_IPV4: + { + ip = ntohl(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + break; + } + default: + len = len + sprintf(prntBuf+len, "invalid type \n"); + break; + } + +#ifdef GCP_MGCO + if (PRSNT_NODEF == cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.val)); + } +#endif /* GCP_MGCO */ + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + len = len + sprintf(&prntBuf[0] + len,"\n"); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport SAP Information ***************************************************************************************/ + + len = len + sprintf(&prntBuf[0] + len,"\n"); + /* MG Transport SAP Information */ + sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTSAPSta.state)); + len = len + sprintf(&prntBuf[0] + len," %u \n", (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + +/****************************************************************************************************************/ +/* Print MG Transport Server Information ***************************************************************************************/ + + if(sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer)){ + len = len + sprintf(&prntBuf[0] + len," no established server found \n"); + } + else { + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTptSrvSta.state)); + len = len + sprintf(prntBuf+len, ""); + + switch (cfm.t.ssta.s.mgTptSrvSta.tptAddr.type) + { + case CM_TPTADDR_NOTPRSNT: + { + len = len + sprintf(prntBuf+len, "none"); + break; + } + case CM_TPTADDR_IPV4: + { + ip = ntohl(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "IPv4 IP address #%s, port %u",asciiAddr, + (unsigned int)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port)); + + break; + } + default: + len = len + sprintf(prntBuf+len, "unknown"); + break; + } + len = len + sprintf(prntBuf+len, "\n"); + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + +/****************************************************************************************************************/ + len = len + sprintf(&prntBuf[0] + len,"\n"); + + stream->write_function(stream, "\n%s\n",&prntBuf[0]); + + return SWITCH_STATUS_SUCCESS; +} + +/****************************************************************************************************************/ +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char prntBuf[1024]; + megaco_profile_t* mg_cfg = NULL; + mg_peer_profile_t* mg_peer = NULL; + + switch_assert(profilename); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + mg_cfg = megaco_profile_locate(profilename); + if(!mg_cfg){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); + return SWITCH_STATUS_FALSE; + } + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + return SWITCH_STATUS_FALSE; + } + + idx = mg_cfg->idx; + + /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ + + /* Fetch data from Trillium MEGACO Stack * + * SystemId - Software version information * + * SSAP - MG SAP Information * + * TSAP - MG Transport SAP Information * + * Peer - MG Peer Information * + * TPT-Server - MG Transport Server information * + */ + +#if 0 + /* get System ID */ + sng_mgco_mg_get_status(STSID, &cfm, idx); + stream->write_function(stream, "***********************************************\n"); + stream->write_function(stream, "**** TRILLIUM MEGACO Software Information *****\n"); + stream->write_function(stream, "Version = %d \n", cfm.t.ssta.s.systemId.mVer); + stream->write_function(stream, "Version Revision = %d \n", cfm.t.ssta.s.systemId.mRev); + stream->write_function(stream, "Branch Version = %d \n", cfm.t.ssta.s.systemId.bVer); + stream->write_function(stream, "Branch Revision = %d \n", cfm.t.ssta.s.systemId.bRev); + stream->write_function(stream, "Part Number = %d \n", cfm.t.ssta.s.systemId.ptNmb); + stream->write_function(stream, "***********************************************\n"); +#endif + + /* MG Peer Information */ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + smmgPrntPeerSta(&cfm.t.ssta.s.mgPeerSta); + + /* MG Peer Information */ + sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); + smmgPrntSsapSta(&cfm.t.ssta.s.mgSSAPSta); + + /* MG Transport SAP Information */ + sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); + len = len + sprintf(prntBuf+len,"***********************************************\n"); + len = len + sprintf(prntBuf+len,"**********MG TRANSPORT SAP Information**********\n"); + len = len + sprintf(prntBuf+len,"TSAP status:\n"); + len = len + sprintf(prntBuf+len,"state = %d, number of listeners %u\n", + (int)(cfm.t.ssta.s.mgTSAPSta.state), + (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); + len = len + sprintf(prntBuf+len,"***********************************************\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"%s\n",prntBuf); + + /* MG Transport Server Information */ + sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer); + smmgPrntSrvSta(&cfm.t.ssta.s.mgTptSrvSta); + + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ +void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) +{ + int len = 0x00; + int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + + if(PRSNT_NODEF == cfm->namePres.pres) + { + len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm->name)); + } + else + { + len = len + sprintf(prntBuf+len, " Not Present \n"); + } + + /* + * Print all IP addresses in the IP addr table + */ + for(i=0; ipeerAddrTbl.count; i++) + { + switch (cfm->peerAddrTbl.netAddr[i].type) + { + case CM_NETADDR_IPV4: + { + ip = ntohl(cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + break; + } + case CM_NETADDR_IPV6: + { + char ipv6_buf[128]; + int len1= 0; + int j = 0; + memset(&ipv6_buf[0], 0, sizeof(ipv6_buf)); + len1 = len1 + sprintf(ipv6_buf+len1, "IP V6 address : %2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[0])); + + for (j = 1; j < CM_IPV6ADDR_SIZE; j++) + { + len1 = len1 + sprintf(ipv6_buf+len1, ":%2x", (unsigned int) + (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[j])); + } + len1 = len1 + sprintf(ipv6_buf+len1, "\n"); + len = len + sprintf(prntBuf+len, "%s\n", ipv6_buf); + break; + } + default: + { + len = len + sprintf(prntBuf+len, " Invalid address type[%d]\n", cfm->peerAddrTbl.netAddr[i].type); + break; + } + } + } /* End of for */ + + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendOgTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendIcTxn)); + len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->rttEstimate)); + + switch(cfm->protocol) + { + case LMG_PROTOCOL_MGCP: + len = len + sprintf(prntBuf+len," MGCP \n"); + break; + + case LMG_PROTOCOL_MGCO: + len = len + sprintf(prntBuf+len," MEGACO \n"); + break; + + case LMG_PROTOCOL_NONE: + len = len + sprintf(prntBuf+len," MGCP/MEGACO \n"); + break; + + default: + len = len + sprintf(prntBuf+len," invalid \n"); + break; + } + + switch(cfm->transportType) + { + case LMG_TPT_UDP: + len = len + sprintf(prntBuf+len, "UDP\n"); + break; + + case LMG_TPT_TCP: + len = len + sprintf(prntBuf+len, "TCP\n"); + break; + + case LMG_TPT_NONE: + len = len + sprintf(prntBuf+len, "UDP/TCP\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } +#ifdef GCP_MGCO + switch(cfm->encodingScheme) + { + case LMG_ENCODE_BIN: + len = len + sprintf(prntBuf+len, "BINARY\n"); + break; + + case LMG_ENCODE_TXT: + len = len + sprintf(prntBuf+len, "TEXT\n"); + break; + + case LMG_ENCODE_NONE: + len = len + sprintf(prntBuf+len, "TEXT/BINARY\n"); + break; + + default: + len = len + sprintf(prntBuf+len, "invalid\n"); + break; + } + + if(LMG_VER_PROF_MGCO_H248_1_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "1.0 \n"); + } else if(LMG_VER_PROF_MGCO_H248_2_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "2.0 \n"); + }else if(LMG_VER_PROF_MGCO_H248_3_0 == cfm->version){ + len = len + sprintf(prntBuf+len, "3.0 \n"); + } else{ + len = len + sprintf(prntBuf+len, "invalid \n"); + } +#endif + +} +/******************************************************************************/ + diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c index 103f8726e7..6038173a8c 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_megaco/megaco_stack.c @@ -37,7 +37,6 @@ int sng_mgco_mg_app_ssap_stop(int idx); switch_status_t sng_mgco_stack_gen_cfg(); -void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); sng_mg_transport_types_e mg_get_tpt_type(megaco_profile_t* mg_cfg); sng_mg_transport_types_e mg_get_tpt_type_from_str(char* tpt_type); @@ -1179,482 +1178,6 @@ int sng_mgco_mg_shutdown() return (sng_cntrl_mg (&pst, &cntrl)); } /******************************************************************************/ -void handle_mg_alarm(Pst *pst, MgMngmt *usta) -{ - U16 ret; - int len = 0x00; - char prBuf[3048]; - - memset(&prBuf[0], 0, sizeof(prBuf)); - - len = len + sprintf(prBuf+len,"MG Status Indication: received with Category = %d, Event = %d, Cause = %d \n", - usta->t.usta.alarm.category, usta->t.usta.alarm.event, - usta->t.usta.alarm.cause); - - len = len + sprintf(prBuf+len, "Category ( "); - - switch (usta->t.usta.alarm.category) - { - case LCM_CATEGORY_PROTOCOL: - { - len = len + sprintf(prBuf+len, "protocol related "); - break; - } - case LCM_CATEGORY_INTERFACE: - { - len = len + sprintf(prBuf+len, "interface related "); - break; - } - case LCM_CATEGORY_INTERNAL: - { - len = len + sprintf(prBuf+len, "internal "); - break; - } - case LCM_CATEGORY_RESOURCE: - { - len = len + sprintf(prBuf+len, "system resources related "); - break; - } - case LCM_CATEGORY_PSF_FTHA: - { - len = len + sprintf(prBuf+len, "fault tolerance / high availability PSF related "); - break; - } - case LCM_CATEGORY_LYR_SPECIFIC: - { - len = len + sprintf(prBuf+len, "MGCP related "); - break; - } - default: - { - len = len + sprintf(prBuf+len, "unknown: %d", (int)(usta->t.usta.alarm.category)); - break; - } - } - len = len + sprintf(prBuf+len, ") "); - - len = len + sprintf(prBuf+len, " Event ( "); - switch (usta->t.usta.alarm.event) - { - case LMG_EVENT_TSAP_RECVRY_SUCCESS: - { - len = len + sprintf(prBuf+len, "TSAP recovery success"); - break; - } - case LMG_EVENT_TSAP_RECVRY_FAILED: - { - len = len + sprintf(prBuf+len, "TSAP recovery failed"); - break; - } - case LCM_EVENT_UI_INV_EVT: - { - len = len + sprintf(prBuf+len, "upper interface invalid event"); - break; - } - case LCM_EVENT_LI_INV_EVT: - { - len = len + sprintf(prBuf+len, "lower interface invalid event"); - break; - } - case LCM_EVENT_PI_INV_EVT: - { - len = len + sprintf(prBuf+len, "peer interface invalid event"); - break; - } - case LCM_EVENT_INV_EVT: - { - len = len + sprintf(prBuf+len, "general invalid event"); - break; - } - case LCM_EVENT_INV_STATE: - { - len = len + sprintf(prBuf+len, "invalid internal state"); - break; - } - case LCM_EVENT_INV_TMR_EVT: - { - len = len + sprintf(prBuf+len, "invalid timer event"); - break; - } - case LCM_EVENT_MI_INV_EVT: - { - len = len + sprintf(prBuf+len, "management interface invalid event"); - break; - } - case LCM_EVENT_BND_FAIL: - { - len = len + sprintf(prBuf+len, "bind failure"); - break; - } - case LCM_EVENT_NAK: - { - len = len + sprintf(prBuf+len, "destination nack"); - break; - } - case LCM_EVENT_TIMEOUT: - { - len = len + sprintf(prBuf+len, "timeout"); - break; - } - case LCM_EVENT_BND_OK: - { - len = len + sprintf(prBuf+len, "bind ok"); - break; - } - case LCM_EVENT_SMEM_ALLOC_FAIL: - { - len = len + sprintf(prBuf+len, "static memory allocation failed"); - break; - } - case LCM_EVENT_DMEM_ALLOC_FAIL: - { - len = len + sprintf(prBuf+len, "dynamic mmemory allocation failed"); - break; - } - case LCM_EVENT_LYR_SPECIFIC: - { - len = len + sprintf(prBuf+len, "MGCP specific"); - break; - } - default: - { - len = len + sprintf(prBuf+len, "unknown event %d", (int)(usta->t.usta.alarm.event)); - break; - } - case LMG_EVENT_HIT_BNDCFM: - { - len = len + sprintf(prBuf+len, "HIT bind confirm"); - break; - } - case LMG_EVENT_HIT_CONCFM: - { - len = len + sprintf(prBuf+len, "HIT connect confirm"); - break; - } - case LMG_EVENT_HIT_DISCIND: - { - len = len + sprintf(prBuf+len, "HIT disconnect indication"); - break; - } - case LMG_EVENT_HIT_UDATIND: - { - len = len + sprintf(prBuf+len, "HIT unit data indication"); - break; - } - case LMG_EVENT_MGT_BNDREQ: - { - len = len + sprintf(prBuf+len, "MGT bind request"); - break; - } - case LMG_EVENT_PEER_CFG_FAIL: - { - len = len + sprintf(prBuf+len, "Peer Configuration Failed"); - break; - } - case LMG_EVENT_MGT_UBNDREQ: - { - len = len + sprintf(prBuf+len, "MGT unbind request"); - break; - } - case LMG_EVENT_MGT_MGCPTXNREQ: - { - len = len + sprintf(prBuf+len, "MGT MGCP transaction request"); - break; - } - case LMG_EVENT_MGT_MGCPTXNIND: - { - len = len + sprintf(prBuf+len, "MGT MGCP transaction indication"); - break; - } - - case LMG_EVENT_PEER_ENABLED: - { - len = len + sprintf(prBuf+len, "gateway enabled"); - break; - } - case LMG_EVENT_PEER_DISCOVERED: - { - len = len + sprintf(prBuf+len, "gateway discovered , notified entity"); - break; - } - case LMG_EVENT_PEER_REMOVED: - { - len = len + sprintf(prBuf+len, "gateway removed"); - break; - } - case LMG_EVENT_RES_CONG_ON: - { - len = len + sprintf(prBuf+len, "resource congestion ON"); - break; - } - case LMG_EVENT_RES_CONG_OFF: - { - len = len + sprintf(prBuf+len, "resource congestion OFF"); - break; - } - case LMG_EVENT_TPTSRV: - { - len = len + sprintf(prBuf+len, "transport service"); - break; - } - case LMG_EVENT_SSAP_ENABLED: - { - len = len + sprintf(prBuf+len, "SSAP enabled"); - break; - } - case LMG_EVENT_NS_NOT_RESPONDING: - { - len = len + sprintf(prBuf+len, "name server not responding"); - break; - } - case LMG_EVENT_TPT_FAILED: - { - len = len + sprintf(prBuf+len, "transport failure"); - break; - } - } - - len = len + sprintf(prBuf+len, " ) "); - - len = len + sprintf(prBuf+len, " cause ( "); - switch (usta->t.usta.alarm.cause) - { - case LCM_CAUSE_UNKNOWN: - { - len = len + sprintf(prBuf+len, "unknown"); - break; - } - case LCM_CAUSE_OUT_OF_RANGE: - { - len = len + sprintf(prBuf+len, "out of range"); - break; - } - case LCM_CAUSE_INV_SAP: - { - len = len + sprintf(prBuf+len, "NULL/unknown sap"); - break; - } - case LCM_CAUSE_INV_SPID: - { - len = len + sprintf(prBuf+len, "invalid service provider"); - break; - } - case LCM_CAUSE_INV_SUID: - { - len = len + sprintf(prBuf+len, "invalid service user"); - break; - } - case LCM_CAUSE_INV_NETWORK_MSG: - { - len = len + sprintf(prBuf+len, "invalid network message"); - break; - } - case LCM_CAUSE_DECODE_ERR: - { - len = len + sprintf(prBuf+len, "message decoding problem"); - break; - } - case LCM_CAUSE_USER_INITIATED: - { - len = len + sprintf(prBuf+len, "user initiated"); - break; - } - case LCM_CAUSE_MGMT_INITIATED: - { - len = len + sprintf(prBuf+len, "management initiated"); - break; - } - case LCM_CAUSE_INV_STATE: /* cause and event! */ - { - len = len + sprintf(prBuf+len, "invalid state"); - break; - } - case LCM_CAUSE_TMR_EXPIRED: /* cause and event! */ - { - len = len + sprintf(prBuf+len, "timer expired"); - break; - } - case LCM_CAUSE_INV_MSG_LENGTH: - { - len = len + sprintf(prBuf+len, "invalid message length"); - break; - } - case LCM_CAUSE_PROT_NOT_ACTIVE: - { - len = len + sprintf(prBuf+len, "protocol layer not active"); - break; - } - case LCM_CAUSE_INV_PAR_VAL: - { - len = len + sprintf(prBuf+len, "invalid parameter value"); - break; - } - case LCM_CAUSE_NEG_CFM: - { - len = len + sprintf(prBuf+len, "negative confirmation"); - break; - } - case LCM_CAUSE_MEM_ALLOC_FAIL: - { - len = len + sprintf(prBuf+len, "memory allocation failure"); - break; - } - case LCM_CAUSE_HASH_FAIL: - { - len = len + sprintf(prBuf+len, "hashing failure"); - break; - } - case LCM_CAUSE_LYR_SPECIFIC: - { - len = len + sprintf(prBuf+len, "MGCP specific"); - break; - } - default: - { - len = len + sprintf(prBuf+len, "unknown %d", (int)(usta->t.usta.alarm.cause)); - break; - } - case LMG_CAUSE_TPT_FAILURE: /* make up your mind - cause or event? */ - { - len = len + sprintf(prBuf+len, "transport failure"); - break; - } - case LMG_CAUSE_NS_NOT_RESPONDING: - { - len = len + sprintf(prBuf+len, "name server not responding"); - break; - } - } - len = len + sprintf(prBuf+len, " ) "); - - len = len + sprintf(prBuf+len, " Alarm parameters ( "); - ret = smmgGetAlarmInfoField(&usta->t.usta); - switch (ret) - { - case SMMG_UNKNOWNFIELD: - { - len = len + sprintf(prBuf+len, "invalid "); - - break; - } - case SMMG_PEERINFO: - { - /* - * Invoke the new function for printing the MgPeerInfo & - * delete all print code here - */ - smmgPrntPeerInfo(&(usta->t.usta.alarmInfo.u.peerInfo)); - break; - } - case SMMG_SAPID: - { - len = len + sprintf(prBuf+len, "SAP ID %d\n", (int)(usta->t.usta.alarmInfo.u.sapId)); - break; - } - case SMMG_MEM: - { - len = len + sprintf(prBuf+len, "memory region %d pool %d\n", - (int)(usta->t.usta.alarmInfo.u.mem.region), - (int)(usta->t.usta.alarmInfo.u.mem.pool)); - - break; - } - case SMMG_SRVSTA: - { - smmgPrntSrvSta(&usta->t.usta.alarmInfo.u.srvSta); - break; - } - case SMMG_PEERSTA: - { - smmgPrntPeerSta(&usta->t.usta.alarmInfo.u.peerSta); - break; - } - case SMMG_SSAPSTA: - { - smmgPrntSsapSta(&usta->t.usta.alarmInfo.u.ssapSta); - break; - } - case SMMG_PARID: - { - len = len + sprintf(prBuf+len, "parameter type: "); - switch (usta->t.usta.alarmInfo.u.parId.parType) - { - case LMG_PAR_TPTADDR: len = len + sprintf(prBuf+len, "transport address"); break; - case LMG_PAR_MBUF: len = len + sprintf(prBuf+len, "message buffer"); break; - case LMG_PAR_CHOICE: len = len + sprintf(prBuf+len, "choice"); break; - case LMG_PAR_SPID: len = len + sprintf(prBuf+len, "spId"); break; - default: len = len + sprintf(prBuf+len, "unknown"); break; - } - - len = len + sprintf(prBuf+len, ", value %d\n", - (int)(usta->t.usta.alarmInfo.u.parId.u.sapId)); - - break; - } - case SMMG_NOT_APPL: - { - len = len + sprintf(prBuf+len, "not applicable\n"); - break; - } - - /*TODO*/ - } - len = len + sprintf(prBuf+len, " ) "); - len = len + sprintf(prBuf+len, " \n "); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s \n", prBuf); -} - -/*****************************************************************************************************************************/ -void handle_tucl_alarm(Pst *pst, HiMngmt *sta) -{ - /* To print the general information */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Recieved a status indication from TUCL layer \n\n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Category = %d , event = %d , cause = %d\n", - sta->t.usta.alarm.category, - sta->t.usta.alarm.event, sta->t.usta.alarm.cause); - - switch(sta->t.usta.alarm.event) - { - case LCM_EVENT_INV_EVT: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LCM_EVENT_INV_EVT with type (%d)\n\n", - sta->t.usta.info.type); - break; - } - case LHI_EVENT_BNDREQ: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LHI_EVENT_BNDREQ with type (%d) spId (%d)\n\n", - sta->t.usta.info.type, sta->t.usta.info.spId); - break; - } - case LHI_EVENT_SERVOPENREQ: - case LHI_EVENT_DATREQ: - case LHI_EVENT_UDATREQ: - case LHI_EVENT_CONREQ: - case LHI_EVENT_DISCREQ: -#if(defined(HI_TLS) && defined(HI_TCP_TLS)) - case LHI_EVENT_TLS_ESTREQ: -#endif - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: partype (%d) type(%d)\n\n", - sta->t.usta.info.inf.parType, sta->t.usta.info.type); - break; - } - case LCM_EVENT_DMEM_ALLOC_FAIL: - case LCM_EVENT_SMEM_ALLOC_FAIL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " [HI_USTA]: MEM_ALLOC_FAIL with region(%d) pool (%d) type(%d)\n\n", - sta->t.usta.info.inf.mem.region, sta->t.usta.info.inf.mem.pool, - sta->t.usta.info.type); - break; - } - default: - break; - } - -} /* handle_sng_tucl_alarm */ -/******************************************************************************/ - int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer) { Pst pst; @@ -1722,368 +1245,7 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, return (sng_sta_mg (&pst, &cntrl, cfm)); } -/******************************************************************************/ -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename) -{ - int idx = 0x00; - int len = 0x00; - MgMngmt cfm; - char prntBuf[1024]; - megaco_profile_t* mg_cfg = NULL; - mg_peer_profile_t* mg_peer = NULL; - - switch_assert(profilename); - - memset((U8 *)&cfm, 0, sizeof(cfm)); - memset((char *)&prntBuf, 0, sizeof(prntBuf)); - - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } - mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); - - if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); - return SWITCH_STATUS_FALSE; - } - - idx = mg_cfg->idx; - - /*stream->write_function(stream, "Collecting MG Profile[%s] status... \n",profilename);*/ - - /* Fetch data from Trillium MEGACO Stack * - * SystemId - Software version information * - * SSAP - MG SAP Information * - * TSAP - MG Transport SAP Information * - * Peer - MG Peer Information * - * TPT-Server - MG Transport Server information * - */ - -#if 0 - /* get System ID */ - sng_mgco_mg_get_status(STSID, &cfm, idx); - stream->write_function(stream, "***********************************************\n"); - stream->write_function(stream, "**** TRILLIUM MEGACO Software Information *****\n"); - stream->write_function(stream, "Version = %d \n", cfm.t.ssta.s.systemId.mVer); - stream->write_function(stream, "Version Revision = %d \n", cfm.t.ssta.s.systemId.mRev); - stream->write_function(stream, "Branch Version = %d \n", cfm.t.ssta.s.systemId.bVer); - stream->write_function(stream, "Branch Revision = %d \n", cfm.t.ssta.s.systemId.bRev); - stream->write_function(stream, "Part Number = %d \n", cfm.t.ssta.s.systemId.ptNmb); - stream->write_function(stream, "***********************************************\n"); -#endif - - /* MG Peer Information */ - sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); - smmgPrntPeerSta(&cfm.t.ssta.s.mgPeerSta); - - /* MG Peer Information */ - sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); - smmgPrntSsapSta(&cfm.t.ssta.s.mgSSAPSta); - - /* MG Transport SAP Information */ - sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); - len = len + sprintf(prntBuf+len,"***********************************************\n"); - len = len + sprintf(prntBuf+len,"**********MG TRANSPORT SAP Information**********\n"); - len = len + sprintf(prntBuf+len,"TSAP status:\n"); - len = len + sprintf(prntBuf+len,"state = %d, number of listeners %u\n", - (int)(cfm.t.ssta.s.mgTSAPSta.state), - (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); - len = len + sprintf(prntBuf+len,"***********************************************\n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"%s\n",prntBuf); - - /* MG Transport Server Information */ - sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer); - smmgPrntSrvSta(&cfm.t.ssta.s.mgTptSrvSta); - - return SWITCH_STATUS_SUCCESS; -} -/******************************************************************************/ -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) -{ - int idx = 0x00; - int len = 0x00; - MgMngmt cfm; - char* xmlhdr = ""; - char prntBuf[3048]; - int i = 0x00; - char *asciiAddr; - CmInetIpAddr ip; - megaco_profile_t* mg_cfg = NULL; - mg_peer_profile_t* mg_peer = NULL; - - switch_assert(profilename); - - memset((U8 *)&cfm, 0, sizeof(cfm)); - memset((char *)&prntBuf, 0, sizeof(prntBuf)); - - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } - mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); - - if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); - return SWITCH_STATUS_FALSE; - } - - - idx = mg_cfg->idx; - - len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); - - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->name); - len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); -/****************************************************************************************************************/ -/* Print Peer Information ***************************************************************************************/ - - /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ - - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"\n",mg_peer->name); - - /* send request to MEGACO Trillium stack to get peer information*/ - sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); - - get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); - - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"\n"); - - -/****************************************************************************************************************/ -/* Print MG SAP Information ***************************************************************************************/ - - len = len + sprintf(&prntBuf[0] + len,"\n"); - - /* MG SAP Information */ - sng_mgco_mg_get_status(STSSAP, &cfm, mg_cfg, mg_peer); - - len = len + sprintf(prntBuf+len, " %s \n", PRNT_SAP_STATE((int)(cfm.t.ssta.s.mgSSAPSta.state))); - len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numAssocPeer)); - len = len + sprintf(prntBuf+len, " %u \n", (unsigned int)(cfm.t.ssta.s.mgSSAPSta.numServers)); - len = len + sprintf(&prntBuf[0] + len,"\n"); - for (i = 0; i < cfm.t.ssta.s.mgSSAPSta.numAssocPeer; i++) - { - len = len + sprintf(&prntBuf[0] + len,"\n"); - if(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.namePres.pres == PRSNT_NODEF) - { - len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.name)); - } - switch(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.type) - { - case CM_NETADDR_IPV4: - { - ip = ntohl(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].dname.netAddr.u.ipv4NetAddr); - cmInetNtoa(ip, &asciiAddr); - len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); - break; - } - default: - len = len + sprintf(prntBuf+len, "invalid type \n"); - break; - } - -#ifdef GCP_MGCO - if (PRSNT_NODEF == cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.pres) - { - len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm.t.ssta.s.mgSSAPSta.peerInfo[i].mid.val)); - } -#endif /* GCP_MGCO */ - len = len + sprintf(&prntBuf[0] + len,"\n"); - } - len = len + sprintf(&prntBuf[0] + len,"\n"); - - len = len + sprintf(&prntBuf[0] + len,"\n"); - -/****************************************************************************************************************/ -/* Print MG Transport SAP Information ***************************************************************************************/ - - len = len + sprintf(&prntBuf[0] + len,"\n"); - /* MG Transport SAP Information */ - sng_mgco_mg_get_status(STTSAP, &cfm, mg_cfg, mg_peer); - len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTSAPSta.state)); - len = len + sprintf(&prntBuf[0] + len," %u \n", (unsigned int)(cfm.t.ssta.s.mgTSAPSta.numServers)); - len = len + sprintf(&prntBuf[0] + len,"\n"); - -/****************************************************************************************************************/ -/* Print MG Transport Server Information ***************************************************************************************/ - - if(sng_mgco_mg_get_status(STSERVER, &cfm, mg_cfg, mg_peer)){ - len = len + sprintf(&prntBuf[0] + len," no established server found \n"); - } - else { - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len," %s \n", PRNT_SAP_STATE(cfm.t.ssta.s.mgTptSrvSta.state)); - len = len + sprintf(prntBuf+len, ""); - - switch (cfm.t.ssta.s.mgTptSrvSta.tptAddr.type) - { - case CM_TPTADDR_NOTPRSNT: - { - len = len + sprintf(prntBuf+len, "none"); - break; - } - case CM_TPTADDR_IPV4: - { - ip = ntohl(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address); - cmInetNtoa(ip, &asciiAddr); - len = len + sprintf(prntBuf+len, "IPv4 IP address #%s, port %u",asciiAddr, - (unsigned int)(cfm.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port)); - - break; - } - default: - len = len + sprintf(prntBuf+len, "unknown"); - break; - } - len = len + sprintf(prntBuf+len, "\n"); - len = len + sprintf(&prntBuf[0] + len,"\n"); - } - -/****************************************************************************************************************/ - len = len + sprintf(&prntBuf[0] + len,"\n"); - - stream->write_function(stream, "\n%s\n",&prntBuf[0]); - - return SWITCH_STATUS_SUCCESS; -} - -/******************************************************************************/ - -void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) -{ - int len = 0x00; - int i = 0x00; - char *asciiAddr; - CmInetIpAddr ip; - - if(PRSNT_NODEF == cfm->namePres.pres) - { - len = len + sprintf(prntBuf+len, " %s \n", (char *)(cfm->name)); - } - else - { - len = len + sprintf(prntBuf+len, " Not Present \n"); - } - - /* - * Print all IP addresses in the IP addr table - */ - for(i=0; ipeerAddrTbl.count; i++) - { - switch (cfm->peerAddrTbl.netAddr[i].type) - { - case CM_NETADDR_IPV4: - { - ip = ntohl(cfm->peerAddrTbl.netAddr[i].u.ipv4NetAddr); - cmInetNtoa(ip, &asciiAddr); - len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); - break; - } - case CM_NETADDR_IPV6: - { - char ipv6_buf[128]; - int len1= 0; - int j = 0; - memset(&ipv6_buf[0], 0, sizeof(ipv6_buf)); - len1 = len1 + sprintf(ipv6_buf+len1, "IP V6 address : %2x", (unsigned int) - (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[0])); - - for (j = 1; j < CM_IPV6ADDR_SIZE; j++) - { - len1 = len1 + sprintf(ipv6_buf+len1, ":%2x", (unsigned int) - (cfm->peerAddrTbl.netAddr[i].u.ipv6NetAddr[j])); - } - len1 = len1 + sprintf(ipv6_buf+len1, "\n"); - len = len + sprintf(prntBuf+len, "%s\n", ipv6_buf); - break; - } - default: - { - len = len + sprintf(prntBuf+len, " Invalid address type[%d]\n", cfm->peerAddrTbl.netAddr[i].type); - break; - } - } - } /* End of for */ - - len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendOgTxn)); - len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->numPendIcTxn)); - len = len + sprintf(prntBuf+len," %lu \n",(unsigned long)(cfm->rttEstimate)); - - switch(cfm->protocol) - { - case LMG_PROTOCOL_MGCP: - len = len + sprintf(prntBuf+len," MGCP \n"); - break; - - case LMG_PROTOCOL_MGCO: - len = len + sprintf(prntBuf+len," MEGACO \n"); - break; - - case LMG_PROTOCOL_NONE: - len = len + sprintf(prntBuf+len," MGCP/MEGACO \n"); - break; - - default: - len = len + sprintf(prntBuf+len," invalid \n"); - break; - } - - switch(cfm->transportType) - { - case LMG_TPT_UDP: - len = len + sprintf(prntBuf+len, "UDP\n"); - break; - - case LMG_TPT_TCP: - len = len + sprintf(prntBuf+len, "TCP\n"); - break; - - case LMG_TPT_NONE: - len = len + sprintf(prntBuf+len, "UDP/TCP\n"); - break; - - default: - len = len + sprintf(prntBuf+len, "invalid\n"); - break; - } -#ifdef GCP_MGCO - switch(cfm->encodingScheme) - { - case LMG_ENCODE_BIN: - len = len + sprintf(prntBuf+len, "BINARY\n"); - break; - - case LMG_ENCODE_TXT: - len = len + sprintf(prntBuf+len, "TEXT\n"); - break; - - case LMG_ENCODE_NONE: - len = len + sprintf(prntBuf+len, "TEXT/BINARY\n"); - break; - - default: - len = len + sprintf(prntBuf+len, "invalid\n"); - break; - } - - if(LMG_VER_PROF_MGCO_H248_1_0 == cfm->version){ - len = len + sprintf(prntBuf+len, "1.0 \n"); - } else if(LMG_VER_PROF_MGCO_H248_2_0 == cfm->version){ - len = len + sprintf(prntBuf+len, "2.0 \n"); - }else if(LMG_VER_PROF_MGCO_H248_3_0 == cfm->version){ - len = len + sprintf(prntBuf+len, "3.0 \n"); - } else{ - len = len + sprintf(prntBuf+len, "invalid \n"); - } -#endif - -} + /**********************************************************************************************************************************/ sng_mg_transport_types_e mg_get_tpt_type(megaco_profile_t* mg_profile) { diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h index dabf4a5551..0e10bc346d 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_megaco/megaco_stack.h @@ -8,36 +8,10 @@ #include "mod_megaco.h" -#ifndef _MEGACO_CFG_H_ -#define _MEGACO_CFG_H_ +#ifndef _MEGACO_STACK_H_ +#define _MEGACO_STACK_H_ #define MAX_MID_LEN 30 -#define MAX_DOMAIN_LEN 30 -#define MAX_NAME_LEN 25 -#define MAX_MG_PROFILES 5 - -#if 0 -typedef struct sng_mg_peer{ - char name[MAX_NAME_LEN]; /* Peer Name as defined in config file */ - uint16_t id; /* Peer ID as defined in config file */ - uint8_t ipaddr[MAX_DOMAIN_LEN]; /* Peer IP */ - uint16_t port; /*Peer Port */ - uint8_t mid[MAX_MID_LEN]; /* Peer H.248 MID */ - uint16_t encoding_type; /* Encoding TEXT/Binary */ -}sng_mg_peer_t; - -typedef struct sng_mg_peers{ - uint16_t total_peer; /* Total number of MGC Peer */ - sng_mg_peer_t peers[MG_MAX_PEERS+1]; -}sng_mg_peers_t; - -typedef struct sng_mg_transport_profile{ - char name[MAX_NAME_LEN]; /* Peer Name as defined in config file */ - uint32_t id; /* map to tsap id */ - uint16_t transport_type; /* transport type */ -}sng_mg_transport_profile_t; - -#endif typedef enum{ SNG_MG_TPT_NONE, @@ -70,36 +44,6 @@ typedef enum{ "SNG_MG_ENCODING_NONE") -#if 0 -/* each profile is corresponds to each MG Instance */ -typedef struct sng_mg_cfg{ - char name[MAX_NAME_LEN]; /* MG(Virtual MG) Name as defined in config file */ - uint32_t id; /* Id - map to MG SAP ID */ - uint8_t mid[MAX_MID_LEN]; /* MG H.248 MID */ - uint8_t my_domain[MAX_DOMAIN_LEN]; /* local domain name */ - uint8_t my_ipaddr[MAX_DOMAIN_LEN]; /* local domain name */ - uint32_t port; /* port */ - uint16_t protocol_version; /* Protocol supported version */ - uint16_t peer_id; /* MGC Peer ID */ - uint16_t transport_prof_id; /* Transport profile id ..this also will be the spId for MG SAP*/ - uint16_t protocol_type; /* MEGACO/MGCP */ -}sng_mg_cfg_t; - - -typedef struct sng_mg_gbl_cfg{ - int num_of_mg_profiles; - sng_mg_cfg_t mgCfg[MAX_MG_PROFILES + 1]; - sng_mg_transport_profile_t mgTptProf[MG_MAX_PEERS+1]; /* transport profile */ - sng_mg_peers_t mgPeer; -}sng_mg_gbl_cfg_t; - - -extern switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile); -extern switch_status_t sng_parse_mg_tpt_profile(switch_xml_t mg_tpt_profile); -extern switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface); -#endif - - void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* msg); @@ -115,30 +59,5 @@ switch_status_t sng_mgco_cfg(megaco_profile_t* profile); switch_status_t sng_mgco_init(sng_isup_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); -/*****************************************************************************************************/ - -#if 0 -#define GET_MG_CFG_IDX(_profilename, _idx){\ - for(idx=0; idx < MAX_MG_PROFILES; idx++){\ - /* id zero is not acceptable */\ - if(megaco_globals.g_mg_cfg.mgCfg[idx].id){\ - if (strcmp(megaco_globals.g_mg_cfg.mgCfg[idx].name, profilename)) {\ - continue;\ - } else{\ - break;\ - }\ - }\ - }\ -} -#define GET_TPT_ID(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].id -#define GET_MU_SAP_ID(_id) megaco_globals.g_mg_cfg.mgCfg[_id].id - -#define GET_TPT_TYPE(_id) megaco_globals.g_mg_cfg.mgTptProf[megaco_globals.g_mg_cfg.mgCfg[_id].transport_prof_id].transport_type - -#define GET_ENCODING_TYPE(_id) megaco_globals.g_mg_cfg.mgPeer.peers[megaco_globals.g_mg_cfg.mgCfg[_id].peer_id].encoding_type -#endif - -#endif /* _MEGACO_CFG_H_ */ +#endif /* _MEGACO_STACK_H_ */ diff --git a/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c b/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c new file mode 100644 index 0000000000..dd114a3850 --- /dev/null +++ b/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c @@ -0,0 +1,495 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Kapil Gupta +* All rights reserved. +* +* +*/ + +/* INCLUDES *******************************************************************/ +#include "mod_megaco.h" +#include "megaco_stack.h" +/******************************************************************************/ + +/* FUNCTION PROTOTYPES ********************************************************/ + +/******************************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +void handle_mg_alarm(Pst *pst, MgMngmt *usta) +{ + U16 ret; + int len = 0x00; + char prBuf[3048]; + + memset(&prBuf[0], 0, sizeof(prBuf)); + + len = len + sprintf(prBuf+len,"MG Status Indication: received with Category = %d, Event = %d, Cause = %d \n", + usta->t.usta.alarm.category, usta->t.usta.alarm.event, + usta->t.usta.alarm.cause); + + len = len + sprintf(prBuf+len, "Category ( "); + + switch (usta->t.usta.alarm.category) + { + case LCM_CATEGORY_PROTOCOL: + { + len = len + sprintf(prBuf+len, "protocol related "); + break; + } + case LCM_CATEGORY_INTERFACE: + { + len = len + sprintf(prBuf+len, "interface related "); + break; + } + case LCM_CATEGORY_INTERNAL: + { + len = len + sprintf(prBuf+len, "internal "); + break; + } + case LCM_CATEGORY_RESOURCE: + { + len = len + sprintf(prBuf+len, "system resources related "); + break; + } + case LCM_CATEGORY_PSF_FTHA: + { + len = len + sprintf(prBuf+len, "fault tolerance / high availability PSF related "); + break; + } + case LCM_CATEGORY_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP related "); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown: %d", (int)(usta->t.usta.alarm.category)); + break; + } + } + len = len + sprintf(prBuf+len, ") "); + + len = len + sprintf(prBuf+len, " Event ( "); + switch (usta->t.usta.alarm.event) + { + case LMG_EVENT_TSAP_RECVRY_SUCCESS: + { + len = len + sprintf(prBuf+len, "TSAP recovery success"); + break; + } + case LMG_EVENT_TSAP_RECVRY_FAILED: + { + len = len + sprintf(prBuf+len, "TSAP recovery failed"); + break; + } + case LCM_EVENT_UI_INV_EVT: + { + len = len + sprintf(prBuf+len, "upper interface invalid event"); + break; + } + case LCM_EVENT_LI_INV_EVT: + { + len = len + sprintf(prBuf+len, "lower interface invalid event"); + break; + } + case LCM_EVENT_PI_INV_EVT: + { + len = len + sprintf(prBuf+len, "peer interface invalid event"); + break; + } + case LCM_EVENT_INV_EVT: + { + len = len + sprintf(prBuf+len, "general invalid event"); + break; + } + case LCM_EVENT_INV_STATE: + { + len = len + sprintf(prBuf+len, "invalid internal state"); + break; + } + case LCM_EVENT_INV_TMR_EVT: + { + len = len + sprintf(prBuf+len, "invalid timer event"); + break; + } + case LCM_EVENT_MI_INV_EVT: + { + len = len + sprintf(prBuf+len, "management interface invalid event"); + break; + } + case LCM_EVENT_BND_FAIL: + { + len = len + sprintf(prBuf+len, "bind failure"); + break; + } + case LCM_EVENT_NAK: + { + len = len + sprintf(prBuf+len, "destination nack"); + break; + } + case LCM_EVENT_TIMEOUT: + { + len = len + sprintf(prBuf+len, "timeout"); + break; + } + case LCM_EVENT_BND_OK: + { + len = len + sprintf(prBuf+len, "bind ok"); + break; + } + case LCM_EVENT_SMEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "static memory allocation failed"); + break; + } + case LCM_EVENT_DMEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "dynamic mmemory allocation failed"); + break; + } + case LCM_EVENT_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP specific"); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown event %d", (int)(usta->t.usta.alarm.event)); + break; + } + case LMG_EVENT_HIT_BNDCFM: + { + len = len + sprintf(prBuf+len, "HIT bind confirm"); + break; + } + case LMG_EVENT_HIT_CONCFM: + { + len = len + sprintf(prBuf+len, "HIT connect confirm"); + break; + } + case LMG_EVENT_HIT_DISCIND: + { + len = len + sprintf(prBuf+len, "HIT disconnect indication"); + break; + } + case LMG_EVENT_HIT_UDATIND: + { + len = len + sprintf(prBuf+len, "HIT unit data indication"); + break; + } + case LMG_EVENT_MGT_BNDREQ: + { + len = len + sprintf(prBuf+len, "MGT bind request"); + break; + } + case LMG_EVENT_PEER_CFG_FAIL: + { + len = len + sprintf(prBuf+len, "Peer Configuration Failed"); + break; + } + case LMG_EVENT_MGT_UBNDREQ: + { + len = len + sprintf(prBuf+len, "MGT unbind request"); + break; + } + case LMG_EVENT_MGT_MGCPTXNREQ: + { + len = len + sprintf(prBuf+len, "MGT MGCP transaction request"); + break; + } + case LMG_EVENT_MGT_MGCPTXNIND: + { + len = len + sprintf(prBuf+len, "MGT MGCP transaction indication"); + break; + } + + case LMG_EVENT_PEER_ENABLED: + { + len = len + sprintf(prBuf+len, "gateway enabled"); + break; + } + case LMG_EVENT_PEER_DISCOVERED: + { + len = len + sprintf(prBuf+len, "gateway discovered , notified entity"); + break; + } + case LMG_EVENT_PEER_REMOVED: + { + len = len + sprintf(prBuf+len, "gateway removed"); + break; + } + case LMG_EVENT_RES_CONG_ON: + { + len = len + sprintf(prBuf+len, "resource congestion ON"); + break; + } + case LMG_EVENT_RES_CONG_OFF: + { + len = len + sprintf(prBuf+len, "resource congestion OFF"); + break; + } + case LMG_EVENT_TPTSRV: + { + len = len + sprintf(prBuf+len, "transport service"); + break; + } + case LMG_EVENT_SSAP_ENABLED: + { + len = len + sprintf(prBuf+len, "SSAP enabled"); + break; + } + case LMG_EVENT_NS_NOT_RESPONDING: + { + len = len + sprintf(prBuf+len, "name server not responding"); + break; + } + case LMG_EVENT_TPT_FAILED: + { + len = len + sprintf(prBuf+len, "transport failure"); + break; + } + } + + len = len + sprintf(prBuf+len, " ) "); + + len = len + sprintf(prBuf+len, " cause ( "); + switch (usta->t.usta.alarm.cause) + { + case LCM_CAUSE_UNKNOWN: + { + len = len + sprintf(prBuf+len, "unknown"); + break; + } + case LCM_CAUSE_OUT_OF_RANGE: + { + len = len + sprintf(prBuf+len, "out of range"); + break; + } + case LCM_CAUSE_INV_SAP: + { + len = len + sprintf(prBuf+len, "NULL/unknown sap"); + break; + } + case LCM_CAUSE_INV_SPID: + { + len = len + sprintf(prBuf+len, "invalid service provider"); + break; + } + case LCM_CAUSE_INV_SUID: + { + len = len + sprintf(prBuf+len, "invalid service user"); + break; + } + case LCM_CAUSE_INV_NETWORK_MSG: + { + len = len + sprintf(prBuf+len, "invalid network message"); + break; + } + case LCM_CAUSE_DECODE_ERR: + { + len = len + sprintf(prBuf+len, "message decoding problem"); + break; + } + case LCM_CAUSE_USER_INITIATED: + { + len = len + sprintf(prBuf+len, "user initiated"); + break; + } + case LCM_CAUSE_MGMT_INITIATED: + { + len = len + sprintf(prBuf+len, "management initiated"); + break; + } + case LCM_CAUSE_INV_STATE: /* cause and event! */ + { + len = len + sprintf(prBuf+len, "invalid state"); + break; + } + case LCM_CAUSE_TMR_EXPIRED: /* cause and event! */ + { + len = len + sprintf(prBuf+len, "timer expired"); + break; + } + case LCM_CAUSE_INV_MSG_LENGTH: + { + len = len + sprintf(prBuf+len, "invalid message length"); + break; + } + case LCM_CAUSE_PROT_NOT_ACTIVE: + { + len = len + sprintf(prBuf+len, "protocol layer not active"); + break; + } + case LCM_CAUSE_INV_PAR_VAL: + { + len = len + sprintf(prBuf+len, "invalid parameter value"); + break; + } + case LCM_CAUSE_NEG_CFM: + { + len = len + sprintf(prBuf+len, "negative confirmation"); + break; + } + case LCM_CAUSE_MEM_ALLOC_FAIL: + { + len = len + sprintf(prBuf+len, "memory allocation failure"); + break; + } + case LCM_CAUSE_HASH_FAIL: + { + len = len + sprintf(prBuf+len, "hashing failure"); + break; + } + case LCM_CAUSE_LYR_SPECIFIC: + { + len = len + sprintf(prBuf+len, "MGCP specific"); + break; + } + default: + { + len = len + sprintf(prBuf+len, "unknown %d", (int)(usta->t.usta.alarm.cause)); + break; + } + case LMG_CAUSE_TPT_FAILURE: /* make up your mind - cause or event? */ + { + len = len + sprintf(prBuf+len, "transport failure"); + break; + } + case LMG_CAUSE_NS_NOT_RESPONDING: + { + len = len + sprintf(prBuf+len, "name server not responding"); + break; + } + } + len = len + sprintf(prBuf+len, " ) "); + + len = len + sprintf(prBuf+len, " Alarm parameters ( "); + ret = smmgGetAlarmInfoField(&usta->t.usta); + switch (ret) + { + case SMMG_UNKNOWNFIELD: + { + len = len + sprintf(prBuf+len, "invalid "); + + break; + } + case SMMG_PEERINFO: + { + /* + * Invoke the new function for printing the MgPeerInfo & + * delete all print code here + */ + smmgPrntPeerInfo(&(usta->t.usta.alarmInfo.u.peerInfo)); + break; + } + case SMMG_SAPID: + { + len = len + sprintf(prBuf+len, "SAP ID %d\n", (int)(usta->t.usta.alarmInfo.u.sapId)); + break; + } + case SMMG_MEM: + { + len = len + sprintf(prBuf+len, "memory region %d pool %d\n", + (int)(usta->t.usta.alarmInfo.u.mem.region), + (int)(usta->t.usta.alarmInfo.u.mem.pool)); + + break; + } + case SMMG_SRVSTA: + { + smmgPrntSrvSta(&usta->t.usta.alarmInfo.u.srvSta); + break; + } + case SMMG_PEERSTA: + { + smmgPrntPeerSta(&usta->t.usta.alarmInfo.u.peerSta); + break; + } + case SMMG_SSAPSTA: + { + smmgPrntSsapSta(&usta->t.usta.alarmInfo.u.ssapSta); + break; + } + case SMMG_PARID: + { + len = len + sprintf(prBuf+len, "parameter type: "); + switch (usta->t.usta.alarmInfo.u.parId.parType) + { + case LMG_PAR_TPTADDR: len = len + sprintf(prBuf+len, "transport address"); break; + case LMG_PAR_MBUF: len = len + sprintf(prBuf+len, "message buffer"); break; + case LMG_PAR_CHOICE: len = len + sprintf(prBuf+len, "choice"); break; + case LMG_PAR_SPID: len = len + sprintf(prBuf+len, "spId"); break; + default: len = len + sprintf(prBuf+len, "unknown"); break; + } + + len = len + sprintf(prBuf+len, ", value %d\n", + (int)(usta->t.usta.alarmInfo.u.parId.u.sapId)); + + break; + } + case SMMG_NOT_APPL: + { + len = len + sprintf(prBuf+len, "not applicable\n"); + break; + } + + /*TODO*/ + } + len = len + sprintf(prBuf+len, " ) "); + len = len + sprintf(prBuf+len, " \n "); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s \n", prBuf); +} + +/*****************************************************************************************************************************/ +void handle_tucl_alarm(Pst *pst, HiMngmt *sta) +{ + /* To print the general information */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Recieved a status indication from TUCL layer \n\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Category = %d , event = %d , cause = %d\n", + sta->t.usta.alarm.category, + sta->t.usta.alarm.event, sta->t.usta.alarm.cause); + + switch(sta->t.usta.alarm.event) + { + case LCM_EVENT_INV_EVT: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LCM_EVENT_INV_EVT with type (%d)\n\n", + sta->t.usta.info.type); + break; + } + case LHI_EVENT_BNDREQ: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: LHI_EVENT_BNDREQ with type (%d) spId (%d)\n\n", + sta->t.usta.info.type, sta->t.usta.info.spId); + break; + } + case LHI_EVENT_SERVOPENREQ: + case LHI_EVENT_DATREQ: + case LHI_EVENT_UDATREQ: + case LHI_EVENT_CONREQ: + case LHI_EVENT_DISCREQ: +#if(defined(HI_TLS) && defined(HI_TCP_TLS)) + case LHI_EVENT_TLS_ESTREQ: +#endif + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," [HI_USTA]: partype (%d) type(%d)\n\n", + sta->t.usta.info.inf.parType, sta->t.usta.info.type); + break; + } + case LCM_EVENT_DMEM_ALLOC_FAIL: + case LCM_EVENT_SMEM_ALLOC_FAIL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " [HI_USTA]: MEM_ALLOC_FAIL with region(%d) pool (%d) type(%d)\n\n", + sta->t.usta.info.inf.mem.region, sta->t.usta.info.inf.mem.pool, + sta->t.usta.info.type); + break; + } + default: + break; + } + +} /* handle_sng_tucl_alarm */ +/******************************************************************************/ + diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c index 52b1294cb2..236fb68cfd 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_megaco/megaco_xml.c @@ -165,229 +165,3 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { } /****************************************************************************************************************************/ - -#if 0 -switch_status_t sng_parse_mg_profile(switch_xml_t mg_interface) -{ - int i = 0x00; - const char *prof_name = NULL; - switch_xml_t param; - - /*************************************************************************/ - prof_name = switch_xml_attr_soft(mg_interface, "name"); - - /*************************************************************************/ - for (param = switch_xml_child(mg_interface, "param"); param; param = param->next) { - char *var = (char *) switch_xml_attr_soft(param, "name"); - char *val = (char *) switch_xml_attr_soft(param, "value"); - if (!var || !val) { - continue; - } - - /******************************************************************************************/ - if(!strcasecmp(var, "id")){ - i = atoi(val); - megaco_globals.g_mg_cfg.mgCfg[i].id = i; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface Id[%d] \n", i); - /*******************************************************************************************/ - }else if(!strcasecmp(var, "protocol")){ - /********************************************************************************************/ - if(!strcasecmp(val,"MEGACO")) { - megaco_globals.g_mg_cfg.mgCfg[i].protocol_type = SNG_MG_MEGACO; - }else if(!strcasecmp(val,"MGCP")){ - megaco_globals.g_mg_cfg.mgCfg[i].protocol_type = SNG_MG_MGCP; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGCP Protocol Not Yet Supported \n"); - return SWITCH_STATUS_FALSE; - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",val); - return SWITCH_STATUS_FALSE; - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface protocol[%d] \n", - megaco_globals.g_mg_cfg.mgCfg[i].protocol_type); - /********************************************************************************************/ - }else if(!strcasecmp(var, "version")){ - /********************************************************************************************/ - megaco_globals.g_mg_cfg.mgCfg[i].protocol_version = atoi(val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface protocol version[%s] \n",val); - if((megaco_globals.g_mg_cfg.mgCfg[i].protocol_version < 1) - || (megaco_globals.g_mg_cfg.mgCfg[i].protocol_version > 3)) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol version[%s] , Supported values are [1/2/3] \n",val); - return SWITCH_STATUS_FALSE; - } - /********************************************************************************************/ - }else if(!strcasecmp(var, "transportProfileId")){ - /********************************************************************************************/ - megaco_globals.g_mg_cfg.mgCfg[i].transport_prof_id = atoi(val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface transport_prof_id[%d] \n", - megaco_globals.g_mg_cfg.mgCfg[i].transport_prof_id); - /********************************************************************************************/ - }else if(!strcasecmp(var, "localIp")){ - /***********************************************************************i*********************/ - strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].my_ipaddr[0],val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_interface my_ipaddr[%s] \n", - megaco_globals.g_mg_cfg.mgCfg[i].my_ipaddr); - /********************************************************************************************/ - }else if(!strcasecmp(var, "port")){ - /********************************************************************************************/ - megaco_globals.g_mg_cfg.mgCfg[i].port = atoi(val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_interface my_port[%d] \n", megaco_globals.g_mg_cfg.mgCfg[i].port); - /********************************************************************************************/ - }else if(!strcasecmp(var, "myDomainName")){ - /********************************************************************************************/ - strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].my_domain[0],val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_interface myDomainName[%s] \n", megaco_globals.g_mg_cfg.mgCfg[i].my_domain); - /********************************************************************************************/ - }else if(!strcasecmp(var, "mid")){ - /********************************************************************************************/ - strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].mid[0],val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_interface mid[%s] \n", megaco_globals.g_mg_cfg.mgCfg[i].mid); - /********************************************************************************************/ - }else if(!strcasecmp(var, "peerId")){ - /********************************************************************************************/ - megaco_globals.g_mg_cfg.mgCfg[i].peer_id = atoi(val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_interface peerId[%d] \n", megaco_globals.g_mg_cfg.mgCfg[i].peer_id); - /********************************************************************************************/ - }else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_interface \n", var); - return SWITCH_STATUS_FALSE; - } - } - - strcpy((char*)&megaco_globals.g_mg_cfg.mgCfg[i].name[0], prof_name); - - return SWITCH_STATUS_SUCCESS; -} - -/***********************************************************************************************************/ - -switch_status_t sng_parse_mg_tpt_profile(switch_xml_t mg_tpt_profile) -{ - int i = 0x00; - switch_xml_t param; - const char *prof_name = NULL; - - /*************************************************************************/ - prof_name = switch_xml_attr_soft(mg_tpt_profile, "name"); - - /*************************************************************************/ - for (param = switch_xml_child(mg_tpt_profile, "param"); param; param = param->next) { - char *var = (char *) switch_xml_attr_soft(param, "name"); - char *val = (char *) switch_xml_attr_soft(param, "value"); - if (!var || !val) { - continue; - } - - /******************************************************************************************/ - if(!strcasecmp(var, "id")){ - /*******************************************************************************************/ - i = atoi(val); - megaco_globals.g_mg_cfg.mgTptProf[i].id = i; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_tpt_profile Id[%d] \n", i); - /*******************************************************************************************/ - }else if(!strcasecmp(var, "transportType")){ - /*******************************************************************************************/ - if(!strcasecmp(val,"UDP")) { - megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_UDP; - }else if(!strcasecmp(val,"TCP")){ - megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_TCP; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "TCP Transport for H.248 Protocol Not Yet Supported \n"); - return SWITCH_STATUS_FALSE; - }else if(!strcasecmp(val,"STCP")){ - megaco_globals.g_mg_cfg.mgTptProf[i].transport_type = SNG_MG_TPT_SCTP; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STCP Transport for H.248 Protocol Not Yet Supported \n"); - return SWITCH_STATUS_FALSE; - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Protocol Value[%s] \n",val); - return SWITCH_STATUS_FALSE; - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_tpt_profile transport_type[%d] \n", - megaco_globals.g_mg_cfg.mgTptProf[i].transport_type); - /********************************************************************************************/ - }else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_transport \n", var); - return SWITCH_STATUS_FALSE; - } - } - - strcpy((char*)&megaco_globals.g_mg_cfg.mgTptProf[i].name[0], prof_name); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_tpt_profile Name[%s] \n", &megaco_globals.g_mg_cfg.mgTptProf[i].name[0]); - - return SWITCH_STATUS_SUCCESS; -} -/***********************************************************************************************************/ - -switch_status_t sng_parse_mg_peer_profile(switch_xml_t mg_peer_profile) -{ - int i = 0x00; - switch_xml_t param; - const char *prof_name = NULL; - - /*************************************************************************/ - prof_name = switch_xml_attr_soft(mg_peer_profile, "name"); - - for (param = switch_xml_child(mg_peer_profile, "param"); param; param = param->next) { - /***********************************************************************************************************/ - char *var = (char *) switch_xml_attr_soft(param, "name"); - char *val = (char *) switch_xml_attr_soft(param, "value"); - if (!var || !val) { - continue; - } - - /***********************************************************************************************************/ - if(!strcasecmp(var, "id")){ - /***********************************************************************************************************/ - i = atoi(val); - megaco_globals.g_mg_cfg.mgPeer.peers[i].id = i; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mg_peer_profile Id[%d] \n", i); - /***********************************************************************************************************/ - }else if(!strcasecmp(var, "port")){ - /***********************************************************************************************************/ - megaco_globals.g_mg_cfg.mgPeer.peers[i].port = atoi(val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_peer_profile port[%d] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].port); - /***********************************************************************************************************/ - }else if(!strcasecmp(var, "encodingScheme")){ - /***********************************************************************************************************/ - if(!strcasecmp(val, "TEXT")){ - megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type = SNG_MG_ENCODING_TEXT; - } else if(!strcasecmp(val, "BINARY")){ - megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type = SNG_MG_ENCODING_BINARY; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Encoding Type[%s] \n",val); - return SWITCH_STATUS_FALSE; - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_peer_profile encodingScheme[%d] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].encoding_type); - /***********************************************************************************************************/ - }else if(!strcasecmp(var, "mid")){ - /***********************************************************************************************************/ - strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].mid[0],val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_peer_profile mid[%s] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].mid); - /***********************************************************************************************************/ - }else if(!strcasecmp(var, "ip")){ - /***********************************************************************************************************/ - strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].ipaddr[0],val); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - " mg_peer_profile ip[%s] \n", megaco_globals.g_mg_cfg.mgPeer.peers[i].ipaddr); - /***********************************************************************************************************/ - }else{ - /***********************************************************************************************************/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Invalid var[%s] in mg_peer \n", var); - return SWITCH_STATUS_FALSE; - } - } - - strcpy((char*)&megaco_globals.g_mg_cfg.mgPeer.peers[i].name[0], prof_name); - - megaco_globals.g_mg_cfg.mgPeer.total_peer++; - return SWITCH_STATUS_SUCCESS; -} -#endif -/***********************************************************************************************************/ diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index 94a0f64d13..e966c76095 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -16,84 +16,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" SWITCH_STANDARD_API(megaco_function) { - int argc; - char *argv[10]; - char *dup = NULL; - - if (zstr(cmd)) { - goto usage; - } - - dup = strdup(cmd); - argc = switch_split(dup, ' ', argv); - - if (argc < 1 || zstr(argv[0])) { - goto usage; - } - -/**********************************************************************************/ - if (!strcmp(argv[0], "profile")) { - if (zstr(argv[1]) || zstr(argv[2])) { - goto usage; - } -/**********************************************************************************/ - if (!strcmp(argv[2], "start")) { -/**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); - if (profile) { - megaco_profile_release(profile); - stream->write_function(stream, "-ERR Profile %s is already started\n", argv[2]); - } else { - megaco_profile_start(argv[1]); - stream->write_function(stream, "+OK\n"); - } -/**********************************************************************************/ - } else if (!strcmp(argv[2], "stop")) { -/**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); - if (profile) { - megaco_profile_release(profile); - megaco_profile_destroy(&profile); - stream->write_function(stream, "+OK\n"); - } else { - stream->write_function(stream, "-ERR No such profile\n"); - } -/**********************************************************************************/ - }else if(!strcmp(argv[2], "status")) { -/**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); - if (profile) { - megaco_profile_status(stream, profile->name); - } else { - stream->write_function(stream, "-ERR No such profile\n"); - } -/**********************************************************************************/ - }else if(!strcmp(argv[2], "xmlstatus")) { -/**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); - if (profile) { - megaco_profile_xmlstatus(stream, profile->name); - } else { - stream->write_function(stream, "-ERR No such profile\n"); - } -/**********************************************************************************/ - }else { -/**********************************************************************************/ - goto usage; - } - } - - goto done; - - usage: - stream->write_function(stream, "-ERR Usage: "MEGACO_FUNCTION_SYNTAX"\n"); - - done: - switch_safe_free(dup); - return SWITCH_STATUS_SUCCESS; + return mg_process_cli_cmd(cmd, stream); } static switch_status_t console_complete_hashtable(switch_hash_t *hash, const char *line, const char *cursor, switch_console_callback_match_t **matches) diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index a277a1f840..444639677c 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -15,6 +15,8 @@ #define MG_MAX_PEERS 5 +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" + struct megaco_globals { switch_memory_pool_t *pool; switch_hash_t *profile_hash; @@ -68,6 +70,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload); switch_status_t sng_mgco_start(megaco_profile_t* profile); switch_status_t sng_mgco_stop(megaco_profile_t* profile); switch_status_t mg_config_cleanup(megaco_profile_t* profile); +switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream); #endif /* MOD_MEGACO_H */ From 0fc6ccff7a19a4c009f446e6d44c84bc67f88e30 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 6 Jun 2012 18:03:07 +0530 Subject: [PATCH 219/493] adding "peerxmlstatus" CLI command to show the peer status for requested profile --- src/mod/endpoints/mod_megaco/megaco_cli.c | 133 +++++++++++++++------- src/mod/endpoints/mod_megaco/mod_megaco.c | 1 + src/mod/endpoints/mod_megaco/mod_megaco.h | 2 +- 3 files changed, 94 insertions(+), 42 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_cli.c b/src/mod/endpoints/mod_megaco/megaco_cli.c index e7d0794c49..0bdb334754 100644 --- a/src/mod/endpoints/mod_megaco/megaco_cli.c +++ b/src/mod/endpoints/mod_megaco/megaco_cli.c @@ -12,8 +12,9 @@ /******************************************************************************/ /* FUNCTION PROTOTYPES ********************************************************/ -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); +switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); /******************************************************************************/ @@ -22,9 +23,10 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream) { - int argc; - char *argv[10]; - char *dup = NULL; + int argc; + char* argv[10]; + char* dup = NULL; + megaco_profile_t* profile = NULL; if (zstr(cmd)) { goto usage; @@ -37,15 +39,17 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } - /**********************************************************************************/ +/**********************************************************************************/ if (!strcmp(argv[0], "profile")) { if (zstr(argv[1]) || zstr(argv[2])) { goto usage; } - /**********************************************************************************/ +/**********************************************************************************/ + profile = megaco_profile_locate(argv[1]); + +/**********************************************************************************/ if (!strcmp(argv[2], "start")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { megaco_profile_release(profile); stream->write_function(stream, "-ERR Profile %s is already started\n", argv[2]); @@ -53,10 +57,9 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre megaco_profile_start(argv[1]); stream->write_function(stream, "+OK\n"); } - /**********************************************************************************/ +/**********************************************************************************/ } else if (!strcmp(argv[2], "stop")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { megaco_profile_release(profile); megaco_profile_destroy(&profile); @@ -64,27 +67,36 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ }else if(!strcmp(argv[2], "status")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { - megaco_profile_status(stream, profile->name); + megaco_profile_release(profile); + megaco_profile_status(stream, profile); } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ }else if(!strcmp(argv[2], "xmlstatus")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { - megaco_profile_xmlstatus(stream, profile->name); + megaco_profile_release(profile); + megaco_profile_xmlstatus(stream, profile); } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ + }else if(!strcmp(argv[2], "peerxmlstatus")) { +/**********************************************************************************/ + if (profile) { + megaco_profile_release(profile); + megaco_profile_peer_xmlstatus(stream, profile); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } +/**********************************************************************************/ }else { - /**********************************************************************************/ +/**********************************************************************************/ goto usage; } } @@ -100,7 +112,7 @@ done: } /******************************************************************************/ -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) +switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; int len = 0x00; @@ -110,23 +122,69 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c int i = 0x00; char *asciiAddr; CmInetIpAddr ip; - megaco_profile_t* mg_cfg = NULL; mg_peer_profile_t* mg_peer = NULL; - switch_assert(profilename); + switch_assert(mg_cfg); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); + return SWITCH_STATUS_FALSE; + } + + + idx = mg_cfg->idx; + + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->peer_list[0]); + + /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + + ip = ntohl(cfm.t.ssta.s.mgPeerSta.peerAddrTbl.netAddr[i].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + + len = len + sprintf(prntBuf+len, "%s\n",PRNT_MG_PEER_STATE(cfm.t.ssta.s.mgPeerSta.peerState)); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + + stream->write_function(stream, "\n%s\n",&prntBuf[0]); + + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ + +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char* xmlhdr = ""; + char prntBuf[3048]; + int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + mg_peer_profile_t* mg_peer = NULL; + + switch_assert(mg_cfg); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); return SWITCH_STATUS_FALSE; } @@ -137,7 +195,6 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(&prntBuf[0] + len,"\n"); len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->name); - len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); /****************************************************************************************************************/ /* Print Peer Information ***************************************************************************************/ @@ -254,29 +311,23 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c } /****************************************************************************************************************/ -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename) +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; int len = 0x00; MgMngmt cfm; char prntBuf[1024]; - megaco_profile_t* mg_cfg = NULL; mg_peer_profile_t* mg_peer = NULL; - switch_assert(profilename); + switch_assert(mg_cfg); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index e966c76095..722e023ec6 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -72,6 +72,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles peerxmlstatus"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index 444639677c..9a30bc01df 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -15,7 +15,7 @@ #define MG_MAX_PEERS 5 -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus] [peerxmlstatus]" struct megaco_globals { switch_memory_pool_t *pool; From f49fb271daa6d1c26892a12c221f8287fb03f7b3 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 6 Jun 2012 16:21:22 -0400 Subject: [PATCH 220/493] Renamed files from megaco* media_gateway* --- src/mod/endpoints/mod_megaco/{megaco.c => media_gateway.c} | 0 .../endpoints/mod_megaco/{megaco_cli.c => media_gateway_cli.c} | 0 .../mod_megaco/{megaco_stack.c => media_gateway_stack.c} | 0 .../mod_megaco/{megaco_stack.h => media_gateway_stack.h} | 0 .../{megaco_stack_alarms.c => media_gateway_stack_alarms.c} | 0 .../endpoints/mod_megaco/{megaco_xml.c => media_gateway_xml.c} | 0 .../endpoints/mod_megaco/{mod_megaco.c => mod_media_gateway.c} | 0 .../endpoints/mod_megaco/{mod_megaco.h => mod_media_gateway.h} | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename src/mod/endpoints/mod_megaco/{megaco.c => media_gateway.c} (100%) rename src/mod/endpoints/mod_megaco/{megaco_cli.c => media_gateway_cli.c} (100%) rename src/mod/endpoints/mod_megaco/{megaco_stack.c => media_gateway_stack.c} (100%) rename src/mod/endpoints/mod_megaco/{megaco_stack.h => media_gateway_stack.h} (100%) rename src/mod/endpoints/mod_megaco/{megaco_stack_alarms.c => media_gateway_stack_alarms.c} (100%) rename src/mod/endpoints/mod_megaco/{megaco_xml.c => media_gateway_xml.c} (100%) rename src/mod/endpoints/mod_megaco/{mod_megaco.c => mod_media_gateway.c} (100%) rename src/mod/endpoints/mod_megaco/{mod_megaco.h => mod_media_gateway.h} (100%) diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_megaco/media_gateway.c similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco.c rename to src/mod/endpoints/mod_megaco/media_gateway.c diff --git a/src/mod/endpoints/mod_megaco/megaco_cli.c b/src/mod/endpoints/mod_megaco/media_gateway_cli.c similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco_cli.c rename to src/mod/endpoints/mod_megaco/media_gateway_cli.c diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_megaco/media_gateway_stack.c similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco_stack.c rename to src/mod/endpoints/mod_megaco/media_gateway_stack.c diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_megaco/media_gateway_stack.h similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco_stack.h rename to src/mod/endpoints/mod_megaco/media_gateway_stack.h diff --git a/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c b/src/mod/endpoints/mod_megaco/media_gateway_stack_alarms.c similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco_stack_alarms.c rename to src/mod/endpoints/mod_megaco/media_gateway_stack_alarms.c diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_megaco/media_gateway_xml.c similarity index 100% rename from src/mod/endpoints/mod_megaco/megaco_xml.c rename to src/mod/endpoints/mod_megaco/media_gateway_xml.c diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_media_gateway.c similarity index 100% rename from src/mod/endpoints/mod_megaco/mod_megaco.c rename to src/mod/endpoints/mod_megaco/mod_media_gateway.c diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_media_gateway.h similarity index 100% rename from src/mod/endpoints/mod_megaco/mod_megaco.h rename to src/mod/endpoints/mod_megaco/mod_media_gateway.h From abc1e1e42bafad6c2c428d48db44acb1b81be379 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 6 Jun 2012 16:24:36 -0400 Subject: [PATCH 221/493] Revert "Renamed files from megaco* media_gateway*" This reverts commit f49fb271daa6d1c26892a12c221f8287fb03f7b3. --- src/mod/endpoints/mod_megaco/{media_gateway.c => megaco.c} | 0 .../endpoints/mod_megaco/{media_gateway_cli.c => megaco_cli.c} | 0 .../mod_megaco/{media_gateway_stack.c => megaco_stack.c} | 0 .../mod_megaco/{media_gateway_stack.h => megaco_stack.h} | 0 .../{media_gateway_stack_alarms.c => megaco_stack_alarms.c} | 0 .../endpoints/mod_megaco/{media_gateway_xml.c => megaco_xml.c} | 0 .../endpoints/mod_megaco/{mod_media_gateway.c => mod_megaco.c} | 0 .../endpoints/mod_megaco/{mod_media_gateway.h => mod_megaco.h} | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename src/mod/endpoints/mod_megaco/{media_gateway.c => megaco.c} (100%) rename src/mod/endpoints/mod_megaco/{media_gateway_cli.c => megaco_cli.c} (100%) rename src/mod/endpoints/mod_megaco/{media_gateway_stack.c => megaco_stack.c} (100%) rename src/mod/endpoints/mod_megaco/{media_gateway_stack.h => megaco_stack.h} (100%) rename src/mod/endpoints/mod_megaco/{media_gateway_stack_alarms.c => megaco_stack_alarms.c} (100%) rename src/mod/endpoints/mod_megaco/{media_gateway_xml.c => megaco_xml.c} (100%) rename src/mod/endpoints/mod_megaco/{mod_media_gateway.c => mod_megaco.c} (100%) rename src/mod/endpoints/mod_megaco/{mod_media_gateway.h => mod_megaco.h} (100%) diff --git a/src/mod/endpoints/mod_megaco/media_gateway.c b/src/mod/endpoints/mod_megaco/megaco.c similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway.c rename to src/mod/endpoints/mod_megaco/megaco.c diff --git a/src/mod/endpoints/mod_megaco/media_gateway_cli.c b/src/mod/endpoints/mod_megaco/megaco_cli.c similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway_cli.c rename to src/mod/endpoints/mod_megaco/megaco_cli.c diff --git a/src/mod/endpoints/mod_megaco/media_gateway_stack.c b/src/mod/endpoints/mod_megaco/megaco_stack.c similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway_stack.c rename to src/mod/endpoints/mod_megaco/megaco_stack.c diff --git a/src/mod/endpoints/mod_megaco/media_gateway_stack.h b/src/mod/endpoints/mod_megaco/megaco_stack.h similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway_stack.h rename to src/mod/endpoints/mod_megaco/megaco_stack.h diff --git a/src/mod/endpoints/mod_megaco/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway_stack_alarms.c rename to src/mod/endpoints/mod_megaco/megaco_stack_alarms.c diff --git a/src/mod/endpoints/mod_megaco/media_gateway_xml.c b/src/mod/endpoints/mod_megaco/megaco_xml.c similarity index 100% rename from src/mod/endpoints/mod_megaco/media_gateway_xml.c rename to src/mod/endpoints/mod_megaco/megaco_xml.c diff --git a/src/mod/endpoints/mod_megaco/mod_media_gateway.c b/src/mod/endpoints/mod_megaco/mod_megaco.c similarity index 100% rename from src/mod/endpoints/mod_megaco/mod_media_gateway.c rename to src/mod/endpoints/mod_megaco/mod_megaco.c diff --git a/src/mod/endpoints/mod_megaco/mod_media_gateway.h b/src/mod/endpoints/mod_megaco/mod_megaco.h similarity index 100% rename from src/mod/endpoints/mod_megaco/mod_media_gateway.h rename to src/mod/endpoints/mod_megaco/mod_megaco.h From 8b017f6c01670d231a3d735f0a301070b2361606 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 6 Jun 2012 16:36:22 -0400 Subject: [PATCH 222/493] Renamed mod_megaco to mod_media_gateway --- .../Makefile | 4 +-- .../conf/megaco.conf.xml | 0 .../media_gateway.c} | 2 +- .../media_gateway_cli.c} | 4 +-- .../media_gateway_stack.c} | 30 +++++++++---------- .../media_gateway_stack.h} | 4 +-- .../media_gateway_stack_alarms.c} | 4 +-- .../media_gateway_xml.c} | 4 +-- .../mod_media_gateway.c} | 6 ++-- .../mod_media_gateway.h} | 2 +- 10 files changed, 30 insertions(+), 30 deletions(-) rename src/mod/endpoints/{mod_megaco => mod_media_gateway}/Makefile (55%) rename src/mod/endpoints/{mod_megaco => mod_media_gateway}/conf/megaco.conf.xml (100%) rename src/mod/endpoints/{mod_megaco/megaco.c => mod_media_gateway/media_gateway.c} (99%) rename src/mod/endpoints/{mod_megaco/megaco_cli.c => mod_media_gateway/media_gateway_cli.c} (99%) rename src/mod/endpoints/{mod_megaco/megaco_stack.c => mod_media_gateway/media_gateway_stack.c} (98%) rename src/mod/endpoints/{mod_megaco/megaco_stack.h => mod_media_gateway/media_gateway_stack.h} (94%) rename src/mod/endpoints/{mod_megaco/megaco_stack_alarms.c => mod_media_gateway/media_gateway_stack_alarms.c} (99%) rename src/mod/endpoints/{mod_megaco/megaco_xml.c => mod_media_gateway/media_gateway_xml.c} (99%) rename src/mod/endpoints/{mod_megaco/mod_megaco.c => mod_media_gateway/mod_media_gateway.c} (98%) rename src/mod/endpoints/{mod_megaco/mod_megaco.h => mod_media_gateway/mod_media_gateway.h} (98%) diff --git a/src/mod/endpoints/mod_megaco/Makefile b/src/mod/endpoints/mod_media_gateway/Makefile similarity index 55% rename from src/mod/endpoints/mod_megaco/Makefile rename to src/mod/endpoints/mod_media_gateway/Makefile index 228d3f88e8..2a8f5e7ac8 100644 --- a/src/mod/endpoints/mod_megaco/Makefile +++ b/src/mod/endpoints/mod_media_gateway/Makefile @@ -7,6 +7,6 @@ ifeq ($(ARCH),x86_64) endif BASE=../../../.. -LOCAL_OBJS=megaco.o megaco_stack.o megaco_xml.o megaco_cli.o megaco_stack_alarms.o -LOCAL_LDFLAGS=-lsng_megaco +LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o +LOCAL_LDFLAGS=-lsng_mg include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_megaco/conf/megaco.conf.xml b/src/mod/endpoints/mod_media_gateway/conf/megaco.conf.xml similarity index 100% rename from src/mod/endpoints/mod_megaco/conf/megaco.conf.xml rename to src/mod/endpoints/mod_media_gateway/conf/megaco.conf.xml diff --git a/src/mod/endpoints/mod_megaco/megaco.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c similarity index 99% rename from src/mod/endpoints/mod_megaco/megaco.c rename to src/mod/endpoints/mod_media_gateway/media_gateway.c index aa8fd8ede1..98d433179e 100644 --- a/src/mod/endpoints/mod_megaco/megaco.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -6,7 +6,7 @@ * */ -#include "mod_megaco.h" +#include "mod_media_gateway.h" megaco_profile_t *megaco_profile_locate(const char *name) { diff --git a/src/mod/endpoints/mod_megaco/megaco_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c similarity index 99% rename from src/mod/endpoints/mod_megaco/megaco_cli.c rename to src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 0bdb334754..db50feaa57 100644 --- a/src/mod/endpoints/mod_megaco/megaco_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -7,8 +7,8 @@ */ /* INCLUDES *******************************************************************/ -#include "mod_megaco.h" -#include "megaco_stack.h" +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" /******************************************************************************/ /* FUNCTION PROTOTYPES ********************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c similarity index 98% rename from src/mod/endpoints/mod_megaco/megaco_stack.c rename to src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index 6038173a8c..abe46a5837 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -7,8 +7,8 @@ */ /* INCLUDES *******************************************************************/ -#include "mod_megaco.h" -#include "megaco_stack.h" +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -47,42 +47,42 @@ sng_mg_protocol_types_e mg_get_proto_type_from_str(char* proto_type); /* FUNCTIONS ******************************************************************/ -switch_status_t sng_mgco_init(sng_isup_event_interface_t* event) +switch_status_t sng_mgco_init(sng_mg_event_interface_t* event) { uint32_t major, minor, build; switch_assert(event); /* initalize sng_mg library */ - sng_isup_init_gen(event); + sng_mg_init_gen(event); /* print the version of the library being used */ - sng_isup_version(&major, &minor, &build); + sng_mg_version(&major, &minor, &build); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Loaded LibSng-MEGACO %d.%d.%d\n", major, minor, build); /* start up the stack manager */ - if (sng_isup_init_sm()) { + if (sng_mg_init_sm()) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Failed to start Stack Manager\n"); return SWITCH_STATUS_FALSE; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started Stack Manager!\n"); } - if (sng_isup_init_tucl()) { + if (sng_mg_init_tucl()) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start TUCL\n"); return SWITCH_STATUS_FALSE; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started TUCL!\n"); } - if (sng_isup_init_mg()) { + if (sng_mg_init_mg()) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start MG\n"); return SWITCH_STATUS_FALSE; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Started MG!\n"); } - if (sng_isup_init_mu()) { + if (sng_mg_init_mu()) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Failed to start MU\n"); return SWITCH_STATUS_FALSE; } else { @@ -104,19 +104,19 @@ switch_status_t sng_mgco_stack_shutdown() sng_mgco_tucl_shutdown(); /* free MEGACO Application */ - sng_isup_free_mu(); + sng_mg_free_mu(); /* free MEGACO */ - sng_isup_free_mg(); + sng_mg_free_mg(); /* free TUCL */ - sng_isup_free_tucl(); + sng_mg_free_tucl(); /* free SM */ - sng_isup_free_sm(); + sng_mg_free_sm(); /* free gen */ - sng_isup_free_gen(); + sng_mg_free_gen(); return SWITCH_STATUS_SUCCESS; } @@ -638,7 +638,7 @@ int mgco_tucl_gen_config(void) cfg.t.cfg.s.hiGen.poolDropThr = HI_MEM_POOL_DROP_THRESHOLD; cfg.t.cfg.s.hiGen.poolStopThr = HI_MEM_POOL_STOP_THRESHOLD; - cfg.t.cfg.s.hiGen.timeRes = SI_PERIOD; /* time resolution */ + cfg.t.cfg.s.hiGen.timeRes = HI_PERIOD; /* time resolution */ #ifdef HI_SPECIFY_GENSOCK_ADDR cfg.t.cfg.s.hiGen.ipv4GenSockAddr.address = CM_INET_INADDR_ANY; diff --git a/src/mod/endpoints/mod_megaco/megaco_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h similarity index 94% rename from src/mod/endpoints/mod_megaco/megaco_stack.h rename to src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 0e10bc346d..ac5b911f9b 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -6,7 +6,7 @@ * */ -#include "mod_megaco.h" +#include "mod_media_gateway.h" #ifndef _MEGACO_STACK_H_ #define _MEGACO_STACK_H_ @@ -56,7 +56,7 @@ void handle_tucl_alarm(Pst *pst, HiMngmt *sta); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); -switch_status_t sng_mgco_init(sng_isup_event_interface_t* event); +switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); diff --git a/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c similarity index 99% rename from src/mod/endpoints/mod_megaco/megaco_stack_alarms.c rename to src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index dd114a3850..fc09a6bea4 100644 --- a/src/mod/endpoints/mod_megaco/megaco_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -7,8 +7,8 @@ */ /* INCLUDES *******************************************************************/ -#include "mod_megaco.h" -#include "megaco_stack.h" +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" /******************************************************************************/ /* FUNCTION PROTOTYPES ********************************************************/ diff --git a/src/mod/endpoints/mod_megaco/megaco_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c similarity index 99% rename from src/mod/endpoints/mod_megaco/megaco_xml.c rename to src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 236fb68cfd..710cc7e6c4 100644 --- a/src/mod/endpoints/mod_megaco/megaco_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -5,8 +5,8 @@ * * */ -#include "mod_megaco.h" -#include "megaco_stack.h" +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" /****************************************************************************************************************************/ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) ; diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c similarity index 98% rename from src/mod/endpoints/mod_megaco/mod_megaco.c rename to src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 722e023ec6..ebad0b30b7 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -6,11 +6,11 @@ * */ -#include "mod_megaco.h" -#include "megaco_stack.h" +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" struct megaco_globals megaco_globals; -static sng_isup_event_interface_t sng_event; +static sng_mg_event_interface_t sng_event; SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h similarity index 98% rename from src/mod/endpoints/mod_megaco/mod_megaco.h rename to src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 9a30bc01df..c55bb6744f 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -10,7 +10,7 @@ #ifndef MOD_MEGACO_H #define MOD_MEGACO_H -#include "sng_megaco/sng_ss7.h" +#include "sng_mg/sng_mg.h" #include #define MG_MAX_PEERS 5 From 69bada70259ba3506f1e1565944186875c9eb532 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 11 Jun 2012 12:43:08 +0530 Subject: [PATCH 223/493] removign sctp/peer id from config xml block --- .../ftmod_sangoma_ss7_m2ua.c | 61 +++++++++++++------ .../ftmod_sangoma_ss7_m2ua.h | 2 - .../ftmod_sangoma_ss7_m2ua_xml.c | 13 ---- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index f0ae00fa5a..57ab67c0ca 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -51,8 +51,9 @@ static int ftmod_sctp_config(int id); static ftdm_status_t ftmod_sctp_sap_config(int id); static ftdm_status_t ftmod_sctp_tsap_config(int id); static int ftmod_m2ua_gen_config(void); -static int ftmod_m2ua_sctsap_config(int id); +static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id); static int ftmod_m2ua_peer_config(int id); +static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id); static int ftmod_m2ua_cluster_config(int idx); static int ftmod_m2ua_dlsap_config(int idx); static int ftmod_nif_gen_config(void); @@ -283,13 +284,6 @@ ftdm_status_t sng_m2ua_cfg(void) if((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) && (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) { - if(ftmod_m2ua_sctsap_config(x)) { - ftdm_log (FTDM_LOG_ERROR ,"M2UA SCTSAP[%d] configuration: NOT OK\n", x); - return FTDM_FAIL; - }else { - ftdm_log (FTDM_LOG_INFO ,"M2UA SCTSAP[%d] configuration: OK\n", x); - } - /****************************************************************************************************/ /* M2UA PEER configurations */ @@ -780,13 +774,44 @@ static int ftmod_m2ua_gen_config(void) } /**********************************************************************************************/ -static int ftmod_m2ua_sctsap_config(int id) +static int ftmod_m2ua_peer_config(int id) +{ + int x = 0; + int peer_id = 0; + sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + sng_m2ua_peer_cfg_t* peer = NULL; + + /* loop through peer list from cluster to configure SCTSAP */ + + for(x = 0; x < clust->numOfPeers;x++){ + peer_id = clust->peerIdLst[x]; + peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id]; + if(ftmod_m2ua_sctsap_config(id, peer->sctpId)){ + ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config FAILED \n", id); + return 0x01; + }else{ + ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config SUCCESS \n", id); + } + if(ftmod_m2ua_peer_config1(id, peer_id)){ + ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config FAILED \n", id); + return 0x01; + }else{ + ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); + } + + + } + + return 0x0;; +} + +static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) { int i; Pst pst; MwMgmt cfg; - sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; - sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[m2ua->sctpId]; + sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[sctp_id]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); @@ -802,7 +827,7 @@ static int ftmod_m2ua_sctsap_config(int id) cfg.hdr.elmId.elmnt = STMWSCTSAP; /* SCTSAP */ cfg.hdr.transId = 0; /* transaction identifier */ - cfg.hdr.response.selector = 0; + cfg.hdr.response.selector = 0; cfg.hdr.response.prior = PRIOR0; cfg.hdr.response.route = RTESPEC; cfg.hdr.response.mem.region = S_REG; @@ -811,9 +836,9 @@ static int ftmod_m2ua_sctsap_config(int id) cfg.t.cfg.s.sctSapCfg.reConfig.selector = 0; /* service user SAP ID */ - cfg.t.cfg.s.sctSapCfg.suId = m2ua->id; + cfg.t.cfg.s.sctSapCfg.suId = m2ua_inf_id; /* service provider ID */ - cfg.t.cfg.s.sctSapCfg.spId = m2ua->sctpId; + cfg.t.cfg.s.sctSapCfg.spId = sctp_id; /* source port number */ cfg.t.cfg.s.sctSapCfg.srcPort = 2904; /* interface address */ @@ -858,13 +883,12 @@ static int ftmod_m2ua_sctsap_config(int id) /****************************************************************************************************/ /* M2UA - Peer configuration */ -static int ftmod_m2ua_peer_config(int id) +static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id) { int i; Pst pst; MwMgmt cfg; - sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; - sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[m2ua->peerId]; + sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id]; sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[peer->sctpId]; memset((U8 *)&cfg, 0, sizeof(MwMgmt)); @@ -1615,9 +1639,10 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) { MwMgmt ssta; Pst pst; + int peerId = 0x01; sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; - sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[m2ua->peerId]; + sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peerId]; /*TODO - KAPIL - need to add proper peerId*/ memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&ssta, 0, sizeof(MwMgmt)); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 8f85ac3536..8c2a12e1c8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -60,8 +60,6 @@ typedef struct sng_m2ua_cfg{ uint32_t flags; uint32_t id; /* ID */ uint8_t nodeType; /*Node Type SG/ASP */ - uint16_t sctpId; /* idx to sctp profile */ - uint16_t peerId; /* idx to m2ua_peer profile */ uint16_t clusterId; /* idx to m2ua_cluster profile */ }sng_m2ua_cfg_t; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index a3785cc01d..a0ed2b3d7f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -252,17 +252,6 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) } SS7_DEBUG("Found an nif node_type = %d\n", sng_m2ua.nodeType); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "sctp_id")) { - /**********************************************************************/ - sng_m2ua.sctpId=atoi(parm->val); - - SS7_DEBUG("Found an m2ua sctp_id = %d\n", sng_m2ua.sctpId); - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "peerd_id")) { - /**********************************************************************/ - sng_m2ua.peerId=atoi(parm->val); - - SS7_DEBUG("Found an m2ua peerd_id = %d\n", sng_m2ua.peerId); /**********************************************************************/ } else if (!strcasecmp(parm->var, "cluster_id")) { /**********************************************************************/ @@ -299,8 +288,6 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].id = m2ua_iface->id; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].nodeType = m2ua_iface->nodeType; - g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].sctpId = m2ua_iface->sctpId; - g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].peerId = m2ua_iface->peerId; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_PRESENT); From 8102c1603cd6455361d68809b9ee61647d52363b Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 11 Jun 2012 18:45:56 +0530 Subject: [PATCH 224/493] adding src/peer port into xml config --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c | 4 ++-- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h | 1 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c | 12 +++++++++++- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 57ab67c0ca..c1566d7758 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -840,7 +840,7 @@ static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) /* service provider ID */ cfg.t.cfg.s.sctSapCfg.spId = sctp_id; /* source port number */ - cfg.t.cfg.s.sctSapCfg.srcPort = 2904; + cfg.t.cfg.s.sctSapCfg.srcPort = sctp->port; /* interface address */ /*For multiple IP address support */ #ifdef SCT_ENDP_MULTI_IPADDR @@ -925,7 +925,7 @@ static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id) cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[i].u.ipv4NetAddr = peer->destAddrList[i]; } #ifdef MW_CFG_DSTPORT - cfg.t.cfg.s.peerCfg.assocCfg.dstPort = /* TODO */ 2904; /* Port on which M2UA runs */ + cfg.t.cfg.s.peerCfg.assocCfg.dstPort = peer->port; /* Port on which M2UA runs */ #endif cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = sctp->numSrcAddr; /* source address list */ for (i=0; i <= (sctp->numSrcAddr-1); i++) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 8c2a12e1c8..d87b9d6c04 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -71,6 +71,7 @@ typedef struct sng_m2ua_peer_cfg{ uint16_t selfAspId; /* Self ASP ID. ASP identifier for this ASP node if the aspIdFlag is TRUE. */ uint32_t numDestAddr; /* Number of destination address defined */ uint16_t sctpId; /* idx to sctp profile */ + uint16_t port; /* port */ uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ uint16_t locOutStrms; /*Number of outgoing streams supported by this association*/ int init_sctp_assoc; /* flag to tell if we need to initiate SCTP association */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index a0ed2b3d7f..be8cbe4a85 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -387,6 +387,12 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter SS7_DEBUG("Found an sng_m2ua_peer sctp_id = %d\n", sng_m2ua_peer.sctpId); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "dest_port")) { + /**********************************************************************/ + sng_m2ua_peer.port = atoi(parm->val); + + SS7_DEBUG("Found an sng_m2ua_peer port = %d\n", sng_m2ua_peer.port); + /**********************************************************************/ } else if (!strcasecmp(parm->var, "dest_addr")) { /**********************************************************************/ if (sng_m2ua_peer.numDestAddr < SCT_MAX_NET_ADDRS) { @@ -450,6 +456,7 @@ static int ftmod_ss7_fill_in_m2ua_peer_interface(sng_m2ua_peer_cfg_t *m2ua_peer_ g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].locOutStrms = m2ua_peer_iface->locOutStrms; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].numDestAddr = m2ua_peer_iface->numDestAddr; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].sctpId = m2ua_peer_iface->sctpId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].port = m2ua_peer_iface->port; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].init_sctp_assoc = m2ua_peer_iface->init_sctp_assoc; for (k=0; knumDestAddr; k++) { g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].destAddrList[k] = m2ua_peer_iface->destAddrList[k]; @@ -677,6 +684,9 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) } else { SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val); } + } else if (!strcasecmp(param->var, "src_port")) { + t_link.port = atoi(param->val); + SS7_DEBUG("SCTP - Parsing with port = %s\n", param->val); } else { SS7_ERROR("SCTP - Found an unknown parameter <%s>. Skipping it.\n", param->var); @@ -684,7 +694,7 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) } g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].id = t_link.id; - g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].tuclId = t_link.id; + g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].port = t_link.port; strncpy((char*)g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].name, t_link.name, strlen(t_link.name) ); g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].flags = 0; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].numSrcAddr = t_link.numSrcAddr; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 90fb3e5b7f..63e146c029 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -462,7 +462,7 @@ typedef struct sng_sctp_link { char name[MAX_NAME_LEN]; uint32_t flags; uint32_t id; - uint32_t tuclId; + uint32_t port; uint32_t numSrcAddr; uint32_t srcAddrList[SCT_MAX_NET_ADDRS+1]; } sng_sctp_link_t; From 91f9374a9f7d1b1ae23347b9ef2cd5104c4b49e5 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 11 Jun 2012 13:23:37 -0400 Subject: [PATCH 225/493] Added code to treat sngss7_config section (same as sng_isup) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 2e4f7e1e5f..9896e932aa 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -2894,8 +2894,11 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf return NULL; } - /* search the isup config */ - for (isup = switch_xml_child(ss7configs, "sng_isup"); isup; isup = isup->next) { + /* sng_isup and ss7config xml childs are treated the same way. sng_isup was used initially, but does not make sense + * for configurations that do not have an ISUP layer, sng_isup is kept for backward compatibility */ + + /* search the ss7config */ + for (isup = switch_xml_child(ss7configs, "sngss7_config"); isup; isup = isup->next) { char *name = (char *) switch_xml_attr(isup, "name"); if (!name) { continue; @@ -2904,10 +2907,23 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf break; } } - + if (!isup) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "not found '%s' sng_isup XML config section\n", confname); - return NULL; + /* search the isup config */ + for (isup = switch_xml_child(ss7configs, "sng_isup"); isup; isup = isup->next) { + char *name = (char *) switch_xml_attr(isup, "name"); + if (!name) { + continue; + } + if (!strcasecmp(name, confname)) { + break; + } + } + + if (!isup) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "not found '%s' ss7config or sng_isup XML config section\n", confname); + return NULL; + } } /* found our XML chunk, create the root node */ From 58dc659fbbaa734b37149840ce3e2f55a8585105 Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 12 Jun 2012 18:43:01 +0530 Subject: [PATCH 226/493] adding code based on modified xml and cli code changes (rename the m2ua cli command to "xmlshow" and adding cli code to show sctp state also in m2ua peerstatus command) --- libs/freetdm/mod_freetdm/mod_freetdm.c | 102 ++++++-- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 222 ++++++++++++------ .../ftmod_sangoma_ss7_logger.c | 5 + .../ftmod_sangoma_ss7_m2ua.c | 14 +- .../ftmod_sangoma_ss7_m2ua.h | 4 +- .../ftmod_sangoma_ss7_m2ua_xml.c | 62 ++--- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 13 +- 7 files changed, 273 insertions(+), 149 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 9896e932aa..6751175cb5 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -2867,6 +2867,77 @@ static int add_config_list_nodes(switch_xml_t swnode, ftdm_conf_node_t *rootnode return 0; } +/* create ftdm_conf_node_t tree based on a fixed pattern XML configuration list + * last arg is to specify if we have any sublist for e.g. + * + * + * + * + * + * + * + * + * */ +static int add_config_nodes(switch_xml_t swnode, ftdm_conf_node_t *rootnode, + const char *list_name, const char *list_element_name, const char *sub_list_name) +{ + char *var, *val; + switch_xml_t list; + switch_xml_t sub_list; + switch_xml_t element; + switch_xml_t param; + + ftdm_conf_node_t *n_list; + ftdm_conf_node_t *n_element; + + list = switch_xml_child(swnode, list_name); + if (!list) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "no list %s found\n", list_name); + return -1; + } + + if ((FTDM_SUCCESS != ftdm_conf_node_create(list_name, &n_list, rootnode))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to create %s node\n", list_name); + return -1; + } + + for (element = switch_xml_child(list, list_element_name); element; element = element->next) { + char *element_name = (char *) switch_xml_attr(element, "name"); + + if (!element_name) { + continue; + } + + if ((FTDM_SUCCESS != ftdm_conf_node_create(list_element_name, &n_element, n_list))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to create %s node for %s\n", list_element_name, element_name); + return -1; + } + ftdm_conf_node_add_param(n_element, "name", element_name); + + for (param = switch_xml_child(element, "param"); param; param = param->next) { + var = (char *) switch_xml_attr_soft(param, "name"); + val = (char *) switch_xml_attr_soft(param, "value"); + ftdm_conf_node_add_param(n_element, var, val); + } + + /*If we have single node list */ + if (sub_list_name ) { + sub_list = switch_xml_child(element, sub_list_name); + if (!sub_list) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "no sub_list %s found\n", sub_list_name); + return -1; + } + for (param = switch_xml_child(sub_list, "param"); param; param = param->next) { + var = (char *) switch_xml_attr_soft(param, "name"); + val = (char *) switch_xml_attr_soft(param, "value"); + ftdm_conf_node_add_param(n_element, var, val); + } + } + } + + return 0; +} + static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *confname, const char *operatingMode) { switch_xml_t signode, ss7configs, isup, gen, param; @@ -2998,23 +3069,21 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf ftdm_conf_node_destroy(rootnode); return NULL; } - } - /* add mtp linksets */ - if (add_config_list_nodes(isup, rootnode, "mtp_linksets", "mtp_linkset", NULL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_linksets for sng_isup config %s\n", confname); - ftdm_conf_node_destroy(rootnode); - return NULL; - } + /* add mtp linksets */ + if (add_config_list_nodes(isup, rootnode, "mtp_linksets", "mtp_linkset", NULL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_linksets for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } - /* add mtp routes */ - if (add_config_list_nodes(isup, rootnode, "mtp_routes", "mtp_route", "linksets", "linkset")) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_routes for sng_isup config %s\n", confname); - ftdm_conf_node_destroy(rootnode); - return NULL; - } + /* add mtp routes */ + if (add_config_list_nodes(isup, rootnode, "mtp_routes", "mtp_route", "linksets", "linkset")) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_routes for sng_isup config %s\n", confname); + ftdm_conf_node_destroy(rootnode); + return NULL; + } - if(is_isup) { /* add isup interfaces */ if (add_config_list_nodes(isup, rootnode, "isup_interfaces", "isup_interface", NULL, NULL)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process isup_interfaces for sng_isup config %s\n", confname); @@ -3049,13 +3118,14 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf return NULL; } - if (add_config_list_nodes(isup, rootnode, "sng_m2ua_peer_interfaces", "sng_m2ua_peer_interface", NULL, NULL)) { + if (add_config_nodes(isup, rootnode, "sng_m2ua_peer_interfaces", "sng_m2ua_peer_interface", "sng_destination_addresses")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_peer_interfaces for sng_isup config %s\n", confname); ftdm_conf_node_destroy(rootnode); return NULL; } - if (add_config_list_nodes(isup, rootnode, "sng_m2ua_cluster_interfaces", "sng_m2ua_cluster_interface", NULL, NULL)) { + + if (add_config_nodes(isup, rootnode, "sng_m2ua_cluster_interfaces", "sng_m2ua_cluster_interface", "sng_m2ua_peers")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_cluster_interfaces for sng_isup config %s\n", confname); ftdm_conf_node_destroy(rootnode); return NULL; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index bec6e020ac..6fece294cc 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -393,64 +393,78 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha handle_show_procId(stream); /**********************************************************************/ - } else if (!strcasecmp(argv[c], "m2ua")) { - /**********************************************************************/ + } else{ + /**********************************************************************/ + stream->write_function(stream, "Unknown \"show\" command\n"); + goto handle_cli_error; + } + /**************************************************************************/ + } else if (!strcasecmp(argv[c], "xmlshow")) { + /**************************************************************************/ + + if (check_arg_count(argc, 2)) { + cli_ss7_show_general(stream); + return FTDM_SUCCESS; + } + c++; + /**************************************************************************/ + if (!strcasecmp(argv[c], "m2ua")) { + /**************************************************************************/ switch(argc) { case 2: /* show m2ua */ - { - handle_show_m2ua_profiles(stream); - break; - } + { + handle_show_m2ua_profiles(stream); + break; + } case 3: /* show m2ua */ - { - c++; - handle_show_m2ua_profile(stream, argv[c]); - break; - } + { + c++; + handle_show_m2ua_profile(stream, argv[c]); + break; + } case 4: - { - char* profile_name = argv[++c]; - c++; - if(!strcasecmp(argv[c],"peerstatus")){ - handle_show_m2ua_peer_status(stream, profile_name); + { + char* profile_name = argv[++c]; + c++; + if(!strcasecmp(argv[c],"peerstatus")){ + handle_show_m2ua_peer_status(stream, profile_name); + } + else{ + stream->write_function(stream, "Unknown \"show m2ua \" command..\n"); + goto handle_cli_error_argc; + } + break; } - else{ - stream->write_function(stream, "Unknown \"show m2ua \" command..\n"); - goto handle_cli_error_argc; - } - break; - } default: - goto handle_cli_error_argc; + goto handle_cli_error_argc; } - /**********************************************************************/ + /**********************************************************************/ } else if (!strcasecmp(argv[c], "nif")) { - /**********************************************************************/ + /**********************************************************************/ if (check_arg_count(argc, 3)){ handle_show_nif_profiles(stream); }else{ c++; handle_show_nif_profile(stream, argv[c]); } - /**********************************************************************/ + /**********************************************************************/ } else if (!strcasecmp(argv[c], "sctp")) { - /**********************************************************************/ + /**********************************************************************/ if (check_arg_count(argc, 3)){ handle_show_sctp_profiles(stream); }else{ c++; handle_show_sctp_profile(stream, argv[c]); } - /**********************************************************************/ + /**********************************************************************/ } else { - /**********************************************************************/ - stream->write_function(stream, "Unknown \"show\" command\n"); + /**********************************************************************/ + stream->write_function(stream, "Unknown \"xmlshow\" command\n"); goto handle_cli_error; - /**********************************************************************/ } - /**************************************************************************/ + /**********************************************************************/ } else if (!strcasecmp(argv[c], "set")) { /**************************************************************************/ if (check_arg_count(argc, 4)) goto handle_cli_error_argc; @@ -914,13 +928,13 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "\n"); stream->write_function(stream, "ftmod_sangoma_ss7 M2UA :\n"); - stream->write_function(stream, "ftdm ss7 show sctp \n"); - stream->write_function(stream, "ftdm ss7 show sctp \n"); - stream->write_function(stream, "ftdm ss7 show m2ua \n"); - stream->write_function(stream, "ftdm ss7 show m2ua \n"); - stream->write_function(stream, "ftdm ss7 show m2ua peerstatus\n"); - stream->write_function(stream, "ftdm ss7 show nif \n"); - stream->write_function(stream, "ftdm ss7 show nif \n"); + stream->write_function(stream, "ftdm ss7 xmlshow sctp \n"); + stream->write_function(stream, "ftdm ss7 xmlshow sctp \n"); + stream->write_function(stream, "ftdm ss7 xmlshow m2ua \n"); + stream->write_function(stream, "ftdm ss7 xmlshow m2ua \n"); + stream->write_function(stream, "ftdm ss7 xmlshow m2ua peerstatus\n"); + stream->write_function(stream, "ftdm ss7 xmlshow nif \n"); + stream->write_function(stream, "ftdm ss7 xmlshow nif \n"); stream->write_function(stream, "\n"); @@ -3062,8 +3076,10 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) int idx = 0x00; int len = 0x00; MwMgmt cfm; + MwMgmt rsp; memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset((U8 *)&rsp, 0, sizeof(MwMgmt)); memset(&buf[0], 0, sizeof(buf)); len = len + sprintf(buf + len, "%s\n", xmlhdr); @@ -3103,7 +3119,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); } - if(ftmod_m2ua_ssta_req(STMWCLUSTER,x,&cfm)) { + if(ftmod_m2ua_ssta_req(STMWCLUSTER,g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); return FTDM_FAIL; } else { @@ -3122,21 +3138,30 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); } - if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; - } else { - len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); - len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + memcpy((U8 *)&rsp, &cfm, sizeof(MwMgmt)); - len = len + sprintf(buf + len, "\n"); + /* loop through configured peers */ + for(idx = 0; idx < rsp.t.ssta.s.clusterSta.nmbPeer; idx++) + { + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + + if(ftmod_m2ua_ssta_req(STMWPEER, rsp.t.ssta.s.clusterSta.peerSt[idx].peerId, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + + len = len + sprintf(buf + len, "\n"); + } } if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { @@ -3180,8 +3205,10 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char int found = 0x00; int len = 0x00; MwMgmt cfm; + MwMgmt rsp; memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset((U8 *)&rsp, 0, sizeof(MwMgmt)); memset(&buf[0], 0, sizeof(buf)); len = len + sprintf(buf + len, "%s\n", xmlhdr); @@ -3240,21 +3267,30 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); } - if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; - } else { - len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); - len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + memcpy((U8 *)&rsp, &cfm, sizeof(MwMgmt)); - len = len + sprintf(buf + len, "\n"); + /* loop through configured peers */ + for(idx = 0; idx < rsp.t.ssta.s.clusterSta.nmbPeer; idx++) + { + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + + if(ftmod_m2ua_ssta_req(STMWPEER, rsp.t.ssta.s.clusterSta.peerSt[idx].peerId, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + + len = len + sprintf(buf + len, "\n"); + } } if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { @@ -3706,8 +3742,15 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, int found = 0x00; int len = 0x00; MwMgmt cfm; + SbMgmt sctp_cfm; + sng_m2ua_cluster_cfg_t* clust = NULL; + sng_m2ua_cfg_t* m2ua = NULL; + sng_m2ua_peer_cfg_t* peer = NULL; + int peer_id = 0; + int sctp_id = 0; memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset((U8 *)&sctp_cfm, 0, sizeof(SbMgmt)); memset(&buf[0], 0, sizeof(buf)); len = len + sprintf(buf + len, "%s\n", xmlhdr); @@ -3731,14 +3774,41 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, return FTDM_FAIL; } - if(ftmod_m2ua_ssta_req(STMWPEER,x,&cfm)) { - stream->write_function(stream," Request to Trillium M2UA layer failed \n"); - return FTDM_FAIL; - } else { - len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); - len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); - len = len + sprintf(buf + len, "\n"); + m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x]; + clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + for(x = 0; x < clust->numOfPeers;x++){ + peer_id = clust->peerIdLst[x]; + peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id]; + + if(ftmod_m2ua_ssta_req(STMWPEER, peer_id, &cfm)) { + stream->write_function(stream," Request to Trillium M2UA layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",peer->name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + /*len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED");*/ + len = len + sprintf(buf + len, "\n"); + } + + sctp_id = peer->sctpId; + + if(ftmod_sctp_ssta_req(STSBASSOC, sctp_id, &sctp_cfm)) { + if(LMW_PEER_DOWN == cfm.t.ssta.s.peerSta.state){ + /* If there is no association established so far, it will return fail..*/ + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); + len = len + sprintf(buf + len, "\n"); + }else{ + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(sctp_cfm.t.ssta.s.assocSta.assocState)); + len = len + sprintf(buf + len, "\n"); + } } stream->write_function(stream,"\n%s\n",buf); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 922200629f..e9b370a151 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -870,6 +870,11 @@ void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta) /* To print the event specific information */ switch(sta->t.usta.alarm.event) { + case LMW_EVENT_TERM_OK: + { + ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_TERM_OK: Association Terminated with PeerId[%d] \n",sta->t.usta.s.peerId); + break; + } case LMW_EVENT_ENDPOPEN_OK: { ftdm_log(FTDM_LOG_INFO," M2UA : LMW_EVENT_ENDPOPEN_OK: \n"); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index c1566d7758..0639165e97 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -791,13 +791,13 @@ static int ftmod_m2ua_peer_config(int id) ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config FAILED \n", id); return 0x01; }else{ - ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config SUCCESS \n", id); + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config SUCCESS \n", id); } if(ftmod_m2ua_peer_config1(id, peer_id)){ ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config FAILED \n", id); return 0x01; }else{ - ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); } @@ -1639,10 +1639,9 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) { MwMgmt ssta; Pst pst; - int peerId = 0x01; - sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; - sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; - sng_m2ua_peer_cfg_t* peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peerId]; /*TODO - KAPIL - need to add proper peerId*/ + sng_m2ua_cfg_t* m2ua = NULL; + sng_m2ua_cluster_cfg_t* clust = NULL; + sng_m2ua_peer_cfg_t* peer = NULL; memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&ssta, 0, sizeof(MwMgmt)); @@ -1668,6 +1667,7 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) { case STMWSCTSAP: { + m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; ssta.t.ssta.id.suId = m2ua->id ; /* lower sap Id */ break; } @@ -1678,11 +1678,13 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) } case STMWPEER: { + peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[id]; ssta.t.ssta.id.peerId = peer->id ; /* peer Id */ break; } case STMWCLUSTER: { + clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[id]; ssta.t.ssta.id.clusterId = clust->id ; /* cluster Id */ break; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index d87b9d6c04..2b44426102 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -71,8 +71,8 @@ typedef struct sng_m2ua_peer_cfg{ uint16_t selfAspId; /* Self ASP ID. ASP identifier for this ASP node if the aspIdFlag is TRUE. */ uint32_t numDestAddr; /* Number of destination address defined */ uint16_t sctpId; /* idx to sctp profile */ - uint16_t port; /* port */ - uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ + uint16_t port; + uint32_t destAddrList[SCT_MAX_NET_ADDRS+1]; /* Destination adddress list */ uint16_t locOutStrms; /*Number of outgoing streams supported by this association*/ int init_sctp_assoc; /* flag to tell if we need to initiate SCTP association */ }sng_m2ua_peer_cfg_t; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index be8cbe4a85..46f7fd7d19 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -38,6 +38,7 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" +#include "switch_utils.h" /******************************************************************************/ /* DEFINES ********************************************************************/ @@ -123,16 +124,16 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface) sng_nif.id = atoi(parm->val); SS7_DEBUG("Found an nif id = %d\n", sng_nif.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "m2ua_link_nmb")) { + } else if (!strcasecmp(parm->var, "m2ua-interface-id")) { /**********************************************************************/ sng_nif.m2uaLnkNmb = atoi(parm->val); - SS7_DEBUG("Found an nif m2ua_link_nmb = %d\n", sng_nif.m2uaLnkNmb); + SS7_DEBUG("Found an nif m2ua-interface-id = %d\n", sng_nif.m2uaLnkNmb); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "mtp2_link_nmb")) { + } else if (!strcasecmp(parm->var, "mtp2-interface-id")) { /**********************************************************************/ sng_nif.mtp2LnkNmb=atoi(parm->val); - SS7_DEBUG("Found an nif mtp2_link_nmb = %d\n", sng_nif.mtp2LnkNmb); + SS7_DEBUG("Found an nif mtp2-interface-id = %d\n", sng_nif.mtp2LnkNmb); /**********************************************************************/ } else { /**********************************************************************/ @@ -239,21 +240,7 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) sng_m2ua.id = atoi(parm->val); SS7_DEBUG("Found an m2ua id = %d\n", sng_m2ua.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "node_type")) { - /**********************************************************************/ - if(!strcasecmp(parm->val, "SGP")){ - sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP; - } else if(!strcasecmp(parm->val, "ASP")){ - SS7_ERROR(" NodeType = ASP Not Supported Yet \n"); - return FTDM_FAIL; - } else { - SS7_ERROR("Found an invalid NodeType Parameter Value[%s]\n", parm->val); - return FTDM_FAIL; - } - SS7_DEBUG("Found an nif node_type = %d\n", sng_m2ua.nodeType); - /**********************************************************************/ - /**********************************************************************/ - } else if (!strcasecmp(parm->var, "cluster_id")) { + } else if (!strcasecmp(parm->var, "m2ua-cluster-interface-id")) { /**********************************************************************/ sng_m2ua.clusterId=atoi(parm->val); @@ -271,6 +258,8 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) /**************************************************************************/ } /* for (i = 0; i < num_parms; i++) */ + sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP; + /* default the interface to paused state */ sngss7_set_flag(&sng_m2ua, SNGSS7_PAUSED); @@ -348,7 +337,6 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter SS7_DEBUG("Parsing \"m2ua_peer_interface\"...\n"); } - for (i = 0; i < num_parms; i++) { /**************************************************************************/ @@ -363,7 +351,7 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter sng_m2ua_peer.id = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_peer id = %d\n", sng_m2ua_peer.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "asp_id_flag")) { + } else if (!strcasecmp(parm->var, "include-asp-identifier")) { /**********************************************************************/ if(!strcasecmp(parm->val, "TRUE")){ sng_m2ua_peer.aspIdFlag = 0x01; @@ -375,41 +363,41 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter } SS7_DEBUG("Found an sng_m2ua_peer aspIdFlag = %d\n", sng_m2ua_peer.aspIdFlag); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "self_asp_id")) { + } else if (!strcasecmp(parm->var, "asp-identifier")) { /**********************************************************************/ sng_m2ua_peer.selfAspId=atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_peer self_asp_id = %d\n", sng_m2ua_peer.selfAspId); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "sctp_id")) { + } else if (!strcasecmp(parm->var, "sctp-interface-id")) { /**********************************************************************/ sng_m2ua_peer.sctpId = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_peer sctp_id = %d\n", sng_m2ua_peer.sctpId); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "dest_port")) { + } else if (!strcasecmp(parm->var, "destination-port")) { /**********************************************************************/ sng_m2ua_peer.port = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_peer port = %d\n", sng_m2ua_peer.port); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "dest_addr")) { + } else if (!strcasecmp(parm->var, "address")) { /**********************************************************************/ if (sng_m2ua_peer.numDestAddr < SCT_MAX_NET_ADDRS) { sng_m2ua_peer.destAddrList[sng_m2ua_peer.numDestAddr] = iptoul (parm->val); sng_m2ua_peer.numDestAddr++; - SS7_DEBUG("sng_m2ua_peer - Parsing with dest IP Address = %s\n", parm->val); + SS7_DEBUG("sng_m2ua_peer - Parsing with dest IP Address = %s \n", parm->val); } else { SS7_ERROR("sng_m2ua_peer - too many dest address configured. dropping %s \n", parm->val); } /**********************************************************************/ - } else if (!strcasecmp(parm->var, "loc_out_strms")) { + } else if (!strcasecmp(parm->var, "number-of-outgoing-streams")) { /**********************************************************************/ sng_m2ua_peer.locOutStrms=atoi(parm->val); - SS7_DEBUG("Found an sng_m2ua_peer loc_out_strms = %d\n", sng_m2ua_peer.locOutStrms); + SS7_DEBUG("Found an sng_m2ua_peer number-of-outgoing-streams = %d\n", sng_m2ua_peer.locOutStrms); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "init_sctp_assoc")) { + } else if (!strcasecmp(parm->var, "init-sctp-association")) { /**********************************************************************/ if(!strcasecmp(parm->val, "TRUE")){ sng_m2ua_peer.init_sctp_assoc = 0x01; @@ -535,7 +523,7 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i sng_m2ua_cluster.id = atoi(parm->val); SS7_DEBUG("Found an sng_m2ua_cluster id = %d\n", sng_m2ua_cluster.id); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "trf_mode")) { + } else if (!strcasecmp(parm->var, "traffic-mode")) { /**********************************************************************/ if(!strcasecmp(parm->val, "loadshare")){ sng_m2ua_cluster.trfMode = SNG_M2UA_TRF_MODE_LOADSHARE; @@ -549,7 +537,7 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i } SS7_DEBUG("Found an sng_m2ua_cluster.trfMode = %d\n", sng_m2ua_cluster.trfMode); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "load_share_algo")) { + } else if (!strcasecmp(parm->var, "load-share-algorithm")) { /**********************************************************************/ if(!strcasecmp(parm->val, "roundrobin")){ sng_m2ua_cluster.loadShareAlgo = SNG_M2UA_LOAD_SHARE_ALGO_RR; @@ -564,14 +552,14 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i SS7_DEBUG("Found an sng_m2ua_cluster.loadShareAlgo = %d\n", sng_m2ua_cluster.loadShareAlgo); /**********************************************************************/ - } else if (!strcasecmp(parm->var, "peer_id")) { + } else if (!strcasecmp(parm->var, "m2ua-peer-interface-id")) { /**********************************************************************/ if(sng_m2ua_cluster.numOfPeers < MW_MAX_NUM_OF_PEER) { sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers] = atoi(parm->val); - sng_m2ua_cluster.numOfPeers++; SS7_DEBUG("Found an sng_m2ua_cluster peerId[%d], Total numOfPeers[%d] \n", sng_m2ua_cluster.peerIdLst[sng_m2ua_cluster.numOfPeers], - sng_m2ua_cluster.numOfPeers); + sng_m2ua_cluster.numOfPeers+1); + sng_m2ua_cluster.numOfPeers++; }else{ SS7_ERROR("Peer List excedding max[%d] limit \n", MW_MAX_NUM_OF_PEER); return FTDM_FAIL; @@ -603,7 +591,7 @@ static int ftmod_ss7_fill_in_m2ua_clust_interface(sng_m2ua_cluster_cfg_t *m2ua_c int k = 0x00; int i = m2ua_cluster_iface->id; - strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[i].name, (char *)m2ua_cluster_iface->name, MAX_NAME_LEN-1); + strncpy((char *)g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].name, (char *)m2ua_cluster_iface->name, MAX_NAME_LEN-1); g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].id = m2ua_cluster_iface->id; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[i].trfMode = m2ua_cluster_iface->trfMode; @@ -676,7 +664,7 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) t_link.id = atoi(param->val); SS7_DEBUG("SCTP - Parsing with id = %s\n", param->val); } - else if (!strcasecmp(param->var, "src_addr")) { + else if (!strcasecmp(param->var, "src-addr")) { if (t_link.numSrcAddr < SCT_MAX_NET_ADDRS) { t_link.srcAddrList[t_link.numSrcAddr+1] = iptoul (param->val); t_link.numSrcAddr++; @@ -684,7 +672,7 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) } else { SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val); } - } else if (!strcasecmp(param->var, "src_port")) { + } else if (!strcasecmp(param->var, "src-port")) { t_link.port = atoi(param->val); SS7_DEBUG("SCTP - Parsing with port = %s\n", param->val); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 4b51bfc0e7..4136423257 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -223,7 +223,6 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; - printf("var[%s], val[%s]\n",var,val); /* confirm that the first parameter is the "operatingMode" */ if(!strcasecmp(var, "operatingMode")){ /**********************************************************************/ @@ -275,7 +274,7 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa /**********************************************************************/ /* don't care for now */ /**********************************************************************/ - } else if (!strcasecmp(var, "ccSpanId")) { + } else if (!strcasecmp(var, "span-id")) { /**********************************************************************/ sngSpan.ccSpanId = atoi(val); SS7_DEBUG("Found an ccSpanId = %d\n",sngSpan.ccSpanId); @@ -543,16 +542,6 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) } case SNG_SS7_OPR_MODE_M2UA_SG: { - if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) { - SS7_ERROR("Failed to parse \"mtp_linksets\"!\n"); - return FTDM_FAIL; - } - - if (ftmod_ss7_parse_mtp_routes(mtp_routes)) { - SS7_ERROR("Failed to parse \"mtp_routes\"!\n"); - return FTDM_FAIL; - } - if (ftmod_ss7_parse_sctp_links(sctp_ifaces) != FTDM_SUCCESS) { SS7_ERROR("Failed to parse !\n"); return FTDM_FAIL; From b22a4b566a329f522613f1b9c69329f828ffe3ab Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 18:07:42 -0400 Subject: [PATCH 227/493] Fix for some compile warnings --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 6fece294cc..246aeb232b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3070,13 +3070,13 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) { - char* xmlhdr = (char*)""; + MwMgmt cfm; + MwMgmt rsp; char buf[2048]; + char* xmlhdr = (char*)""; int x = 0x00; int idx = 0x00; int len = 0x00; - MwMgmt cfm; - MwMgmt rsp; memset((U8 *)&cfm, 0, sizeof(MwMgmt)); memset((U8 *)&rsp, 0, sizeof(MwMgmt)); From bdaead271d78879b73cc16db56904da5659b5959 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 18:18:14 -0400 Subject: [PATCH 228/493] Fix for compile warnings --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 246aeb232b..f1403c5c84 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3090,11 +3090,11 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbClusters); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbPeers); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbIntf); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbClusters); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbPeers); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbIntf); len = len + sprintf(buf + len, "\n"); } @@ -3153,7 +3153,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3282,7 +3282,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3300,7 +3300,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3630,7 +3630,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) } else { len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, "\n"); } @@ -3649,7 +3649,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); len = len + sprintf(buf + len, "\n"); } @@ -3714,7 +3714,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); len = len + sprintf(buf + len, "\n"); } From ba17ae3f1071823f87a459fed7e874f4c2b005e6 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 18:32:58 -0400 Subject: [PATCH 229/493] Fix for compile warnings --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index f1403c5c84..6496da388b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3092,9 +3092,9 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memAlloc); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbClusters); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbPeers); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbIntf); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbPeers); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbIntf); len = len + sprintf(buf + len, "\n"); } @@ -3171,7 +3171,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3339,8 +3339,8 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbAssoc); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbEndp); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbLocalAddr); @@ -3430,7 +3430,7 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) char *asciiAddr; CmInetIpAddr ip; - len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.assocId); + len = len + sprintf(buf + len, " %ld \n", cfm->t.ssta.s.assocSta.assocId); len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState)); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstPort); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcPort); @@ -3629,7 +3629,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, "\n"); } From 88807931745c406f280d0fed578c1066f55f4611 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 18:47:53 -0400 Subject: [PATCH 230/493] Removed include for switch_utils.h --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 46f7fd7d19..57bca70e61 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -38,7 +38,6 @@ /* INCLUDE ********************************************************************/ #include "ftmod_sangoma_ss7_main.h" -#include "switch_utils.h" /******************************************************************************/ /* DEFINES ********************************************************************/ From 055dc8bc4beea90ed88d0604823d6e7d54827863 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 19:15:14 -0400 Subject: [PATCH 231/493] re-adjusted parameter names --- libs/freetdm/mod_freetdm/mod_freetdm.c | 22 +++++++++---------- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 11 +++++----- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 6751175cb5..35690b1e24 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -2938,7 +2938,7 @@ static int add_config_nodes(switch_xml_t swnode, ftdm_conf_node_t *rootnode, return 0; } -static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *confname, const char *operatingMode) +static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *confname, const char *operating_mode) { switch_xml_t signode, ss7configs, isup, gen, param; ftdm_conf_node_t *rootnode, *list; @@ -3004,19 +3004,19 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf } /* operating mode , M2UA or ISUP */ - if(operatingMode && ('\0' != operatingMode[0])) { - if(!strcasecmp(operatingMode, "ISUP")) { + if(operating_mode && ('\0' != operating_mode[0])) { + if(!strcasecmp(operating_mode, "ISUP")) { is_isup = 0x01; } - else if(!strcasecmp(operatingMode, "M2UA_SG")) { + else if(!strcasecmp(operating_mode, "M2UA_SG")) { is_isup = 0x00; } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid operating Mode[%s] \n", operatingMode); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid operating Mode[%s] \n", operating_mode); ftdm_conf_node_destroy(rootnode); return NULL; } } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Operating mode not specified, default to ISUP \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Operating mode not specified, default to ISUP \n"); is_isup = 0x01; } @@ -3367,7 +3367,7 @@ static switch_status_t load_config(void) char *id = (char *) switch_xml_attr(myspan, "id"); char *name = (char *) switch_xml_attr(myspan, "name"); char *configname = (char *) switch_xml_attr(myspan, "cfgprofile"); - char *operatingMode = (char *) switch_xml_attr(myspan, "operating_mode"); + char *operating_mode = (char *) switch_xml_attr(myspan, "operating_mode"); ftdm_span_t *span = NULL; uint32_t span_id = 0; unsigned paramindex = 0; @@ -3401,7 +3401,7 @@ static switch_status_t load_config(void) span_id = ftdm_span_get_id(span); } - ss7confnode = _get_ss7_config_node(cfg, configname, operatingMode); + ss7confnode = _get_ss7_config_node(cfg, configname, operating_mode); if (!ss7confnode) { CONFIG_ERROR("Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); continue; @@ -3409,9 +3409,9 @@ static switch_status_t load_config(void) memset(spanparameters, 0, sizeof(spanparameters)); paramindex = 0; - if(operatingMode){ - spanparameters[paramindex].var = "operatingMode"; - spanparameters[paramindex].val = operatingMode; + if(operating_mode){ + spanparameters[paramindex].var = "operating-mode"; + spanparameters[paramindex].val = operating_mode; paramindex++; } spanparameters[paramindex].var = "confnode"; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 4136423257..ebbdc69cae 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -206,13 +206,12 @@ static void ftmod_ss7_set_glare_resolution (const char *method); int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span) { + sng_route_t self_route; + sng_span_t sngSpan; int i = 0; const char *var = NULL; const char *val = NULL; ftdm_conf_node_t *ptr = NULL; - sng_route_t self_route; - sng_span_t sngSpan; - /* clean out the isup ckt */ memset(&sngSpan, 0x0, sizeof(sngSpan)); @@ -223,8 +222,8 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; - /* confirm that the first parameter is the "operatingMode" */ - if(!strcasecmp(var, "operatingMode")){ + /* confirm that the first parameter is the "operating-mode" */ + if(!strcasecmp(var, "operating-mode")){ /**********************************************************************/ if(!strcasecmp(val, "ISUP")) { g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; @@ -274,7 +273,7 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa /**********************************************************************/ /* don't care for now */ /**********************************************************************/ - } else if (!strcasecmp(var, "span-id")) { + } else if (!strcasecmp(var, "span-id") || !strcasecmp(var, "ccSpanId")) { /**********************************************************************/ sngSpan.ccSpanId = atoi(val); SS7_DEBUG("Found an ccSpanId = %d\n",sngSpan.ccSpanId); From feaadd2f43751af626ec526efff956531032da33 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 19:29:07 -0400 Subject: [PATCH 232/493] re-adjusted parameter names --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index ebbdc69cae..0d37dffb12 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -260,27 +260,18 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa i++; while (ftdm_parameters[i].var != NULL) { - /**************************************************************************/ - var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; if (!strcasecmp(var, "dialplan")) { - /**********************************************************************/ /* don't care for now */ - /**********************************************************************/ } else if (!strcasecmp(var, "context")) { - /**********************************************************************/ /* don't care for now */ - /**********************************************************************/ } else if (!strcasecmp(var, "span-id") || !strcasecmp(var, "ccSpanId")) { - /**********************************************************************/ sngSpan.ccSpanId = atoi(val); SS7_DEBUG("Found an ccSpanId = %d\n",sngSpan.ccSpanId); - /**********************************************************************/ } else { SS7_ERROR("Unknown parameter found =\"%s\"...ignoring it!\n", var); - /**********************************************************************/ } i++; From 143fb61bdb66ef946d4245665f29f62039c91aa0 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 20:12:27 -0400 Subject: [PATCH 233/493] re-adjusted parameter names --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 0d37dffb12..182ca0745e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -224,20 +224,19 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa /* confirm that the first parameter is the "operating-mode" */ if(!strcasecmp(var, "operating-mode")){ - /**********************************************************************/ if(!strcasecmp(val, "ISUP")) { g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; } else if(!strcasecmp(val, "M2UA_SG")) { g_ftdm_operating_mode = SNG_SS7_OPR_MODE_M2UA_SG; } else { - SS7_ERROR("Invalid operating Mode[%s] \n", val); - return FTDM_FAIL; + SS7_DEBUG("Operating mode not specified, defaulting to ISUP\n"); + g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; } - /**********************************************************************/ + i++; } - i++; + var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; From 2112375e07a5e59a4766e15459a423b27c8860df Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 20:19:37 -0400 Subject: [PATCH 234/493] re-adjusted parameter names --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c index 182ca0745e..c028bb709d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c @@ -222,6 +222,8 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa var = ftdm_parameters[i].var; val = ftdm_parameters[i].val; + g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; + /* confirm that the first parameter is the "operating-mode" */ if(!strcasecmp(var, "operating-mode")){ if(!strcasecmp(val, "ISUP")) { @@ -231,7 +233,6 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa g_ftdm_operating_mode = SNG_SS7_OPR_MODE_M2UA_SG; } else { SS7_DEBUG("Operating mode not specified, defaulting to ISUP\n"); - g_ftdm_operating_mode = SNG_SS7_OPR_MODE_ISUP; } i++; } From 088a564c02d1d5bcf4d6b42743ac69d694c8d775 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 12 Jun 2012 20:26:15 -0400 Subject: [PATCH 235/493] changed mod_megaco to mod_media_gateway --- build/modules.conf.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index cc99d528f0..783eddf41f 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -7,7 +7,7 @@ applications/mod_hash applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia -endpoints/mod_megaco +endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket From bb075a6f10fba52d57498b81321223d52175ab09 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 13 Jun 2012 14:02:56 -0400 Subject: [PATCH 236/493] Added radius --- build/modules.conf.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 783eddf41f..daaa6084c7 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -5,6 +5,7 @@ applications/mod_dptools applications/mod_commands applications/mod_hash applications/mod_spandsp +applications/mod_rad_auth dialplans/mod_dialplan_xml endpoints/mod_sofia endpoints/mod_media_gateway @@ -12,3 +13,5 @@ endpoints/mod_media_gateway xml_int/mod_xml_cdr event_handlers/mod_event_socket codecs/mod_sangoma_codec +event_handlers/mod_radius_cdr + From 69197b1d0cec61c3580854a9960169b8f2c914df Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 14 Jun 2012 15:40:57 +0530 Subject: [PATCH 237/493] fixing cli issues --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 65 ++++++++++++------- .../ftmod_sangoma_ss7_m2ua.c | 52 ++++++++++++--- .../ftmod_sangoma_ss7_m2ua.h | 1 + .../ftmod_sangoma_ss7_main.h | 5 +- 4 files changed, 88 insertions(+), 35 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 6fece294cc..8c76bb6f12 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -403,8 +403,8 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha /**************************************************************************/ if (check_arg_count(argc, 2)) { - cli_ss7_show_general(stream); - return FTDM_SUCCESS; + stream->write_function(stream, "Unknown \"xmlshow\" command\n"); + goto handle_cli_error; } c++; /**************************************************************************/ @@ -3071,7 +3071,7 @@ static ftdm_status_t cli_ss7_show_all_spans_general(ftdm_stream_handle_t *stream static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[6144]; int x = 0x00; int idx = 0x00; int len = 0x00; @@ -3105,6 +3105,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) { len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); @@ -3164,17 +3165,17 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) } } - if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; - } else { - len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); - len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); - len = len + sprintf(buf + len, "\n"); - } + if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); + len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); + len = len + sprintf(buf + len, "\n"); + } len = len + sprintf(buf + len, "\n"); } @@ -3199,7 +3200,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int idx = 0x00; int found = 0x00; @@ -3234,6 +3235,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", m2ua_profile_name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); @@ -3248,7 +3250,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); } - if(ftmod_m2ua_ssta_req(STMWCLUSTER,x,&cfm)) { + if(ftmod_m2ua_ssta_req(STMWCLUSTER, g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId, &cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); return FTDM_FAIL; } else { @@ -3323,7 +3325,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; SbMgmt cfm; @@ -3402,8 +3404,14 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) } if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; + if(LCM_REASON_INVALID_PAR_VAL == cfm.cfm.reason){ + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); + len = len + sprintf(buf + len, "\n"); + }else{ + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } } else { len = len + sprintf(buf + len, "\n"); len = len + get_assoc_resp_buf(buf + len, &cfm); @@ -3535,7 +3543,7 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char* sctp_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; SbMgmt cfm; @@ -3586,8 +3594,15 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char } if(ftmod_sctp_ssta_req(STSBASSOC,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; + /* it means assoc id not yet allocated */ + if(LCM_REASON_INVALID_PAR_VAL == cfm.cfm.reason){ + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); + len = len + sprintf(buf + len, "\n"); + }else{ + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } } else { len = len + sprintf(buf + len, "\n"); len = len + get_assoc_resp_buf(buf + len, &cfm); @@ -3613,7 +3628,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int len = 0x00; NwMgmt cfm; @@ -3674,7 +3689,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* nif_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int found = 0x00; int len = 0x00; @@ -3737,7 +3752,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name) { char* xmlhdr = (char*)""; - char buf[2048]; + char buf[4096]; int x = 0x00; int found = 0x00; int len = 0x00; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 0639165e97..a5ff80a636 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -51,7 +51,7 @@ static int ftmod_sctp_config(int id); static ftdm_status_t ftmod_sctp_sap_config(int id); static ftdm_status_t ftmod_sctp_tsap_config(int id); static int ftmod_m2ua_gen_config(void); -static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id); +static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id); static int ftmod_m2ua_peer_config(int id); static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id); static int ftmod_m2ua_cluster_config(int idx); @@ -782,6 +782,14 @@ static int ftmod_m2ua_peer_config(int id) sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; sng_m2ua_peer_cfg_t* peer = NULL; + if((clust->flags & SNGSS7_CONFIGURED)){ + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config: Cluster [%s] is already configured \n", clust->name); + return 0x00; + } + + /*NOTE : SCTSAP is based on per source address , so if we have same Cluster / peer shared across many then + * we dont have do configuration for each time */ + /* loop through peer list from cluster to configure SCTSAP */ for(x = 0; x < clust->numOfPeers;x++){ @@ -800,13 +808,18 @@ static int ftmod_m2ua_peer_config(int id) ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); } + clust->sct_sap_id = id; + /* set configured flag for cluster and peer */ + clust->flags |= SNGSS7_CONFIGURED; + peer->flags |= SNGSS7_CONFIGURED; } return 0x0;; } -static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) + +static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id) { int i; Pst pst; @@ -836,7 +849,7 @@ static int ftmod_m2ua_sctsap_config(int m2ua_inf_id, int sctp_id) cfg.t.cfg.s.sctSapCfg.reConfig.selector = 0; /* service user SAP ID */ - cfg.t.cfg.s.sctSapCfg.suId = m2ua_inf_id; + cfg.t.cfg.s.sctSapCfg.suId = sct_sap_id; /* service provider ID */ cfg.t.cfg.s.sctSapCfg.spId = sctp_id; /* source port number */ @@ -1275,7 +1288,7 @@ int ftmod_ss7_m2ua_start(void){ x = 1; while (x < (MW_MAX_NUM_OF_PEER)) { if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].id !=0) && - (!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].flags & SNGSS7_CONFIGURED)) && + ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].flags & SNGSS7_CONFIGURED)) && (g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].init_sctp_assoc)) { if(ftmod_init_sctp_assoc(x)) { ftdm_log (FTDM_LOG_ERROR ,"ftmod_init_sctp_assoc FAIL for peerId[%d] \n", x); @@ -1296,9 +1309,16 @@ int ftmod_ss7_m2ua_start(void){ static int ftmod_open_endpoint(int id) { + int ret = 0x00; Pst pst; MwMgmt cntrl; sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + if(clust->flags & SNGSS7_M2UA_EP_OPENED) { + ftdm_log (FTDM_LOG_INFO ," END-POINT already opened\n"); + return ret; + } memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1324,7 +1344,12 @@ static int ftmod_open_endpoint(int id) cntrl.t.cntrl.action = AMWENDPOPEN; cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */ - return (sng_cntrl_m2ua (&pst, &cntrl)); + + if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){ + clust->flags |= SNGSS7_M2UA_EP_OPENED; + } + return ret; + } /***********************************************************************************************************************/ @@ -1400,9 +1425,17 @@ static int ftmod_sctp_tucl_tsap_bind(int id) static int ftmod_m2ua_sctp_sctsap_bind(int id) { + int ret = 0x00; Pst pst; MwMgmt cntrl; sng_m2ua_cfg_t* m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; + sng_m2ua_cluster_cfg_t* clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + if(clust->flags & SNGSS7_ACTIVE) { + ftdm_log (FTDM_LOG_INFO ," SCT-SAP is already enabled\n"); + return ret; + } + memset((U8 *)&pst, 0, sizeof(Pst)); memset((U8 *)&cntrl, 0, sizeof(MwMgmt)); @@ -1427,8 +1460,10 @@ static int ftmod_m2ua_sctp_sctsap_bind(int id) cntrl.t.cntrl.action = ABND; cntrl.t.cntrl.s.suId = m2ua->id; - return (sng_cntrl_m2ua (&pst, &cntrl)); - + if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){ + clust->flags |= SNGSS7_ACTIVE; + } + return ret; } /***********************************************************************************************************************/ static int ftmod_nif_m2ua_dlsap_bind(int id) @@ -1668,7 +1703,8 @@ int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm) case STMWSCTSAP: { m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id]; - ssta.t.ssta.id.suId = m2ua->id ; /* lower sap Id */ + clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + ssta.t.ssta.id.suId = clust->sct_sap_id ; /* lower sap Id */ break; } case STMWDLSAP: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 2b44426102..8e22e47b97 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -96,6 +96,7 @@ typedef struct sng_m2ua_cluster_cfg{ char name[MAX_NAME_LEN]; uint32_t flags; uint32_t id; /* ID */ + uint32_t sct_sap_id; /* Internal - sct_sap_id */ uint8_t trfMode; /* Traffic mode. This parameter defines the mode in which this m2ua cluster is supposed to work */ uint8_t loadShareAlgo; /* This parameter defines the M2UA load share algorithm which is used to distribute the traffic */ uint16_t numOfPeers; /* idx to m2ua_peer profile */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 63e146c029..0e52f88710 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -767,9 +767,10 @@ typedef enum { SNGSS7_M2UA_PRESENT = (1 << 18), SNGSS7_M2UA_STARTED = (1 << 19), + SNGSS7_M2UA_EP_OPENED = (1 << 20), - SNGSS7_NIF_PRESENT = (1 << 20), - SNGSS7_NIF_STARTED = (1 << 21), + SNGSS7_NIF_PRESENT = (1 << 21), + SNGSS7_NIF_STARTED = (1 << 22), } sng_task_flag_t; /******************************************************************************/ From 6502e96f50edc60e7d23f08b05570e2ff73f04dc Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 14 Jun 2012 18:23:12 -0400 Subject: [PATCH 238/493] Fix for hard link for freeradius-client --- src/mod/applications/mod_rad_auth/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mod/applications/mod_rad_auth/Makefile b/src/mod/applications/mod_rad_auth/Makefile index c00bce2cc2..88d1f0b585 100644 --- a/src/mod/applications/mod_rad_auth/Makefile +++ b/src/mod/applications/mod_rad_auth/Makefile @@ -1,6 +1,12 @@ switch_srcdir=../../../.. +ifdef FREERADIUSDIR +FREERADIUSLA=$(FREERADIUSDIR)/libfreeradius-client.so +else FREERADIUSLA=/usr/local/lib/libfreeradius-client.so +endif + + LOCAL_LIBADD=$(FREERADIUSLA) include $(switch_srcdir)/build/modmake.rules From 2f5ac6243332fb75add1e13159966b2a8d49ffc8 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 15 Jun 2012 15:46:53 -0400 Subject: [PATCH 239/493] added mod_distributor --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 1d27aaad1b..1284bb8bc1 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -5,6 +5,7 @@ applications/mod_dptools applications/mod_commands applications/mod_hash applications/mod_spandsp +applications/mod_distributor dialplans/mod_dialplan_xml endpoints/mod_sofia ../../libs/freetdm/mod_freetdm From 92b55af0715a2a8c41b78ba01ec75763697cf3e5 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 15 Jun 2012 16:08:18 -0400 Subject: [PATCH 240/493] missing functions rename --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index ebad0b30b7..6383bb0750 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -14,7 +14,7 @@ static sng_mg_event_interface_t sng_event; SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); -SWITCH_MODULE_DEFINITION(mod_megaco, mod_megaco_load, mod_megaco_shutdown, NULL); +SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); SWITCH_STANDARD_API(megaco_function) { @@ -51,7 +51,7 @@ static switch_status_t list_profiles(const char *line, const char *cursor, switc return status; } -SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) +SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) { switch_api_interface_t *api_interface; @@ -93,7 +93,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) return sng_mgco_init(&sng_event); } -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown) +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) { sng_mgco_stack_shutdown(); From af39d4c9d2a5ac277035ccbb5b984c06ee4cb155 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 15 Jun 2012 16:16:11 -0400 Subject: [PATCH 241/493] missed one --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 6383bb0750..58a8794fad 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -12,8 +12,8 @@ struct megaco_globals megaco_globals; static sng_mg_event_interface_t sng_event; -SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load); -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_megaco_shutdown); +SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); SWITCH_STANDARD_API(megaco_function) From 07b260d18baab081e51d39c6dd4aef2d201e3772 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 15 Jun 2012 16:17:01 -0400 Subject: [PATCH 242/493] Trying to re-use same Makefile as mod_rad_cdr --- src/mod/applications/mod_rad_auth/Makefile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/mod/applications/mod_rad_auth/Makefile b/src/mod/applications/mod_rad_auth/Makefile index 88d1f0b585..d2e91c24b3 100644 --- a/src/mod/applications/mod_rad_auth/Makefile +++ b/src/mod/applications/mod_rad_auth/Makefile @@ -1,13 +1,14 @@ switch_srcdir=../../../.. -ifdef FREERADIUSDIR -FREERADIUSLA=$(FREERADIUSDIR)/libfreeradius-client.so -else -FREERADIUSLA=/usr/local/lib/libfreeradius-client.so -endif +RADCLIENT_VERSION=1.1.6 +RADCLIENT=freeradius-client-$(RADCLIENT_VERSION) +RADCLIENT_DIR=$(switch_srcdir)/libs/$(RADCLIENT) +RADCLIENT_BUILDDIR=$(switch_builddir)/libs/$(RADCLIENT) +RADCLIENT_LIBDIR=$(RADCLIENT_BUILDDIR)/lib +RADCLIENT_LA=${RADCLIENT_LIBDIR}/libfreeradius-client.la - -LOCAL_LIBADD=$(FREERADIUSLA) +LOCAL_CFLAGS=-I$(RADCLIENT_DIR)/include +LOCAL_LIBADD=$(RADCLIENT_LA) include $(switch_srcdir)/build/modmake.rules From 74de83c6eb8742887a3be75801088bb03c4a0e8b Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 15 Jun 2012 16:48:53 -0400 Subject: [PATCH 243/493] Trying without rad_auth --- build/modules.conf.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index daaa6084c7..2bdedc6237 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -5,7 +5,7 @@ applications/mod_dptools applications/mod_commands applications/mod_hash applications/mod_spandsp -applications/mod_rad_auth +#applications/mod_rad_auth dialplans/mod_dialplan_xml endpoints/mod_sofia endpoints/mod_media_gateway From 3b4c725b1c339233452a2832a05e9b8325bb8822 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 18 Jun 2012 17:41:05 +0530 Subject: [PATCH 244/493] fixing cli issues --- libs/freetdm/configure.ac | 2 +- libs/freetdm/mod_freetdm/mod_freetdm.c | 8 +- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c | 7 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 96 ++++---- .../ftmod_sangoma_ss7_m2ua.c | 216 +++++++++--------- .../ftmod_sangoma_ss7_m2ua.h | 2 + .../ftmod_sangoma_ss7_m2ua_xml.c | 17 +- .../ftmod_sangoma_ss7_main.h | 5 +- 8 files changed, 178 insertions(+), 175 deletions(-) diff --git a/libs/freetdm/configure.ac b/libs/freetdm/configure.ac index 80f0c73070..292c1e7cfa 100644 --- a/libs/freetdm/configure.ac +++ b/libs/freetdm/configure.ac @@ -316,7 +316,7 @@ if test "${HAVE_SNG_SS7}" = "yes"; then case "${host}" in x86_64-*) # X86_64 machines need additional flags when compiling against libsng_isdn - CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT -DDEBUGP" + CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT" ;; esac fi diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 35690b1e24..89524f0eca 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -3061,7 +3061,6 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf return NULL; } - /* If ISUP is operating mode then only include mtp3_links/isup links */ if(is_isup) { /* add mtp3 links */ if (add_config_list_nodes(isup, rootnode, "mtp3_links", "mtp3_link", NULL, NULL)) { @@ -3097,10 +3096,9 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf ftdm_conf_node_destroy(rootnode); return NULL; } - } - else { + } else { /* add sctp links */ - if (add_config_list_nodes(isup, rootnode, "sng_sctp_interfaces", "sng_sctp_interface", NULL, NULL)) { + if (add_config_nodes(isup, rootnode, "sng_sctp_interfaces", "sng_sctp_interface", "sng_source_addresses")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_sctp_interface for sng_isup config %s\n", confname); ftdm_conf_node_destroy(rootnode); return NULL; @@ -3124,13 +3122,11 @@ static ftdm_conf_node_t *_get_ss7_config_node(switch_xml_t cfg, const char *conf return NULL; } - if (add_config_nodes(isup, rootnode, "sng_m2ua_cluster_interfaces", "sng_m2ua_cluster_interface", "sng_m2ua_peers")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_m2ua_cluster_interfaces for sng_isup config %s\n", confname); ftdm_conf_node_destroy(rootnode); return NULL; } - } switch_core_hash_insert(globals.ss7_configs, confname, rootnode); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c index 170f03f8f3..1600e71016 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c @@ -209,6 +209,13 @@ int ft_to_sngss7_cfg_all(void) } } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) */ + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + if(FTDM_SUCCESS != ftmod_ss7_m2ua_init()){ + ftdm_log (FTDM_LOG_ERROR, "ftmod_ss7_m2ua_init FAILED \n"); + return FTDM_FAIL; + } + } + g_ftdm_sngss7_data.gen_config = SNG_GEN_CFG_STATUS_DONE; } /* if (!(g_ftdm_sngss7_data.gen_config)) */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 89cfec14a7..6906b80290 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3090,8 +3090,8 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbPeers); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbIntf); @@ -3102,7 +3102,9 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) x = 1; while(x\n"); len = len + sprintf(buf + len, " %s \n", g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].name); @@ -3120,6 +3122,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); } + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); if(ftmod_m2ua_ssta_req(STMWCLUSTER,g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); return FTDM_FAIL; @@ -3137,34 +3140,47 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbActPeer); len = len + sprintf(buf + len, "\n"); - } - memcpy((U8 *)&rsp, &cfm, sizeof(MwMgmt)); + memset((U8 *)&rsp, 0, sizeof(MwMgmt)); + memcpy(&rsp, &cfm, sizeof(MwMgmt)); - /* loop through configured peers */ - for(idx = 0; idx < rsp.t.ssta.s.clusterSta.nmbPeer; idx++) - { - memset((U8 *)&cfm, 0, sizeof(MwMgmt)); - if(ftmod_m2ua_ssta_req(STMWPEER, rsp.t.ssta.s.clusterSta.peerSt[idx].peerId, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); - return FTDM_FAIL; - } else { - len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); - len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); - len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + /* loop through configured peers */ + for(idx = 0; idx < rsp.t.ssta.s.clusterSta.nmbPeer; idx++) + { + int peer_id = rsp.t.ssta.s.clusterSta.peerSt[idx].peerId; + + memset(&cfm, 0, sizeof(MwMgmt)); - len = len + sprintf(buf + len, "\n"); + if(LMW_PEER_DOWN != rsp.t.ssta.s.clusterSta.peerSt[idx].peerState){ + + if(ftmod_m2ua_ssta_req(STMWPEER, peer_id, &cfm)) { + stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id].name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.sctpHBeatEnb); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.locOutStrms); + + len = len + sprintf(buf + len, "\n"); + } + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id].name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(rsp.t.ssta.s.clusterSta.peerSt[idx].peerState)); + len = len + sprintf(buf + len, "\n"); + } } } + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { stream->write_function(stream," Request to Trillium SCTP layer failed \n"); return FTDM_FAIL; @@ -3172,7 +3188,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3218,7 +3234,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char x = 1; while(x %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3302,7 +3318,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3341,8 +3357,8 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbAssoc); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbEndp); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbLocalAddr); @@ -3379,7 +3395,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) x = 1; while(x\n"); @@ -3438,7 +3454,7 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) char *asciiAddr; CmInetIpAddr ip; - len = len + sprintf(buf + len, " %ld \n", cfm->t.ssta.s.assocSta.assocId); + len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.assocId); len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState)); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstPort); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcPort); @@ -3558,7 +3574,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char x = 1; while(x\n"); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, "\n"); } @@ -3653,7 +3669,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) x = 1; while(x\n"); @@ -3664,7 +3680,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); - len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); len = len + sprintf(buf + len, "\n"); } @@ -3704,7 +3720,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* x = 1; while(x\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); - len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); len = len + sprintf(buf + len, "\n"); } @@ -3774,7 +3790,7 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, x = 1; while(xid ; /* peer Id */ + ssta.t.ssta.id.peerId = id ; /* peer Id */ break; } case STMWCLUSTER: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index 8e22e47b97..c7ce2e74eb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -60,6 +60,7 @@ typedef struct sng_m2ua_cfg{ uint32_t flags; uint32_t id; /* ID */ uint8_t nodeType; /*Node Type SG/ASP */ + uint8_t end_point_opened; /* flag to check is end-point already opened */ uint16_t clusterId; /* idx to m2ua_cluster profile */ }sng_m2ua_cfg_t; @@ -122,6 +123,7 @@ int ftmod_ss7_m2ua_start(void); void ftmod_ss7_m2ua_free(void); ftdm_status_t ftmod_ss7_m2ua_cfg(void); +ftdm_status_t ftmod_ss7_m2ua_init(void); int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm); int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index 57bca70e61..b9ae986402 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -146,9 +146,6 @@ static int ftmod_ss7_parse_nif_interface(ftdm_conf_node_t *nif_interface) /**************************************************************************/ } /* for (i = 0; i < num_parms; i++) */ - /* default the interface to paused state */ - sngss7_set_flag(&sng_nif, SNGSS7_PAUSED); - /* fill in the nif interface */ ftmod_ss7_fill_in_nif_interface(&sng_nif); @@ -259,9 +256,6 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) sng_m2ua.nodeType = SNG_M2UA_NODE_TYPE_SGP; - /* default the interface to paused state */ - sngss7_set_flag(&sng_m2ua, SNGSS7_PAUSED); - /* fill in the nif interface */ ftmod_ss7_fill_in_m2ua_interface(&sng_m2ua); @@ -421,9 +415,6 @@ static int ftmod_ss7_parse_m2ua_peer_interface(ftdm_conf_node_t *m2ua_peer_inter /**************************************************************************/ } /* for (i = 0; i < num_parms; i++) */ - /* default the interface to paused state */ - sngss7_set_flag(&sng_m2ua_peer, SNGSS7_PAUSED); - /* fill in the sng_m2ua_peer interface */ ftmod_ss7_fill_in_m2ua_peer_interface(&sng_m2ua_peer); @@ -576,9 +567,6 @@ static int ftmod_ss7_parse_m2ua_clust_interface(ftdm_conf_node_t *m2ua_cluster_i /**************************************************************************/ } /* for (i = 0; i < num_parms; i++) */ - /* default the interface to paused state */ - sngss7_set_flag(&sng_m2ua_cluster, SNGSS7_PAUSED); - /* fill in the sng_m2ua_peer interface */ ftmod_ss7_fill_in_m2ua_clust_interface(&sng_m2ua_cluster); @@ -663,7 +651,7 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) t_link.id = atoi(param->val); SS7_DEBUG("SCTP - Parsing with id = %s\n", param->val); } - else if (!strcasecmp(param->var, "src-addr")) { + else if (!strcasecmp(param->var, "address")) { if (t_link.numSrcAddr < SCT_MAX_NET_ADDRS) { t_link.srcAddrList[t_link.numSrcAddr+1] = iptoul (param->val); t_link.numSrcAddr++; @@ -671,7 +659,7 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) } else { SS7_ERROR("SCTP - too many source address configured. dropping %s \n", param->val); } - } else if (!strcasecmp(param->var, "src-port")) { + } else if (!strcasecmp(param->var, "source-port")) { t_link.port = atoi(param->val); SS7_DEBUG("SCTP - Parsing with port = %s\n", param->val); } @@ -683,7 +671,6 @@ static int ftmod_ss7_parse_sctp_link(ftdm_conf_node_t *node) g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].id = t_link.id; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].port = t_link.port; strncpy((char*)g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].name, t_link.name, strlen(t_link.name) ); - g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].flags = 0; g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].numSrcAddr = t_link.numSrcAddr; for (i=1; i<=t_link.numSrcAddr; i++) { g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[t_link.id].srcAddrList[i] = t_link.srcAddrList[i]; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 0e52f88710..9a5a8cbe95 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -768,9 +768,10 @@ typedef enum { SNGSS7_M2UA_PRESENT = (1 << 18), SNGSS7_M2UA_STARTED = (1 << 19), SNGSS7_M2UA_EP_OPENED = (1 << 20), + SNGSS7_M2UA_INIT_ASSOC_DONE = (1 << 21), - SNGSS7_NIF_PRESENT = (1 << 21), - SNGSS7_NIF_STARTED = (1 << 22), + SNGSS7_NIF_PRESENT = (1 << 22), + SNGSS7_NIF_STARTED = (1 << 23), } sng_task_flag_t; /******************************************************************************/ From 32106afc433b6e96f00742a3e55b9565f4e4f8a9 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 18 Jun 2012 12:51:38 -0400 Subject: [PATCH 245/493] Fixed compile issues again on 32-bit --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 6906b80290..620e4f3ece 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3090,9 +3090,15 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); +#ifdef BIT_64 len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n", (int64_t) cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); +#else + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbClusters); +#endif len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbPeers); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbIntf); len = len + sprintf(buf + len, "\n"); @@ -3162,7 +3168,11 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#ifdef BIT_64 + len = len + sprintf(buf + len, " %d \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#else + len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#endif len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3188,7 +3198,11 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); +#ifdef BIT_64 + len = len + sprintf(buf + len," %d \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); +#else + len = len + sprintf(buf + len," %ld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); +#endif len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3300,7 +3314,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3318,7 +3332,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %ld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3357,8 +3371,13 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); +#ifdef BIT_64 len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); +#else + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); +#endif len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbAssoc); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbEndp); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.nmbLocalAddr); @@ -3454,7 +3473,11 @@ int get_assoc_resp_buf(char* buf,SbMgmt* cfm) char *asciiAddr; CmInetIpAddr ip; +#ifdef BIT_64 len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.assocId); +#else + len = len + sprintf(buf + len, " %ld \n", cfm->t.ssta.s.assocSta.assocId); +#endif len = len + sprintf(buf + len, " %s \n", PRNT_SCTP_ASSOC_STATE(cfm->t.ssta.s.assocSta.assocState)); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.dstPort); len = len + sprintf(buf + len, " %d \n", cfm->t.ssta.s.assocSta.srcPort); @@ -3660,8 +3683,13 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); +#ifdef BIT_64 len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.genSta.memAlloc); +#else + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memSize); + len = len + sprintf(buf + len, " %ld \n",cfm.t.ssta.s.genSta.memAlloc); +#endif len = len + sprintf(buf + len, "\n"); } From 56c8534827f980b773f20035d1385ed9f54160c7 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 18 Jun 2012 14:34:12 -0400 Subject: [PATCH 246/493] Fixed compile issues again on 32-bit --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 620e4f3ece..80aad15ee8 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3092,11 +3092,11 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); #ifdef BIT_64 len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %d \n", (int64_t) cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); #else len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); - len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.genSta.memAlloc); + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memAlloc); len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbClusters); #endif len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbPeers); @@ -3314,7 +3314,11 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[rsp.t.ssta.s.clusterSta.peerSt[idx].peerId].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); - len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#ifdef BIT_64 + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#else + len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.peerSta.assocSta.spAssocId); +#endif len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3332,7 +3336,11 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); - len = len + sprintf(buf + len," %ld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); +#ifdef BIT_64 + len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.spEndpId); +#else + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.sctSapSta.spEndpId); +#endif len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } @@ -3708,7 +3716,11 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); +#ifdef BIT_64 len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); +#else + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); +#endif len = len + sprintf(buf + len, "\n"); } From 0cefb8d63337d3365a0c9a3ce9e27e06d6319db0 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 18 Jun 2012 15:01:08 -0400 Subject: [PATCH 247/493] Fixed compile issues again on 32-bit --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 80aad15ee8..951d0a3e49 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3093,12 +3093,11 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) #ifdef BIT_64 len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.memAlloc); - len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); #else len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memSize); len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.memAlloc); - len = len + sprintf(buf + len, " %ld \n", cfm.t.ssta.s.genSta.nmbClusters); #endif + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbClusters); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbPeers); len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.genSta.nmbIntf); len = len + sprintf(buf + len, "\n"); @@ -3171,7 +3170,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) #ifdef BIT_64 len = len + sprintf(buf + len, " %d \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); #else - len = len + sprintf(buf + len, " %ld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); + len = len + sprintf(buf + len, " %lld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); #endif len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); @@ -3201,7 +3200,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) #ifdef BIT_64 len = len + sprintf(buf + len," %d \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); #else - len = len + sprintf(buf + len," %ld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); + len = len + sprintf(buf + len," %lld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); #endif len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); From 0a9f34aa09cbe60ae9bd8c8ceb855b8a261cc44e Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 18 Jun 2012 15:27:45 -0400 Subject: [PATCH 248/493] Fixed compile issues again on 32-bit --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 951d0a3e49..b8cc34480f 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3784,7 +3784,11 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.m2uaState)); len = len + sprintf(buf + len," %s \n", PRNT_NIF_SAP_STATE(cfm.t.ssta.s.dlSapSta.mtp2State)); +#ifdef BIT_64 len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.dlSapSta.nmbRetry); +#else + len = len + sprintf(buf + len," %ld \n", cfm.t.ssta.s.dlSapSta.nmbRetry); +#endif len = len + sprintf(buf + len, "\n"); } From 743e91569e5ef10abc92198ed473d9ac561abb5f Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 19 Jun 2012 17:00:39 +0530 Subject: [PATCH 249/493] adding enable/disable MEGACO stack looging CLI command --- .../mod_media_gateway/media_gateway_cli.c | 25 +++++++++++++++- .../mod_media_gateway/media_gateway_stack.c | 30 +++++++++++++++++-- .../mod_media_gateway/media_gateway_stack.h | 2 ++ .../mod_media_gateway/mod_media_gateway.c | 2 ++ .../mod_media_gateway/mod_media_gateway.h | 2 ++ 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index db50feaa57..720032673c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -99,12 +99,35 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /**********************************************************************************/ goto usage; } +/**********************************************************************************/ + }else if (!strcmp(argv[0], "logging")) { +/**********************************************************************************/ + if (zstr(argv[1])) { + goto usage; + } + /******************************************************************/ + if(!strcasecmp(argv[1], "enable")){ + mg_enable_logging(); + /******************************************************************/ + }else if(!strcasecmp(argv[1], "disable")){ + /******************************************************************/ + mg_disable_logging(); + /******************************************************************/ + } else { + /******************************************************************/ + goto usage; + } +/**********************************************************************************/ + }else { +/**********************************************************************************/ + goto usage; } +/**********************************************************************************/ goto done; usage: - stream->write_function(stream, "-ERR Usage: "MEGACO_FUNCTION_SYNTAX"\n"); + stream->write_function(stream, "-ERR Usage: \n""\t"MEGACO_CLI_SYNTAX" \n \t"MEGACO_FUNCTION_SYNTAX"\n \t" MEGACO_LOGGING_CLI_SYNTAX "\n"); done: switch_safe_free(dup); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index abe46a5837..d4717501ce 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -19,7 +19,6 @@ int mgco_mu_gen_config(void); int mgco_tucl_gen_config(void); int mgco_mu_ssap_config(int idx); int mgco_mg_tsap_config(megaco_profile_t* profile); -int mgco_mg_enble_debug(void); int mgco_mg_ssap_config(megaco_profile_t* profile); int mgco_mg_peer_config(megaco_profile_t* profile); int mgco_mg_tpt_server_config(megaco_profile_t* profile); @@ -571,7 +570,7 @@ int mgco_mg_ssap_cntrl(int idx) } /******************************************************************************/ -int mgco_mg_enble_debug() +int mg_enable_logging() { MgMngmt mgMngmt; Pst pst; /* Post for layer manager */ @@ -597,6 +596,33 @@ int mgco_mg_enble_debug() return(sng_cntrl_mg(&pst, &mgMngmt)); } +/******************************************************************************/ +int mg_disable_logging() +{ + MgMngmt mgMngmt; + Pst pst; /* Post for layer manager */ + MgCntrl* cntrl; + + memset(&mgMngmt, 0, sizeof(mgMngmt)); + cntrl = &mgMngmt.t.cntrl; + + /* initalize the post structure */ + smPstInit(&pst); + + /* insert the destination Entity */ + pst.dstEnt = ENTMG; + mgMngmt.hdr.msgType = TCFG; + mgMngmt.hdr.entId.ent = ENTHI; + mgMngmt.hdr.entId.inst = S_INST; + mgMngmt.hdr.elmId.elmnt = STGEN; + + cntrl->action = ADISIMM; + cntrl->subAction = SADBG; + cntrl->s.dbg.genDbgMask = 0xfffffdff; + + return(sng_cntrl_mg(&pst, &mgMngmt)); +} + /******************************************************************************/ int mgco_tucl_gen_config(void) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index ac5b911f9b..9bbe90b7df 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -53,6 +53,8 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg); void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason); void handle_mg_alarm(Pst *pst, MgMngmt *sta); void handle_tucl_alarm(Pst *pst, HiMngmt *sta); +int mg_enable_logging(void); +int mg_disable_logging(void); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 58a8794fad..322dbd4221 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -73,6 +73,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); switch_console_set_complete("add megaco profile ::megaco::list_profiles peerxmlstatus"); + switch_console_set_complete("add megaco logging ::megaco::list_profiles enable"); + switch_console_set_complete("add megaco logging ::megaco::list_profiles disable"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index c55bb6744f..2e0db8cb62 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -15,6 +15,8 @@ #define MG_MAX_PEERS 5 +#define MEGACO_CLI_SYNTAX "profile|logging" +#define MEGACO_LOGGING_CLI_SYNTAX "logging [enable|disable]" #define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus] [peerxmlstatus]" struct megaco_globals { From 8846e1fea1029ac8599762c4e219e9984b1cd70b Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 19 Jun 2012 23:36:38 +0530 Subject: [PATCH 250/493] issue fix --- src/mod/endpoints/mod_media_gateway/media_gateway_stack.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index d4717501ce..591bb5f13d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -96,6 +96,9 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event) /*****************************************************************************************************************/ switch_status_t sng_mgco_stack_shutdown() { + /* disable MG logging */ + mg_disable_logging(); + /* shutdown MG */ sng_mgco_mg_shutdown(); @@ -1256,7 +1259,7 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, case STSERVER: { cntrl.t.ssta.s.mgTptSrvSta.tptAddr.type = CM_INET_IPV4ADDR_TYPE; - cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port = ntohl(ipAddr); + cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.port = atoi(mg_cfg->port); if(ROK == cmInetAddr((S8*)mg_cfg->my_ipaddr, &ipAddr)) { cntrl.t.ssta.s.mgTptSrvSta.tptAddr.u.ipv4TptAddr.address = ntohl(ipAddr); From cb73fdf2f6e2e1189bc7d93615079a17dc855a5f Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 19 Jun 2012 17:30:03 -0400 Subject: [PATCH 251/493] Added parsing for additional parameters for UI team to test their code --- .../mod_media_gateway/media_gateway_xml.c | 29 +++++++++++++-- .../mod_media_gateway/mod_media_gateway.h | 36 ++++++++++++------- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 710cc7e6c4..2d584ed0ed 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -19,7 +19,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) switch_xml_t cfg, xml, param, mg_interfaces, mg_interface, mg_peers, mg_peer, peer_interfaces ; switch_status_t status = SWITCH_STATUS_FALSE; switch_event_t *event = NULL; - const char *file = "megaco.conf"; + const char *file = "media_gateway.conf"; switch_xml_config_item_t *instructions = (profile ? get_instructions(profile) : NULL); int count; int idx; @@ -63,6 +63,11 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) break; } + if (!mg_interface) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error profile %s not found\n", profile->name); + return SWITCH_STATUS_FALSE; + } + /* go through the peer configuration and get the mg profile associated peers only */ if (!(mg_peers = switch_xml_child(cfg, "mg_peers"))) { goto done; @@ -144,10 +149,25 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { static switch_xml_config_int_options_t opt_version = { SWITCH_TRUE, /* enforce min */ 1, - SWITCH_TRUE, /* Enforce Max */ + SWITCH_TRUE, /* enforce Max */ 3 }; + static switch_xml_config_int_options_t opt_termination_id_len = { + SWITCH_TRUE, /* enforce min */ + 1, + SWITCH_TRUE, /* enforce Max */ + 9 + }; + + static switch_xml_config_enum_item_t opt_default_codec_enum[] = { + { "PCMA", MEGACO_CODEC_PCMA}, + { "PCMU", MEGACO_CODEC_PCMU}, + { "G.729", MEGACO_CODEC_G729}, + { "G.723.1", MEGACO_CODEC_G723_1}, + { "ILBC", MEGACO_CODEC_ILBC }, + }; + switch_xml_config_item_t instructions[] = { /* parameter name type reloadable pointer default value options structure */ SWITCH_CONFIG_ITEM("protocol", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->protocol_type, "MEGACO", &switch_config_string_strdup, "", "MG Protocol type"), @@ -156,6 +176,11 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "2944", &switch_config_string_strdup, "", "port"), SWITCH_CONFIG_ITEM("domain-name", SWITCH_CONFIG_STRING, 0, &profile->my_domain, "", &switch_config_string_strdup, "", "domain name"), SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "message identifier "), + + SWITCH_CONFIG_ITEM("default-codec", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->default_codec, "PCMU", &opt_default_codec_enum, "", "default codec"), + SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), + SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), + SWITCH_CONFIG_ITEM("rtp-termination-id-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 2e0db8cb62..d4c6e43077 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -32,6 +32,14 @@ typedef enum { PF_RUNNING = (1 << 0) } megaco_profile_flags_t; +typedef enum { + MEGACO_CODEC_PCMA, + MEGACO_CODEC_PCMU, + MEGACO_CODEC_G729, + MEGACO_CODEC_G723_1, + MEGACO_CODEC_ILBC, +} megaco_codec_t; + typedef struct mg_peer_profile_s{ char *name; switch_memory_pool_t *pool; @@ -47,18 +55,22 @@ typedef struct mg_peer_profile_s{ typedef struct megaco_profile_s { char *name; - switch_memory_pool_t *pool; - switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ - megaco_profile_flags_t flags; - int idx; /* Trillium MEGACO SAP identification*/ - char* mid; /* MG H.248 MID */ - char* my_domain; /* local domain name */ - char* my_ipaddr; /* local domain name */ - char* port; /* port */ - char* protocol_type; /* MEGACO/MGCP */ - int protocol_version; /* Protocol supported version */ - int total_peers; - char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ + switch_memory_pool_t *pool; + switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ + megaco_profile_flags_t flags; + int idx; /* Trillium MEGACO SAP identification*/ + char* mid; /* MG H.248 MID */ + char* my_domain; /* local domain name */ + char* my_ipaddr; /* local domain name */ + char* port; /* port */ + char* protocol_type; /* MEGACO/MGCP */ + int protocol_version; /* Protocol supported version */ + int total_peers; + megaco_codec_t default_codec; + char* rtp_port_range; + char* rtp_termination_id_prefix; + int rtp_termination_id_len; + char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ } megaco_profile_t; From ae17b90f68f411d5d27420282adedaac26fab417 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 19 Jun 2012 17:54:01 -0400 Subject: [PATCH 252/493] Changed megaco commands to mg --- .../mod_media_gateway/mod_media_gateway.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 322dbd4221..bcc66cc396 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -66,16 +66,16 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) switch_core_hash_init(&megaco_globals.peer_profile_hash, pool); switch_thread_rwlock_create(&megaco_globals.peer_profile_rwlock, pool); - SWITCH_ADD_API(api_interface, "megaco", "megaco", megaco_function, MEGACO_FUNCTION_SYNTAX); + SWITCH_ADD_API(api_interface, "mg", "media_gateway", megaco_function, MEGACO_FUNCTION_SYNTAX); - switch_console_set_complete("add megaco profile ::megaco::list_profiles start"); - switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); - switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); - switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); - switch_console_set_complete("add megaco profile ::megaco::list_profiles peerxmlstatus"); - switch_console_set_complete("add megaco logging ::megaco::list_profiles enable"); - switch_console_set_complete("add megaco logging ::megaco::list_profiles disable"); - switch_console_add_complete_func("::megaco::list_profiles", list_profiles); + switch_console_set_complete("add mg profile ::mg::list_profiles start"); + switch_console_set_complete("add mg profile ::mg::list_profiles stop"); + switch_console_set_complete("add mg profile ::mg::list_profiles status"); + switch_console_set_complete("add mg profile ::mg::list_profiles xmlstatus"); + switch_console_set_complete("add mg profile ::mg::list_profiles peerxmlstatus"); + switch_console_set_complete("add mg logging ::mg::list_profiles enable"); + switch_console_set_complete("add mg logging ::mg::list_profiles disable"); + switch_console_add_complete_func("::mg::list_profiles", list_profiles); /* Initialize MEGACO Stack */ From 6aa8c9b80dcf77dba76b96f0da62a99953dfd04c Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 19 Jun 2012 22:35:37 -0400 Subject: [PATCH 253/493] freetdm: Improvements to ftdm core flag CLI command --- libs/freetdm/src/ftdm_io.c | 210 +++++++++++++++--- libs/freetdm/src/include/private/ftdm_types.h | 4 + 2 files changed, 186 insertions(+), 28 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 78e65dfe88..bdb66c635a 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -40,6 +40,7 @@ #define _GNU_SOURCE #include "private/ftdm_core.h" #include +#include #ifdef WIN32 #include #endif @@ -66,7 +67,8 @@ static ftdm_status_t ftdm_call_set_call_id(ftdm_channel_t *fchan, ftdm_caller_da static ftdm_status_t ftdm_call_clear_call_id(ftdm_caller_data_t *caller_data); static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan); static ftdm_status_t ftdm_channel_sig_indicate(ftdm_channel_t *ftdmchan, ftdm_channel_indication_t indication, ftdm_usrmsg_t *usrmsg); - +static const char *channel_val2str(unsigned long long flag); +static unsigned long long channel_str2val(const char *flag_name); static int time_is_init = 0; @@ -4339,7 +4341,7 @@ static struct { ftdm_io_interface_t *pika_interface; } interfaces; -static void print_channels_by_flag(ftdm_stream_handle_t *stream, int32_t flagval, int not, int *count) +static void print_channels_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, uint32_t inchan_id, int32_t flagval, int not, int *count) { ftdm_hash_iterator_t *i = NULL; ftdm_span_t *span; @@ -4349,40 +4351,85 @@ static void print_channels_by_flag(ftdm_stream_handle_t *stream, int32_t flagval const void *key = NULL; void *val = NULL; uint32_t flag = (1 << flagval); + int mycount = 0; *count = 0; ftdm_mutex_lock(globals.mutex); - for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) { - hashtable_this(i, &key, NULL, &val); - if (!key || !val) { - break; - } - span = val; - citer = ftdm_span_get_chan_iterator(span, NULL); + if (inspan) { + citer = ftdm_span_get_chan_iterator(inspan, NULL); if (!citer) { - continue; + goto end; } for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) { fchan = ftdm_iterator_current(curr); - if (not && !ftdm_test_flag(fchan, flag)) { - stream->write_function(stream, "[s%dc%d][%d:%d] has not flag %d\n", - fchan->span_id, fchan->chan_id, - fchan->physical_span_id, fchan->physical_chan_id, - flagval); - (*count)++; - } else if (!not && ftdm_test_flag(fchan, flag)) { - stream->write_function(stream, "[s%dc%d][%d:%d] has flag %d\n", - fchan->span_id, fchan->chan_id, - fchan->physical_span_id, fchan->physical_chan_id, - flagval); - (*count)++; + if (!inchan_id || inchan_id == fchan->chan_id) { + if (not) { + if (!ftdm_test_flag(fchan, flag)) { + stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) ON \n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval, channel_val2str(flagval)); + + mycount++; + } else { + stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) OFF \n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval, channel_val2str(flagval)); + } + } else if (!not) { + if (ftdm_test_flag(fchan, flag)) { + stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) ON\n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval, channel_val2str(flagval)); + + mycount++; + } else { + stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) OFF \n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval, channel_val2str(flagval)); + } + } } } ftdm_iterator_free(citer); - } + } else { + for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) { + hashtable_this(i, &key, NULL, &val); + if (!key || !val) { + break; + } + span = val; + citer = ftdm_span_get_chan_iterator(span, NULL); + if (!citer) { + continue; + } + for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) { + fchan = ftdm_iterator_current(curr); + if (not && !ftdm_test_flag(fchan, flag)) { + stream->write_function(stream, "[s%dc%d][%d:%d] has not flag %d\n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval); + mycount++; + } else if (!not && ftdm_test_flag(fchan, flag)) { + stream->write_function(stream, "[s%dc%d][%d:%d] has flag %d\n", + fchan->span_id, fchan->chan_id, + fchan->physical_span_id, fchan->physical_chan_id, + flagval); + mycount++; + } + } + ftdm_iterator_free(citer); + } + } + *count = mycount; +end: ftdm_mutex_unlock(globals.mutex); } @@ -4434,12 +4481,88 @@ static void print_core_usage(ftdm_stream_handle_t *stream) { stream->write_function(stream, "--------------------------------------------------------------------------------\n" - "ftdm core state [!] - List all channels in or not in the given state\n" - "ftdm core flag - List all channels with the given flag value set\n" + "ftdm core state [!] - List all channels in or not in the given state\n" + "ftdm core flag [!] [] [] - List all channels with the given flag value set\n" "ftdm core calls - List all known calls to the FreeTDM core\n" "--------------------------------------------------------------------------------\n"); } +typedef struct channel_flags_str { + const char *name; + unsigned long long channel_flag; +} channel_flag_str_t; + +static channel_flag_str_t channel_flag_strs[] = { + { "configured" , FTDM_CHANNEL_CONFIGURED}, + { "ready", FTDM_CHANNEL_READY}, + { "open", FTDM_CHANNEL_OPEN}, + { "dtmf-detect", FTDM_CHANNEL_DTMF_DETECT}, + { "suppress-dtmf", FTDM_CHANNEL_SUPRESS_DTMF}, + { "transcode", FTDM_CHANNEL_TRANSCODE}, + { "buffer", FTDM_CHANNEL_BUFFER}, + { "in-thread", FTDM_CHANNEL_INTHREAD}, + { "wink", FTDM_CHANNEL_WINK}, + { "flash", FTDM_CHANNEL_FLASH}, + { "state-change", FTDM_CHANNEL_STATE_CHANGE}, + { "hold", FTDM_CHANNEL_HOLD}, + { "in-use", FTDM_CHANNEL_INUSE}, + { "off-hook", FTDM_CHANNEL_OFFHOOK}, + { "ringing", FTDM_CHANNEL_RINGING}, + { "progress-detect", FTDM_CHANNEL_PROGRESS_DETECT}, + { "callerid-detect", FTDM_CHANNEL_CALLERID_DETECT}, + { "outbound", FTDM_CHANNEL_OUTBOUND}, + { "suspended", FTDM_CHANNEL_SUSPENDED}, + { "3-way", FTDM_CHANNEL_3WAY}, + { "progress", FTDM_CHANNEL_PROGRESS}, + { "media", FTDM_CHANNEL_MEDIA}, + { "answered", FTDM_CHANNEL_ANSWERED}, + { "mute", FTDM_CHANNEL_MUTE}, + { "use-rx-gain", FTDM_CHANNEL_USE_RX_GAIN}, + { "use-tx-gain", FTDM_CHANNEL_USE_TX_GAIN}, + { "in-alarm", FTDM_CHANNEL_IN_ALARM}, + { "sig-up", FTDM_CHANNEL_SIG_UP}, + { "user-hangup", FTDM_CHANNEL_USER_HANGUP}, + { "rx-disabled", FTDM_CHANNEL_RX_DISABLED}, + { "tx-disabled", FTDM_CHANNEL_TX_DISABLED}, + { "call-started", FTDM_CHANNEL_CALL_STARTED}, + { "non-block", FTDM_CHANNEL_NONBLOCK}, + { "ind-ack-pending", FTDM_CHANNEL_IND_ACK_PENDING}, + { "blocking", FTDM_CHANNEL_BLOCKING}, + { "media", FTDM_CHANNEL_DIGITAL_MEDIA}, + { "native-sigbridge", FTDM_CHANNEL_NATIVE_SIGBRIDGE}, + { "invalid", FTDM_CHANNEL_MAX_FLAG}, +}; + +static unsigned long long channel_str2val(const char *flag_name) +{ + int i; + for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { + if (!strcasecmp(channel_flag_strs[i].name, flag_name)) { + return channel_flag_strs[i].channel_flag; + } + } + return FTDM_CHANNEL_MAX_FLAG; +} + +static const char *channel_val2str(unsigned long long flag) +{ + int i; + for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { + if (channel_flag_strs[i].channel_flag == flag) { + return channel_flag_strs[i].name; + } + } + return channel_flag_strs[FTDM_CHANNEL_MAX_FLAG].name; +} + +static void print_channel_flag_values(ftdm_stream_handle_t *stream) +{ + int i; + for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { + stream->write_function(stream, "%s\n", channel_flag_strs[i].name); + } +} + static char *handle_core_command(const char *cmd) { char *mycmd = NULL; @@ -4449,11 +4572,12 @@ static char *handle_core_command(const char *cmd) char *argv[10] = { 0 }; char *state = NULL; char *flag = NULL; - uint32_t flagval = 0; + unsigned long long flagval = 0; uint32_t current_call_id = 0; ftdm_caller_data_t *calldata = NULL; ftdm_channel_t *fchan = NULL; ftdm_channel_state_t i = FTDM_CHANNEL_STATE_INVALID; + ftdm_span_t *fspan = NULL; ftdm_stream_handle_t stream = { 0 }; FTDM_STANDARD_STREAM(stream); @@ -4494,6 +4618,7 @@ static char *handle_core_command(const char *cmd) print_channels_by_state(&stream, i, not, &count); stream.write_function(&stream, "\nTotal channels %s %s: %d\n", not ? "not in state" : "in state", ftdm_channel_state2str(i), count); } else if (!strcasecmp(argv[0], "flag")) { + uint32_t chan_id = 0; if (argc < 2) { stream.write_function(&stream, "core flag command requires an argument\n"); print_core_usage(&stream); @@ -4504,8 +4629,37 @@ static char *handle_core_command(const char *cmd) not = 1; flag++; } - flagval = atoi(flag); - print_channels_by_flag(&stream, flagval, not, &count); + + if (isalpha(flag[0])) { + flagval = channel_str2val(flag); + if (flagval == FTDM_CHANNEL_MAX_FLAG) { + stream.write_function(&stream, "\nInvalid channel flag value. Possible channel flags\n"); + print_channel_flag_values(&stream); + goto done; + } + } else { + flagval = atoi(flag); + } + + /* Specific span specified */ + if (argv[2]) { + ftdm_span_find_by_name(argv[2], &fspan); + if (!fspan) { + stream.write_function(&stream, "-ERR span:%s not found\n", argv[2]); + goto done; + } + } + + /* Specific channel specified */ + if (argv[3]) { + chan_id = atoi(argv[3]); + if (chan_id >= ftdm_span_get_chan_count(fspan)) { + stream.write_function(&stream, "-ERR invalid channel %d\n", chan_id); + goto done; + } + } + + print_channels_by_flag(&stream, fspan, chan_id, flagval, not, &count); stream.write_function(&stream, "\nTotal channels %s %d: %d\n", not ? "without flag" : "with flag", flagval, count); } else if (!strcasecmp(argv[0], "calls")) { ftdm_mutex_lock(globals.call_id_mutex); diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 17e273c425..7df764e52f 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -268,6 +268,10 @@ typedef enum { /*!< Native signaling bridge is enabled */ #define FTDM_CHANNEL_NATIVE_SIGBRIDGE (1ULL << 37) +/*!< This no more flags after this flag */ +#define FTDM_CHANNEL_MAX_FLAG (1ULL << 38) +/*! Date: Wed, 20 Jun 2012 00:35:10 -0400 Subject: [PATCH 254/493] Changed megaco.conf.xml to media_gateway.conf.xml --- .../conf/media_gateway.conf.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml diff --git a/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml b/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml new file mode 100644 index 0000000000..91f8f0cc63 --- /dev/null +++ b/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 50e3e563da2a3e0ea795dcc2b226317749e8ab11 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 20 Jun 2012 00:38:05 -0400 Subject: [PATCH 255/493] Updated conf --- .../conf/media_gateway.conf.xml | 74 ++++++++++++------- 1 file changed, 48 insertions(+), 26 deletions(-) mode change 100644 => 100755 src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml diff --git a/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml b/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml old mode 100644 new mode 100755 index 91f8f0cc63..aa314fbe5b --- a/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml +++ b/src/mod/endpoints/mod_media_gateway/conf/media_gateway.conf.xml @@ -1,28 +1,50 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + From a54ec05fdbffd34097210abff84c27099e434dc1 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 20 Jun 2012 02:06:31 -0400 Subject: [PATCH 256/493] fix for compilation error on 64-bit --- libs/freetdm/src/ftdm_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index bdb66c635a..4dca25e452 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -4552,7 +4552,7 @@ static const char *channel_val2str(unsigned long long flag) return channel_flag_strs[i].name; } } - return channel_flag_strs[FTDM_CHANNEL_MAX_FLAG].name; + return "invalid"; } static void print_channel_flag_values(ftdm_stream_handle_t *stream) From 31d48a8c3af263a0f6133c874d15cf53420bba29 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 20 Jun 2012 12:01:04 +0530 Subject: [PATCH 257/493] adding "<>" or "[]" from the code itself , instead of passing from config xml for MID field --- .../mod_media_gateway/media_gateway_xml.c | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 2d584ed0ed..ba5c20aabb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -12,6 +12,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) ; static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) ; static int mg_sap_id; +static switch_status_t modify_mid(char* mid); /****************************************************************************************************************************/ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) @@ -57,6 +58,10 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->total_peers++; } + if(SWITCH_STATUS_FALSE == (status = modify_mid(profile->mid))){ + goto done; + } + profile->idx = ++mg_sap_id; /* we should break from here , profile name should be unique */ @@ -92,6 +97,10 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) goto done; } + if(SWITCH_STATUS_FALSE == (status = modify_mid(peer_profile->mid))){ + goto done; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"peer_profile name[%s], ipaddr[%s] port[%s], mid[%s] transport_type[%s], encoding_type[%s] \n", peer_profile->name, peer_profile->ipaddr, peer_profile->port,peer_profile->mid, peer_profile->transport_type, peer_profile->encoding_type); @@ -190,3 +199,54 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { } /****************************************************************************************************************************/ + +static switch_status_t modify_mid(char* mid) +{ + char* dup = NULL; + char* val[10]; + int count; + + switch_assert(mid); + + /* If MID type is IP then add mid into [] brackets , + * If MID type is domain then add mid into <> brackets * + */ + + dup = strdup(mid); + count = switch_split(dup, '.', val); + + if(!count) { + /* Input string is not separated by '.', check if its separated by '-' as format could be xxx-xx-xxx/xxx-xx-xx-xxx */ + free(dup); + dup = strdup(mid); + if(0 == (count = switch_split(dup, '-', val))){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); + return SWITCH_STATUS_FALSE; + } + } + + if(('<' == val[0][0]) || ('[' == val[0][0])){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID[%s] is already prefixed with proper brackets \n",mid); + return SWITCH_STATUS_SUCCESS; + } + + /*first check could be if count is 3 means domain name as generally we have xxx-xx-xxx/xxx.xx.xxx domain */ + if(3 == count){ + /* domain-type, add value into <> */ + free(dup); + dup = strdup(mid); + sprintf(mid,"<%s>",dup); + }else if(4 == count){ + /* IP address in xxx.xxx.xxx.xxx format */ + free(dup); + dup = strdup(mid); + sprintf(mid,"[%s]",dup); + }else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); + return SWITCH_STATUS_FALSE; + } + + + free(dup); + return SWITCH_STATUS_SUCCESS; +} From 2512694e4313f4491a795c28bb010cbca0c9a8b6 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 20 Jun 2012 12:12:28 +0530 Subject: [PATCH 258/493] removing warnings --- .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index b8cc34480f..594fdb97ad 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -3167,11 +3167,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " %s \n",g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id].name); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.peerSta.state)); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.retryCount); -#ifdef BIT_64 - len = len + sprintf(buf + len, " %d \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); -#else - len = len + sprintf(buf + len, " %lld \n", (int64_t) cfm.t.ssta.s.peerSta.assocSta.spAssocId); -#endif + len = len + sprintf(buf + len, " %d \n", (int)cfm.t.ssta.s.peerSta.assocSta.spAssocId); len = len + sprintf(buf + len, " %s \n",(cfm.t.ssta.s.peerSta.assocSta.connected)?"CONNECTED":"NOT CONNECTED"); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcInProg); len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.peerSta.assocSta.flcLevel); @@ -3197,11 +3193,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); len = len + sprintf(buf + len," %s \n", PRNT_M2UA_SAP_STATE(cfm.t.ssta.s.sctSapSta.state)); len = len + sprintf(buf + len," %s \n", (cfm.t.ssta.s.sctSapSta.endpOpen)?"END_POINT_OPENED_SUCCESSFULLY":"END_POINT_NOT_OPEN"); -#ifdef BIT_64 - len = len + sprintf(buf + len," %d \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); -#else - len = len + sprintf(buf + len," %lld \n", (int64_t) cfm.t.ssta.s.sctSapSta.spEndpId); -#endif + len = len + sprintf(buf + len," %d \n", (int) cfm.t.ssta.s.sctSapSta.spEndpId); len = len + sprintf(buf + len," %d \n", cfm.t.ssta.s.sctSapSta.nmbPrimRetry); len = len + sprintf(buf + len, "\n"); } From 7b97ff470f21c7e2afcacfce16767acdf602120f Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 20 Jun 2012 13:53:51 +0530 Subject: [PATCH 259/493] adding "xmlshow m2ua clusterstatus" CLI command. --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 142 ++++++++++++++---- .../ftmod_sangoma_ss7_m2ua.c | 24 ++- 2 files changed, 134 insertions(+), 32 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index 594fdb97ad..1adf6dd607 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -124,6 +124,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char* m2ua_profile_name); static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name); +static ftdm_status_t handle_show_m2ua_cluster_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name); static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream); static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* profile_name); int get_assoc_resp_buf(char* buf,SbMgmt* cfm); @@ -427,10 +428,17 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha { char* profile_name = argv[++c]; c++; + /***************************************************************/ if(!strcasecmp(argv[c],"peerstatus")){ + /***************************************************************/ handle_show_m2ua_peer_status(stream, profile_name); - } - else{ + /***************************************************************/ + }else if(!strcasecmp(argv[c],"clusterstatus")){ + /***************************************************************/ + handle_show_m2ua_cluster_status(stream, profile_name); + /***************************************************************/ + } else{ + /***************************************************************/ stream->write_function(stream, "Unknown \"show m2ua \" command..\n"); goto handle_cli_error_argc; } @@ -933,6 +941,7 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) stream->write_function(stream, "ftdm ss7 xmlshow m2ua \n"); stream->write_function(stream, "ftdm ss7 xmlshow m2ua \n"); stream->write_function(stream, "ftdm ss7 xmlshow m2ua peerstatus\n"); + stream->write_function(stream, "ftdm ss7 xmlshow m2ua clusterstatus\n"); stream->write_function(stream, "ftdm ss7 xmlshow nif \n"); stream->write_function(stream, "ftdm ss7 xmlshow nif \n"); stream->write_function(stream, "\n"); @@ -3086,7 +3095,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); if(ftmod_m2ua_ssta_req(STMWGEN, 0x00, &cfm)) { - stream->write_function(stream," Request to Trillium M2UA layer failed \n"); + stream->write_function(stream," Request to layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3115,7 +3124,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " %s \n", g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3129,7 +3138,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) memset((U8 *)&cfm, 0, sizeof(MwMgmt)); if(ftmod_m2ua_ssta_req(STMWCLUSTER,g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3160,7 +3169,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) if(LMW_PEER_DOWN != rsp.t.ssta.s.clusterSta.peerSt[idx].peerState){ if(ftmod_m2ua_ssta_req(STMWPEER, peer_id, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3187,7 +3196,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) memset((U8 *)&cfm, 0, sizeof(MwMgmt)); if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3206,7 +3215,7 @@ static ftdm_status_t handle_show_m2ua_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; } @@ -3259,7 +3268,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, " %s \n", m2ua_profile_name); if(ftmod_m2ua_ssta_req(STMWDLSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3272,7 +3281,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char } if(ftmod_m2ua_ssta_req(STMWCLUSTER, g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3298,7 +3307,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char memset((U8 *)&cfm, 0, sizeof(MwMgmt)); if(ftmod_m2ua_ssta_req(STMWPEER, rsp.t.ssta.s.clusterSta.peerSt[idx].peerId, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3321,7 +3330,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char } if(ftmod_m2ua_ssta_req(STMWSCTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3340,7 +3349,7 @@ static ftdm_status_t handle_show_m2ua_profile(ftdm_stream_handle_t *stream, char stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; } @@ -3366,7 +3375,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); if(ftmod_sctp_ssta_req(STSBGEN, 0x00, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3386,7 +3395,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) #ifdef LSB12 if(ftmod_sctp_ssta_req(STSBTMR, 0x00, &cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3418,7 +3427,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); if(ftmod_sctp_ssta_req(STSBSCTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3428,7 +3437,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) } if(ftmod_sctp_ssta_req(STSBTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3443,7 +3452,7 @@ static ftdm_status_t handle_show_sctp_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); len = len + sprintf(buf + len, "\n"); }else{ - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } } else { @@ -3612,7 +3621,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, "\n"); if(ftmod_sctp_ssta_req(STSBSCTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3622,7 +3631,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char } if(ftmod_sctp_ssta_req(STSBTSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3638,7 +3647,7 @@ static ftdm_status_t handle_show_sctp_profile(ftdm_stream_handle_t *stream, char len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); len = len + sprintf(buf + len, "\n"); }else{ - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } } else { @@ -3678,7 +3687,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); if(ftmod_nif_ssta_req(STNWGEN, 0x00, &cfm)) { - stream->write_function(stream," Request to Trillium NIF layer failed \n"); + stream->write_function(stream," Request to NIF layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3701,7 +3710,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); if(ftmod_nif_ssta_req(STNWDLSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to NIF layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3723,7 +3732,7 @@ static ftdm_status_t handle_show_nif_profiles(ftdm_stream_handle_t *stream) len = len + sprintf(buf + len, "\n"); stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; } /****************************************************************************** @@ -3770,7 +3779,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* len = len + sprintf(buf + len, "\n"); if(ftmod_nif_ssta_req(STNWDLSAP,x,&cfm)) { - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to NIF layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3788,7 +3797,7 @@ static ftdm_status_t handle_show_nif_profile(ftdm_stream_handle_t *stream, char* stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; } /******************************************************************************/ @@ -3848,7 +3857,7 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id]; if(ftmod_m2ua_ssta_req(STMWPEER, peer_id, &cfm)) { - stream->write_function(stream," Request to Trillium M2UA layer failed \n"); + stream->write_function(stream," Request to M2UA layer failed \n"); return FTDM_FAIL; } else { len = len + sprintf(buf + len, "\n"); @@ -3867,7 +3876,7 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, len = len + sprintf(buf + len, " SCT_ASSOC_STATE_CLOSED \n"); len = len + sprintf(buf + len, "\n"); }else{ - stream->write_function(stream," Request to Trillium SCTP layer failed \n"); + stream->write_function(stream," Request to SCTP layer failed \n"); return FTDM_FAIL; } } else { @@ -3879,7 +3888,82 @@ static ftdm_status_t handle_show_m2ua_peer_status(ftdm_stream_handle_t *stream, stream->write_function(stream,"\n%s\n",buf); - return FTDM_FAIL; + return FTDM_SUCCESS; +} + +/****************************************************************************** +* Fun: handle_show_m2ua_cluster_status() +* Desc: display requested m2ua profile cluster information +* Ret: FTDM_SUCCESS | FTDM_FAIL +* Note: +* author: Kapil Gupta +*******************************************************************************/ + +static ftdm_status_t handle_show_m2ua_cluster_status(ftdm_stream_handle_t *stream, char* m2ua_profile_name) +{ + char* xmlhdr = (char*)""; + char buf[4096]; + int x = 0x00; + int found = 0x00; + int len = 0x00; + int idx = 0x00; + MwMgmt cfm; + SbMgmt sctp_cfm; + sng_m2ua_cluster_cfg_t* clust = NULL; + sng_m2ua_cfg_t* m2ua = NULL; + + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); + memset((U8 *)&sctp_cfm, 0, sizeof(SbMgmt)); + memset(&buf[0], 0, sizeof(buf)); + + len = len + sprintf(buf + len, "%s\n", xmlhdr); + + /*iterate through all the m2ua links and get required profile */ + x = 1; + while(xwrite_function(stream,"Requested M2UA profile[%s] not configured\n", m2ua_profile_name); + return FTDM_FAIL; + } + + m2ua = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x]; + clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId]; + + if(ftmod_m2ua_ssta_req(STMWCLUSTER,g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].clusterId,&cfm)) { + stream->write_function(stream," Request to M2UA layer failed \n"); + return FTDM_FAIL; + } else { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n",clust->name); + len = len + sprintf(buf + len," %s \n", PRNT_M2UA_CLUSTER_STATE(cfm.t.ssta.s.clusterSta.state)); + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbPeer); + for(idx = 0; idx < cfm.t.ssta.s.clusterSta.nmbPeer; idx++) + { + len = len + sprintf(buf + len, "\n"); + len = len + sprintf(buf + len, " %s \n", g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[cfm.t.ssta.s.clusterSta.peerSt[idx].peerId].name); + len = len + sprintf(buf + len, " %d \n", cfm.t.ssta.s.clusterSta.peerSt[idx].peerId); + len = len + sprintf(buf + len, " %s \n", PRNT_M2UA_PEER_STATE(cfm.t.ssta.s.clusterSta.peerSt[idx].peerState)); + len = len + sprintf(buf + len, "\n"); + } + len = len + sprintf(buf + len, " %d \n",cfm.t.ssta.s.clusterSta.nmbActPeer); + + len = len + sprintf(buf + len, "\n"); + } + + stream->write_function(stream,"\n%s\n",buf); + + return FTDM_SUCCESS; } /******************************************************************************/ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index ccaf3ce418..5b173bfc8b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -793,10 +793,10 @@ static int ftmod_m2ua_peer_config(int id) ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config SUCCESS \n", id); } if(ftmod_m2ua_peer_config1(id, peer_id)){ - ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config FAILED \n", id); + ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer[%d] configuration for M2UA Intf Id[%d] config FAILED \n", peer_id, id); return 0x01; }else{ - ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer configuration for M2UA Intf Id[%d] config SUCCESS \n", id); + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer[%d] configuration for M2UA Intf Id[%d] config SUCCESS \n", peer_id, id); } clust->sct_sap_id = id; @@ -813,13 +813,28 @@ static int ftmod_m2ua_peer_config(int id) static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id) { int i; + int ret; Pst pst; MwMgmt cfg; + MwMgmt cfm; sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[sctp_id]; + + memset((U8 *)&cfg, 0, sizeof(MwMgmt)); + memset((U8 *)&cfm, 0, sizeof(MwMgmt)); memset((U8 *)&pst, 0, sizeof(Pst)); + /* check is sct_sap is already configured */ + if(!ftmod_m2ua_ssta_req(STMWSCTSAP, sct_sap_id, &cfm )){ + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: SCT SAP [%s] is already configured \n", sctp->name); + return 0x00; + } + + if(LCM_REASON_INVALID_SAP == cfm.cfm.reason){ + ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: SCT SAP [%s] is not configured..configuring now \n", sctp->name); + } + smPstInit(&pst); pst.dstEnt = ENTMW; @@ -880,8 +895,11 @@ static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id) cfg.t.cfg.s.sctSapCfg.reConfig.mem.region = S_REG; cfg.t.cfg.s.sctSapCfg.reConfig.mem.pool = S_POOL; - return (sng_cfg_m2ua (&pst, &cfg)); + if (0 == (ret = sng_cfg_m2ua (&pst, &cfg))){ + sctp->flags |= SNGSS7_CONFIGURED; + } + return ret; } /****************************************************************************************************/ From eae74df4e680a2e465512a59fbe8743a2c788b3b Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 20 Jun 2012 12:02:10 -0400 Subject: [PATCH 260/493] change loglevels and enable debug --- src/mod/endpoints/mod_media_gateway/media_gateway_stack.c | 2 ++ src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index abe46a5837..37fdabfda5 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -255,6 +255,8 @@ switch_status_t sng_mgco_start(megaco_profile_t* profile ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_enable_cntrl SUCCESS \n"); } + mgco_mg_enble_debug(); + return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 58a8794fad..026151a6f2 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -116,14 +116,14 @@ void handle_sng_log(uint8_t level, char *fmt, ...) case SNG_LOGLEVEL_DEBUG: log_level = SWITCH_LOG_DEBUG; break; case SNG_LOGLEVEL_INFO: log_level = SWITCH_LOG_INFO; break; case SNG_LOGLEVEL_WARN: log_level = SWITCH_LOG_WARNING; break; - case SNG_LOGLEVEL_ERROR: log_level = SWITCH_LOG_ERROR; break; + case SNG_LOGLEVEL_ERROR: log_level = SWITCH_LOG_DEBUG; break; case SNG_LOGLEVEL_CRIT: log_level = SWITCH_LOG_CRIT; break; default: log_level = SWITCH_LOG_DEBUG; break; }; vsprintf(&print_buf[0], fmt, ptr); - switch_log_printf(SWITCH_CHANNEL_LOG, log_level, " MOD_MEGACO: %s \n", &print_buf[0]); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, log_level, " MOD_MEGACO: %s \n", &print_buf[0]); va_end(ptr); } From 166249b0b915d637dd478d87a3dd61cd3f7d6cc8 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 20 Jun 2012 12:30:08 -0400 Subject: [PATCH 261/493] Check in TDM and RTP controllable channels (incomplete) --- libs/freetdm/mod_freetdm/Makefile.in | 1 + libs/freetdm/mod_freetdm/mod_freetdm.c | 4 +- libs/freetdm/mod_freetdm/tdm.c | 413 +++++++++++ .../sofia-sip/libsofia-sip-ua/sdp/sdp_parse.c | 45 +- .../libsofia-sip-ua/sdp/sofia-sip/sdp.h | 10 +- src/mod/endpoints/mod_sofia/Makefile.am | 2 +- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 + src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/rtp.c | 653 ++++++++++++++++++ 9 files changed, 1110 insertions(+), 21 deletions(-) create mode 100644 libs/freetdm/mod_freetdm/tdm.c create mode 100644 src/mod/endpoints/mod_sofia/rtp.c diff --git a/libs/freetdm/mod_freetdm/Makefile.in b/libs/freetdm/mod_freetdm/Makefile.in index ceea0dfbba..33ca03b440 100644 --- a/libs/freetdm/mod_freetdm/Makefile.in +++ b/libs/freetdm/mod_freetdm/Makefile.in @@ -4,6 +4,7 @@ BASE=../../.. FT_DIR=.. VERBOSE=1 FTLA=$(FT_DIR)/libfreetdm.la +LOCAL_OBJS=tdm.o LOCAL_CFLAGS=-I$(FT_DIR)/src/include -I$(FT_DIR)/src/isdn/include $(FT_CFLAGS) LOCAL_LDFLAGS=-L$(FT_DIR) -lfreetdm include $(BASE)/build/modmake.rules diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 35690b1e24..c24ab4967e 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -873,7 +873,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc if (!tech_pvt->ftdmchan) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "no ftdmchan set in channel %s!\n", name); return SWITCH_STATUS_FALSE; - } + } span_id = ftdm_channel_get_span_id(tech_pvt->ftdmchan); chan_id = ftdm_channel_get_id(tech_pvt->ftdmchan); @@ -906,7 +906,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc ftdm_channel_wait(tech_pvt->ftdmchan, &wflags, ftdm_channel_get_io_interval(tech_pvt->ftdmchan) * 10); if (!(wflags & FTDM_WRITE)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Dropping frame! (write note ready) in channel %s device %d:%d!\n", name, span_id, chan_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Dropping frame! (write not ready) in channel %s device %d:%d!\n", name, span_id, chan_id); return SWITCH_STATUS_SUCCESS; } diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c new file mode 100644 index 0000000000..935411867b --- /dev/null +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -0,0 +1,413 @@ +/* +* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application +* Copyright (C) 2005-2011, Anthony Minessale II +* +* Version: MPL 1.1 +* +* The contents of this file are subject to the Mozilla Public License Version +* 1.1 (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* http://www.mozilla.org/MPL/ +* +* Software distributed under the License is distributed on an "AS IS" basis, +* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +* for the specific language governing rights and limitations under the +* License. +* +* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application +* +* The Initial Developer of the Original Code is +* Anthony Minessale II +* Portions created by the Initial Developer are Copyright (C) +* the Initial Developer. All Rights Reserved. +* +* Contributor(s): +* +* Mathieu Rene +* +* tdm.c -- FreeTDM Controllable Channel Module +* +*/ + +#include +#include "freetdm.h" + +void ctdm_init(switch_loadable_module_interface_t *module_interface); + +/* Parameters */ + +#define kSPAN_ID "span" +#define kCHAN_ID "chan" + +static struct { + switch_memory_pool_t *pool; + switch_endpoint_interface_t *endpoint_interface; +} ctdm; + +typedef struct { + int span_id; + int chan_id; + ftdm_channel_t *ftdm_channel; + switch_core_session_t *session; + switch_codec_t read_codec, write_codec; + switch_frame_t read_frame; +} ctdm_private_t; + +static switch_status_t channel_on_init(switch_core_session_t *session); +static switch_status_t channel_on_destroy(switch_core_session_t *session); +static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, switch_call_cause_t *cancel_cause); +static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id); +static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id); +static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); +static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf); + +switch_state_handler_table_t ctdm_state_handlers = { + .on_init = channel_on_init, + .on_destroy = channel_on_destroy +}; + +switch_io_routines_t ctdm_io_routines = { + .send_dtmf = channel_send_dtmf, + .outgoing_channel = channel_outgoing_channel, + .read_frame = channel_read_frame, + .write_frame = channel_write_frame, + .receive_message = channel_receive_message +}; + +void ctdm_init(switch_loadable_module_interface_t *module_interface) +{ + switch_endpoint_interface_t *endpoint_interface; + ctdm.pool = module_interface->pool; + endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); + endpoint_interface->interface_name = "tdm"; + endpoint_interface->io_routines = &ctdm_io_routines; + endpoint_interface->state_handler = &ctdm_state_handlers; + ctdm.endpoint_interface = endpoint_interface; + +} + +static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) +{ + const char *szspanid = switch_event_get_header(var_event, kSPAN_ID), + *szchanid = switch_event_get_header(var_event, kCHAN_ID); + int chan_id; + int span_id; + + ftdm_span_t *span; + ftdm_channel_t *chan; + switch_channel_t *channel; + char name[128]; + const char *dname; + ftdm_codec_t codec; + uint32_t interval; + + ctdm_private_t *tech_pvt; + + if (zstr(szchanid) || zstr(szspanid)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both "kSPAN_ID" and "kCHAN_ID" have to be set.\n"); + goto fail; + } + + chan_id = atoi(szchanid); + span_id = atoi(szspanid); + + + if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); + goto fail; + } + + channel = switch_core_session_get_channel(*new_session); + + if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); + goto fail; + } + + span = ftdm_channel_get_span(chan); + + tech_pvt = switch_core_session_alloc(*new_session, sizeof *tech_pvt); + tech_pvt->chan_id = chan_id; + tech_pvt->span_id = span_id; + tech_pvt->ftdm_channel = chan; + tech_pvt->session = *new_session; + switch_core_session_set_private(*new_session, tech_pvt); + + snprintf(name, sizeof(name), "tdm/%d:%d", span_id, chan_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connect outbound channel %s\n", name); + switch_channel_set_name(channel, name); + + switch_channel_set_state(channel, CS_INIT); + + if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_GET_CODEC, &codec)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel codec.\n"); + return SWITCH_STATUS_GENERR; + } + + if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_GET_INTERVAL, &interval)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel interval.\n"); + return SWITCH_STATUS_GENERR; + } + + switch(codec) { + case FTDM_CODEC_ULAW: + { + dname = "PCMU"; + } + break; + case FTDM_CODEC_ALAW: + { + dname = "PCMA"; + } + break; + case FTDM_CODEC_SLIN: + { + dname = "L16"; + } + break; + default: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid codec value retrieved from channel, codec value: %d\n", codec); + goto fail; + } + } + + + if (switch_core_codec_init(&tech_pvt->read_codec, + dname, + NULL, + 8000, + interval, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + goto fail; + } else { + if (switch_core_codec_init(&tech_pvt->write_codec, + dname, + NULL, + 8000, + interval, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + switch_core_codec_destroy(&tech_pvt->read_codec); + goto fail; + } + } + + if (switch_core_session_set_read_codec(*new_session, &tech_pvt->read_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set read codec?\n"); + goto fail; + } + + if (switch_core_session_set_write_codec(*new_session, &tech_pvt->write_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n"); + } + + if (switch_core_session_thread_launch(*new_session) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start session thread.\n"); + goto fail; + } + + return SWITCH_CAUSE_SUCCESS; + +fail: + + if (tech_pvt) { + if (tech_pvt->ftdm_channel) { + ftdm_channel_close(&tech_pvt->ftdm_channel); + } + + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + } + + if (*new_session) { + switch_core_session_destroy(new_session); + } + return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; +} + +static switch_status_t channel_on_init(switch_core_session_t *session) +{ + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t channel_on_destroy(switch_core_session_t *session) +{ + ctdm_private_t *tech_pvt = switch_core_session_get_private(session); + + if ((tech_pvt = switch_core_session_get_private(session))) { + + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + } + + ftdm_channel_close(&tech_pvt->ftdm_channel); + + return SWITCH_STATUS_SUCCESS; +} + + +static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id) +{ + ftdm_wait_flag_t wflags = FTDM_READ; + ftdm_status_t status; + ctdm_private_t *tech_pvt; + const char *name; + switch_channel_t *channel; + int chunk; + uint32_t span_id, chan_id; + ftdm_size_t len; + char dtmf[128] = ""; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + name = switch_channel_get_name(channel); + +top: + wflags = FTDM_READ; + chunk = ftdm_channel_get_io_interval(tech_pvt->ftdm_channel) * 2; + status = ftdm_channel_wait(tech_pvt->ftdm_channel, &wflags, chunk); + + + span_id = ftdm_channel_get_span_id(tech_pvt->ftdm_channel); + chan_id = ftdm_channel_get_id(tech_pvt->ftdm_channel); + + if (status == FTDM_FAIL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to read from channel %s device %d:%d!\n", name, span_id, chan_id); + goto fail; + } + + if (status == FTDM_TIMEOUT) { + goto top; + } + + if (!(wflags & FTDM_READ)) { + goto top; + } + + len = tech_pvt->read_frame.buflen; + if (ftdm_channel_read(tech_pvt->ftdm_channel, tech_pvt->read_frame.data, &len) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to read from channel %s device %d:%d!\n", name, span_id, chan_id); + } + + *frame = &tech_pvt->read_frame; + tech_pvt->read_frame.datalen = (uint32_t)len; + tech_pvt->read_frame.samples = tech_pvt->read_frame.datalen; + + if (ftdm_channel_get_codec(tech_pvt->ftdm_channel) == FTDM_CODEC_SLIN) { + tech_pvt->read_frame.samples /= 2; + } + + while (ftdm_channel_dequeue_dtmf(tech_pvt->ftdm_channel, dtmf, sizeof(dtmf))) { + switch_dtmf_t _dtmf = { 0, switch_core_default_dtmf_duration(0) }; + char *p; + for (p = dtmf; p && *p; p++) { + if (is_dtmf(*p)) { + _dtmf.digit = *p; + ftdm_log(FTDM_LOG_DEBUG, "Queuing DTMF [%c] in channel %s device %d:%d\n", *p, name, span_id, chan_id); + switch_channel_queue_dtmf(channel, &_dtmf); + } + } + } + + return SWITCH_STATUS_SUCCESS; + +fail: + return SWITCH_STATUS_GENERR; +} + +static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id) +{ + ftdm_wait_flag_t wflags = FTDM_WRITE; + ctdm_private_t *tech_pvt; + const char *name; + switch_channel_t *channel; + uint32_t span_id, chan_id; + ftdm_size_t len; + unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0}; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + span_id = ftdm_channel_get_span_id(tech_pvt->ftdm_channel); + chan_id = ftdm_channel_get_id(tech_pvt->ftdm_channel); + + name = switch_channel_get_name(channel); + + if (switch_test_flag(frame, SFF_CNG)) { + frame->data = data; + frame->buflen = sizeof(data); + if ((frame->datalen = tech_pvt->write_codec.implementation->encoded_bytes_per_packet) > frame->buflen) { + goto fail; + } + memset(data, 255, frame->datalen); + } + + wflags = FTDM_WRITE; + ftdm_channel_wait(tech_pvt->ftdm_channel, &wflags, ftdm_channel_get_io_interval(tech_pvt->ftdm_channel) * 10); + + if (!(wflags & FTDM_WRITE)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Dropping frame! (write not ready) in channel %s device %d:%d!\n", name, span_id, chan_id); + return SWITCH_STATUS_SUCCESS; + } + + len = frame->datalen; + if (ftdm_channel_write(tech_pvt->ftdm_channel, frame->data, frame->buflen, &len) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Failed to write to channel %s device %d:%d!\n", name, span_id, chan_id); + } + + return SWITCH_STATUS_SUCCESS; + +fail: + return SWITCH_STATUS_GENERR; +} + +static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf) +{ + ctdm_private_t *tech_pvt = NULL; + char tmp[2] = ""; + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + tmp[0] = dtmf->digit; + ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SEND_DTMF, tmp); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) +{ + return SWITCH_STATUS_SUCCESS; +} + diff --git a/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_parse.c b/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_parse.c index 027544a00a..781c0963f8 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_parse.c +++ b/libs/sofia-sip/libsofia-sip-ua/sdp/sdp_parse.c @@ -81,6 +81,7 @@ struct sdp_parser_s { unsigned pr_insane : 1; unsigned pr_c_missing : 1; unsigned pr_config : 1; + unsigned pr_megaco : 1; }; #define is_posdigit(c) ((c) >= '1' && (c) <= '9') @@ -176,6 +177,7 @@ sdp_parse(su_home_t *home, char const msg[], issize_t msgsize, int flags) if (flags & sdp_f_config) p->pr_c_missing = 1, p->pr_config = 1; p->pr_mode_manual = (flags & sdp_f_mode_manual) != 0; + p->pr_megaco = (flags & sdp_f_megaco) != 0; p->pr_session_mode = sdp_sendrecv; parse_message(p); @@ -1502,8 +1504,18 @@ static void parse_payload(sdp_parser_t *p, char *r, sdp_rtpmap_t **result) { while (*r) { unsigned long value; + if (((p->pr_config && r[0] == '*') || (p->pr_megaco && r[0] == MEGACO_CHOOSE_TOK)) && (r[1] == ' ' || r[1] == '\0')) { + PARSE_ALLOC(p, sdp_rtpmap_t, rm); - if (parse_ul(p, &r, &value, 128) == 0) { + *result = rm; result = &rm->rm_next; + + rm->rm_predef = 1; + rm->rm_any = 1; + rm->rm_encoding = "*"; + rm->rm_rate = 0; + + return; + } else if (parse_ul(p, &r, &value, 128) == 0 && value < 128) { PARSE_ALLOC(p, sdp_rtpmap_t, rm); assert(0 <= value && value < 128); @@ -1519,21 +1531,8 @@ static void parse_payload(sdp_parser_t *p, char *r, sdp_rtpmap_t **result) rm->rm_encoding = ""; rm->rm_rate = 0; } - } - else if (p->pr_config && r[0] == '*' && (r[1] == ' ' || r[1] == '\0')) { - PARSE_ALLOC(p, sdp_rtpmap_t, rm); - - *result = rm; result = &rm->rm_next; - - rm->rm_predef = 1; - rm->rm_any = 1; - rm->rm_encoding = "*"; - rm->rm_rate = 0; - - return; - } - else { - parsing_error(p, "m= invalid format for RTP/AVT"); + } else { + parsing_error(p, "m= invalid format for RTP/AVP"); return; } @@ -1797,6 +1796,13 @@ static int parse_ul(sdp_parser_t *p, char **r, return 0; } + if (p->pr_megaco && *ul == MEGACO_CHOOSE_TOK) { + *result = MEGACO_CHOOSE; + (*r)++; + *r += strspn(*r, SPACE TAB); + return 0; + } + return -1; } @@ -1824,6 +1830,13 @@ static int parse_ull(sdp_parser_t *p, char **r, return 0; } + if (p->pr_megaco && *s == MEGACO_CHOOSE_TOK) { + *result = MEGACO_CHOOSE; + (*r)++; + *r += strspn(*r, SPACE TAB); + return 0; + } + return -1; } diff --git a/libs/sofia-sip/libsofia-sip-ua/sdp/sofia-sip/sdp.h b/libs/sofia-sip/libsofia-sip-ua/sdp/sofia-sip/sdp.h index e4af3836a3..74d6adea4f 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sdp/sofia-sip/sdp.h +++ b/libs/sofia-sip/libsofia-sip-ua/sdp/sofia-sip/sdp.h @@ -24,6 +24,10 @@ #ifndef SDP_H #define SDP_H + +#define MEGACO_CHOOSE_TOK '$' +#define MEGACO_CHOOSE (UINT16_MAX + 1) + /**@file sofia-sip/sdp.h Simple SDP (RFC 2327) Interface. * * @author Pekka Pessi @@ -260,7 +264,7 @@ typedef enum { /** Media announcement. * * This structure describes one media type, e.g., audio. The description - * contains the transport address (IP address and port) used for the group, + * contains the transport address (IP address and port) used for the group,/Users/mrene/Downloads * the transport protocol used, the media formats or RTP payload types, and * optionally media-specific bandwidth specification, encryption key and * attributes. @@ -525,7 +529,9 @@ enum sdp_parse_flags_e { /** Do not generate or parse SDP mode */ sdp_f_mode_manual = 512, /** Always generate media-level mode attributes */ - sdp_f_mode_always = 1024 + sdp_f_mode_always = 1024, + /** Allow optional (choose) parameters */ + sdp_f_megaco = 2048 }; /** SDP parser handle. */ diff --git a/src/mod/endpoints/mod_sofia/Makefile.am b/src/mod/endpoints/mod_sofia/Makefile.am index fb0ab25e0b..efd6b2c385 100644 --- a/src/mod/endpoints/mod_sofia/Makefile.am +++ b/src/mod/endpoints/mod_sofia/Makefile.am @@ -9,7 +9,7 @@ SOFIAUA_BUILDDIR=$(SOFIA_BUILDDIR)/libsofia-sip-ua SOFIALA=$(SOFIAUA_BUILDDIR)/libsofia-sip-ua.la mod_LTLIBRARIES = mod_sofia.la -mod_sofia_la_SOURCES = mod_sofia.c sofia.c sofia_glue.c sofia_presence.c sofia_reg.c sip-dig.c mod_sofia.h +mod_sofia_la_SOURCES = mod_sofia.c sofia.c sofia_glue.c sofia_presence.c sofia_reg.c sip-dig.c rtp.c mod_sofia.h mod_sofia_la_CFLAGS = $(AM_CFLAGS) -I. $(SOFIA_CMD_LINE_CFLAGS) mod_sofia_la_CFLAGS += -I$(SOFIAUA_DIR)/bnf -I$(SOFIAUA_BUILDDIR)/bnf mod_sofia_la_CFLAGS += -I$(SOFIAUA_DIR)/http -I$(SOFIAUA_BUILDDIR)/http diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index e47fb85c46..0f598573c0 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -5634,6 +5634,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) SWITCH_ADD_API(api_interface, "sofia_count_reg", "Count Sofia registration", sofia_count_reg_function, "[profile/]@"); SWITCH_ADD_API(api_interface, "sofia_dig", "SIP DIG", sip_dig_function, ""); SWITCH_ADD_CHAT(chat_interface, SOFIA_CHAT_PROTO, sofia_presence_chat_send); + + crtp_init(*module_interface); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 217c95af8c..fa4fdc0b10 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -1152,3 +1152,4 @@ void sofia_process_dispatch_event(sofia_dispatch_event_t **dep); char *sofia_glue_get_host(const char *str, switch_memory_pool_t *pool); void sofia_presence_check_subscriptions(sofia_profile_t *profile, time_t now); void sofia_msg_thread_start(int idx); +void crtp_init(switch_loadable_module_interface_t *module_interface); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c new file mode 100644 index 0000000000..8920e684a7 --- /dev/null +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -0,0 +1,653 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2011, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Mathieu Rene + * + * rtp.c -- RTP Controllable Channel Module + * + */ + +#include +#include "mod_sofia.h" + +#define kRSDP "r_sdp" +#define kLSDP "l_sdp" +#define kBINDADDRESS "bind_address" +#define kCODECSTRING "codec_string" + +static struct { + switch_memory_pool_t *pool; + switch_endpoint_interface_t *endpoint_interface; +} crtp; + +typedef struct { + switch_core_session_t *session; + switch_channel_t *channel; + switch_codec_t read_codec, write_codec; + switch_frame_t read_frame; + + switch_rtp_bug_flag_t rtp_bugs; + switch_rtp_t *rtp_session; + + const char *bind_address; + + + const switch_codec_implementation_t *negotiated_codecs[SWITCH_MAX_CODECS]; + int num_negotiated_codecs; + + char *origin; + + int local_port; + +} crtp_private_t; + +static switch_status_t channel_on_init(switch_core_session_t *session); +static switch_status_t channel_on_destroy(switch_core_session_t *session); +static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, switch_call_cause_t *cancel_cause); +static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id); +static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id); +static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); +static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf); + +switch_state_handler_table_t crtp_state_handlers = { + .on_init = channel_on_init, + .on_destroy = channel_on_destroy +}; + +switch_io_routines_t crtp_io_routines = { + .outgoing_channel = channel_outgoing_channel, + .read_frame = channel_read_frame, + .write_frame = channel_write_frame, + .receive_message = channel_receive_message, + .send_dtmf = channel_send_dtmf +}; + +SWITCH_STANDARD_API(test_function) +{ + return SWITCH_STATUS_SUCCESS; +} + +void crtp_init(switch_loadable_module_interface_t *module_interface) +{ + switch_endpoint_interface_t *endpoint_interface; + switch_api_interface_t *api_interface; + crtp.pool = module_interface->pool; + endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); + endpoint_interface->interface_name = "rtp"; + endpoint_interface->io_routines = &crtp_io_routines; + endpoint_interface->state_handler = &crtp_state_handlers; + crtp.endpoint_interface = endpoint_interface; + +// SWITCH_ADD_API(api_interface, "rtp_test", "test", test_function, ""); +} + + +typedef struct parsed_sdp_s { + const char *c; /*!< Connection */ + + +} parsed_sdp_t; + + +//static switch_status_t check_codec + +/* + * Setup the local RTP side + * A lot of values can be chosen by the MG, those will have $ as a placeholder. + * We need to validate the SDP, making sure we can support everything that's offered on our behalf, + * amend it if we don't support everything, or systematically reject it if we cannot support it. + * + * Would this function be called using NULL as l_sdp, we will generate an SDP payload. + */ + +static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_sdp, const char *codec_string) +{ + switch_core_session_t const * session = tech_pvt->session; + int num_codecs; + const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS] = { 0 }; + + char *codec_order[SWITCH_MAX_CODECS] = { 0 }; + int codec_order_last; + + + /* Load in the list of codecs we support. If we have a codec string we use our priorities first */ + if (codec_string) { + char *tmp_codec_string; + if ((tmp_codec_string = switch_core_session_strdup(tech_pvt->session, codec_string))) { + codec_order_last = switch_separate_string(tmp_codec_string, ',', codec_order, SWITCH_MAX_CODECS); + num_codecs = switch_loadable_module_get_codecs_sorted(codecs, SWITCH_MAX_CODECS, codec_order, codec_order_last); + } + } else { + num_codecs = switch_loadable_module_get_codecs(codecs, switch_arraylen(codecs)); + } + + /* TODO: Look at remote settings */ + + if (zstr(l_sdp)) { + /* Generate a local SDP here */ + const char *sdpbuf = switch_core_session_sprintf(session, "v=0\nIN IP4 %s\nm=audio %d RTP/AVP %d"); + + } else { + /* Parse the SDP and remove anything we cannot support, then validate it to make sure it contains at least one codec + * so that we reject invalid ones. */ +#if 1 + uint8_t match = 0; + int first = 0, last = 0; + int ptime = 0, dptime = 0, maxptime = 0, dmaxptime = 0; + int sendonly = 0, recvonly = 0; + int greedy = 0, x = 0, skip = 0, mine = 0; + int got_crypto = 0, got_audio = 0, got_avp = 0, got_savp = 0, got_udptl = 0; +#endif + int sdp_modified = 0; + int cur_codec = 0; + + sdp_parser_t *parser = NULL; + sdp_session_t *sdp, *lsdp; + sdp_media_t *m; + sdp_attribute_t *attr; + su_home_t *sdp_home; + + if (!(parser = sdp_parse(NULL, l_sdp, (int) strlen(l_sdp), sdp_f_megaco /* accept $ values */ | sdp_f_insane /* accept omitted o= */))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Malformed SDP\n"); + goto fail; + } + + if (!(sdp = sdp_session(parser))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't get session from sdp.\n"); + goto fail; + } + sdp_home = sdp_parser_home(parser); + for (m = sdp->sdp_media; m; m = m->m_next) { + + if (m->m_type == sdp_media_audio) { + sdp_rtpmap_t *map; + + for (attr = m->m_attributes; attr; attr = attr->a_next) { + if (!strcasecmp(attr->a_name, "ptime") && attr->a_value) { + ptime = atoi(attr->a_value); + } else if (!strcasecmp(attr->a_name, "maxptime") && attr->a_value) { + maxptime = atoi(attr->a_value); + } + } + + sdp_connection_t *connection; + connection = sdp->sdp_connection; + if (m->m_connections) { + connection = m->m_connections; + } + + /* Check for wildcards in m= (media) and c= (connection) */ + if (!zstr(connection->c_address)) { + if (!strcmp(connection->c_address, "$")) { + connection->c_address = su_strdup(sdp_home, tech_pvt->bind_address); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Using bind address: %s\n", tech_pvt->bind_address); + switch_channel_set_variable(tech_pvt->channel, kBINDADDRESS, tech_pvt->bind_address); + sdp_modified = 1; + } else if (strcmp(connection->c_address, tech_pvt->bind_address)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGC requested to bind on [%s] which is different than the configuration [%s]\n", + connection->c_address, tech_pvt->bind_address); + goto fail; + } + + if (m->m_port == MEGACO_CHOOSE) { + tech_pvt->local_port = m->m_port = switch_rtp_request_port(tech_pvt->bind_address); + switch_channel_set_variable_printf(tech_pvt->channel, "rtp_local_port", "%d", tech_pvt->local_port); + if (!tech_pvt->local_port) { + /* Port request failed */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No available RTP ports on [%s]\n", tech_pvt->bind_address); + goto fail; + } + sdp_modified = 1; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Using local port: %d\n", tech_pvt->local_port); + } + } + + /* Validate codecs */ + for (map = m->m_rtpmaps; map; map = map->rm_next) { + if (map->rm_any) { + /* Pick our first favorite codec */ + if (codecs[cur_codec]) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing a codec: %s/%d\n", codecs[cur_codec]->iananame, codecs[cur_codec]->ianacode); + map->rm_encoding = su_strdup(sdp_home, codecs[cur_codec]->iananame); + map->rm_pt = codecs[cur_codec]->ianacode; + map->rm_any = 0; + map->rm_predef = codecs[cur_codec]->ianacode < 96; + cur_codec++; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No more codecs in preferences!\n"); + goto fail; + } + } + } + } else if (m->m_type == sdp_media_image && m->m_port) { + /* TODO: Handle T38 */ + + } + } + char sdpbuf[2048] = ""; + sdp_printer_t *printer = sdp_print(sdp_home, sdp, sdpbuf, sizeof(sdpbuf), 0); + switch_channel_set_variable(tech_pvt->channel, kLSDP, sdpbuf); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting local SDP: [%s]\n", sdpbuf); + sdp_printer_free(printer); + + goto done; + + fail: + if (tech_pvt->local_port) { + switch_rtp_release_port(tech_pvt->bind_address, tech_pvt->local_port); + } + + if (parser) { + sdp_parser_free(parser); + } + + return SWITCH_STATUS_FALSE; + } + +done: + return SWITCH_STATUS_SUCCESS; + +} + +#if 0 +static void setup_rtp(crtp_private_t *tech_pvt, const char *r_sdp, const char *l_sdp) +{ + switch_core_session_t const * session = tech_pvt->session; + uint8_t match = 0; + int first = 0, last = 0; + int ptime = 0, dptime = 0, maxptime = 0, dmaxptime = 0; + int sendonly = 0, recvonly = 0; + int greedy = 0, x = 0, skip = 0, mine = 0; + int got_crypto = 0, got_audio = 0, got_avp = 0, got_savp = 0, got_udptl = 0; + + sdp_parser_t *parser = NULL, *l_parser = NULL; + sdp_session_t *sdp, *lsdp; + sdp_media_t *m; + sdp_attribute_t *attr; + + + int scrooge = 0; + + + if (zstr(r_sdp)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No SDP\n"); + goto fail; + } + + if (!(parser = sdp_parse(NULL, r_sdp, (int) strlen(r_sdp), 0))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Malformed SDP\n"); + goto fail; + } + + if (!(sdp = sdp_session(parser))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't get session from sdp.\n"); + goto fail; + } + + for (m = sdp->sdp_media; m; m = m->m_next) { + sdp_connection_t *connection; + ptime = dptime; + maxptime = dmaxptime; + + if (m->m_proto == sdp_proto_srtp) { + got_savp++; + } else if (m->m_proto == sdp_proto_rtp) { + got_avp++; + } else if (m->m_proto == sdp_proto_udptl) { + got_udptl++; + } + + if (got_udptl && m->m_type == sdp_media_image && m->m_port) { + //switch_t38_options_t *t38_options = tech_process_udptl(tech_pvt, sdp, m); + + /* TODO: Process T38 */ + + } else if (m->m_type == sdp_media_audio && m->m_port && !got_audio) { + sdp_rtpmap_t *map; + + connection = sdp->sdp_connection; + if (m->m_connections) { + connection = m->m_connections; + } + + if (!connection) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "Cannot find a c= line in the sdp at media or session level!\n"); + match = 0; + break; + } + + /* Begin Codec Negotiation */ + for (map = m->m_rtpmaps; map; map = map->rm_next) { + int32_t i; + uint32_t near_rate = 0; + const switch_codec_implementation_t *mimp = NULL, *near_match = NULL; + const char *rm_encoding; + uint32_t map_bit_rate = 0; + int codec_ms = 0; + switch_codec_fmtp_t codec_fmtp = { 0 }; + + if (x++ < skip) { + continue; + } + + if (!(rm_encoding = map->rm_encoding)) { + rm_encoding = ""; + } + + if (!strcasecmp(rm_encoding, "telephone-event")) { + if (!best_te || map->rm_rate == tech_pvt->rm_rate) { + best_te = (switch_payload_t) map->rm_pt; + }9 + } + + if (!cng_pt && !strcasecmp(rm_encoding, "CN")) { + cng_pt = (switch_payload_t) map->rm_pt; + if (tech_pvt->rtp_session) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Set comfort noise payload to %u\n", cng_pt); + switch_rtp_set_cng_pt(tech_pvt->rtp_session, tech_pvt->cng_pt); + } + } + + if (match) { + continue; + } + + if (greedy) { + first = mine; + last = first + 1; + } else { + first = 0; + last = num_codecs; + } + + codec_ms = ptime; + + if (maxptime && (!codec_ms || codec_ms > maxptime)) { + codec_ms = maxptime; + } + + if (!codec_ms) { + codec_ms = switch_default_ptime(rm_encoding, map->rm_pt); + } + + map_bit_rate = switch_known_bitrate((switch_payload_t)map->rm_pt); + + if (!ptime && !strcasecmp(map->rm_encoding, "g723")) { + ptime = codec_ms = 30; + } + + if (zstr(map->rm_fmtp)) { + if (!strcasecmp(map->rm_encoding, "ilbc")) { + ptime = codec_ms = 30; + map_bit_rate = 13330; + } + } else { + if ((switch_core_codec_parse_fmtp(map->rm_encoding, map->rm_fmtp, map->rm_rate, &codec_fmtp)) == SWITCH_STATUS_SUCCESS) { + if (codec_fmtp.bits_per_second) { + map_bit_rate = codec_fmtp.bits_per_second; + } + if (codec_fmtp.microseconds_per_packet) { + codec_ms = (codec_fmtp.microseconds_per_packet / 1000); + } + } + } + + + for (i = first; i < last && i < total_codecs; i++) { + const switch_codec_implementation_t *imp = codec_array[i]; + uint32_t bit_rate = imp->bits_per_second; + uint32_t codec_rate = imp->samples_per_second; + if (imp->codec_type != SWITCH_CODEC_TYPE_AUDIO) { + continue; + } + + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Compare [%s:%d:%u:%d:%u]/[%s:%d:%u:%d:%u]\n", + rm_encoding, map->rm_pt, (int) map->rm_rate, codec_ms, map_bit_rate, + imp->iananame, imp->ianacode, codec_rate, imp->microseconds_per_packet / 1000, bit_rate); + if ((zstr(map->rm_encoding) || (tech_pvt->profile->ndlb & PFLAG_NDLB_ALLOW_BAD_IANANAME)) && map->rm_pt < 96) { + match = (map->rm_pt == imp->ianacode) ? 1 : 0; + } else { + match = strcasecmp(rm_encoding, imp->iananame) ? 0 : 1; + } + + if (match && bit_rate && map_bit_rate && map_bit_rate != bit_rate && strcasecmp(map->rm_encoding, "ilbc")) { + /* nevermind */ + match = 0; + } + + if (match) { + if (scrooge) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, + "Bah HUMBUG! Sticking with %s@%uh@%ui\n", + imp->iananame, imp->samples_per_second, imp->microseconds_per_packet / 1000); + } else { + if ((ptime && codec_ms && codec_ms * 1000 != imp->microseconds_per_packet) || map->rm_rate != codec_rate) { + near_rate = map->rm_rate; + near_match = imp; + match = 0; + continue; + } + } + mimp = imp; + break; + } else { + match = 0; + } + } + } + + /* End */ + + + } + } + +fail: + if (parser) { + sdp_parser_free(parser); + } +} +#endif + +static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) +{ + switch_channel_t *channel; + char name[128]; + const char *dname = "PCMU"; + uint32_t interval = 20; + crtp_private_t *tech_pvt; + const char *r_sdp = switch_event_get_header(var_event, kRSDP); + const char *l_sdp = switch_event_get_header(var_event, kLSDP); + const char *codec_string = switch_event_get_header_nil(var_event, kCODECSTRING); + + + if (!(*new_session = switch_core_session_request(crtp.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); + goto fail; + } + + channel = switch_core_session_get_channel(*new_session); + + + + tech_pvt = switch_core_session_alloc(*new_session, sizeof *tech_pvt); + tech_pvt->session = *new_session; + tech_pvt->channel = channel; + tech_pvt->bind_address = switch_core_session_strdup(*new_session, switch_event_get_header_nil(var_event, kBINDADDRESS)); + switch_core_session_set_private(*new_session, tech_pvt); + + if (setup_local_rtp(tech_pvt, l_sdp, codec_string) != SWITCH_STATUS_SUCCESS) { + goto fail; + } + + snprintf(name, sizeof(name), "rtp/ctrl"); /* TODO add addresses */ + switch_channel_set_name(channel, name); + + switch_channel_set_state(channel, CS_INIT); + + if (switch_core_codec_init(&tech_pvt->read_codec, + dname, + NULL, + 8000, + interval, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + goto fail; + } else { + if (switch_core_codec_init(&tech_pvt->write_codec, + dname, + NULL, + 8000, + interval, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + switch_core_codec_destroy(&tech_pvt->read_codec); + goto fail; + } + } + + if (switch_core_session_set_read_codec(*new_session, &tech_pvt->read_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set read codec?\n"); + goto fail; + } + + if (switch_core_session_set_write_codec(*new_session, &tech_pvt->write_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n"); + } + + if (switch_core_session_thread_launch(*new_session) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start session thread.\n"); + goto fail; + } + + switch_channel_mark_answered(channel); + + return SWITCH_CAUSE_SUCCESS; + +fail: + if (tech_pvt) { + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + } + + if (*new_session) { + switch_core_session_destroy(new_session); + } + return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; +} + +static switch_status_t channel_on_init(switch_core_session_t *session) +{ + + switch_channel_t *channel = switch_core_session_get_channel(session); + + switch_channel_set_state(channel, CS_ROUTING); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t channel_on_destroy(switch_core_session_t *session) +{ + crtp_private_t *tech_pvt = switch_core_session_get_private(session); + + if ((tech_pvt = switch_core_session_get_private(session))) { + + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + } + + return SWITCH_STATUS_SUCCESS; +} + + +static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id) +{ + crtp_private_t *tech_pvt; + switch_channel_t *channel; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id) +{ + crtp_private_t *tech_pvt; + switch_channel_t *channel; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + + return SWITCH_STATUS_SUCCESS; + +} + +static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf) +{ + crtp_private_t *tech_pvt = NULL; + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) +{ + return SWITCH_STATUS_SUCCESS; +} + From 43ffafcb4b44772cf3abfca21b7addec354d4380 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 20 Jun 2012 12:30:37 -0400 Subject: [PATCH 262/493] wrong operand to sizeof --- libs/freetdm/src/ftdm_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 78e65dfe88..c081c655d8 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -169,7 +169,7 @@ static void stop_chan_io_dump(ftdm_io_dump_t *dump) return; } ftdm_safe_free(dump->buffer); - memset(dump, 0, sizeof(dump)); + memset(dump, 0, sizeof(*dump)); } static ftdm_status_t start_chan_io_dump(ftdm_channel_t *chan, ftdm_io_dump_t *dump, ftdm_size_t size) From 8da3d119ab8e5f9ba4998e68b02993d707c1b3f0 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 20 Jun 2012 13:20:35 -0400 Subject: [PATCH 263/493] Added display of M2UA signalling channels for CLI command show status --- .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index b8cc34480f..c7bd95947b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1451,6 +1451,33 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, x++; } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */ + /* Look spans that are being used by M2UA SG links */ + for (x = 1; x < ftdm_array_len(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif); x++) { + if (g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id) { + if (g_ftdm_sngss7_data.cfg.mtp2Link[g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].mtp2LnkNmb].id) { + uint32_t mtp1_id = g_ftdm_sngss7_data.cfg.mtp2Link[g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].mtp2LnkNmb].id; + if (g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].id) { + if (g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].span == span) { + if (chan) { + if (chan == g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].chan) { + stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|SIGNALING LINK\n", + g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].span, + g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].chan, + 0); + } + } else { + stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|SIGNALING LINK\n", + g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].span, + g_ftdm_sngss7_data.cfg.mtp1Link[mtp1_id].chan, + 0); + } + } + } + + } + } + } + return FTDM_SUCCESS; } From 6a1229c8f9f878ca46bbadfeeebd6a456a8ace87 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 21 Jun 2012 01:09:51 +0530 Subject: [PATCH 264/493] fixing compilation error --- src/mod/endpoints/mod_media_gateway/media_gateway_stack.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index ebc7b869f6..591bb5f13d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -257,8 +257,6 @@ switch_status_t sng_mgco_start(megaco_profile_t* profile ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_enable_cntrl SUCCESS \n"); } - mgco_mg_enble_debug(); - return SWITCH_STATUS_SUCCESS; } From b44bcd57637020397483b655aa35af26a3581d95 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 20 Jun 2012 16:28:00 -0400 Subject: [PATCH 265/493] Added core spanflag CLI command --- libs/freetdm/mod_freetdm/mod_freetdm.c | 3 +- libs/freetdm/src/ftdm_io.c | 271 +++++++++++++----- libs/freetdm/src/include/private/ftdm_types.h | 2 + 3 files changed, 205 insertions(+), 71 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 63abc9f284..12cb7e5ef7 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -5069,7 +5069,8 @@ static ftdm_cli_entry_t ftdm_cli_options[] = /* Fake handlers as they are handled within freetdm library, * we should provide a way inside freetdm to query for completions from signaling modules */ { "core state", "[!]", "", NULL }, - { "core flag", "[!]", "", NULL }, + { "core flag", "[!] [] []", "", NULL }, + { "core spanflag", "[!] []", "", NULL }, { "core calls", "", "", NULL }, }; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index a9cb0b4f2a..6052971274 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -63,12 +63,78 @@ struct tm *localtime_r(const time_t *clock, struct tm *result); ftdm_time_t time_last_throttle_log = 0; ftdm_time_t time_current_throttle_log = 0; +typedef struct val_str { + const char *str; + unsigned long long val; +} val_str_t; + +static val_str_t channel_flag_strs[] = { + { "configured" , FTDM_CHANNEL_CONFIGURED}, + { "ready", FTDM_CHANNEL_READY}, + { "open", FTDM_CHANNEL_OPEN}, + { "dtmf-detect", FTDM_CHANNEL_DTMF_DETECT}, + { "suppress-dtmf", FTDM_CHANNEL_SUPRESS_DTMF}, + { "transcode", FTDM_CHANNEL_TRANSCODE}, + { "buffer", FTDM_CHANNEL_BUFFER}, + { "in-thread", FTDM_CHANNEL_INTHREAD}, + { "wink", FTDM_CHANNEL_WINK}, + { "flash", FTDM_CHANNEL_FLASH}, + { "state-change", FTDM_CHANNEL_STATE_CHANGE}, + { "hold", FTDM_CHANNEL_HOLD}, + { "in-use", FTDM_CHANNEL_INUSE}, + { "off-hook", FTDM_CHANNEL_OFFHOOK}, + { "ringing", FTDM_CHANNEL_RINGING}, + { "progress-detect", FTDM_CHANNEL_PROGRESS_DETECT}, + { "callerid-detect", FTDM_CHANNEL_CALLERID_DETECT}, + { "outbound", FTDM_CHANNEL_OUTBOUND}, + { "suspended", FTDM_CHANNEL_SUSPENDED}, + { "3-way", FTDM_CHANNEL_3WAY}, + { "progress", FTDM_CHANNEL_PROGRESS}, + { "media", FTDM_CHANNEL_MEDIA}, + { "answered", FTDM_CHANNEL_ANSWERED}, + { "mute", FTDM_CHANNEL_MUTE}, + { "use-rx-gain", FTDM_CHANNEL_USE_RX_GAIN}, + { "use-tx-gain", FTDM_CHANNEL_USE_TX_GAIN}, + { "in-alarm", FTDM_CHANNEL_IN_ALARM}, + { "sig-up", FTDM_CHANNEL_SIG_UP}, + { "user-hangup", FTDM_CHANNEL_USER_HANGUP}, + { "rx-disabled", FTDM_CHANNEL_RX_DISABLED}, + { "tx-disabled", FTDM_CHANNEL_TX_DISABLED}, + { "call-started", FTDM_CHANNEL_CALL_STARTED}, + { "non-block", FTDM_CHANNEL_NONBLOCK}, + { "ind-ack-pending", FTDM_CHANNEL_IND_ACK_PENDING}, + { "blocking", FTDM_CHANNEL_BLOCKING}, + { "media", FTDM_CHANNEL_DIGITAL_MEDIA}, + { "native-sigbridge", FTDM_CHANNEL_NATIVE_SIGBRIDGE}, + { "invalid", FTDM_CHANNEL_MAX_FLAG}, +}; + +static val_str_t span_flag_strs[] = { + { "configured", FTDM_SPAN_CONFIGURED}, + { "started", FTDM_SPAN_STARTED}, + { "state-change", FTDM_SPAN_STATE_CHANGE}, + { "suspended", FTDM_SPAN_SUSPENDED}, + { "in-thread", FTDM_SPAN_IN_THREAD}, + { "stop-thread", FTDM_SPAN_STOP_THREAD}, + { "use-chan-queue", FTDM_SPAN_USE_CHAN_QUEUE}, + { "suggest-chan-id", FTDM_SPAN_SUGGEST_CHAN_ID}, + { "use-av-rate", FTDM_SPAN_USE_AV_RATE}, + { "power-saving", FTDM_SPAN_PWR_SAVING}, + { "signals-queue", FTDM_SPAN_USE_SIGNALS_QUEUE}, + { "proceed-state", FTDM_SPAN_USE_PROCEED_STATE}, + { "skip-state", FTDM_SPAN_USE_SKIP_STATES}, + { "non-stoppable", FTDM_SPAN_NON_STOPPABLE}, + { "use-transfer", FTDM_SPAN_USE_TRANSFER}, +}; + static ftdm_status_t ftdm_call_set_call_id(ftdm_channel_t *fchan, ftdm_caller_data_t *caller_data); static ftdm_status_t ftdm_call_clear_call_id(ftdm_caller_data_t *caller_data); static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan); static ftdm_status_t ftdm_channel_sig_indicate(ftdm_channel_t *ftdmchan, ftdm_channel_indication_t indication, ftdm_usrmsg_t *usrmsg); -static const char *channel_val2str(unsigned long long flag); -static unsigned long long channel_str2val(const char *flag_name); + +static const char *ftdm_val2str(unsigned long long val, val_str_t *val_str_table, ftdm_size_t array_size, const char *default_str); +static unsigned long long ftdm_str2val(const char *str, val_str_t *val_str_table, ftdm_size_t array_size, unsigned long long default_val); + static int time_is_init = 0; @@ -1051,7 +1117,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t i++; } - ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY); + ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY); new_chan->state = FTDM_CHANNEL_STATE_DOWN; new_chan->state_status = FTDM_STATE_STATUS_COMPLETED; *chan = new_chan; @@ -4370,28 +4436,28 @@ static void print_channels_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *in stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) ON \n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval, channel_val2str(flagval)); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); mycount++; } else { stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) OFF \n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval, channel_val2str(flagval)); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); } - } else if (!not) { + } else { if (ftdm_test_flag(fchan, flag)) { - stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) ON\n", + stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) ON\n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval, channel_val2str(flagval)); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); mycount++; } else { stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) OFF \n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval, channel_val2str(flagval)); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); } } } @@ -4412,16 +4478,16 @@ static void print_channels_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *in for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) { fchan = ftdm_iterator_current(curr); if (not && !ftdm_test_flag(fchan, flag)) { - stream->write_function(stream, "[s%dc%d][%d:%d] has not flag %d\n", + stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s)\n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); mycount++; } else if (!not && ftdm_test_flag(fchan, flag)) { - stream->write_function(stream, "[s%dc%d][%d:%d] has flag %d\n", + stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s)\n", fchan->span_id, fchan->chan_id, fchan->physical_span_id, fchan->physical_chan_id, - flagval); + flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid")); mycount++; } } @@ -4433,6 +4499,68 @@ end: ftdm_mutex_unlock(globals.mutex); } +static void print_spans_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, int32_t flagval, int not, int *count) +{ + ftdm_hash_iterator_t *i = NULL; + ftdm_span_t *span; + const void *key = NULL; + void *val = NULL; + uint32_t flag = (1 << flagval); + int mycount = 0; + + *count = 0; + + ftdm_mutex_lock(globals.mutex); + + if (inspan) { + if (not) { + if (!ftdm_test_flag(inspan, flag)) { + stream->write_function(stream, "[s%d] flag !%d(!%s) ON \n", + inspan->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + + mycount++; + } else { + stream->write_function(stream, "[s%d] flag !%d(!%s) OFF \n", + inspan->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + } + } else { + if (ftdm_test_flag(inspan, flag)) { + stream->write_function(stream, "[s%d] flag %d(%s) ON \n", + inspan->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + mycount++; + } else { + stream->write_function(stream, "[s%d] flag %d(%s) OFF \n", + inspan->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + } + } + } else { + for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) { + hashtable_this(i, &key, NULL, &val); + if (!key || !val) { + break; + } + span = val; + if (not && !ftdm_test_flag(span, flag)) { + stream->write_function(stream, "[s%d] flag !%d(!%s)\n", + span->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + mycount++; + } else if (!not && ftdm_test_flag(span, flag)) { + stream->write_function(stream, "[s%d] flag %d(%s)\n", + span->span_id, + flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid")); + mycount++; + } + } + } + *count = mycount; + ftdm_mutex_unlock(globals.mutex); +} + static void print_channels_by_state(ftdm_stream_handle_t *stream, ftdm_channel_state_t state, int not, int *count) { ftdm_hash_iterator_t *i = NULL; @@ -4483,83 +4611,47 @@ static void print_core_usage(ftdm_stream_handle_t *stream) "--------------------------------------------------------------------------------\n" "ftdm core state [!] - List all channels in or not in the given state\n" "ftdm core flag [!] [] [] - List all channels with the given flag value set\n" + "ftdm core spanflag [!] [] - List all spans with the given span flag value set\n" "ftdm core calls - List all known calls to the FreeTDM core\n" "--------------------------------------------------------------------------------\n"); } -typedef struct channel_flags_str { - const char *name; - unsigned long long channel_flag; -} channel_flag_str_t; -static channel_flag_str_t channel_flag_strs[] = { - { "configured" , FTDM_CHANNEL_CONFIGURED}, - { "ready", FTDM_CHANNEL_READY}, - { "open", FTDM_CHANNEL_OPEN}, - { "dtmf-detect", FTDM_CHANNEL_DTMF_DETECT}, - { "suppress-dtmf", FTDM_CHANNEL_SUPRESS_DTMF}, - { "transcode", FTDM_CHANNEL_TRANSCODE}, - { "buffer", FTDM_CHANNEL_BUFFER}, - { "in-thread", FTDM_CHANNEL_INTHREAD}, - { "wink", FTDM_CHANNEL_WINK}, - { "flash", FTDM_CHANNEL_FLASH}, - { "state-change", FTDM_CHANNEL_STATE_CHANGE}, - { "hold", FTDM_CHANNEL_HOLD}, - { "in-use", FTDM_CHANNEL_INUSE}, - { "off-hook", FTDM_CHANNEL_OFFHOOK}, - { "ringing", FTDM_CHANNEL_RINGING}, - { "progress-detect", FTDM_CHANNEL_PROGRESS_DETECT}, - { "callerid-detect", FTDM_CHANNEL_CALLERID_DETECT}, - { "outbound", FTDM_CHANNEL_OUTBOUND}, - { "suspended", FTDM_CHANNEL_SUSPENDED}, - { "3-way", FTDM_CHANNEL_3WAY}, - { "progress", FTDM_CHANNEL_PROGRESS}, - { "media", FTDM_CHANNEL_MEDIA}, - { "answered", FTDM_CHANNEL_ANSWERED}, - { "mute", FTDM_CHANNEL_MUTE}, - { "use-rx-gain", FTDM_CHANNEL_USE_RX_GAIN}, - { "use-tx-gain", FTDM_CHANNEL_USE_TX_GAIN}, - { "in-alarm", FTDM_CHANNEL_IN_ALARM}, - { "sig-up", FTDM_CHANNEL_SIG_UP}, - { "user-hangup", FTDM_CHANNEL_USER_HANGUP}, - { "rx-disabled", FTDM_CHANNEL_RX_DISABLED}, - { "tx-disabled", FTDM_CHANNEL_TX_DISABLED}, - { "call-started", FTDM_CHANNEL_CALL_STARTED}, - { "non-block", FTDM_CHANNEL_NONBLOCK}, - { "ind-ack-pending", FTDM_CHANNEL_IND_ACK_PENDING}, - { "blocking", FTDM_CHANNEL_BLOCKING}, - { "media", FTDM_CHANNEL_DIGITAL_MEDIA}, - { "native-sigbridge", FTDM_CHANNEL_NATIVE_SIGBRIDGE}, - { "invalid", FTDM_CHANNEL_MAX_FLAG}, -}; - -static unsigned long long channel_str2val(const char *flag_name) +static unsigned long long ftdm_str2val(const char *str, val_str_t *val_str_table, ftdm_size_t array_size, unsigned long long default_val) { int i; - for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { - if (!strcasecmp(channel_flag_strs[i].name, flag_name)) { - return channel_flag_strs[i].channel_flag; + for (i = 0; i < array_size; i++) { + if (!strcasecmp(val_str_table[i].str, str)) { + return val_str_table[i].val; } } - return FTDM_CHANNEL_MAX_FLAG; + return default_val; } -static const char *channel_val2str(unsigned long long flag) +static const char *ftdm_val2str(unsigned long long val, val_str_t *val_str_table, ftdm_size_t array_size, const char *default_str) { int i; - for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { - if (channel_flag_strs[i].channel_flag == flag) { - return channel_flag_strs[i].name; + for (i = 0; i < array_size; i++) { + if (val_str_table[i].val == val) { + return val_str_table[i].str; } } - return "invalid"; + return default_str; } static void print_channel_flag_values(ftdm_stream_handle_t *stream) { int i; for (i = 0; i < ftdm_array_len(channel_flag_strs); i++) { - stream->write_function(stream, "%s\n", channel_flag_strs[i].name); + stream->write_function(stream, "%s\n", channel_flag_strs[i].str); + } +} + +static void print_span_flag_values(ftdm_stream_handle_t *stream) +{ + int i; + for (i = 0; i < ftdm_array_len(span_flag_strs); i++) { + stream->write_function(stream, "%s\n", span_flag_strs[i].str); } } @@ -4631,12 +4723,13 @@ static char *handle_core_command(const char *cmd) } if (isalpha(flag[0])) { - flagval = channel_str2val(flag); + flagval = ftdm_str2val(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), FTDM_CHANNEL_MAX_FLAG); if (flagval == FTDM_CHANNEL_MAX_FLAG) { stream.write_function(&stream, "\nInvalid channel flag value. Possible channel flags\n"); print_channel_flag_values(&stream); goto done; } + flagval = flagval >> 1; } else { flagval = atoi(flag); } @@ -4661,6 +4754,44 @@ static char *handle_core_command(const char *cmd) print_channels_by_flag(&stream, fspan, chan_id, flagval, not, &count); stream.write_function(&stream, "\nTotal channels %s %d: %d\n", not ? "without flag" : "with flag", flagval, count); + } else if (!strcasecmp(argv[0], "spanflag")) { + if (argc < 2) { + stream.write_function(&stream, "core spanflag command requires an argument\n"); + print_core_usage(&stream); + goto done; + } + + flag = argv[1]; + if (argv[1][0] == '!') { + not = 1; + flag++; + } + + if (isalpha(flag[0])) { + flagval = ftdm_str2val(flag, span_flag_strs, ftdm_array_len(span_flag_strs), FTDM_SPAN_MAX_FLAG); + if (flagval == FTDM_SPAN_MAX_FLAG) { + stream.write_function(&stream, "\nInvalid span flag value. Possible span flags\n"); + print_span_flag_values(&stream); + goto done; + } + flagval = flagval >> 1; + } else { + flagval = atoi(flag); + } + + /* Specific span specified */ + if (argv[2]) { + ftdm_span_find_by_name(argv[2], &fspan); + if (!fspan) { + stream.write_function(&stream, "-ERR span:%s not found\n", argv[2]); + goto done; + } + } + + print_spans_by_flag(&stream, fspan, flagval, not, &count); + if (!fspan) { + stream.write_function(&stream, "\nTotal spans %s %d: %d\n", not ? "without flag" : "with flag", flagval, count); + } } else if (!strcasecmp(argv[0], "calls")) { ftdm_mutex_lock(globals.call_id_mutex); current_call_id = globals.last_call_id; diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 7df764e52f..19d496bea4 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -197,6 +197,8 @@ typedef enum { FTDM_SPAN_NON_STOPPABLE = (1 << 13), /* If this flag is set, then this span supports TRANSFER state */ FTDM_SPAN_USE_TRANSFER = (1 << 14), + /* This is the last flag, no more flags bigger than this */ + FTDM_SPAN_MAX_FLAG = (1 << 15), } ftdm_span_flag_t; /*! \brief Channel supported features */ From 79702bc0d2aa1fe4086c6108633181bf2d9a0a68 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 20 Jun 2012 21:34:04 -0400 Subject: [PATCH 266/493] start implementing command handlers --- .gitignore | 3 + libs/freetdm/mod_freetdm/tdm.c | 2 +- src/include/switch_apr.h | 3 +- .../mod_media_gateway/media_gateway_stack.c | 3 +- .../mod_media_gateway/media_gateway_xml.c | 1 + .../mod_media_gateway/mod_media_gateway.c | 189 ++++++++++++++++++ 6 files changed, 197 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 55e1e9856b..3c0fd7cf40 100644 --- a/.gitignore +++ b/.gitignore @@ -199,3 +199,6 @@ src/mod/formats/mod_shout/*/*/mod_shout.log /src/mod/languages/mod_managed/x64/Release_CLR/FREESWITCH.MANAGED.DLL.metagen /src/mod/languages/mod_managed/x64/Release_CLR/RSAENH.DLL.bi /src/mod/languages/mod_managed/x64/Release_CLR/TZRES.DLL.bi + +src/include/switch_apr.h +.gitignore \ No newline at end of file diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 935411867b..61a145ed3b 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -109,7 +109,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_codec_t codec; uint32_t interval; - ctdm_private_t *tech_pvt; + ctdm_private_t *tech_pvt = NULL; if (zstr(szchanid) || zstr(szspanid)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both "kSPAN_ID" and "kCHAN_ID" have to be set.\n"); diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index 0c8673570f..e125eb9390 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -773,7 +773,8 @@ typedef gid_t switch_gid_t; typedef ino_t switch_ino_t; typedef dev_t switch_dev_t; #endif - typedef off64_t switch_off_t; + +typedef off_t switch_off_t; /** * Structure for referencing file information diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index ebc7b869f6..51935b9c8d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -256,8 +256,7 @@ switch_status_t sng_mgco_start(megaco_profile_t* profile ) else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " mgco_mg_tsap_enable_cntrl SUCCESS \n"); } - - mgco_mg_enble_debug(); + //mgco_mg_enable_debug(); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index ba5c20aabb..d43a0e96ce 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -243,6 +243,7 @@ static switch_status_t modify_mid(char* mid) sprintf(mid,"[%s]",dup); }else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); + free(dup); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 30de4f86fc..b249e98896 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -130,11 +130,200 @@ void handle_sng_log(uint8_t level, char *fmt, ...) va_end(ptr); } +static void mgco_print_sdp(CmSdpInfoSet *sdp) +{ + int i; + +// XXX check if we can use that for debug: +// cmUnpkCmSdpInfoSet(<#CmSdpInfoSet *param#>, <#Ptr ptr#>, <#CmIntfVer intfVer#>, <#Buffer *mBuf#>); + + + if (sdp->numComp.pres == NOTPRSNT) { + return; + } + + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; + + if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && + s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->conn.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->conn.u.ip4.u.uniIp.b[0].val, + s->conn.u.ip4.u.uniIp.b[1].val, + s->conn.u.ip4.u.uniIp.b[2].val, + s->conn.u.ip4.u.uniIp.b[3].val); + } + if (s->attrSet.numComp.pres) { + for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { + CmSdpAttr *a = s->attrSet.attr[mediaId]; + + } + } + + if (s->mediaDescSet.numComp.pres) { + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; + + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + + } + + } + } + + } + + } +} + /*****************************************************************************************************************************/ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) { + size_t txnIter; + /*TODO*/ + if(msg->body.type.val == MGT_TXN) + { + /* Loop over transaction list */ + for(txnIter=0;txnIterbody.u.tl.num.val;txnIter++) + { + switch(msg->body.u.tl.txns[txnIter]->type.val) { + case MGT_TXNREQ: + { + MgMgcoTxnReq* txnReq; + MgMgcoTransId transId; /* XXX */ + int axnIter; + txnReq = &(msg->body.u.tl.txns[txnIter]->u.req); + + /* Loop over action list */ + for (axnIter=0;axnIteral.num.val;axnIter++) { + MgMgcoActionReq *actnReq; + MgMgcoContextId ctxId; + int cmdIter; + + actnReq = txnReq->al.actns[axnIter]; + ctxId = actnReq->cxtId; /* XXX */ + + if (actnReq->pres.pres == NOTPRSNT) { + continue; + } + + /* Loop over command list */ + for (cmdIter=0; cmdIter < (actnReq->cl.num.val); cmdIter++) { + MgMgcoCommandReq *cmdReq = actnReq->cl.cmds[cmdIter]; + MgMgcoTermId *termId = NULLP; + + switch (cmdReq->cmd.type.val) { + case MGT_ADD: + { + MgMgcoAmmReq *addReq = &cmdReq->cmd.u.add; + MgMgcoTermId termId = addReq->termId; + int descId; + for (descId = 0; descId < addReq->dl.num.val; descId++) { + switch (addReq->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Textual SDP %s\n", mediaPar->u.local.sdpStr.pres ? "present" : "absent"); + break; + } + case MGT_MEDIAPAR_REMOTE: + { + break; + } + + case MGT_MEDIAPAR_LOCCTL: + { + break; + } + case MGT_MEDIAPAR_TERMST: + break; + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Textual SDP %s\n", mgStream->sl.remote.sdpStr.pres ? "present" : "absent"); + + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_print_sdp(&mgStream->sl.remote.sdp); + } + + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_print_sdp(&mgStream->sl.local.sdp); + } + + break; + } + } + } + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_REQEVTDESC: + case MGT_EVBUFDESC: + case MGT_SIGNALSDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + } + } + break; + } + case MGT_MODIFY: + { + MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod; + break; + } + case MGT_MOVE: + { + MgMgcoAmmReq *addReq = &cmdReq->cmd.u.move; + break; + + } + case MGT_SUB: + { + MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub; + } + case MGT_SVCCHG: + case MGT_NTFY: + case MGT_AUDITCAP: + case MGT_AUDITVAL: + break; + } + + } + } + + break; + } + case MGT_TXNREPLY: + { + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received unknown command %d in transaction\n", msg->body.u.tl.txns[txnIter]->type.val); + break; + } + } + } } /*****************************************************************************************************************************/ From c18c32f8005dfef6f074eb0a3c9f78c7d104259c Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 20 Jun 2012 22:43:54 -0400 Subject: [PATCH 267/493] Fix for compile warnings rtp.c --- src/mod/endpoints/mod_sofia/rtp.c | 39 +++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 8920e684a7..23a94b9261 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -88,15 +88,19 @@ switch_io_routines_t crtp_io_routines = { .send_dtmf = channel_send_dtmf }; +#if 0 SWITCH_STANDARD_API(test_function) { return SWITCH_STATUS_SUCCESS; } +#endif void crtp_init(switch_loadable_module_interface_t *module_interface) { switch_endpoint_interface_t *endpoint_interface; +#if 0 /* DAVIDY */ switch_api_interface_t *api_interface; +#endif crtp.pool = module_interface->pool; endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); endpoint_interface->interface_name = "rtp"; @@ -128,12 +132,18 @@ typedef struct parsed_sdp_s { static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_sdp, const char *codec_string) { - switch_core_session_t const * session = tech_pvt->session; - int num_codecs; - const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS] = { 0 }; - - char *codec_order[SWITCH_MAX_CODECS] = { 0 }; int codec_order_last; + int num_codecs; +#if 0 /* DAVIDY */ + switch_core_session_t const * session = tech_pvt->session; +#endif + const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS] = { 0 }; + char *codec_order[SWITCH_MAX_CODECS] = { 0 }; +#if 1 /* DAVIDY */ + char *sdpbuf = NULL; + sdp_connection_t *connection = NULL; + sdp_printer_t *printer = NULL; +#endif /* Load in the list of codecs we support. If we have a codec string we use our priorities first */ @@ -151,24 +161,30 @@ static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_s if (zstr(l_sdp)) { /* Generate a local SDP here */ +#if 0 /* DAVIDY */ const char *sdpbuf = switch_core_session_sprintf(session, "v=0\nIN IP4 %s\nm=audio %d RTP/AVP %d"); +#endif } else { /* Parse the SDP and remove anything we cannot support, then validate it to make sure it contains at least one codec * so that we reject invalid ones. */ -#if 1 +#if 0 uint8_t match = 0; int first = 0, last = 0; int ptime = 0, dptime = 0, maxptime = 0, dmaxptime = 0; int sendonly = 0, recvonly = 0; - int greedy = 0, x = 0, skip = 0, mine = 0; - int got_crypto = 0, got_audio = 0, got_avp = 0, got_savp = 0, got_udptl = 0; + int greedy = 0, x = 0, skip = 0; #endif + int ptime = 0, maxptime = 0; int sdp_modified = 0; int cur_codec = 0; sdp_parser_t *parser = NULL; +#if 1 /* DAVIDY */ + sdp_session_t *sdp; +#else sdp_session_t *sdp, *lsdp; +#endif sdp_media_t *m; sdp_attribute_t *attr; su_home_t *sdp_home; @@ -196,7 +212,6 @@ static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_s } } - sdp_connection_t *connection; connection = sdp->sdp_connection; if (m->m_connections) { connection = m->m_connections; @@ -250,8 +265,10 @@ static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_s } } +#if 0 /* DAVIDY */ char sdpbuf[2048] = ""; - sdp_printer_t *printer = sdp_print(sdp_home, sdp, sdpbuf, sizeof(sdpbuf), 0); +#endif + printer = sdp_print(sdp_home, sdp, sdpbuf, sizeof(sdpbuf), 0); switch_channel_set_variable(tech_pvt->channel, kLSDP, sdpbuf); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting local SDP: [%s]\n", sdpbuf); sdp_printer_free(printer); @@ -486,7 +503,9 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *dname = "PCMU"; uint32_t interval = 20; crtp_private_t *tech_pvt; +#if 0 const char *r_sdp = switch_event_get_header(var_event, kRSDP); +#endif const char *l_sdp = switch_event_get_header(var_event, kLSDP); const char *codec_string = switch_event_get_header_nil(var_event, kCODECSTRING); From ca5b100d17072c95a269d4d2d533dc1f2d6d1b07 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 21 Jun 2012 11:36:20 +0530 Subject: [PATCH 268/493] code commit for multiple peer cli command --- .../mod_media_gateway/media_gateway_cli.c | 73 +++++++++++-------- .../mod_media_gateway/media_gateway_stack.c | 59 ++++++++------- .../mod_media_gateway/media_gateway_xml.c | 10 ++- .../mod_media_gateway/mod_media_gateway.c | 2 +- src/mod/endpoints/mod_sofia/rtp.c | 2 +- 5 files changed, 80 insertions(+), 66 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 720032673c..e21fc9d3af 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -138,6 +138,7 @@ done: switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; + int peerIdx = 0x00; int len = 0x00; MgMngmt cfm; char* xmlhdr = ""; @@ -152,33 +153,37 @@ switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, me memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); - - if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); - return SWITCH_STATUS_FALSE; - } - - idx = mg_cfg->idx; len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->peer_list[0]); + len = len + sprintf(&prntBuf[0] + len,"\n"); - /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + for(peerIdx =0; peerIdx < mg_cfg->total_peers; peerIdx++){ - /* send request to MEGACO Trillium stack to get peer information*/ - sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[peerIdx]); - ip = ntohl(cfm.t.ssta.s.mgPeerSta.peerAddrTbl.netAddr[i].u.ipv4NetAddr); - cmInetNtoa(ip, &asciiAddr); - len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[peerIdx],mg_cfg->name); + return SWITCH_STATUS_FALSE; + } - len = len + sprintf(prntBuf+len, "%s\n",PRNT_MG_PEER_STATE(cfm.t.ssta.s.mgPeerSta.peerState)); + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_peer->name); - len = len + sprintf(&prntBuf[0] + len,"\n"); + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + + ip = ntohl(cfm.t.ssta.s.mgPeerSta.peerAddrTbl.netAddr[i].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + + len = len + sprintf(prntBuf+len, "%s\n",PRNT_MG_PEER_STATE(cfm.t.ssta.s.mgPeerSta.peerState)); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + } + + len = len + sprintf(&prntBuf[0] + len,"\n"); stream->write_function(stream, "\n%s\n",&prntBuf[0]); @@ -190,6 +195,7 @@ switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, me switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; + int peerIdx = 0x00; int len = 0x00; MgMngmt cfm; char* xmlhdr = ""; @@ -204,13 +210,7 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_ memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); - - if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); - return SWITCH_STATUS_FALSE; - } - + idx = mg_cfg->idx; @@ -221,17 +221,26 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_ /****************************************************************************************************************/ /* Print Peer Information ***************************************************************************************/ - /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ - len = len + sprintf(&prntBuf[0] + len,"\n"); - len = len + sprintf(&prntBuf[0] + len,"\n",mg_peer->name); - /* send request to MEGACO Trillium stack to get peer information*/ - sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + for(peerIdx =0; peerIdx < mg_cfg->total_peers; peerIdx++){ - get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[peerIdx]); - len = len + sprintf(&prntBuf[0] + len,"\n"); + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[peerIdx],mg_cfg->name); + return SWITCH_STATUS_FALSE; + } + + len = len + sprintf(&prntBuf[0] + len,"\n",mg_peer->name); + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + + get_peer_xml_buffer(&prntBuf[0] + len, &cfm.t.ssta.s.mgPeerSta); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + } len = len + sprintf(&prntBuf[0] + len,"\n"); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index 591bb5f13d..d6fe2c5614 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -183,7 +183,6 @@ switch_status_t sng_mgco_cfg(megaco_profile_t* profile) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mgco_mu_ssap_config SUCCESS \n"); } - if(mgco_mg_tsap_config(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," mgco_mg_tsap_config FAILED \n"); return SWITCH_STATUS_FALSE; @@ -1001,7 +1000,7 @@ int mgco_mg_tsap_config(megaco_profile_t* profile) /* FILL TSAP config */ cfg->tSAPId = profile->idx; cfg->spId = profile->idx; - cfg->provType = mg_get_tpt_type(profile); + cfg->provType = LMG_PROV_TYPE_TUCL; /* FILL TUCL Information */ cfg->memId.region = S_REG; @@ -1045,7 +1044,7 @@ int mgco_mg_peer_config(megaco_profile_t* mg_cfg) Pst pst; /* Post for layer manager */ U32 peerIdx = 0; CmInetIpAddr ipAddr = 0; - mg_peer_profile_t* mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + mg_peer_profile_t* mg_peer = NULL; memset(&mgMngmt, 0, sizeof(mgMngmt)); cfg = &(mgMngmt.t.cfg.c.mgGcpEntCfg); @@ -1063,39 +1062,43 @@ int mgco_mg_peer_config(megaco_profile_t* mg_cfg) mgMngmt.hdr.elmId.elmnt = STGCPENT; cfg->numPeer = mg_cfg->total_peers; - cfg->peerCfg[peerIdx].sSAPId = mg_cfg->idx; /* SSAP ID */; - cfg->peerCfg[peerIdx].port = atoi(mg_peer->port); - cfg->peerCfg[peerIdx].tsapId = mg_cfg->idx; + for(peerIdx =0; peerIdx < mg_cfg->total_peers; peerIdx++){ - cfg->peerCfg[peerIdx].mtuSize = MG_MAX_MTU_SIZE; + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[peerIdx]); + cfg->peerCfg[peerIdx].sSAPId = mg_cfg->idx; /* SSAP ID */; + cfg->peerCfg[peerIdx].port = atoi(mg_peer->port); + cfg->peerCfg[peerIdx].tsapId = mg_cfg->idx; - cfg->peerCfg[peerIdx].peerAddrTbl.count = 1; - cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].type = - CM_NETADDR_IPV4; + cfg->peerCfg[peerIdx].mtuSize = MG_MAX_MTU_SIZE; - if(ROK == cmInetAddr((S8*)&mg_peer->ipaddr[0],&ipAddr)) - { - cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].u.ipv4NetAddr = ntohl(ipAddr); - } - else - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "cmInetAddr failed \n"); - cfg->peerCfg[peerIdx].peerAddrTbl.count = 0; - } + cfg->peerCfg[peerIdx].peerAddrTbl.count = 1; + cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].type = + CM_NETADDR_IPV4; + + if(ROK == cmInetAddr((S8*)&mg_peer->ipaddr[0],&ipAddr)) + { + cfg->peerCfg[peerIdx].peerAddrTbl.netAddr[0].u.ipv4NetAddr = ntohl(ipAddr); + } + else + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "cmInetAddr failed \n"); + cfg->peerCfg[peerIdx].peerAddrTbl.count = 0; + } #ifdef GCP_MG - cfg->peerCfg[peerIdx].transportType = mg_get_tpt_type_from_str(mg_peer->transport_type); - cfg->peerCfg[peerIdx].encodingScheme = mg_get_enc_type_from_str(mg_peer->encoding_type); - cfg->peerCfg[peerIdx].mgcPriority = 0; - cfg->peerCfg[peerIdx].useAHScheme = FALSE; - cfg->peerCfg[peerIdx].mid.pres = PRSNT_NODEF; - cfg->peerCfg[peerIdx].mid.len = strlen((char*)mg_peer->mid); - cmMemcpy((U8 *)cfg->peerCfg[peerIdx].mid.val, - (CONSTANT U8*)(char*)mg_peer->mid, - cfg->peerCfg[peerIdx].mid.len); + cfg->peerCfg[peerIdx].transportType = mg_get_tpt_type_from_str(mg_peer->transport_type); + cfg->peerCfg[peerIdx].encodingScheme = mg_get_enc_type_from_str(mg_peer->encoding_type); + cfg->peerCfg[peerIdx].mgcPriority = peerIdx; + cfg->peerCfg[peerIdx].useAHScheme = FALSE; + cfg->peerCfg[peerIdx].mid.pres = PRSNT_NODEF; + cfg->peerCfg[peerIdx].mid.len = strlen((char*)mg_peer->mid); + cmMemcpy((U8 *)cfg->peerCfg[peerIdx].mid.val, + (CONSTANT U8*)(char*)mg_peer->mid, + cfg->peerCfg[peerIdx].mid.len); #endif /* GCP_MG */ + } return(sng_cfg_mg(&pst, &mgMngmt)); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index ba5c20aabb..f174361f03 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -78,11 +78,12 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) goto done; } - count = 0x00; - event = NULL; for (mg_peer = switch_xml_child(mg_peers, "mg_peer"); mg_peer; mg_peer = mg_peer->next) { const char *name = switch_xml_attr_soft(mg_peer, "name"); for(idx=0; idxtotal_peers; idx++){ + count = 0x00; + event = NULL; + peer_profile = NULL; if (!strcmp(name, profile->peer_list[idx])) { /* peer profile */ peer_profile = switch_core_alloc(profile->pool, sizeof(*peer_profile)); @@ -93,7 +94,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) count = switch_event_import_xml(switch_xml_child(mg_peer, "param"), "name", "value", &event); if(SWITCH_STATUS_FALSE == (status = switch_xml_config_parse_event(event, count, reload, instructions1))){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Peer XML Parsing failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Peer XML Parsing failed \n"); goto done; } @@ -136,6 +137,7 @@ switch_status_t mg_config_cleanup(megaco_profile_t* profile) static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) { switch_xml_config_item_t *dup; + switch_xml_config_item_t instructions[] = { /* parameter name type reloadable pointer default value options structure */ SWITCH_CONFIG_ITEM("ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ipaddr, "", &switch_config_string_strdup, "", "Peer IP"), @@ -145,7 +147,7 @@ static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profil SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "peer message identifier "), SWITCH_CONFIG_ITEM_END() }; - + dup = malloc(sizeof(instructions)); memcpy(dup, instructions, sizeof(instructions)); return dup; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 30de4f86fc..ea6e9fe53b 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -118,7 +118,7 @@ void handle_sng_log(uint8_t level, char *fmt, ...) case SNG_LOGLEVEL_DEBUG: log_level = SWITCH_LOG_DEBUG; break; case SNG_LOGLEVEL_INFO: log_level = SWITCH_LOG_INFO; break; case SNG_LOGLEVEL_WARN: log_level = SWITCH_LOG_WARNING; break; - case SNG_LOGLEVEL_ERROR: log_level = SWITCH_LOG_DEBUG; break; + case SNG_LOGLEVEL_ERROR: log_level = SWITCH_LOG_ERROR; break; case SNG_LOGLEVEL_CRIT: log_level = SWITCH_LOG_CRIT; break; default: log_level = SWITCH_LOG_DEBUG; break; }; diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 23a94b9261..4a8107f859 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -502,7 +502,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi char name[128]; const char *dname = "PCMU"; uint32_t interval = 20; - crtp_private_t *tech_pvt; + crtp_private_t *tech_pvt = NULL; #if 0 const char *r_sdp = switch_event_get_header(var_event, kRSDP); #endif From 3693867388d241078a113ef1c37cdb9f95a23896 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 21 Jun 2012 19:22:14 +0530 Subject: [PATCH 269/493] adding TCP transport support --- src/mod/endpoints/mod_media_gateway/media_gateway_stack.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index d6fe2c5614..55fd3ee9b0 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -782,6 +782,8 @@ int mgco_mg_gen_config(void) cfg->noEDInst = 1; #endif /* CM_ABNF_MT_LIB */ + cfg->entType = LMG_ENT_GW; + #ifdef GCP_CH cfg->numBinsPeerCmdHl = 20; cfg->numBinsTransReqHl = 50; From 97d89de3fc5011168f7a5eb903316fb6d1221bed Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 21 Jun 2012 19:23:22 +0530 Subject: [PATCH 270/493] MEGACO over TCP support --- src/mod/endpoints/mod_media_gateway/media_gateway_stack.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index 55fd3ee9b0..0cec5a829e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -1310,7 +1310,6 @@ sng_mg_transport_types_e mg_get_tpt_type_from_str(char* tpt_type) if(!strcasecmp(tpt_type, "UDP")){ return SNG_MG_TPT_UDP; }else if(!strcasecmp(tpt_type,"TCP")){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "TCP Transport for H.248 Protocol Not Yet Supported \n"); return SNG_MG_TPT_TCP; }else if(!strcasecmp(tpt_type,"STCP")){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STCP Transport for H.248 Protocol Not Yet Supported \n"); From c5c7b09007bcbd767e507f86bc2cb69081936ed6 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 22 Jun 2012 11:35:00 -0400 Subject: [PATCH 271/493] Rolling back to find out what's breaking build --- conf/insideout/autoload_configs/modules.conf.xml | 2 +- conf/vanilla/autoload_configs/modules.conf.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/insideout/autoload_configs/modules.conf.xml b/conf/insideout/autoload_configs/modules.conf.xml index 8793a003ba..9970d7724d 100644 --- a/conf/insideout/autoload_configs/modules.conf.xml +++ b/conf/insideout/autoload_configs/modules.conf.xml @@ -60,7 +60,7 @@ - + diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 50353ac849..cb45a1598c 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -80,7 +80,7 @@ - + From adca0985a4274d7d67643d9549581f1743d13db9 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 22 Jun 2012 13:20:04 -0400 Subject: [PATCH 272/493] Rolling back to find out what's breaking build --- build/modules.conf.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index 2bdedc6237..e17118c6f6 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -8,10 +8,10 @@ applications/mod_spandsp #applications/mod_rad_auth dialplans/mod_dialplan_xml endpoints/mod_sofia -endpoints/mod_media_gateway +#endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket codecs/mod_sangoma_codec -event_handlers/mod_radius_cdr +#event_handlers/mod_radius_cdr From 607da0f56c1b7a1c9227d39b53a53ab9a4b9ceca Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 22 Jun 2012 17:05:15 -0400 Subject: [PATCH 273/493] ss7: adding ss7_iam_fwd_ind_hex as x-header and channel variables in hex format. Read the forward call indicator IE and print it into channel variable ss7_iam_fwd_ind_hex. If this variable exists, put it in the x-header. This implementation takes bits of A, CB, D, E, F, HG, I from the hex value. Bits of KJ, L, P-M are not taken and set to 0. The hex value is H-A-P-I, H is the highest bit to A, and next is P-I. I is the lowest bit in the whole field, and H is the highest bit in the whole field. Refer to Q.763 chapter 3.23. --- libs/freetdm/mod_freetdm/mod_freetdm.c | 5 ++ .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_main.h | 1 + .../ftmod_sangoma_ss7_support.c | 54 +++++++++++++++++-- 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index e889d1ebba..ed57b8c0c3 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1874,6 +1874,11 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_iam_fwd_ind_hex"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-IAM-FWD-IND-HEX", "%s", var_value); + } + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_access_transport_urlenc"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Access-Transport-URLENC", "%s", var_value); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 48e4bc4735..beacecc180 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -221,6 +221,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } + copy_fwdCallInd_hex_from_sngss7(ftdmchan, &siConEvnt->fwdCallInd); copy_access_transport_from_sngss7(ftdmchan, &siConEvnt->accTrnspt); copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index a6dde4d704..3b62f67850 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -926,6 +926,7 @@ ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPt ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd); +ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq); ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index b2edc2b497..bafd2d3f8d 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -88,7 +88,7 @@ FTDM_STR2ENUM(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_fl static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val); static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val); ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) ; - +ftdm_status_t hex_to_four_char(uint16_t in, char* out); /* Maps generic FreeTDM CPC codes to SS7 CPC codes */ ftdm2trillium_t cpc_codes[] = { @@ -976,6 +976,54 @@ ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) return FTDM_SUCCESS; } + +ftdm_status_t hex_to_four_char(uint16_t in, char* out) +{ + char val=0; + int mask = 0xf; + int i=0; + if (!out) { + return FTDM_SUCCESS; + } + + for (i=3; i>=0; i--) { + val = (in & (mask<<(4*i))) >> (4*i); + sprintf (out+(3-i), "%x", val); + } + + return FTDM_SUCCESS; +} + +ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) +{ + char val[5]; + uint16_t val_hex = 0; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + memset (val, 0, 5*sizeof(char)); + if (fwdCallInd->eh.pres != PRSNT_NODEF ) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No forward call indicator IE available\n"); + return FTDM_SUCCESS; + } + + val_hex |= fwdCallInd->natIntCallInd.val << 8; + val_hex |= (fwdCallInd->end2EndMethInd.val & 0x1) << 9; + val_hex |= ((fwdCallInd->end2EndMethInd.val & 0x2)>>1) << 10; + val_hex |= fwdCallInd->intInd.val << 11; + val_hex |= fwdCallInd->end2EndInfoInd.val << 12; + val_hex |= fwdCallInd->isdnUsrPrtInd.val << 13; + val_hex |= (fwdCallInd->isdnUsrPrtPrfInd.val & 0x1) << 14; + val_hex |= ((fwdCallInd->isdnUsrPrtPrfInd.val & 0x2)>>1) << 15; + + val_hex |= fwdCallInd->isdnAccInd.val; + hex_to_four_char(val_hex, val) ; + + sngss7_add_var(sngss7_info, "ss7_iam_fwd_ind_hex", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Forwad Call Indicator Hex: 0x%s\n", val); + + return FTDM_SUCCESS; +} + ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) { const char *val = NULL; @@ -1000,9 +1048,9 @@ ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd * SS7_ERROR ("Wrong value set in iam_fwd_ind_HEX variable. Please correct the error. Setting to default values.\n" ); } else { fwdCallInd->natIntCallInd.val = (val_hex & 0x100)>>8; - fwdCallInd->end2EndMethInd.val = (val_hex & 0x600)>>9; + fwdCallInd->end2EndMethInd.val = (val_hex & 0x600)>>9; fwdCallInd->intInd.val = (val_hex & 0x800)>>11; - fwdCallInd->end2EndInfoInd.val = (val_hex & 0x1000)>>12; + fwdCallInd->end2EndInfoInd.val = (val_hex & 0x1000)>>12; fwdCallInd->isdnUsrPrtInd.val = (val_hex & 0x2000)>>13; fwdCallInd->isdnUsrPrtPrfInd.val = (val_hex & 0xC000)>>14; fwdCallInd->isdnUsrPrtPrfInd.val = (fwdCallInd->isdnUsrPrtPrfInd.val==0x03)?0x0:fwdCallInd->isdnUsrPrtPrfInd.val; From fd634d6bc9ce57fdbf2c469b7dde6e8b6b21cd3f Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 22 Jun 2012 19:10:08 -0400 Subject: [PATCH 274/493] still figuring out lib --- .../mod_media_gateway/mod_media_gateway.c | 66 ++++++++++++++++--- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 4a3c32c9fe..1423df9cda 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -134,9 +134,6 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) { int i; -// XXX check if we can use that for debug: -// cmUnpkCmSdpInfoSet(<#CmSdpInfoSet *param#>, <#Ptr ptr#>, <#CmIntfVer intfVer#>, <#Buffer *mBuf#>); - if (sdp->numComp.pres == NOTPRSNT) { return; @@ -161,6 +158,7 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { CmSdpAttr *a = s->attrSet.attr[mediaId]; + } } @@ -177,12 +175,9 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); } - } } - } - } } @@ -191,6 +186,9 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) { size_t txnIter; + switch_memory_pool_t *pool; + + switch_core_new_memory_pool(&pool); /*TODO*/ if(msg->body.type.val == MGT_TXN) @@ -198,6 +196,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /* Loop over transaction list */ for(txnIter=0;txnIterbody.u.tl.num.val;txnIter++) { + switch(msg->body.u.tl.txns[txnIter]->type.val) { case MGT_TXNREQ: { @@ -223,12 +222,44 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) for (cmdIter=0; cmdIter < (actnReq->cl.num.val); cmdIter++) { MgMgcoCommandReq *cmdReq = actnReq->cl.cmds[cmdIter]; MgMgcoTermId *termId = NULLP; + /* The reply we'll send */ + MgMgcoCommand mgCmd = {0}; + mgCmd.peerId = msg->lcl.id; + mgCmd.transId = transId; + mgCmd.u.mgCmdInd[0] = cmdReq; + + + /* XXX Handle choose context before this */ + + mgCmd.contextId = ctxId; + mgCmd.transId = transId; + + mgCmd.cmdStatus.pres = PRSNT_NODEF; + + if(cmdIter == (actnReq->cl.num.val -1)) + { + mgCmd.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + if(axnIter == (txnReq->al.num.val-1)) + { + mgCmd.cmdStatus.val= CH_CMD_STATUS_END_OF_TXN; + } + } + else + { + mgCmd.cmdStatus.val = CH_CMD_STATUS_PENDING; + } + + /* XXX handle props */ + mgCmd.cmdType.pres = PRSNT_NODEF; + mgCmd.cmdType.val = CH_CMD_TYPE_REQ; + mgCmd.u.mgCmdReq[0] = cmdReq; + sng_mgco_send_cmd(suId, &mgCmd); + switch (cmdReq->cmd.type.val) { case MGT_ADD: { MgMgcoAmmReq *addReq = &cmdReq->cmd.u.add; - MgMgcoTermId termId = addReq->termId; int descId; for (descId = 0; descId < addReq->dl.num.val; descId++) { switch (addReq->dl.descs[descId]->type.val) { @@ -240,24 +271,28 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) switch (mediaPar->type.val) { case MGT_MEDIAPAR_LOCAL: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Textual SDP %s\n", mediaPar->u.local.sdpStr.pres ? "present" : "absent"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); break; } case MGT_MEDIAPAR_REMOTE: { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); break; } case MGT_MEDIAPAR_LOCCTL: { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); break; } case MGT_MEDIAPAR_TERMST: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); break; + } case MGT_MEDIAPAR_STRPAR: { MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Textual SDP %s\n", mgStream->sl.remote.sdpStr.pres ? "present" : "absent"); if (mgStream->sl.remote.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); @@ -269,6 +304,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) mgco_print_sdp(&mgStream->sl.local.sdp); } + break; } } @@ -285,6 +321,9 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) break; } } + + + break; } case MGT_MODIFY: @@ -316,6 +355,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) } case MGT_TXNREPLY: { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGT_TXNREPLY\n"); break; } default: @@ -324,18 +364,21 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) } } } + + switch_core_destroy_memory_pool(&pool); } /*****************************************************************************************************************************/ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); /*TODO*/ } /*****************************************************************************************************************************/ void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* sta) { - /*TODO*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); /*TODO*/ } /*****************************************************************************************************************************/ @@ -343,18 +386,21 @@ void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* sta) void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) { /*TODO*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); } /*****************************************************************************************************************************/ void handle_mgco_cntrl_cfm(Pst *pst, SuId suId, MgMgtCntrl* cntrl, Reason reason) { /*TODO*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); } /*****************************************************************************************************************************/ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason) { /*TODO*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); } /*****************************************************************************************************************************/ From e3eed73ecbe2687598983579bee78b2c202f327c Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 25 Jun 2012 12:12:04 +0530 Subject: [PATCH 275/493] adding mg and peer profile cleanup code during shutdown and removing "unused variables" warnings --- .../mod_media_gateway/media_gateway.c | 15 +++++++ .../mod_media_gateway/media_gateway_xml.c | 9 +++++ .../mod_media_gateway/mod_media_gateway.c | 39 ++++++++++++++++--- .../mod_media_gateway/mod_media_gateway.h | 2 + 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 98d433179e..3cd5856bd2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -107,6 +107,21 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) return SWITCH_STATUS_SUCCESS; } +switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopping peer profile: %s\n", (*profile)->name); + + switch_core_hash_delete_wrlock(megaco_globals.peer_profile_hash, (*profile)->name, megaco_globals.peer_profile_rwlock); + + mg_peer_config_cleanup(*profile); + + switch_core_destroy_memory_pool(&(*profile)->pool); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Stopped peer profile: %s\n", (*profile)->name); + + return SWITCH_STATUS_SUCCESS; +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 9e6b7fc1ad..c48032e30c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -133,6 +133,15 @@ switch_status_t mg_config_cleanup(megaco_profile_t* profile) return SWITCH_STATUS_SUCCESS; } +/****************************************************************************************************************************/ +switch_status_t mg_peer_config_cleanup(mg_peer_profile_t* profile) +{ + switch_xml_config_item_t *instructions = (profile ? get_peer_instructions(profile) : NULL); + switch_xml_config_cleanup(instructions); + + return SWITCH_STATUS_SUCCESS; +} + /****************************************************************************************************************************/ static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) { switch_xml_config_item_t *dup; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 1423df9cda..b056d91bba 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -97,6 +97,32 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) { + void *val = NULL; + const void *key = NULL; + switch_ssize_t keylen; + switch_hash_index_t *hi = NULL; + megaco_profile_t* profile = NULL; + mg_peer_profile_t* peer_profile = NULL; + + /* destroy all the mg profiles */ + while ((hi = switch_hash_first(NULL, megaco_globals.profile_hash))) { + switch_hash_this(hi, &key, &keylen, &val); + profile = (megaco_profile_t *) val; + megaco_profile_destroy(&profile); + profile = NULL; + } + + hi = NULL; + key = NULL; + val = NULL; + /* destroy all the mg peer profiles */ + while ((hi = switch_hash_first(NULL, megaco_globals.peer_profile_hash))) { + switch_hash_this(hi, &key, &keylen, &val); + peer_profile = (mg_peer_profile_t *) val; + megaco_peer_profile_destroy(&peer_profile); + peer_profile = NULL; + } + sng_mgco_stack_shutdown(); return SWITCH_STATUS_SUCCESS; @@ -156,7 +182,7 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) } if (s->attrSet.numComp.pres) { for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - CmSdpAttr *a = s->attrSet.attr[mediaId]; + /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ } @@ -221,9 +247,10 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /* Loop over command list */ for (cmdIter=0; cmdIter < (actnReq->cl.num.val); cmdIter++) { MgMgcoCommandReq *cmdReq = actnReq->cl.cmds[cmdIter]; - MgMgcoTermId *termId = NULLP; + /*MgMgcoTermId *termId = NULLP;*/ /* The reply we'll send */ - MgMgcoCommand mgCmd = {0}; + MgMgcoCommand mgCmd; + memset(&mgCmd, 0, sizeof(mgCmd)); mgCmd.peerId = msg->lcl.id; mgCmd.transId = transId; mgCmd.u.mgCmdInd[0] = cmdReq; @@ -328,18 +355,18 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) } case MGT_MODIFY: { - MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod; + /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ break; } case MGT_MOVE: { - MgMgcoAmmReq *addReq = &cmdReq->cmd.u.move; + /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.move;*/ break; } case MGT_SUB: { - MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub; + /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ } case MGT_SVCCHG: case MGT_NTFY: diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index d4c6e43077..8aa0dae0d3 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -84,6 +84,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload); switch_status_t sng_mgco_start(megaco_profile_t* profile); switch_status_t sng_mgco_stop(megaco_profile_t* profile); switch_status_t mg_config_cleanup(megaco_profile_t* profile); +switch_status_t mg_peer_config_cleanup(mg_peer_profile_t* profile); +switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile); switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream); From b6737e31a30afe9901f327b7b29120281c0e2754 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 25 Jun 2012 20:07:51 +0530 Subject: [PATCH 276/493] adding command handler to handle command indication from megaco stack --- .../mod_media_gateway/media_gateway_stack.c | 2 + .../mod_media_gateway/media_gateway_stack.h | 8 + .../mod_media_gateway/media_gateway_xml.c | 6 +- .../mod_media_gateway/mod_media_gateway.c | 296 +++++++++++++++++- 4 files changed, 307 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index 0cec5a829e..8a300ff97e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -945,6 +945,8 @@ int mgco_mg_ssap_config(megaco_profile_t* profile) return SWITCH_STATUS_FALSE; } + pCfg->chEnabled = 0x01; + pCfg->userInfo.pres.pres = PRSNT_NODEF; pCfg->userInfo.id.pres = NOTPRSNT; pCfg->userInfo.mid.pres = PRSNT_NODEF; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 9bbe90b7df..6c2cbc7abd 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -62,4 +62,12 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); +/****************************************************************************************************************/ +/* MG Stack defines */ + +/* Free Commands inside MG CH command */ +#define mg_free_cmd(_cmd) mgFreeEventMem(_cmd) + +/****************************************************************************************************************/ + #endif /* _MEGACO_STACK_H_ */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index c48032e30c..f1259ed544 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -27,6 +27,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) char *var, *val; mg_peer_profile_t* peer_profile = NULL; switch_xml_config_item_t *instructions1 = NULL; + switch_memory_pool_t *pool; if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); @@ -86,8 +87,9 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) peer_profile = NULL; if (!strcmp(name, profile->peer_list[idx])) { /* peer profile */ - peer_profile = switch_core_alloc(profile->pool, sizeof(*peer_profile)); - peer_profile->pool = profile->pool; + switch_core_new_memory_pool(&pool); + peer_profile = switch_core_alloc(pool, sizeof(*peer_profile)); + peer_profile->pool = pool; peer_profile->name = switch_core_strdup(peer_profile->pool, name); switch_thread_rwlock_create(&peer_profile->rwlock, peer_profile->pool); instructions1 = (peer_profile ? get_peer_instructions(peer_profile) : NULL); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index b056d91bba..56d40ec41d 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -9,12 +9,18 @@ #include "mod_media_gateway.h" #include "media_gateway_stack.h" + +/**************************************************************************************************************/ struct megaco_globals megaco_globals; static sng_mg_event_interface_t sng_event; +/**************************************************************************************************************/ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); +switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); + +/**************************************************************************************************************/ SWITCH_STANDARD_API(megaco_function) { @@ -247,7 +253,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /* Loop over command list */ for (cmdIter=0; cmdIter < (actnReq->cl.num.val); cmdIter++) { MgMgcoCommandReq *cmdReq = actnReq->cl.cmds[cmdIter]; - /*MgMgcoTermId *termId = NULLP;*/ + /*MgMgcoTermId *term_id = NULLP;*/ /* The reply we'll send */ MgMgcoCommand mgCmd; memset(&mgCmd, 0, sizeof(mgCmd)); @@ -398,8 +404,81 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /*****************************************************************************************************************************/ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); - /*TODO*/ + uint32_t txn_id = 0x00; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); + + /* validate Transaction Id */ + if (NOTPRSNT != cmd->transId.pres) + txn_id = cmd->transId.val; + else + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Transaction Id not present, rejecting\n", __PRETTY_FUNCTION__); + /*TODO - can invoke "MgUiMgtMgcoErrReq" to report error to MEGACO stack */ + /* deallocate the msg */ + mg_free_cmd(cmd); + return ; + } + + mgAccEvntPrntMgMgcoCommand(cmd, stdout); + + switch(cmd->cmdType.val) + { + case CH_CMD_TYPE_IND: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command indication for command[%s]\n", + __PRETTY_FUNCTION__,PRNT_MG_CMD(cmd->u.mgCmdInd[0]->cmd.type.val)); + + switch(cmd->u.mgCmdInd[0]->cmd.type.val) + { + case MGT_ADD: + { + handle_mg_add_cmd(&cmd->u.mgCmdInd[0]->cmd.u.add); + break; + } + + case MGT_MODIFY: + { + /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ + break; + } + case MGT_MOVE: + { + /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.move;*/ + break; + + } + case MGT_SUB: + { + /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ + } + case MGT_SVCCHG: + case MGT_NTFY: + case MGT_AUDITCAP: + case MGT_AUDITVAL: + break; + } + + break; + } + case CH_CMD_TYPE_REQ: + { + break; + } + case CH_CMD_TYPE_RSP: + { + break; + } + case CH_CMD_TYPE_CFM: + { + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid command type[%d]\n",cmd->cmdType.val); + return; + } + + return; } /*****************************************************************************************************************************/ @@ -430,7 +509,218 @@ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); } + /*****************************************************************************************************************************/ +/* +* +* Fun: mg_get_term_id_list +* +* Desc: Utility function to get MgMgcoTermIdLst structure +* from MgMgcoCommand structure. +* GCP_VER_2_1 - we will have term id list instead of single term id +* +* Ret: If success, return pointer to MgMgcoTermIdLst. +* If failure, return Null. +* +* Notes: None +* +*/ + +MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) +{ + uint8_t cmd_type = MGT_NONE; + uint8_t api_type = CM_CMD_TYPE_NONE; + MgMgcoTermIdLst * term_id = NULL; + + + /*-- mgCmdInd type represents the data structure for both + * incoming and outgoing requests, hence we can get the + * command type from there itself --*/ + cmd_type = cmd->u.mgCmdInd[0]->cmd.type.val; + + /*-- Find apiType --*/ + api_type = cmd->cmdType.val; + + switch (api_type) + { + case CH_CMD_TYPE_REQ: + case CH_CMD_TYPE_IND: + /* Based on Command Type, get to the TermId structure */ + switch (cmd_type) + { + case MGT_ADD: + if (cmd->u.mgCmdInd[0]->cmd.u.add.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.add.termIdLst; + break; + + case MGT_MOVE: + if (cmd->u.mgCmdInd[0]->cmd.u.move.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.move.termIdLst; + break; + + case MGT_MODIFY: + if (cmd->u.mgCmdInd[0]->cmd.u.mod.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.mod.termIdLst; + break; + + case MGT_SUB: + if (cmd->u.mgCmdInd[0]->cmd.u.sub.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.sub.termIdLst; + break; + + case MGT_AUDITCAP: + if (cmd->u.mgCmdInd[0]->cmd.u.acap.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.acap.termIdLst; + break; + + case MGT_AUDITVAL: + if (cmd->u.mgCmdInd[0]->cmd.u.aval.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.aval.termIdLst; + break; + + case MGT_NTFY: + if (cmd->u.mgCmdInd[0]->cmd.u.ntfy.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.ntfy.termIdLst; + break; + + case MGT_SVCCHG: + if (cmd->u.mgCmdInd[0]->cmd.u.svc.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.svc.termIdLst; + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + break; + } + break; + + case CH_CMD_TYPE_RSP: + case CH_CMD_TYPE_CFM: + + cmd_type = cmd->u.mgCmdRsp[0]->type.val; + + switch (cmd_type) + { + case MGT_ADD: + if (cmd->u.mgCmdRsp[0]->u.add.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.add.termIdLst; + break; + + case MGT_MOVE: + if (cmd->u.mgCmdRsp[0]->u.move.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.move.termIdLst; + break; + + case MGT_MODIFY: + if (cmd->u.mgCmdRsp[0]->u.mod.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.mod.termIdLst; + break; + + case MGT_SUB: + if (cmd->u.mgCmdRsp[0]->u.sub.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.sub.termIdLst; + break; + + case MGT_SVCCHG: + if (cmd->u.mgCmdRsp[0]->u.svc.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.svc.termIdLst; + break; + + case MGT_AUDITVAL: + if (cmd->u.mgCmdRsp[0]->u.aval.u.other.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.aval.u.other.termIdLst; + break; + + case MGT_AUDITCAP: + if (cmd->u.mgCmdRsp[0]->u.acap.u.other.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.acap.u.other.termIdLst; + break; + + case MGT_NTFY: + if (cmd->u.mgCmdRsp[0]->u.ntfy.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.ntfy.termIdLst; + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + } /* switch command type for reply */ + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); + break; + } /* switch -api_type */ + + return (term_id); +} + +/*****************************************************************************************************************************/ + +switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) +{ + int descId; + for (descId = 0; descId < addReq->dl.num.val; descId++) { + switch (addReq->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + break; + } + case MGT_MEDIAPAR_REMOTE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + break; + } + + case MGT_MEDIAPAR_LOCCTL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); + break; + } + case MGT_MEDIAPAR_TERMST: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + break; + } + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_print_sdp(&mgStream->sl.remote.sdp); + } + + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_print_sdp(&mgStream->sl.local.sdp); + } + + break; + } + } + } + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_REQEVTDESC: + case MGT_EVBUFDESC: + case MGT_SIGNALSDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + } + } + + return SWITCH_STATUS_SUCCESS; +} /*****************************************************************************************************************************/ From e777de3eefc161e32709534ae63454a8f20d0c5f Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 26 Jun 2012 13:05:23 +0530 Subject: [PATCH 277/493] adding mg stack add command code and sendign dummy rsp of add --- .../mod_media_gateway/mod_media_gateway.c | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 56d40ec41d..d24fa93008 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -19,6 +19,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); +switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); +switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); /**************************************************************************************************************/ @@ -434,6 +439,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_ADD: { handle_mg_add_cmd(&cmd->u.mgCmdInd[0]->cmd.u.add); + mg_send_add_rsp(suId, cmd); break; } @@ -493,6 +499,9 @@ void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) { /*TODO*/ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); + + /*dump information*/ + /*mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout);*/ } /*****************************************************************************************************************************/ @@ -719,9 +728,180 @@ switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) } } + return SWITCH_STATUS_SUCCESS; } + +/*****************************************************************************************************************************/ +switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) +{ + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; + cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; + + + cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); + +#ifdef GCP_VER_2_1 + termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; +#else + termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); +#endif + mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + cmd.cmdStatus.pres = PRSNT_NODEF; + cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + cmd.cmdType.pres = PRSNT_NODEF; + cmd.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &cmd); + + + return ret; +} + +/*****************************************************************************************************************************/ +switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) +{ + Mem sMem; + + sMem.region = 0; + sMem.pool = 0; + + if ( _memSize <= 0 ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); + return SWITCH_STATUS_FALSE; + } + + if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",_memSize); + return SWITCH_STATUS_FALSE; + } + + // Note: memset done inside stack api + + return SWITCH_STATUS_SUCCESS; +} + +switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) +{ + if ( _memSize <= 0 ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); + return SWITCH_STATUS_FALSE; + } + + if ( !msg ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + return SWITCH_STATUS_FALSE; + } + + if ( cmGetMem( (Ptr)msg, _memSize, (Ptr*)_memPtr ) != ROK ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", _memSize ); + return SWITCH_STATUS_FALSE; + } + + // Note: memset done inside stack api + + return SWITCH_STATUS_SUCCESS; +} + + +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) +{ + if ( !msg ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + return SWITCH_STATUS_FALSE; + } + + cmFreeMem( (Ptr)msg ); + + return SWITCH_STATUS_SUCCESS; +} + +#define MG_ACC_GETMEM(_ptr,_len,_memCp,_ret) \ +{ \ + ret = cmGetMem((_memCp), (_len), (Ptr *)&(_ptr)); \ + if( ret == ROK) \ + cmMemset((U8 *)(_ptr), (U8)0, (PTR)(_len)); \ +} + + +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp) +{ +#ifdef GCP_ASN + Size size; +#endif + S16 ret = ROK; + + termId->name.pres.pres = PRSNT_NODEF; + /* mg011.105: Bug fixes */ + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = cmStrlen((CONSTANT U8*)str); + MG_ACC_GETMEM((termId->name.lcl.val), termId->name.lcl.len, memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)str,termId->name.lcl.len); + +#ifdef GCP_ASN + /* Remove comment to fill other term ID + termId->wildcard.num.pres = NOTPRSNT; */ + /* Remove comment to fill wilcard term ID */ + termId->wildcard.num.pres = PRSNT_NODEF; + termId->wildcard.num.val = 1; + size = ((sizeof(MgMgcoWildcardField*))); + MG_ACC_GETMEM((termId->wildcard.wildcard),size,memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + MG_ACC_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), + memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; + termId->wildcard.wildcard[0]->len = 1; + termId->wildcard.wildcard[0]->val[0] = 0x55; +#endif /* GCP_ASN */ + + RETVALUE(ROK); +} + + /*****************************************************************************************************************************/ /* For Emacs: From c82c11b02a3dc54e1a68ed29bd3c5024dc4dd603 Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 26 Jun 2012 17:45:01 +0530 Subject: [PATCH 278/493] adding code to send add response --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index d24fa93008..bca39abb30 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -739,6 +739,7 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) MgMgcoCommand cmd; int ret = 0x00; MgMgcoTermId *termId; + MgMgcoCtxt ctxt; memset(&cmd,0, sizeof(cmd)); @@ -784,6 +785,12 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) ret = sng_mgco_send_cmd(suId, &cmd); + memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); return ret; } From fcaeb37cfd3c0c8aa70992223702c1b325288c67 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 26 Jun 2012 21:25:56 -0400 Subject: [PATCH 279/493] further rollback --- build/modules.conf.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index 2bdedc6237..e93ce2c677 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -5,13 +5,10 @@ applications/mod_dptools applications/mod_commands applications/mod_hash applications/mod_spandsp -#applications/mod_rad_auth dialplans/mod_dialplan_xml endpoints/mod_sofia -endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket codecs/mod_sangoma_codec -event_handlers/mod_radius_cdr From 80f72823b3a0427b6b24851e146984976e0e799a Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 27 Jun 2012 12:31:35 -0400 Subject: [PATCH 280/493] ss7: add ss7_iam_nature_connection_hex to support Nature of Connection Indicator in IAM message. - ss7_iam_nature_connection_hex is the channel variable to carry HEX value from/to IAM message - X-FreeTDM-IAM-NATURE-CONN-HEX is the x-header string to carry HEX value from/to sip invite message - This IE is 8 bit hex, which turns into 2 chars - Only Satellite indicator, Continuity check indicator, and Echo control device indicator are supported. Spare value are not taken. Spare value is always set to all zero. - example: To set 00010101 (bit H-A), set X-FreeTDM-IAM-NATURE-CONN-HEX string value to 15 in the sip invite message to NSG. When NSG send out sip invite, if the incoming IAM message comes with Nature of Connection IE, NSG will put X-FreeTDM-IAM-NATURE-CONN-HEX in the invite x-header. For example, if the IE value is 00001010 in the IAM, NSG will send X-FreeTDM-IAM-NATURE-CONN-HEX with value string of "0A". - Two characters are madatory. "0A" must be specified rather than "A". If invalid format or characters are found, this x-header will be ommited. - Valid characters include 0-9, A-F, and a-f --- libs/freetdm/mod_freetdm/mod_freetdm.c | 11 ++ .../ftmod_sangoma_ss7_handle.c | 1 + .../ftmod_sangoma_ss7_main.h | 2 + .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c | 4 + .../ftmod_sangoma_ss7_support.c | 130 ++++++++++++++++++ 5 files changed, 148 insertions(+) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index ed57b8c0c3..a3e9fd4568 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1558,6 +1558,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (sipvar) { ftdm_usrmsg_add_var(&usrmsg, "ss7_iam_fwd_ind_hex", sipvar); } + + sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-IAM-NATURE-CONN-HEX"); + if (sipvar) { + ftdm_usrmsg_add_var(&usrmsg, "ss7_iam_nature_connection_hex", sipvar); + } } if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) { @@ -1873,7 +1878,13 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-NADI", "%d", channel_caller_data->rdnis.type); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc)); + + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_iam_nature_connection_hex"); + if (!ftdm_strlen_zero(var_value)) { + switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-IAM-NATURE-CONN-HEX", "%s", var_value); + } + var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_iam_fwd_ind_hex"); if (!ftdm_strlen_zero(var_value)) { switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-IAM-FWD-IND-HEX", "%s", var_value); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index beacecc180..a4802b1853 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -221,6 +221,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ } else { SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " "); } + copy_NatureOfConnection_from_sngss7(ftdmchan, &siConEvnt->natConInd); copy_fwdCallInd_hex_from_sngss7(ftdmchan, &siConEvnt->fwdCallInd); copy_access_transport_from_sngss7(ftdmchan, &siConEvnt->accTrnspt); copy_ocn_from_sngss7(ftdmchan, &siConEvnt->origCdNum); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h index 3b62f67850..1e064f2522 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h @@ -930,6 +930,8 @@ ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCal ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq); ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA); +ftdm_status_t copy_NatureOfConnection_from_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd ); +ftdm_status_t copy_NatureOfConnection_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd); ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c index bf693c0999..4f177a3957 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c @@ -163,6 +163,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) copy_ocn_to_sngss7(ftdmchan, &iam.origCdNum); copy_access_transport_to_sngss7(ftdmchan, &iam.accTrnspt); + + copy_NatureOfConnection_to_sngss7(ftdmchan, &iam.natConInd); } else { /* Nature of Connection Indicators */ copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd); @@ -209,6 +211,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) This will overwirte the IE value set be above old implementation. */ copy_access_transport_to_sngss7(ftdmchan, &iam.accTrnspt); + + copy_NatureOfConnection_to_sngss7(ftdmchan, &iam.natConInd); SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d), loc = %s (NADI=%d)\n", sngss7_info->circuit->cic, diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index bafd2d3f8d..2f4c18d4c3 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -90,6 +90,10 @@ static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) ; ftdm_status_t hex_to_four_char(uint16_t in, char* out); + +ftdm_status_t hex_to_char(uint16_t in, char* out, int len); +ftdm_status_t char_to_hex(const char* in, uint16_t* out, int len); + /* Maps generic FreeTDM CPC codes to SS7 CPC codes */ ftdm2trillium_t cpc_codes[] = { {FTDM_CPC_UNKNOWN, CAT_UNKNOWN}, @@ -976,7 +980,79 @@ ftdm_status_t four_char_to_hex(const char* in, uint16_t* out) return FTDM_SUCCESS; } +ftdm_status_t char_to_hex(const char* in, uint16_t* out, int len) +{ + int i= len; + char *val = ftdm_malloc(len*sizeof(char)); + + if (!val ||!in || len>strlen(in)) { + return FTDM_FAIL; + } + + while(i) + { + switch((char)*(in+(len-i))) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + *(val+(len-i)) = *(in+(len-i)) - 48; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + *(val+(len-i)) = *(in+(len-i)) - 55; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + *(val+(len-i)) = *(in+(len-i)) - 87; + break; + default: + SS7_ERROR("Invalid character found when decoding hex string, %c!\n", *(in+(len-i)) ); + break; + } + i--; + }; + for (i=0; i<=len-1; i++) { + *out = *out << 4; + *out |= *(val+i); + } + + return FTDM_SUCCESS; +} + + + +ftdm_status_t hex_to_char(uint16_t in, char* out, int len) +{ + char val=0; + int mask = 0xf; + int i=0; + if (!out) { + return FTDM_SUCCESS; + } + + for (i=len-1; i>=0; i--) { + val = (in & (mask<<(4*i))) >> (4*i); + sprintf (out+(len-1-i), "%x", val); + } + + return FTDM_SUCCESS; +} ftdm_status_t hex_to_four_char(uint16_t in, char* out) { char val=0; @@ -994,6 +1070,60 @@ ftdm_status_t hex_to_four_char(uint16_t in, char* out) return FTDM_SUCCESS; } +ftdm_status_t copy_NatureOfConnection_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd) +{ + const char *val = NULL; + + natConInd->eh.pres = PRSNT_NODEF; + natConInd->satInd.pres = PRSNT_NODEF; + natConInd->contChkInd.pres = PRSNT_NODEF;; + natConInd->echoCntrlDevInd.pres = PRSNT_NODEF; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_nature_connection_hex"); + if (!ftdm_strlen_zero(val)) { + uint16_t val_hex = 0; + if (char_to_hex (val, &val_hex, 2) == FTDM_FAIL) { + SS7_ERROR ("Wrong value set in ss7_iam_nature_connection_hex variable. Please correct the error. Setting to default values.\n" ); + } else { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "hex = 0x%x\n", val_hex); + natConInd->satInd.val = (val_hex & 0x3); + natConInd->contChkInd.val = (val_hex & 0xc)>>2; + natConInd->echoCntrlDevInd.val = (val_hex & 0x10) >> 4; + + return FTDM_SUCCESS; + } + } + + natConInd->satInd.val = 0; + natConInd->contChkInd.val = 0; + natConInd->echoCntrlDevInd.val = 0; + + return FTDM_SUCCESS; +} + +ftdm_status_t copy_NatureOfConnection_from_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd ) +{ + char val[3]; + uint16_t val_hex = 0; + sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; + + memset (val, 0, 3*sizeof(char)); + if (natConInd->eh.pres != PRSNT_NODEF ) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No nature of connection indicator IE available\n"); + return FTDM_SUCCESS; + } + + val_hex |= natConInd->satInd.val; + val_hex |= natConInd->contChkInd.val << 2; + val_hex |= natConInd->echoCntrlDevInd.val <<4; + hex_to_char(val_hex, val, 2) ; + + sngss7_add_var(sngss7_info, "ss7_iam_nature_connection_hex", val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Nature of connection indicator Hex: 0x%s\n", val); + + return FTDM_SUCCESS; +} + ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd) { char val[5]; From cd61d0b59edd8845daf2533ef7bc6d3059766551 Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 29 Jun 2012 21:51:15 +0530 Subject: [PATCH 281/493] adding code to send error response back to MG stack,in case of any app failure --- .../mod_media_gateway/media_gateway_stack.h | 29 ++++++ .../mod_media_gateway/media_gateway_xml.c | 5 +- .../mod_media_gateway/mod_media_gateway.c | 93 ++++++++++++++++++- 3 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 6c2cbc7abd..328806b746 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -43,6 +43,35 @@ typedef enum{ (_val == SNG_MG_ENCODING_BINARY)?"SNG_MG_ENCODING_BINARY":\ "SNG_MG_ENCODING_NONE") +typedef struct _mgStr +{ + U8 len; + U8 val[128]; +} MgStr; + +#define MG_TXN_INVALID 0 + +#define mg_zero(_buf, _size) {cmMemset((U8 *)(_buf), 0, _size);} + +/* Set pres field */ +#define mg_util_set_pres(_pres) \ + (_pres) = PRSNT_NODEF; + +/* Set token value */ +#define mg_util_set_val_pres(tkn,_val) \ + mg_util_set_pres((tkn).pres); \ + (tkn).val = _val; + + +#define mg_mem_copy(_dst, _src, _len) \ + cmMemcpy((U8*) (_dst), (const U8*) (_src), _len) + +#define mg_get_mem(_memPtr, _size, _allocPtr, ret) \ +{ \ + (*ret) = cmGetMem((Ptr *)(_memPtr),(_size) ,(Ptr *)&(_allocPtr)); \ +} + + void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index f1259ed544..5acba0d954 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -153,7 +153,7 @@ static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profil /* parameter name type reloadable pointer default value options structure */ SWITCH_CONFIG_ITEM("ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ipaddr, "", &switch_config_string_strdup, "", "Peer IP"), SWITCH_CONFIG_ITEM("port", SWITCH_CONFIG_STRING, 0, &profile->port, "", &switch_config_string_strdup, "", "peer port"), - SWITCH_CONFIG_ITEM("encoding-scheme", SWITCH_CONFIG_STRING, 0, &profile->encoding_type, "TEXT", &switch_config_string_strdup, "", "peer encoding type"), + SWITCH_CONFIG_ITEM("encoding-scheme", SWITCH_CONFIG_STRING, 0, &profile->encoding_type, "", &switch_config_string_strdup, "", "peer encoding type"), SWITCH_CONFIG_ITEM("transport-type", SWITCH_CONFIG_STRING, 0, &profile->transport_type, "", &switch_config_string_strdup, "", "peer transport type "), SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "peer message identifier "), SWITCH_CONFIG_ITEM_END() @@ -239,6 +239,7 @@ static switch_status_t modify_mid(char* mid) } if(('<' == val[0][0]) || ('[' == val[0][0])){ + free(dup); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID[%s] is already prefixed with proper brackets \n",mid); return SWITCH_STATUS_SUCCESS; } @@ -256,7 +257,7 @@ static switch_status_t modify_mid(char* mid) sprintf(mid,"[%s]",dup); }else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); - free(dup); + free(dup); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index bca39abb30..d549becc70 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -24,6 +24,8 @@ switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); +void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); +switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); /**************************************************************************************************************/ @@ -410,6 +412,10 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { uint32_t txn_id = 0x00; + MgMgcoInd *mgErr; + MgStr errTxt; + MgMgcoContextId ctxtId; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); @@ -419,7 +425,20 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Transaction Id not present, rejecting\n", __PRETTY_FUNCTION__); - /*TODO - can invoke "MgUiMgtMgcoErrReq" to report error to MEGACO stack */ + + /*-- Send Error to MG Stack --*/ + mg_zero(&ctxtId, sizeof(MgMgcoContextId)); + ctxtId.type.pres = NOTPRSNT; + ctxtId.val.pres = NOTPRSNT; + + mg_util_set_txn_string(&errTxt, &txn_id); + + if (SWITCH_STATUS_FALSE == mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, + MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER, &errTxt)) + { + sng_mgco_send_err(suId, mgErr); + } + /* deallocate the msg */ mg_free_cmd(cmd); return ; @@ -908,6 +927,78 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp RETVALUE(ROK); } +switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) +{ + MgMgcoInd *mgErr; + S16 ret; + + mgErr = NULLP; + ret = ROK; + + /* Allocate for AG error */ + mg_stack_alloc_mem((Ptr*)&mgErr, sizeof(MgMgcoInd)); + if (NULL == mgErr) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + return SWITCH_STATUS_FALSE; + } + + /* Set transaction Id in the error request */ + mg_util_set_val_pres(mgErr->transId, trans_id); + + /* Copy the context Id */ + mg_mem_copy(&mgErr->cntxtId, + ctxt_id, + sizeof(MgMgcoContextId)); + + /* Set the peerId */ + mgErr->peerId.pres = NOTPRSNT; + + /* Set the error code */ + mg_util_set_pres(mgErr->err.pres.pres); + mg_util_set_pres(mgErr->err.code.pres); + mg_util_set_val_pres(mgErr->err.code, err); + + if(errTxt->len) + { + mg_get_mem(&mgErr->memCp, (errTxt->len)*sizeof(U8), mgErr->err.text.val, &ret); + if (ROK != ret) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + return SWITCH_STATUS_FALSE; + } + mgErr->err.text.pres = PRSNT_NODEF; + mgErr->err.text.len = errTxt->len; + mg_mem_copy(mgErr->err.text.val, errTxt->val, errTxt->len); + } + + /* Set the output value */ + *errcmd = mgErr; + + return SWITCH_STATUS_SUCCESS; +} + +void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) +{ + mg_zero((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; + + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + + if (MG_TXN_INVALID == txnId ) + { + mg_mem_copy((&errTxt->val[errTxt->len]), "TransactionId=0", 15); + errTxt->len += 15; + } + + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); + +} + + /*****************************************************************************************************************************/ From 24a458683a3e6a0f9390e5ab7318f4cd0b14788e Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 29 Jun 2012 12:54:09 -0400 Subject: [PATCH 282/493] Skip filling locPtyNum if caller_data->loc.digits is NULL --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2f4c18d4c3..867a8f7c07 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -247,13 +247,14 @@ ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *loc { const char *val = NULL; const char *loc_nadi = NULL; - int pres_val = PRSNT_NODEF; + int pres_val = PRSNT_NODEF; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; if (!strcasecmp(caller_data->loc.digits, "NULL")) { pres_val = NOTPRSNT; + return FTDM_SUCCESS; } locPtyNum->eh.pres = pres_val; From 658ce0ba91f39eb062ba32f7efbcd18929cef818 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 29 Jun 2012 16:30:51 -0400 Subject: [PATCH 283/493] work out contexts, cleanup rtp endpoint in preparation for mg-based setup --- .../mod_media_gateway/media_gateway.c | 100 ++++- .../mod_media_gateway/media_gateway_xml.c | 2 + .../mod_media_gateway/mod_media_gateway.c | 198 ++++++--- .../mod_media_gateway/mod_media_gateway.h | 65 ++- src/mod/endpoints/mod_sofia/rtp.c | 395 +----------------- 5 files changed, 302 insertions(+), 458 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3cd5856bd2..e618b5ef6c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -46,6 +46,97 @@ void megaco_peer_profile_release(mg_peer_profile_t *profile) switch_thread_rwlock_unlock(profile->rwlock); } +mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) +{ + mg_context_t *result = NULL; + + if (context_id > MG_MAX_CONTEXTS) { + return NULL; + } + + switch_thread_rwlock_rdlock(profile->contexts_rwlock); + + /* Context exists */ + if (profile->contexts_bitmap[context_id % 8] & (1 << (context_id / 8))) { + for (result = profile->contexts[context_id % MG_CONTEXT_MODULO]; result; result = result->next) { + if (result->context_id == context_id) { + break; + } + } + } + + switch_thread_rwlock_unlock(profile->contexts_rwlock); + + return result; +} + +/* Returns a fresh new context */ +mg_context_t *megaco_choose_context(megaco_profile_t *profile) +{ + mg_context_t *ctx; + + switch_thread_rwlock_wrlock(profile->contexts_rwlock); + /* Try the next one */ + if (profile->next_context_id >= MG_MAX_CONTEXTS) { + profile->next_context_id = 1; + } + + /* Look for an available context */ + for (; profile->next_context_id < MG_MAX_CONTEXTS; profile->next_context_id++) { + if ((profile->contexts_bitmap[profile->next_context_id % 8] & (1 << (profile->next_context_id / 8))) == 0) { + /* Found! */ + profile->contexts_bitmap[profile->next_context_id % 8] |= 1 << (profile->next_context_id / 8); + int i = profile->next_context_id % MG_CONTEXT_MODULO; + ctx = malloc(sizeof *ctx); + ctx->context_id = profile->next_context_id; + ctx->profile = profile; + + if (!profile->contexts[i]) { + profile->contexts[i] = ctx; + } else { + mg_context_t *it; + for (it = profile->contexts[i]; it && it->next; it = it->next) + ; + it->next = ctx; + } + + profile->next_context_id++; + break; + } + } + + switch_thread_rwlock_unlock(profile->contexts_rwlock); + + return ctx; +} + +void megaco_release_context(mg_context_t *ctx) +{ + uint32_t context_id = ctx->context_id; + megaco_profile_t *profile = ctx->profile; + int i = context_id % MG_CONTEXT_MODULO; + + switch_thread_rwlock_wrlock(profile->contexts_rwlock); + if (profile->contexts[i] == ctx) { + profile->contexts[i] = ctx->next; + } else { + mg_context_t *it = profile->contexts[i]->next, *prev = profile->contexts[i]; + for (; it; prev = it, it = it->next) { + if (it == ctx) { + prev->next = it->next; + break; + } + } + } + + profile->contexts_bitmap[context_id % 8] &= ~(1 << (context_id / 8)); + + memset(ctx, 0, sizeof *ctx); + free(ctx); + + switch_thread_rwlock_unlock(profile->contexts_rwlock); +} + switch_status_t megaco_profile_start(const char *profilename) { switch_memory_pool_t *pool; @@ -59,9 +150,14 @@ switch_status_t megaco_profile_start(const char *profilename) profile = switch_core_alloc(pool, sizeof(*profile)); profile->pool = pool; profile->name = switch_core_strdup(pool, profilename); + profile->next_context_id++; switch_thread_rwlock_create(&profile->rwlock, pool); + + switch_thread_rwlock_create(&profile->contexts_rwlock, pool); +// switch_core_hash_init(&profile->contexts_hash, pool); + if (SWITCH_STATUS_SUCCESS != config_profile(profile, SWITCH_FALSE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error configuring profile %s\n", profile->name); goto fail; @@ -94,6 +190,8 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) if(SWITCH_STATUS_FALSE == sng_mgco_stop((*profile))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error stopping MEGACO Stack for profile %s\n", (*profile)->name); } + + /* TODO: Cleanup contexts */ switch_thread_rwlock_unlock((*profile)->rwlock); @@ -104,7 +202,7 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) switch_core_destroy_memory_pool(&(*profile)->pool); - return SWITCH_STATUS_SUCCESS; + return SWITCH_STATUS_SUCCESS; } switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index f1259ed544..3eee1504d8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -131,6 +131,7 @@ switch_status_t mg_config_cleanup(megaco_profile_t* profile) { switch_xml_config_item_t *instructions = (profile ? get_instructions(profile) : NULL); switch_xml_config_cleanup(instructions); + free(instructions); return SWITCH_STATUS_SUCCESS; } @@ -140,6 +141,7 @@ switch_status_t mg_peer_config_cleanup(mg_peer_profile_t* profile) { switch_xml_config_item_t *instructions = (profile ? get_peer_instructions(profile) : NULL); switch_xml_config_cleanup(instructions); + free(instructions); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index bca39abb30..b9f38fb798 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -18,7 +18,7 @@ static sng_mg_event_interface_t sng_event; SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); +switch_status_t handle_mg_add_cmd(SuId suId, MgMgcoCommand *req, MgMgcoAmmReq *addReq); switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); @@ -195,7 +195,6 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ - } } @@ -218,6 +217,74 @@ static void mgco_print_sdp(CmSdpInfoSet *sdp) } } + +static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet *sdp) +{ + int i; + CmSdpInfoSet *local_sdp; + /* Parse the local SDP while copying the important bits over to our local structure, + * while taking care of editing choose request and replacing them by real values */ + + if (!term->u.rtp.local_sdp) { + local_sdp = term->u.rtp.local_sdp = switch_core_alloc(term->context->pool, sizeof *term->u.rtp.local_sdp); + } + + + if (sdp->numComp.pres == NOTPRSNT) { + return SWITCH_STATUS_FALSE; + } + + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; + + local_sdp->info[i] = switch_core_alloc(term->context->pool, sizeof *(local_sdp->info[i])); + *(local_sdp->info[i]) = *(sdp->info[i]); + + if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && + s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->conn.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Local address: %d.%d.%d.%d\n", + s->conn.u.ip4.u.uniIp.b[0].val, + s->conn.u.ip4.u.uniIp.b[1].val, + s->conn.u.ip4.u.uniIp.b[2].val, + s->conn.u.ip4.u.uniIp.b[3].val); + + /* TODO: Double-check bind address for this profile */ + + } + if (s->attrSet.numComp.pres) { + for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { + CmSdpAttr *a = s->attrSet.attr[mediaId]; + local_sdp->info[i]->attrSet.attr[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpAttr)); + *(local_sdp->info[i]->attrSet.attr[mediaId]) = *a; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media %p\n", a); + } + } + + if (s->mediaDescSet.numComp.pres) { + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; + local_sdp->info[i]->mediaDescSet.mediaDesc[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpMediaDesc)); + *(local_sdp->info[i]->mediaDescSet.mediaDesc[mediaId]) = *desc; + + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + + } + } + } + } + } +} + /*****************************************************************************************************************************/ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) @@ -330,17 +397,17 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) } case MGT_MEDIAPAR_STRPAR: { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); - } - - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); - } +// MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; +// +// if (mgStream->sl.remote.pres.pres) { +// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); +// mgco_print_sdp(&mgStream->sl.remote.sdp); +// } +// +// if (mgStream->sl.local.pres.pres) { +// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); +// mgco_print_sdp(&mgStream->sl.local.sdp); +// } break; @@ -438,8 +505,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { case MGT_ADD: { - handle_mg_add_cmd(&cmd->u.mgCmdInd[0]->cmd.u.add); - mg_send_add_rsp(suId, cmd); + handle_mg_add_cmd(suId, cmd, &cmd->u.mgCmdInd[0]->cmd.u.add); break; } @@ -598,7 +664,7 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); break; } break; @@ -651,12 +717,12 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); } /* switch command type for reply */ break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); break; } /* switch -api_type */ @@ -665,9 +731,40 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) /*****************************************************************************************************************************/ -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) +switch_status_t handle_mg_add_cmd(SuId suId, MgMgcoCommand *req, MgMgcoAmmReq *addReq) { - int descId; + int descId; + mg_context_t *ctx = NULL; + + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + MgMgcoCtxt ctxt; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId, sizeof(MgMgcoTransId)); + + if (req->contextId.type.val == MGT_CXTID_CHOOSE) { + ctx = megaco_choose_context(NULL); + } else if (req->contextId.type.val == MGT_CXTID_OTHER) { + ctx = megaco_get_context(NULL, req->contextId.val.val); + } + + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId, sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId, sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + for (descId = 0; descId < addReq->dl.num.val; descId++) { switch (addReq->dl.descs[descId]->type.val) { case MGT_MEDIADESC: @@ -727,72 +824,43 @@ switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) break; } } - - - return SWITCH_STATUS_SUCCESS; -} - - -/*****************************************************************************************************************************/ -switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; - - + + cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; - + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); - + #ifdef GCP_VER_2_1 termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; #else termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); #endif + /* FIXME */ mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); - + /* We will always send one command at a time..*/ cmd.cmdStatus.pres = PRSNT_NODEF; cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - + cmd.cmdType.pres = PRSNT_NODEF; cmd.cmdType.val = CH_CMD_TYPE_RSP; - - + + ret = sng_mgco_send_cmd(suId, &cmd); - + memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.cntxtId, &cmd.contextId,sizeof(MgMgcoContextId)); memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); ctxt.cmdStatus.pres = PRSNT_NODEF; ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); - return ret; + return sng_mgco_send_axn_req(suId, &ctxt);; } /*****************************************************************************************************************************/ @@ -811,7 +879,7 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",_memSize); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n", (int)_memSize); return SWITCH_STATUS_FALSE; } @@ -850,7 +918,7 @@ switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) { if ( !msg ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_free_mem: invalid message\n"); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 8aa0dae0d3..91dc74210c 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -15,6 +15,8 @@ #define MG_MAX_PEERS 5 +#define MG_CONTEXT_MAX_TERMS 3 + #define MEGACO_CLI_SYNTAX "profile|logging" #define MEGACO_LOGGING_CLI_SYNTAX "logging [enable|disable]" #define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus] [peerxmlstatus]" @@ -50,10 +52,57 @@ typedef struct mg_peer_profile_s{ char* mid; /* Peer H.248 MID */ char* transport_type; /* UDP/TCP */ char* encoding_type; /* Encoding TEXT/Binary */ -}mg_peer_profile_t; +} mg_peer_profile_t; -typedef struct megaco_profile_s { +typedef enum { + MG_TERM_FREE = 0, + MG_TERM_TDM, + MG_TERM_RTP +} mg_termination_type_t; + +typedef struct megaco_profile_s megaco_profile_t; +typedef struct mg_context_s mg_context_t; + +typedef struct mg_termination_s { + mg_termination_type_t type; + const char *uuid; + mg_context_t *context; + + union { + struct { + const char *codec; + int ptime; + const char *remote_address; + switch_port_t remote_port; + switch_port_t local_port; + + CmSdpInfoSet *local_sdp; + CmSdpInfoSet *remote_sdp; + + unsigned mode:2; + unsigned :0; + } rtp; + struct { + int span; + int channel; + } tdm; + } u; +} mg_termination_t; + + +struct mg_context_s { + uint32_t context_id; + mg_termination_t terminations[MG_CONTEXT_MAX_TERMS]; + megaco_profile_t *profile; + mg_context_t *next; + switch_memory_pool_t *pool; +}; + +#define MG_CONTEXT_MODULO 16 +#define MG_MAX_CONTEXTS 32768 + +struct megaco_profile_s { char *name; switch_memory_pool_t *pool; switch_thread_rwlock_t *rwlock; /* < Reference counting rwlock */ @@ -71,7 +120,12 @@ typedef struct megaco_profile_s { char* rtp_termination_id_prefix; int rtp_termination_id_len; char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ -} megaco_profile_t; + + switch_thread_rwlock_t *contexts_rwlock; + uint32_t next_context_id; + uint8_t contexts_bitmap[MG_MAX_CONTEXTS/8]; /* Availability matrix, enough bits for a 32768 bitmap */ + mg_context_t *contexts[MG_CONTEXT_MODULO]; +}; megaco_profile_t *megaco_profile_locate(const char *name); @@ -80,6 +134,11 @@ void megaco_profile_release(megaco_profile_t *profile); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); + +mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id); +mg_context_t *megaco_choose_context(megaco_profile_t *profile); +void megaco_release_context(mg_context_t *ctx); + switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload); switch_status_t sng_mgco_start(megaco_profile_t* profile); switch_status_t sng_mgco_stop(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 4a8107f859..e99eef1b76 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -32,10 +32,11 @@ #include #include "mod_sofia.h" -#define kRSDP "r_sdp" -#define kLSDP "l_sdp" #define kBINDADDRESS "bind_address" -#define kCODECSTRING "codec_string" +#define kLOCALADDR "local_addr" +#define kLOCALPORT "local_port" +#define kREMOTEADDR "remote_addr" +#define kREMOTEPORT "remote_port" static struct { switch_memory_pool_t *pool; @@ -88,19 +89,16 @@ switch_io_routines_t crtp_io_routines = { .send_dtmf = channel_send_dtmf }; -#if 0 SWITCH_STANDARD_API(test_function) { return SWITCH_STATUS_SUCCESS; } -#endif void crtp_init(switch_loadable_module_interface_t *module_interface) { switch_endpoint_interface_t *endpoint_interface; -#if 0 /* DAVIDY */ switch_api_interface_t *api_interface; -#endif + crtp.pool = module_interface->pool; endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); endpoint_interface->interface_name = "rtp"; @@ -108,390 +106,9 @@ void crtp_init(switch_loadable_module_interface_t *module_interface) endpoint_interface->state_handler = &crtp_state_handlers; crtp.endpoint_interface = endpoint_interface; -// SWITCH_ADD_API(api_interface, "rtp_test", "test", test_function, ""); + SWITCH_ADD_API(api_interface, "rtp_test", "test", test_function, ""); } - -typedef struct parsed_sdp_s { - const char *c; /*!< Connection */ - - -} parsed_sdp_t; - - -//static switch_status_t check_codec - -/* - * Setup the local RTP side - * A lot of values can be chosen by the MG, those will have $ as a placeholder. - * We need to validate the SDP, making sure we can support everything that's offered on our behalf, - * amend it if we don't support everything, or systematically reject it if we cannot support it. - * - * Would this function be called using NULL as l_sdp, we will generate an SDP payload. - */ - -static switch_status_t setup_local_rtp(crtp_private_t *tech_pvt, const char *l_sdp, const char *codec_string) -{ - int codec_order_last; - int num_codecs; -#if 0 /* DAVIDY */ - switch_core_session_t const * session = tech_pvt->session; -#endif - const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS] = { 0 }; - char *codec_order[SWITCH_MAX_CODECS] = { 0 }; -#if 1 /* DAVIDY */ - char *sdpbuf = NULL; - sdp_connection_t *connection = NULL; - sdp_printer_t *printer = NULL; -#endif - - - /* Load in the list of codecs we support. If we have a codec string we use our priorities first */ - if (codec_string) { - char *tmp_codec_string; - if ((tmp_codec_string = switch_core_session_strdup(tech_pvt->session, codec_string))) { - codec_order_last = switch_separate_string(tmp_codec_string, ',', codec_order, SWITCH_MAX_CODECS); - num_codecs = switch_loadable_module_get_codecs_sorted(codecs, SWITCH_MAX_CODECS, codec_order, codec_order_last); - } - } else { - num_codecs = switch_loadable_module_get_codecs(codecs, switch_arraylen(codecs)); - } - - /* TODO: Look at remote settings */ - - if (zstr(l_sdp)) { - /* Generate a local SDP here */ -#if 0 /* DAVIDY */ - const char *sdpbuf = switch_core_session_sprintf(session, "v=0\nIN IP4 %s\nm=audio %d RTP/AVP %d"); -#endif - - } else { - /* Parse the SDP and remove anything we cannot support, then validate it to make sure it contains at least one codec - * so that we reject invalid ones. */ -#if 0 - uint8_t match = 0; - int first = 0, last = 0; - int ptime = 0, dptime = 0, maxptime = 0, dmaxptime = 0; - int sendonly = 0, recvonly = 0; - int greedy = 0, x = 0, skip = 0; -#endif - int ptime = 0, maxptime = 0; - int sdp_modified = 0; - int cur_codec = 0; - - sdp_parser_t *parser = NULL; -#if 1 /* DAVIDY */ - sdp_session_t *sdp; -#else - sdp_session_t *sdp, *lsdp; -#endif - sdp_media_t *m; - sdp_attribute_t *attr; - su_home_t *sdp_home; - - if (!(parser = sdp_parse(NULL, l_sdp, (int) strlen(l_sdp), sdp_f_megaco /* accept $ values */ | sdp_f_insane /* accept omitted o= */))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Malformed SDP\n"); - goto fail; - } - - if (!(sdp = sdp_session(parser))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't get session from sdp.\n"); - goto fail; - } - sdp_home = sdp_parser_home(parser); - for (m = sdp->sdp_media; m; m = m->m_next) { - - if (m->m_type == sdp_media_audio) { - sdp_rtpmap_t *map; - - for (attr = m->m_attributes; attr; attr = attr->a_next) { - if (!strcasecmp(attr->a_name, "ptime") && attr->a_value) { - ptime = atoi(attr->a_value); - } else if (!strcasecmp(attr->a_name, "maxptime") && attr->a_value) { - maxptime = atoi(attr->a_value); - } - } - - connection = sdp->sdp_connection; - if (m->m_connections) { - connection = m->m_connections; - } - - /* Check for wildcards in m= (media) and c= (connection) */ - if (!zstr(connection->c_address)) { - if (!strcmp(connection->c_address, "$")) { - connection->c_address = su_strdup(sdp_home, tech_pvt->bind_address); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Using bind address: %s\n", tech_pvt->bind_address); - switch_channel_set_variable(tech_pvt->channel, kBINDADDRESS, tech_pvt->bind_address); - sdp_modified = 1; - } else if (strcmp(connection->c_address, tech_pvt->bind_address)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MGC requested to bind on [%s] which is different than the configuration [%s]\n", - connection->c_address, tech_pvt->bind_address); - goto fail; - } - - if (m->m_port == MEGACO_CHOOSE) { - tech_pvt->local_port = m->m_port = switch_rtp_request_port(tech_pvt->bind_address); - switch_channel_set_variable_printf(tech_pvt->channel, "rtp_local_port", "%d", tech_pvt->local_port); - if (!tech_pvt->local_port) { - /* Port request failed */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No available RTP ports on [%s]\n", tech_pvt->bind_address); - goto fail; - } - sdp_modified = 1; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Using local port: %d\n", tech_pvt->local_port); - } - } - - /* Validate codecs */ - for (map = m->m_rtpmaps; map; map = map->rm_next) { - if (map->rm_any) { - /* Pick our first favorite codec */ - if (codecs[cur_codec]) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing a codec: %s/%d\n", codecs[cur_codec]->iananame, codecs[cur_codec]->ianacode); - map->rm_encoding = su_strdup(sdp_home, codecs[cur_codec]->iananame); - map->rm_pt = codecs[cur_codec]->ianacode; - map->rm_any = 0; - map->rm_predef = codecs[cur_codec]->ianacode < 96; - cur_codec++; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No more codecs in preferences!\n"); - goto fail; - } - } - } - } else if (m->m_type == sdp_media_image && m->m_port) { - /* TODO: Handle T38 */ - - } - } -#if 0 /* DAVIDY */ - char sdpbuf[2048] = ""; -#endif - printer = sdp_print(sdp_home, sdp, sdpbuf, sizeof(sdpbuf), 0); - switch_channel_set_variable(tech_pvt->channel, kLSDP, sdpbuf); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting local SDP: [%s]\n", sdpbuf); - sdp_printer_free(printer); - - goto done; - - fail: - if (tech_pvt->local_port) { - switch_rtp_release_port(tech_pvt->bind_address, tech_pvt->local_port); - } - - if (parser) { - sdp_parser_free(parser); - } - - return SWITCH_STATUS_FALSE; - } - -done: - return SWITCH_STATUS_SUCCESS; - -} - -#if 0 -static void setup_rtp(crtp_private_t *tech_pvt, const char *r_sdp, const char *l_sdp) -{ - switch_core_session_t const * session = tech_pvt->session; - uint8_t match = 0; - int first = 0, last = 0; - int ptime = 0, dptime = 0, maxptime = 0, dmaxptime = 0; - int sendonly = 0, recvonly = 0; - int greedy = 0, x = 0, skip = 0, mine = 0; - int got_crypto = 0, got_audio = 0, got_avp = 0, got_savp = 0, got_udptl = 0; - - sdp_parser_t *parser = NULL, *l_parser = NULL; - sdp_session_t *sdp, *lsdp; - sdp_media_t *m; - sdp_attribute_t *attr; - - - int scrooge = 0; - - - if (zstr(r_sdp)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No SDP\n"); - goto fail; - } - - if (!(parser = sdp_parse(NULL, r_sdp, (int) strlen(r_sdp), 0))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Malformed SDP\n"); - goto fail; - } - - if (!(sdp = sdp_session(parser))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't get session from sdp.\n"); - goto fail; - } - - for (m = sdp->sdp_media; m; m = m->m_next) { - sdp_connection_t *connection; - ptime = dptime; - maxptime = dmaxptime; - - if (m->m_proto == sdp_proto_srtp) { - got_savp++; - } else if (m->m_proto == sdp_proto_rtp) { - got_avp++; - } else if (m->m_proto == sdp_proto_udptl) { - got_udptl++; - } - - if (got_udptl && m->m_type == sdp_media_image && m->m_port) { - //switch_t38_options_t *t38_options = tech_process_udptl(tech_pvt, sdp, m); - - /* TODO: Process T38 */ - - } else if (m->m_type == sdp_media_audio && m->m_port && !got_audio) { - sdp_rtpmap_t *map; - - connection = sdp->sdp_connection; - if (m->m_connections) { - connection = m->m_connections; - } - - if (!connection) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "Cannot find a c= line in the sdp at media or session level!\n"); - match = 0; - break; - } - - /* Begin Codec Negotiation */ - for (map = m->m_rtpmaps; map; map = map->rm_next) { - int32_t i; - uint32_t near_rate = 0; - const switch_codec_implementation_t *mimp = NULL, *near_match = NULL; - const char *rm_encoding; - uint32_t map_bit_rate = 0; - int codec_ms = 0; - switch_codec_fmtp_t codec_fmtp = { 0 }; - - if (x++ < skip) { - continue; - } - - if (!(rm_encoding = map->rm_encoding)) { - rm_encoding = ""; - } - - if (!strcasecmp(rm_encoding, "telephone-event")) { - if (!best_te || map->rm_rate == tech_pvt->rm_rate) { - best_te = (switch_payload_t) map->rm_pt; - }9 - } - - if (!cng_pt && !strcasecmp(rm_encoding, "CN")) { - cng_pt = (switch_payload_t) map->rm_pt; - if (tech_pvt->rtp_session) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Set comfort noise payload to %u\n", cng_pt); - switch_rtp_set_cng_pt(tech_pvt->rtp_session, tech_pvt->cng_pt); - } - } - - if (match) { - continue; - } - - if (greedy) { - first = mine; - last = first + 1; - } else { - first = 0; - last = num_codecs; - } - - codec_ms = ptime; - - if (maxptime && (!codec_ms || codec_ms > maxptime)) { - codec_ms = maxptime; - } - - if (!codec_ms) { - codec_ms = switch_default_ptime(rm_encoding, map->rm_pt); - } - - map_bit_rate = switch_known_bitrate((switch_payload_t)map->rm_pt); - - if (!ptime && !strcasecmp(map->rm_encoding, "g723")) { - ptime = codec_ms = 30; - } - - if (zstr(map->rm_fmtp)) { - if (!strcasecmp(map->rm_encoding, "ilbc")) { - ptime = codec_ms = 30; - map_bit_rate = 13330; - } - } else { - if ((switch_core_codec_parse_fmtp(map->rm_encoding, map->rm_fmtp, map->rm_rate, &codec_fmtp)) == SWITCH_STATUS_SUCCESS) { - if (codec_fmtp.bits_per_second) { - map_bit_rate = codec_fmtp.bits_per_second; - } - if (codec_fmtp.microseconds_per_packet) { - codec_ms = (codec_fmtp.microseconds_per_packet / 1000); - } - } - } - - - for (i = first; i < last && i < total_codecs; i++) { - const switch_codec_implementation_t *imp = codec_array[i]; - uint32_t bit_rate = imp->bits_per_second; - uint32_t codec_rate = imp->samples_per_second; - if (imp->codec_type != SWITCH_CODEC_TYPE_AUDIO) { - continue; - } - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Compare [%s:%d:%u:%d:%u]/[%s:%d:%u:%d:%u]\n", - rm_encoding, map->rm_pt, (int) map->rm_rate, codec_ms, map_bit_rate, - imp->iananame, imp->ianacode, codec_rate, imp->microseconds_per_packet / 1000, bit_rate); - if ((zstr(map->rm_encoding) || (tech_pvt->profile->ndlb & PFLAG_NDLB_ALLOW_BAD_IANANAME)) && map->rm_pt < 96) { - match = (map->rm_pt == imp->ianacode) ? 1 : 0; - } else { - match = strcasecmp(rm_encoding, imp->iananame) ? 0 : 1; - } - - if (match && bit_rate && map_bit_rate && map_bit_rate != bit_rate && strcasecmp(map->rm_encoding, "ilbc")) { - /* nevermind */ - match = 0; - } - - if (match) { - if (scrooge) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, - "Bah HUMBUG! Sticking with %s@%uh@%ui\n", - imp->iananame, imp->samples_per_second, imp->microseconds_per_packet / 1000); - } else { - if ((ptime && codec_ms && codec_ms * 1000 != imp->microseconds_per_packet) || map->rm_rate != codec_rate) { - near_rate = map->rm_rate; - near_match = imp; - match = 0; - continue; - } - } - mimp = imp; - break; - } else { - match = 0; - } - } - } - - /* End */ - - - } - } - -fail: - if (parser) { - sdp_parser_free(parser); - } -} -#endif - static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, switch_caller_profile_t *outbound_profile, switch_core_session_t **new_session, From c6b5bc2bda5498b14b50595aa45e8e9023368ca1 Mon Sep 17 00:00:00 2001 From: kapil Date: Sun, 1 Jul 2012 12:13:18 +0530 Subject: [PATCH 284/493] adding AUDIT for root Packages response code, adding media_gateway_cmd_handler.c for all commands related logic/APIs. adding media_gateway_packages.c to have list of all supported packages. adding media_gateway_utils.c for all media gateway utility APIs --- src/mod/endpoints/mod_media_gateway/Makefile | 2 +- .../media_gateway_cmd_handler.c | 642 ++++++++++++++++++ .../media_gateway_packages.c | 135 ++++ .../mod_media_gateway/media_gateway_stack.h | 64 +- .../mod_media_gateway/media_gateway_utils.c | 430 ++++++++++++ .../mod_media_gateway/mod_media_gateway.c | 565 +-------------- 6 files changed, 1300 insertions(+), 538 deletions(-) create mode 100644 src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c create mode 100644 src/mod/endpoints/mod_media_gateway/media_gateway_packages.c create mode 100644 src/mod/endpoints/mod_media_gateway/media_gateway_utils.c diff --git a/src/mod/endpoints/mod_media_gateway/Makefile b/src/mod/endpoints/mod_media_gateway/Makefile index 2a8f5e7ac8..66ad05c428 100644 --- a/src/mod/endpoints/mod_media_gateway/Makefile +++ b/src/mod/endpoints/mod_media_gateway/Makefile @@ -7,6 +7,6 @@ ifeq ($(ARCH),x86_64) endif BASE=../../../.. -LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o +LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o media_gateway_cmd_handler.o media_gateway_utils.o media_gateway_packages.o LOCAL_LDFLAGS=-lsng_mg include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c new file mode 100644 index 0000000000..c81d80bd18 --- /dev/null +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -0,0 +1,642 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" + + +/*****************************************************************************************************************************/ + +/* +* +* Fun: handle_mg_add_cmd +* +* Desc: this api will handle the ADD request received from MG stack +* +* +*/ +switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) +{ + int descId; + for (descId = 0; descId < addReq->dl.num.val; descId++) { + switch (addReq->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + break; + } + case MGT_MEDIAPAR_REMOTE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + break; + } + + case MGT_MEDIAPAR_LOCCTL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); + break; + } + case MGT_MEDIAPAR_TERMST: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + break; + } + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_print_sdp(&mgStream->sl.remote.sdp); + } + + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_print_sdp(&mgStream->sl.local.sdp); + } + + break; + } + } + } + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_REQEVTDESC: + case MGT_EVBUFDESC: + case MGT_SIGNALSDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + } + } + + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************************/ +/* +* +* Fun: mg_send_add_rsp +* +* Desc: this api will send the ADD response based on ADD request received from MG stack +* +* TODO - Dummy response , needs to have proper ADD response code +*/ +switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) +{ + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; + cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; + + + cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); + +#ifdef GCP_VER_2_1 + termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; +#else + termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); +#endif + mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + cmd.cmdStatus.pres = PRSNT_NODEF; + cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + cmd.cmdType.pres = PRSNT_NODEF; + cmd.cmdType.val = CH_CMD_TYPE_RSP; + + ret = sng_mgco_send_cmd(suId, &cmd); + + return ret; +} + +/*****************************************************************************************************************************/ +/* +* +* Fun: mg_send_end_of_axn +* +* Desc: this api will send the END_OF_AXN event to MG stack to indicate that application is done with processing +* +* +*/ +switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId) +{ + int ret = 0x00; + MgMgcoCtxt ctxt; + + memset(&ctxt,0, sizeof(ctxt)); + memcpy(&ctxt.transId,transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, ctxtId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "mg_send_end_of_axn: Sending END_OF_AXN for transId[%d], peerId[%d], context[type = %s, value = %d]\n", + (uint32_t)transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), (uint32_t)ctxtId->val.val); + + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************************/ +/* +* +* Fun: mg_build_mgco_err_request +* +* Desc: this api will send the Error event to MG stack to indicate failure in application +* +* +*/ + +switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) +{ + MgMgcoInd *mgErr; + S16 ret; + + mgErr = NULLP; + ret = ROK; + + /* Allocate for AG error */ + mg_stack_alloc_mem((Ptr*)&mgErr, sizeof(MgMgcoInd)); + if (NULL == mgErr) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + return SWITCH_STATUS_FALSE; + } + + /* Set transaction Id in the error request */ + MG_SET_VAL_PRES(mgErr->transId, trans_id); + + /* Copy the context Id */ + MG_MEM_COPY(&mgErr->cntxtId, + ctxt_id, + sizeof(MgMgcoContextId)); + + /* Set the peerId */ + mgErr->peerId.pres = NOTPRSNT; + + /* Set the error code */ + MG_SET_PRES(mgErr->err.pres.pres); + MG_SET_PRES(mgErr->err.code.pres); + MG_SET_VAL_PRES(mgErr->err.code, err); + + if(errTxt->len) + { + MG_GETMEM(mgErr->err.text.val, (errTxt->len)*sizeof(U8), &mgErr->memCp, &ret); + if (ROK != ret) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + return SWITCH_STATUS_FALSE; + } + mgErr->err.text.pres = PRSNT_NODEF; + mgErr->err.text.len = errTxt->len; + MG_MEM_COPY(mgErr->err.text.val, errTxt->val, errTxt->len); + } + + /* Set the output value */ + *errcmd = mgErr; + + return SWITCH_STATUS_SUCCESS; +} + + +/*****************************************************************************************************************************/ +switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) +{ + MgMgcoContextId *ctxtId; + MgMgcoTermIdLst *term_list; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoSubAudReq *audit; + MgMgcoAuditDesc *audit_desc; + MgMgcoAuditItem *audit_item; + int i; + int err_code; + + audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; + + if(NOTPRSNT == audit->pres.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + audit_desc = &audit->audit; + + if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + /* dump AUDIT message information */ + /*mgAccEvntPrntMgMgcoSubAudReq(auditReq,stdout);*/ + + /*-- Get context id --*/ + ctxtId = &auditReq->contextId; + + /*-- Get termination list --*/ + term_list = mg_get_term_id_list(auditReq); + termId = term_list->terms[0]; + + /*-- Start with Context level checks --*/ + /*-- CHOOSE Context not allowed --*/ + if ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_CHOOSE == ctxtId->type.val)) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "failed, Ctxt: CHOOSE not allowed in Audit Value\n"); + + /* set correct error code */ + mg_util_set_ctxt_string(&errTxt,ctxtId); + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; + } + /*-- CHOOSE Termination not allowed --*/ + else if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_CHOOSE == termId->type.val)) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "failed, Term: CHOOSE not allowed in Audit Value\n"); + + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; + } + + /*-- For Audit Values, ROOT Termination is allowed with Context = ALL but not allowed with Other --*/ + /*-- Check whether the termination is present in the given context --*/ + if (((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_ROOT == termId->type.val)) && + ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_OTHER == ctxtId->type.val))) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "failed, Term: Invalid combination, ROOT Term with OTHER CONTEXT\n"); + + mg_util_set_ctxt_string(&errTxt,ctxtId); + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; + } + + /* validation done , now processing command */ + + for (i = 0; i < audit_desc->num.val; i++) { + + audit_item = audit_desc->al[i]; + + if (!audit_item) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "Audit Descriptor is NULL.. rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + /*TODO - If we are not supporint AUDIT type then can send "MGT_MGCO_RSP_CODE_UNSUPPORTED_DESC" error to MG stack */ + if (NOTPRSNT != audit_item->auditItem.pres) { + + switch(audit_item->auditItem.val) + { + case MGT_MEDIADESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MEDIA \n"); + break; + } + case MGT_MODEMDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MODEM \n"); + break; + } + case MGT_MUXDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MULTIPLEX \n"); + break; + } + case MGT_REQEVTDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Events \n"); + break; + } + case MGT_SIGNALSDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Signals \n"); + break; + } + case MGT_DIGMAPDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Digit Maps \n"); + break; + } + case MGT_OBSEVTDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Buffer Events \n"); + break; + } + case MGT_EVBUFDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Events Buffer \n"); + break; + } + case MGT_STATSDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Statistics \n"); + break; + } + case MGT_PKGSDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Packages \n"); + handle_pkg_audit(suId, auditReq); + break; + } + case MGT_INDAUD_TERMAUDDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Individual Term Audit \n"); + break; + } + default: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid Audit Descriptor[%d] request\n",audit_item->auditItem.val); + err_code = MGT_MGCO_RSP_CODE_UNSUPPORTED_DESC; + goto error; + } + }/*switch(audit_item->auditItem.val)*/ + }/*if (NOTPRSNT != audit_item->auditItem.pres)*/ + }/*for loop - audit_desc->num.val */ + + return SWITCH_STATUS_SUCCESS; + +error: + if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, auditReq->transId.val, ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(suId, mgErr); + } + + /* deallocate the msg */ + mg_free_cmd(auditReq); + return SWITCH_STATUS_FALSE; +} + +/*****************************************************************************************************************************/ +switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) +{ + switch_status_t ret; + MgMgcoCommand reply; + MgMgcoTermIdLst *term_list; + MgMgcoTermId *termId; + MgMgcoSubAudReq *audit; + MgMgcoAuditDesc *audit_desc; + MgMgcoAuditReply *adtRep = NULLP; + U16 numOfParms; + MgMgcoCtxt ctxt; + + memset(&reply, 0, sizeof(reply)); + audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; + + if(NOTPRSNT == audit->pres.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + audit_desc = &audit->audit; + + if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + /* dump AUDIT message information */ + /*mgAccEvntPrntMgMgcoSubAudReq(auditReq,stdout);*/ + + /*-- Get termination list --*/ + term_list = mg_get_term_id_list(auditReq); + termId = term_list->terms[0]; + + + /*copy transaction-id*/ + memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); + /*copy context-id*/ + memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); + /*copy peer identifier */ + memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; + + + adtRep = &(reply.u.mgCmdRsp[0]->u.aval); + + adtRep->type.pres = PRSNT_NODEF; + adtRep->type.val = MGT_TERMAUDIT; + adtRep->u.other.pres.pres = PRSNT_NODEF; + mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + /* Grow the list of reply parameters */ + if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), + &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + numOfParms = adtRep->u.other.audit.num.val; + adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; + adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_PKGSDESC; + + if(SWITCH_STATUS_FALSE == mg_build_pkg_desc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.pkgs)){ + return SWITCH_STATUS_FALSE; + } + + /* We will always send one command at a time..*/ + reply.cmdStatus.pres = PRSNT_NODEF; + reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + reply.cmdType.pres = PRSNT_NODEF; + reply.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &reply); + + memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return ret; + + + +} +/*****************************************************************************************************************************/ +switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) +{ + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + MgMgcoCtxt ctxt; + MgMgcoAuditReply *adtRep = NULLP; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->wild.pres = NOTPRSNT; + cmd.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; + + adtRep = &(cmd.u.mgCmdRsp[0]->u.aval); + + /* Set type as Cxt Audit */ + MG_INIT_TOKEN_VALUE(&(adtRep->type), MGT_CXTAUDIT); + /* Set no of Terminations to 1 */ + MG_INIT_TOKEN_VALUE(&(adtRep->u.cxt.num), 1); + + + + cmd.u.mgCmdRsp[0]->u.aval.u.cxt.num.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.aval.u.cxt.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.aval.u.cxt, &req->u.mgCmdReq[0]->cmd.u.aval.termIdLst); + +#ifdef GCP_VER_2_1 + termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; +#else + termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); +#endif + mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + cmd.cmdStatus.pres = PRSNT_NODEF; + cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + cmd.cmdType.pres = PRSNT_NODEF; + cmd.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &cmd); + + memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return ret; +} + +/*****************************************************************************************************************************/ +switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) +{ + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + MgMgcoCtxt ctxt; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.val = MGT_MODIFY; + cmd.u.mgCmdRsp[0]->u.mod.pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + +#ifdef GCP_VER_2_1 + termId = cmd.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; +#else + termId = &(cmd.u.mgCmdRsp[0]->u.mod.termId); +#endif + mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + cmd.cmdStatus.pres = PRSNT_NODEF; + cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + cmd.cmdType.pres = PRSNT_NODEF; + cmd.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &cmd); + + memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return ret; +} + +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c new file mode 100644 index 0000000000..19c1b1dae7 --- /dev/null +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" + + +MgPackage_t mg_pkg_list [] = +{ + { /* INDEX : 0 */ + MGT_PKG_GENERIC, /* Package Id 1 : Generic package */ + 1, /* Version 1 */ + "g", /* Package name */ + }, + { /* INDEX : 1 */ + MGT_PKG_ROOT, + 2, /* Version 1 */ + "root", /* Package name */ + }, + { /* INDEX : 2 */ + MGT_PKG_TONEDET, /*4*/ + 1, /* Version 1 */ + "tonedet", /* Package name */ + }, + { /* INDEX : 3 */ + MGT_PKG_DTMFDET, /*6*/ + 1, /* Version 1 */ + "dd", /* Package name */ + }, + { /* INDEX : 4 */ + MGT_PKG_NETWORK, /*11*/ + 1, /* Version 1 */ + "nt", /* Package name */ + }, + { /* INDEX : 5 */ + MGT_PKG_RTP, /*12*/ + 1, /* Version 1 */ + "rtp", /* Package name */ + }, + { /* INDEX : 6 */ + MGT_PKG_TDM_CKT, /*13*/ + 1, /* Version 1 */ + "tdmc", /* Package name */ + }, + { /* INDEX : 7 */ + MGT_PKG_QTY_ALT, /*55*/ + 1, /* Version 1 */ + "qac", /* Package name */ + }, + { /* INDEX : 8 */ + MGT_PKG_EN_ALERT, /*59*/ + 2, /* Version 2 */ + "alert", /* Package name */ + }, + { /* INDEX : 9 */ + MGT_PKG_AN_DISP, /*60*/ + 2, /* Version 1 */ + "andisp", /* Package name */ + }, + { /* INDEX : 10 */ + MGT_PKG_INACTTIMER, /*69*/ + 1, /* Version 1 */ + "it", /* Package name */ + }, + { /* INDEX : 11 */ + MGT_PKG_STIMAL, /* 147 */ + 1, /* Version 1 */ + "stimal ", /* Package name */ + }, + { /* INDEX : 12 */ + MGT_PKG_CALLPROGGEN, /* 7 */ + 1, /* Version 1 */ + "cg", /* Package name */ + }, + { /* INDEX : 13 */ + MGT_PKG_GENERIC_ANNC, /* 29 */ + 1, /* Version 1 */ + "an", /* Package name */ + }, + { /* INDEX : 14 */ + MGT_PKG_XD_CALPG_TNGN, /* 36 */ + 1, /* Version 1 */ + "xcg", /* Package name */ + }, + { /* INDEX : 15 */ + MGT_PKG_BSC_SRV_TN, /* 37 */ + 1, /* Version 1 */ + "srvtn", /* Package name */ + }, + { /* INDEX : 16 */ + MGT_PKG_ETSI_NR, + 1, /* Version 1 */ + "etsi_nr", /* Package name */ + }, + /* Add more packages */ +}; + +/***************************************************************************************/ +switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg) +{ + uint16_t i = 0x00; + uint16_t num_of_pkgs = sizeof(mg_pkg_list)/sizeof(MgPackage_t); + + printf("mg_build_pkg_desc: num_of_pkgs[%d]\n",num_of_pkgs); + + for (i = 0; i < num_of_pkgs; i++) { + + if (mgUtlGrowList((void ***)&pkg->items, + sizeof(MgMgcoPkgsItem), &pkg->num, NULLP) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Package descriptor Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + pkg->items[pkg->num.val - 1 ]->pres.pres = PRSNT_NODEF; + pkg->items[pkg->num.val - 1 ]->name.type.pres = PRSNT_NODEF; + pkg->items[pkg->num.val - 1 ]->name.type.val = MGT_GEN_TYPE_KNOWN; + + pkg->items[pkg->num.val - 1 ]->name.u.val.pres = PRSNT_NODEF; + pkg->items[pkg->num.val - 1 ]->name.u.val.val = mg_pkg_list[i].package_id; + + pkg->items[pkg->num.val - 1 ]->ver.pres = PRSNT_NODEF; + pkg->items[pkg->num.val - 1 ]->ver.val = mg_pkg_list[i].version; + + printf("mg_build_pkg_desc: Inserted pkg_id[%d] with version[%d] into pkg list index[%d]\n",mg_pkg_list[i].package_id,mg_pkg_list[i].version,i); + } + + return SWITCH_STATUS_SUCCESS; +} +/***************************************************************************************/ + diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 328806b746..752fabd6ea 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -49,29 +49,55 @@ typedef struct _mgStr U8 val[128]; } MgStr; +#define MAX_PACKAGE_NAME 128 + +typedef struct _mgPackage +{ + uint8_t package_id; + uint16_t version; + uint8_t name[MAX_PACKAGE_NAME+1]; +}MgPackage_t; + +extern MgPackage_t mg_pkg_list[]; + + #define MG_TXN_INVALID 0 -#define mg_zero(_buf, _size) {cmMemset((U8 *)(_buf), 0, _size);} +#define MG_ZERO(_buf, _size) {cmMemset((U8 *)(_buf), 0, _size);} /* Set pres field */ -#define mg_util_set_pres(_pres) \ +#define MG_SET_PRES(_pres) \ (_pres) = PRSNT_NODEF; /* Set token value */ -#define mg_util_set_val_pres(tkn,_val) \ - mg_util_set_pres((tkn).pres); \ +#define MG_SET_VAL_PRES(tkn,_val) \ + MG_SET_PRES((tkn).pres); \ (tkn).val = _val; -#define mg_mem_copy(_dst, _src, _len) \ +#define MG_MEM_COPY(_dst, _src, _len) \ cmMemcpy((U8*) (_dst), (const U8*) (_src), _len) -#define mg_get_mem(_memPtr, _size, _allocPtr, ret) \ -{ \ - (*ret) = cmGetMem((Ptr *)(_memPtr),(_size) ,(Ptr *)&(_allocPtr)); \ + +#define MG_INIT_TOKEN_VALUE(_tkn, _val) \ +{ \ + (_tkn)->pres = PRSNT_NODEF; \ + (_tkn)->val = (_val); \ } +#define MG_GETMEM(_ptr,_len,_memCp,_ret) \ +{ \ + ret = cmGetMem((_memCp), (_len), (Ptr *)&(_ptr)); \ + if( ret == ROK) \ + cmMemset((U8 *)(_ptr), (U8)0, (PTR)(_len)); \ +} +#define MG_INIT_TKNSTR(_tkn, _val, _len) \ +{ \ + (_tkn)->pres = PRSNT_NODEF; \ + (_tkn)->len = (U8)(_len); \ + cmMemcpy((U8 *)(_tkn)->val, (CONSTANT U8 *)(_val), (_len)); \ +} void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); @@ -91,6 +117,28 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); +switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); +void mgco_print_sdp(CmSdpInfoSet *sdp); +void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); +switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); +switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); +switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); +void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); +switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); +switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); +switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); + +switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req); +void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId); +MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); +switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); +switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); + + + /****************************************************************************************************************/ /* MG Stack defines */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c new file mode 100644 index 0000000000..81bde4871b --- /dev/null +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -0,0 +1,430 @@ +/* +* Copyright (c) 2012, Sangoma Technologies +* Mathieu Rene +* All rights reserved. +* +* +*/ + +#include "mod_media_gateway.h" +#include "media_gateway_stack.h" + + +/*****************************************************************************************************************************/ +switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) +{ + Mem sMem; + + sMem.region = 0; + sMem.pool = 0; + + if ( _memSize <= 0 ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); + return SWITCH_STATUS_FALSE; + } + + if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",(int)_memSize); + return SWITCH_STATUS_FALSE; + } + + // Note: memset done inside stack api + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************************/ + +switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) +{ + if ( _memSize <= 0 ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); + return SWITCH_STATUS_FALSE; + } + + if ( !msg ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + return SWITCH_STATUS_FALSE; + } + + if ( cmGetMem( (Ptr)msg, _memSize, (Ptr*)_memPtr ) != ROK ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", (int)_memSize ); + return SWITCH_STATUS_FALSE; + } + + // Note: memset done inside stack api + + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************************/ + +switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) +{ + if ( !msg ) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + return SWITCH_STATUS_FALSE; + } + + cmFreeMem( (Ptr)msg ); + + return SWITCH_STATUS_SUCCESS; +} + + +/*****************************************************************************************************************************/ + +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp) +{ +#ifdef GCP_ASN + Size size; +#endif + S16 ret = ROK; + + termId->name.pres.pres = PRSNT_NODEF; + /* mg011.105: Bug fixes */ + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = cmStrlen((CONSTANT U8*)str); + MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len, memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)str,termId->name.lcl.len); + +#ifdef GCP_ASN + /* Remove comment to fill other term ID + termId->wildcard.num.pres = NOTPRSNT; */ + /* Remove comment to fill wilcard term ID */ + termId->wildcard.num.pres = PRSNT_NODEF; + termId->wildcard.num.val = 1; + size = ((sizeof(MgMgcoWildcardField*))); + MG_GETMEM((termId->wildcard.wildcard),size,memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + MG_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), + memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; + termId->wildcard.wildcard[0]->len = 1; + termId->wildcard.wildcard[0]->val[0] = 0x55; +#endif /* GCP_ASN */ + + RETVALUE(ROK); +} + +/*****************************************************************************************************************************/ +/* +* +* Fun: mg_get_term_id_list +* +* Desc: Utility function to get MgMgcoTermIdLst structure +* from MgMgcoCommand structure. +* GCP_VER_2_1 - we will have term id list instead of single term id +* +* Ret: If success, return pointer to MgMgcoTermIdLst. +* If failure, return Null. +* +* Notes: None +* +*/ + +MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) +{ + uint8_t cmd_type = MGT_NONE; + uint8_t api_type = CM_CMD_TYPE_NONE; + MgMgcoTermIdLst * term_id = NULL; + + + /*-- mgCmdInd type represents the data structure for both + * incoming and outgoing requests, hence we can get the + * command type from there itself --*/ + cmd_type = cmd->u.mgCmdInd[0]->cmd.type.val; + + /*-- Find apiType --*/ + api_type = cmd->cmdType.val; + + switch (api_type) + { + case CH_CMD_TYPE_REQ: + case CH_CMD_TYPE_IND: + /* Based on Command Type, get to the TermId structure */ + switch (cmd_type) + { + case MGT_ADD: + if (cmd->u.mgCmdInd[0]->cmd.u.add.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.add.termIdLst; + break; + + case MGT_MOVE: + if (cmd->u.mgCmdInd[0]->cmd.u.move.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.move.termIdLst; + break; + + case MGT_MODIFY: + if (cmd->u.mgCmdInd[0]->cmd.u.mod.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.mod.termIdLst; + break; + + case MGT_SUB: + if (cmd->u.mgCmdInd[0]->cmd.u.sub.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.sub.termIdLst; + break; + + case MGT_AUDITCAP: + if (cmd->u.mgCmdInd[0]->cmd.u.acap.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.acap.termIdLst; + break; + + case MGT_AUDITVAL: + if (cmd->u.mgCmdInd[0]->cmd.u.aval.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.aval.termIdLst; + break; + + case MGT_NTFY: + if (cmd->u.mgCmdInd[0]->cmd.u.ntfy.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.ntfy.termIdLst; + break; + + case MGT_SVCCHG: + if (cmd->u.mgCmdInd[0]->cmd.u.svc.pres.pres) + term_id = &cmd->u.mgCmdInd[0]->cmd.u.svc.termIdLst; + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + break; + } + break; + + case CH_CMD_TYPE_RSP: + case CH_CMD_TYPE_CFM: + + cmd_type = cmd->u.mgCmdRsp[0]->type.val; + + switch (cmd_type) + { + case MGT_ADD: + if (cmd->u.mgCmdRsp[0]->u.add.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.add.termIdLst; + break; + + case MGT_MOVE: + if (cmd->u.mgCmdRsp[0]->u.move.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.move.termIdLst; + break; + + case MGT_MODIFY: + if (cmd->u.mgCmdRsp[0]->u.mod.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.mod.termIdLst; + break; + + case MGT_SUB: + if (cmd->u.mgCmdRsp[0]->u.sub.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.sub.termIdLst; + break; + + case MGT_SVCCHG: + if (cmd->u.mgCmdRsp[0]->u.svc.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.svc.termIdLst; + break; + + case MGT_AUDITVAL: + if (cmd->u.mgCmdRsp[0]->u.aval.u.other.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.aval.u.other.termIdLst; + break; + + case MGT_AUDITCAP: + if (cmd->u.mgCmdRsp[0]->u.acap.u.other.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.acap.u.other.termIdLst; + break; + + case MGT_NTFY: + if (cmd->u.mgCmdRsp[0]->u.ntfy.pres.pres) + term_id = &cmd->u.mgCmdRsp[0]->u.ntfy.termIdLst; + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + } /* switch command type for reply */ + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); + break; + } /* switch -api_type */ + + return (term_id); +} + + +/*****************************************************************************************************************************/ + +void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) +{ + MG_ZERO(errTxt->val, sizeof(errTxt->val)); + errTxt->len = 0; + + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + + if (MG_TXN_INVALID == txnId ) + { + MG_MEM_COPY((&errTxt->val[errTxt->len]), "TransactionId=0", 15); + errTxt->len += 15; + } + + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); + +} + +/*****************************************************************************************************************************/ +void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) +{ + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; + if(ctxtId->type.pres != NOTPRSNT) + { + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + if(ctxtId->type.val == MGT_CXTID_NULL) + { + errTxt->val[errTxt->len] = '-'; + errTxt->len += 1; + } + else if(ctxtId->type.val == MGT_CXTID_ALL) + { + errTxt->val[errTxt->len] = '*'; + errTxt->len += 1; + } + else if(ctxtId->type.val == MGT_CXTID_CHOOSE) + { + errTxt->val[errTxt->len] = '$'; + errTxt->len += 1; + } + else if((ctxtId->type.val == MGT_CXTID_OTHER) && (ctxtId->val.pres != NOTPRSNT)) + { + sprintf((char*)&errTxt->val[errTxt->len], "%d", ctxtId->val.val); + errTxt->len += cmStrlen((U8*)(&errTxt->val[errTxt->len])); + } + + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); +} + + +/*****************************************************************************************************************************/ +void mgco_print_sdp(CmSdpInfoSet *sdp) +{ + int i; + + + if (sdp->numComp.pres == NOTPRSNT) { + return; + } + + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; + + if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && + s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->conn.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->conn.u.ip4.u.uniIp.b[0].val, + s->conn.u.ip4.u.uniIp.b[1].val, + s->conn.u.ip4.u.uniIp.b[2].val, + s->conn.u.ip4.u.uniIp.b[3].val); + } + if (s->attrSet.numComp.pres) { + for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { + /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ + + + } + } + + if (s->mediaDescSet.numComp.pres) { + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; + + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + + } + } + } + } + } +} + +/*****************************************************************************************************************************/ +void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) +{ + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; + + if(termId->type.pres != NOTPRSNT) + { + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + + if(termId->type.val == MGT_TERMID_ROOT) + { + MG_MEM_COPY((&errTxt->val[errTxt->len]), "ROOT", 4); + errTxt->len += 4; + } + else if(termId->type.val == MGT_TERMID_ALL) + { + errTxt->val[errTxt->len] = '*'; + errTxt->len += 1; + } + else if(termId->type.val == MGT_TERMID_CHOOSE) + { + errTxt->val[errTxt->len] = '$'; + errTxt->len += 1; + } + else if((termId->type.val == MGT_TERMID_OTHER) && (termId->name.pres.pres != NOTPRSNT)) + { + if(termId->name.lcl.pres != NOTPRSNT) + { + MG_MEM_COPY(&(errTxt->val[errTxt->len]), termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + errTxt->len += termId->name.lcl.len; + } + if(termId->name.dom.pres != NOTPRSNT) + { + MG_MEM_COPY(&(errTxt->val[errTxt->len]), + termId->name.dom.val, sizeof(U8) * termId->name.dom.len); + errTxt->len += termId->name.dom.len; + } + } + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); +} +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index d549becc70..e1c5ea2439 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -18,15 +18,6 @@ static sng_mg_event_interface_t sng_event; SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); -switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); -switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); -void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); -switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); - /**************************************************************************************************************/ SWITCH_STANDARD_API(megaco_function) @@ -169,56 +160,7 @@ void handle_sng_log(uint8_t level, char *fmt, ...) va_end(ptr); } -static void mgco_print_sdp(CmSdpInfoSet *sdp) -{ - int i; - - - if (sdp->numComp.pres == NOTPRSNT) { - return; - } - - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; - - if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && - s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { - if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", - s->conn.u.ip4.u.uniIp.b[0].val, - s->conn.u.ip4.u.uniIp.b[1].val, - s->conn.u.ip4.u.uniIp.b[2].val, - s->conn.u.ip4.u.uniIp.b[3].val); - } - if (s->attrSet.numComp.pres) { - for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ - - - } - } - - if (s->mediaDescSet.numComp.pres) { - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); - - } - } - } - } - } -} /*****************************************************************************************************************************/ @@ -415,27 +357,26 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) MgMgcoInd *mgErr; MgStr errTxt; MgMgcoContextId ctxtId; + MgMgcoTermIdLst* termLst; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); /* validate Transaction Id */ - if (NOTPRSNT != cmd->transId.pres) + if (NOTPRSNT != cmd->transId.pres){ txn_id = cmd->transId.val; - else - { + } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Transaction Id not present, rejecting\n", __PRETTY_FUNCTION__); /*-- Send Error to MG Stack --*/ - mg_zero(&ctxtId, sizeof(MgMgcoContextId)); + MG_ZERO(&ctxtId, sizeof(MgMgcoContextId)); ctxtId.type.pres = NOTPRSNT; ctxtId.val.pres = NOTPRSNT; - mg_util_set_txn_string(&errTxt, &txn_id); + mg_util_set_txn_string(&errTxt, (U32*)&txn_id); - if (SWITCH_STATUS_FALSE == mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, - MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER, &errTxt)) - { + if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, + MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER, &errTxt)) { sng_mgco_send_err(suId, mgErr); } @@ -444,7 +385,16 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) return ; } - mgAccEvntPrntMgMgcoCommand(cmd, stdout); + /* Get the termination Id list from the command(Note: GCP_2_1 has termination list , else it will be termination Id) */ + termLst = mg_get_term_id_list(cmd); + if ((NULL == termLst) || (NOTPRSNT == termLst->num.pres)) { + /* termination-id not present , error */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination-Id Not received..rejecting command \n"); + mg_free_cmd(cmd); + return ; + } + + /*mgAccEvntPrntMgMgcoCommand(cmd, stdout);*/ switch(cmd->cmdType.val) { @@ -465,6 +415,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_MODIFY: { /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ + mg_send_modify_rsp(suId, cmd); break; } case MGT_MOVE: @@ -478,9 +429,27 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ } case MGT_SVCCHG: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Service-Change Method Not Yet Supported\n"); + break; + } case MGT_NTFY: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "NOTIFY Method Not Yet Supported\n"); + break; + } case MGT_AUDITCAP: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Audit-Capability Method Not Yet Supported\n"); + break; + } case MGT_AUDITVAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); + handle_mg_audit_cmd(suId, cmd); + mg_send_audit_rsp(suId,cmd); + break; + } break; } @@ -538,468 +507,6 @@ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason } -/*****************************************************************************************************************************/ -/* -* -* Fun: mg_get_term_id_list -* -* Desc: Utility function to get MgMgcoTermIdLst structure -* from MgMgcoCommand structure. -* GCP_VER_2_1 - we will have term id list instead of single term id -* -* Ret: If success, return pointer to MgMgcoTermIdLst. -* If failure, return Null. -* -* Notes: None -* -*/ - -MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) -{ - uint8_t cmd_type = MGT_NONE; - uint8_t api_type = CM_CMD_TYPE_NONE; - MgMgcoTermIdLst * term_id = NULL; - - - /*-- mgCmdInd type represents the data structure for both - * incoming and outgoing requests, hence we can get the - * command type from there itself --*/ - cmd_type = cmd->u.mgCmdInd[0]->cmd.type.val; - - /*-- Find apiType --*/ - api_type = cmd->cmdType.val; - - switch (api_type) - { - case CH_CMD_TYPE_REQ: - case CH_CMD_TYPE_IND: - /* Based on Command Type, get to the TermId structure */ - switch (cmd_type) - { - case MGT_ADD: - if (cmd->u.mgCmdInd[0]->cmd.u.add.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.add.termIdLst; - break; - - case MGT_MOVE: - if (cmd->u.mgCmdInd[0]->cmd.u.move.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.move.termIdLst; - break; - - case MGT_MODIFY: - if (cmd->u.mgCmdInd[0]->cmd.u.mod.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.mod.termIdLst; - break; - - case MGT_SUB: - if (cmd->u.mgCmdInd[0]->cmd.u.sub.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.sub.termIdLst; - break; - - case MGT_AUDITCAP: - if (cmd->u.mgCmdInd[0]->cmd.u.acap.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.acap.termIdLst; - break; - - case MGT_AUDITVAL: - if (cmd->u.mgCmdInd[0]->cmd.u.aval.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.aval.termIdLst; - break; - - case MGT_NTFY: - if (cmd->u.mgCmdInd[0]->cmd.u.ntfy.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.ntfy.termIdLst; - break; - - case MGT_SVCCHG: - if (cmd->u.mgCmdInd[0]->cmd.u.svc.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.svc.termIdLst; - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); - break; - } - break; - - case CH_CMD_TYPE_RSP: - case CH_CMD_TYPE_CFM: - - cmd_type = cmd->u.mgCmdRsp[0]->type.val; - - switch (cmd_type) - { - case MGT_ADD: - if (cmd->u.mgCmdRsp[0]->u.add.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.add.termIdLst; - break; - - case MGT_MOVE: - if (cmd->u.mgCmdRsp[0]->u.move.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.move.termIdLst; - break; - - case MGT_MODIFY: - if (cmd->u.mgCmdRsp[0]->u.mod.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.mod.termIdLst; - break; - - case MGT_SUB: - if (cmd->u.mgCmdRsp[0]->u.sub.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.sub.termIdLst; - break; - - case MGT_SVCCHG: - if (cmd->u.mgCmdRsp[0]->u.svc.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.svc.termIdLst; - break; - - case MGT_AUDITVAL: - if (cmd->u.mgCmdRsp[0]->u.aval.u.other.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.aval.u.other.termIdLst; - break; - - case MGT_AUDITCAP: - if (cmd->u.mgCmdRsp[0]->u.acap.u.other.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.acap.u.other.termIdLst; - break; - - case MGT_NTFY: - if (cmd->u.mgCmdRsp[0]->u.ntfy.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.ntfy.termIdLst; - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); - } /* switch command type for reply */ - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); - break; - } /* switch -api_type */ - - return (term_id); -} - -/*****************************************************************************************************************************/ - -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) -{ - int descId; - for (descId = 0; descId < addReq->dl.num.val; descId++) { - switch (addReq->dl.descs[descId]->type.val) { - case MGT_MEDIADESC: - { - int mediaId; - for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; - switch (mediaPar->type.val) { - case MGT_MEDIAPAR_LOCAL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); - break; - } - case MGT_MEDIAPAR_REMOTE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); - break; - } - - case MGT_MEDIAPAR_LOCCTL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); - break; - } - case MGT_MEDIAPAR_TERMST: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); - break; - } - case MGT_MEDIAPAR_STRPAR: - { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); - } - - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); - } - - break; - } - } - } - } - case MGT_MODEMDESC: - case MGT_MUXDESC: - case MGT_REQEVTDESC: - case MGT_EVBUFDESC: - case MGT_SIGNALSDESC: - case MGT_DIGMAPDESC: - case MGT_AUDITDESC: - case MGT_STATSDESC: - break; - } - } - - - return SWITCH_STATUS_SUCCESS; -} - - -/*****************************************************************************************************************************/ -switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; - cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; - - - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; - - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); -#endif - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &cmd); - - memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); - - return ret; -} - -/*****************************************************************************************************************************/ -switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) -{ - Mem sMem; - - sMem.region = 0; - sMem.pool = 0; - - if ( _memSize <= 0 ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); - return SWITCH_STATUS_FALSE; - } - - if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",_memSize); - return SWITCH_STATUS_FALSE; - } - - // Note: memset done inside stack api - - return SWITCH_STATUS_SUCCESS; -} - -switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) -{ - if ( _memSize <= 0 ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); - return SWITCH_STATUS_FALSE; - } - - if ( !msg ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); - return SWITCH_STATUS_FALSE; - } - - if ( cmGetMem( (Ptr)msg, _memSize, (Ptr*)_memPtr ) != ROK ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", _memSize ); - return SWITCH_STATUS_FALSE; - } - - // Note: memset done inside stack api - - return SWITCH_STATUS_SUCCESS; -} - - -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) -{ - if ( !msg ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); - return SWITCH_STATUS_FALSE; - } - - cmFreeMem( (Ptr)msg ); - - return SWITCH_STATUS_SUCCESS; -} - -#define MG_ACC_GETMEM(_ptr,_len,_memCp,_ret) \ -{ \ - ret = cmGetMem((_memCp), (_len), (Ptr *)&(_ptr)); \ - if( ret == ROK) \ - cmMemset((U8 *)(_ptr), (U8)0, (PTR)(_len)); \ -} - - -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp) -{ -#ifdef GCP_ASN - Size size; -#endif - S16 ret = ROK; - - termId->name.pres.pres = PRSNT_NODEF; - /* mg011.105: Bug fixes */ - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = cmStrlen((CONSTANT U8*)str); - MG_ACC_GETMEM((termId->name.lcl.val), termId->name.lcl.len, memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)str,termId->name.lcl.len); - -#ifdef GCP_ASN - /* Remove comment to fill other term ID - termId->wildcard.num.pres = NOTPRSNT; */ - /* Remove comment to fill wilcard term ID */ - termId->wildcard.num.pres = PRSNT_NODEF; - termId->wildcard.num.val = 1; - size = ((sizeof(MgMgcoWildcardField*))); - MG_ACC_GETMEM((termId->wildcard.wildcard),size,memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - MG_ACC_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), - memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; - termId->wildcard.wildcard[0]->len = 1; - termId->wildcard.wildcard[0]->val[0] = 0x55; -#endif /* GCP_ASN */ - - RETVALUE(ROK); -} - -switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) -{ - MgMgcoInd *mgErr; - S16 ret; - - mgErr = NULLP; - ret = ROK; - - /* Allocate for AG error */ - mg_stack_alloc_mem((Ptr*)&mgErr, sizeof(MgMgcoInd)); - if (NULL == mgErr) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); - return SWITCH_STATUS_FALSE; - } - - /* Set transaction Id in the error request */ - mg_util_set_val_pres(mgErr->transId, trans_id); - - /* Copy the context Id */ - mg_mem_copy(&mgErr->cntxtId, - ctxt_id, - sizeof(MgMgcoContextId)); - - /* Set the peerId */ - mgErr->peerId.pres = NOTPRSNT; - - /* Set the error code */ - mg_util_set_pres(mgErr->err.pres.pres); - mg_util_set_pres(mgErr->err.code.pres); - mg_util_set_val_pres(mgErr->err.code, err); - - if(errTxt->len) - { - mg_get_mem(&mgErr->memCp, (errTxt->len)*sizeof(U8), mgErr->err.text.val, &ret); - if (ROK != ret) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); - return SWITCH_STATUS_FALSE; - } - mgErr->err.text.pres = PRSNT_NODEF; - mgErr->err.text.len = errTxt->len; - mg_mem_copy(mgErr->err.text.val, errTxt->val, errTxt->len); - } - - /* Set the output value */ - *errcmd = mgErr; - - return SWITCH_STATUS_SUCCESS; -} - -void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) -{ - mg_zero((errTxt->val), sizeof(errTxt->val)); - errTxt->len = 0; - - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - - if (MG_TXN_INVALID == txnId ) - { - mg_mem_copy((&errTxt->val[errTxt->len]), "TransactionId=0", 15); - errTxt->len += 15; - } - - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" - "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); - -} - - - /*****************************************************************************************************************************/ /* For Emacs: From 9beec66fcd8678b99fa484f26ea46aa3d21685a5 Mon Sep 17 00:00:00 2001 From: kapil Date: Sun, 1 Jul 2012 12:36:28 +0530 Subject: [PATCH 285/493] removing extra audit rsp api --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index e1c5ea2439..108e43c4ff 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -447,7 +447,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); handle_mg_audit_cmd(suId, cmd); - mg_send_audit_rsp(suId,cmd); break; } break; From 7eb163e74e10a336d0a3801c2b87fc64683602d9 Mon Sep 17 00:00:00 2001 From: kapil Date: Sun, 1 Jul 2012 12:40:17 +0530 Subject: [PATCH 286/493] adding dummy audit rsp api --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 108e43c4ff..96f5bcbaaf 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -447,6 +447,9 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); handle_mg_audit_cmd(suId, cmd); + /*need to call this for other types of audit.. + * ideally from the request apis we should send response..keeping now here just to send dummy responses*/ + mg_send_audit_rsp(suId, cmd); break; } break; From f88f0a8899cda05aa7fe50ff02af69939d34683f Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 2 Jul 2012 00:19:29 -0400 Subject: [PATCH 287/493] fixing warnings --- .../mod_media_gateway/media_gateway_cmd_handler.c | 9 ++++++++- .../endpoints/mod_media_gateway/media_gateway_utils.c | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index c81d80bd18..25ec2a9d52 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -169,9 +169,16 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont ctxt.cmdStatus.pres = PRSNT_NODEF; ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%d], peerId[%d], context[type = %s, value = %d]\n", - (uint32_t)transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), (uint32_t)ctxtId->val.val); + transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "mg_send_end_of_axn: Sending END_OF_AXN for transId[%lu], peerId[%lu], context[type = %s, value = %lu]\n", + transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); + +#endif ret = sng_mgco_send_axn_req(suId, &ctxt); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 81bde4871b..6f97ee0b34 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -316,7 +316,11 @@ void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) } else if((ctxtId->type.val == MGT_CXTID_OTHER) && (ctxtId->val.pres != NOTPRSNT)) { +#ifdef BIT_64 sprintf((char*)&errTxt->val[errTxt->len], "%d", ctxtId->val.val); +#else + sprintf((char*)&errTxt->val[errTxt->len], "%lu", ctxtId->val.val); +#endif errTxt->len += cmStrlen((U8*)(&errTxt->val[errTxt->len])); } From e2e3a5c34eaf76f0521f45e00205c2155b260cf7 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 2 Jul 2012 09:55:36 +0530 Subject: [PATCH 288/493] fixing modify mid code --- .../mod_media_gateway/media_gateway_xml.c | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 5acba0d954..64caa13a99 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -215,23 +215,25 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { static switch_status_t modify_mid(char* mid) { - char* dup = NULL; + char dup[64]; char* val[10]; int count; switch_assert(mid); + memset(&dup[0],0,sizeof(dup)); + /* If MID type is IP then add mid into [] brackets , * If MID type is domain then add mid into <> brackets * */ - dup = strdup(mid); - count = switch_split(dup, '.', val); + strcpy(&dup[0],mid); + count = switch_split(&dup[0], '.', val); if(!count) { /* Input string is not separated by '.', check if its separated by '-' as format could be xxx-xx-xxx/xxx-xx-xx-xxx */ - free(dup); - dup = strdup(mid); + memset(&dup[0],0,sizeof(dup)); + strcpy(&dup[0],mid); if(0 == (count = switch_split(dup, '-', val))){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); return SWITCH_STATUS_FALSE; @@ -239,29 +241,27 @@ static switch_status_t modify_mid(char* mid) } if(('<' == val[0][0]) || ('[' == val[0][0])){ - free(dup); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID[%s] is already prefixed with proper brackets \n",mid); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID = %s is already prefixed with proper brackets \n",mid); return SWITCH_STATUS_SUCCESS; } /*first check could be if count is 3 means domain name as generally we have xxx-xx-xxx/xxx.xx.xxx domain */ if(3 == count){ /* domain-type, add value into <> */ - free(dup); - dup = strdup(mid); + memset(&dup[0],0,sizeof(dup)); + strcpy(&dup[0],mid); sprintf(mid,"<%s>",dup); }else if(4 == count){ /* IP address in xxx.xxx.xxx.xxx format */ - free(dup); - dup = strdup(mid); + memset(&dup[0],0,sizeof(dup)); + strcpy(&dup[0],mid); sprintf(mid,"[%s]",dup); }else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); - free(dup); return SWITCH_STATUS_FALSE; } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added proper brackets to MID = %s \n",mid); - free(dup); return SWITCH_STATUS_SUCCESS; } From 5ec258b388facf4868143bd1e3fc464391cdd2f3 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 2 Jul 2012 04:43:21 -0400 Subject: [PATCH 289/493] adding subtract rsp code (got deleted by mistake) --- .../media_gateway_cmd_handler.c | 59 +++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/mod_media_gateway.c | 11 ++-- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 25ec2a9d52..bbc538a58f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -647,3 +647,62 @@ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) } /*****************************************************************************************************************************/ +/*****************************************************************************************************************************/ +switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) +{ + MgMgcoCommand cmd; + int ret = 0x00; + MgMgcoTermId *termId; + MgMgcoCtxt ctxt; + + memset(&cmd,0, sizeof(cmd)); + + /*copy transaction-id*/ + memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->type.val = MGT_SUB; + cmd.u.mgCmdRsp[0]->u.sub.pres.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.pres = PRSNT_NODEF; + cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst); + +#ifdef GCP_VER_2_1 + termId = cmd.u.mgCmdRsp[0]->u.sub.termIdLst.terms[0]; +#else + termId = &(cmd.u.mgCmdRsp[0]->u.sub.termId); +#endif + mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + cmd.cmdStatus.pres = PRSNT_NODEF; + cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + cmd.cmdType.pres = PRSNT_NODEF; + cmd.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &cmd); + + memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return ret; +} diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 752fabd6ea..c1b6db23de 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -132,6 +132,7 @@ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req); +switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req); void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId); MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 96f5bcbaaf..b3078fd046 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -182,7 +182,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) case MGT_TXNREQ: { MgMgcoTxnReq* txnReq; - MgMgcoTransId transId; /* XXX */ + /*MgMgcoTransId transId; *//* XXX */ int axnIter; txnReq = &(msg->body.u.tl.txns[txnIter]->u.req); @@ -207,14 +207,13 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) MgMgcoCommand mgCmd; memset(&mgCmd, 0, sizeof(mgCmd)); mgCmd.peerId = msg->lcl.id; - mgCmd.transId = transId; mgCmd.u.mgCmdInd[0] = cmdReq; /* XXX Handle choose context before this */ mgCmd.contextId = ctxId; - mgCmd.transId = transId; + /*mgCmd.transId = transId;*/ mgCmd.cmdStatus.pres = PRSNT_NODEF; @@ -353,7 +352,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /*****************************************************************************************************************************/ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { - uint32_t txn_id = 0x00; + U32 txn_id = 0x00; MgMgcoInd *mgErr; MgStr errTxt; MgMgcoContextId ctxtId; @@ -373,7 +372,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) ctxtId.type.pres = NOTPRSNT; ctxtId.val.pres = NOTPRSNT; - mg_util_set_txn_string(&errTxt, (U32*)&txn_id); + mg_util_set_txn_string(&errTxt, &txn_id); if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER, &errTxt)) { @@ -427,6 +426,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_SUB: { /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ + mg_send_subtract_rsp(suId, cmd); + break; } case MGT_SVCCHG: { From 2149aaee1b8f99c2e9221b6356ac60494a008a2c Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 10:50:04 -0400 Subject: [PATCH 290/493] Added mod_media_gateway --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 1d27aaad1b..783eddf41f 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -7,6 +7,7 @@ applications/mod_hash applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia +endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket From 2f985f4e784f65b649587a1a9a5b93e5ae6d0a37 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 11:19:17 -0400 Subject: [PATCH 291/493] Removed mod_media_gateway temporarily, will put back at end --- build/modules.conf.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index 783eddf41f..67844ea342 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -7,7 +7,7 @@ applications/mod_hash applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia -endpoints/mod_media_gateway +#endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket From a4c4155232bc22788a02fa672cb130ee18fad762 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 11:48:37 -0400 Subject: [PATCH 292/493] fixing modify mid issue --- .../mod_media_gateway/media_gateway_xml.c | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 64caa13a99..c1772ae89b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -12,7 +12,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) ; static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) ; static int mg_sap_id; -static switch_status_t modify_mid(char* mid); +static switch_status_t modify_mid(char** pmid); /****************************************************************************************************************************/ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) @@ -59,10 +59,11 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->total_peers++; } - if(SWITCH_STATUS_FALSE == (status = modify_mid(profile->mid))){ + if(SWITCH_STATUS_FALSE == (status = modify_mid(&profile->mid))){ goto done; } + profile->idx = ++mg_sap_id; /* we should break from here , profile name should be unique */ @@ -100,7 +101,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) goto done; } - if(SWITCH_STATUS_FALSE == (status = modify_mid(peer_profile->mid))){ + if(SWITCH_STATUS_FALSE == (status = modify_mid(&peer_profile->mid))){ goto done; } @@ -213,55 +214,57 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { /****************************************************************************************************************************/ -static switch_status_t modify_mid(char* mid) +static switch_status_t modify_mid(char** pmid) { - char dup[64]; + char* mid = *pmid; + char* dup; char* val[10]; int count; - + switch_status_t status = SWITCH_STATUS_FALSE; switch_assert(mid); - memset(&dup[0],0,sizeof(dup)); + dup = strdup(mid); /* If MID type is IP then add mid into [] brackets , * If MID type is domain then add mid into <> brackets * */ - strcpy(&dup[0],mid); - count = switch_split(&dup[0], '.', val); + count = switch_split(dup, '.', val); if(!count) { /* Input string is not separated by '.', check if its separated by '-' as format could be xxx-xx-xxx/xxx-xx-xx-xxx */ - memset(&dup[0],0,sizeof(dup)); - strcpy(&dup[0],mid); if(0 == (count = switch_split(dup, '-', val))){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); - return SWITCH_STATUS_FALSE; + goto done; } } if(('<' == val[0][0]) || ('[' == val[0][0])){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MID = %s is already prefixed with proper brackets \n",mid); - return SWITCH_STATUS_SUCCESS; + status = SWITCH_STATUS_SUCCESS; + goto done; } /*first check could be if count is 3 means domain name as generally we have xxx-xx-xxx/xxx.xx.xxx domain */ if(3 == count){ /* domain-type, add value into <> */ - memset(&dup[0],0,sizeof(dup)); - strcpy(&dup[0],mid); - sprintf(mid,"<%s>",dup); + *pmid = switch_mprintf("<%s>", mid); + free(mid); + mid = *pmid; }else if(4 == count){ /* IP address in xxx.xxx.xxx.xxx format */ - memset(&dup[0],0,sizeof(dup)); - strcpy(&dup[0],mid); - sprintf(mid,"[%s]",dup); + *pmid = switch_mprintf("[%s]", mid); + free(mid); + mid = *pmid; }else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid input MID string[%s]\n",mid); - return SWITCH_STATUS_FALSE; + goto done; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added proper brackets to MID = %s \n",mid); - return SWITCH_STATUS_SUCCESS; + status = SWITCH_STATUS_SUCCESS; + +done: + return status; } From 5925e25626303a6b41d5a9e25ad8a90ad1537d60 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 12:06:47 -0400 Subject: [PATCH 293/493] added mod_rad_cdr --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 67844ea342..2a73456541 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -12,3 +12,4 @@ endpoints/mod_sofia xml_int/mod_xml_cdr event_handlers/mod_event_socket codecs/mod_sangoma_codec +event_handlers/mod_radius_cdr From c544ff4b813b4f24c34a22fc573749cd9e8335be Mon Sep 17 00:00:00 2001 From: James Zhang Date: Tue, 3 Jul 2012 14:29:50 -0400 Subject: [PATCH 294/493] sip: add receiver report to rtcp - only one to one rtcp is supported for currently - jitter stats and loss stats are not real --- src/include/switch_types.h | 3 +- src/switch_rtp.c | 91 +++++++++++++++++++++++++++++++++++--- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 185fdb64af..593e921bcd 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -547,6 +547,8 @@ typedef struct { typedef struct { uint32_t packet_count; uint32_t octet_count; + + uint32_t peer_ssrc; } switch_rtcp_numbers_t; typedef struct { @@ -769,7 +771,6 @@ typedef struct { unsigned type:8; /* packet type */ unsigned length:16; /* length in 32-bit words - 1 */ } switch_rtcp_hdr_t; - #else /* BIG_ENDIAN */ typedef struct { diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 5e741c4eb7..ff03a8d054 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -264,6 +264,46 @@ struct switch_rtp { switch_size_t last_flush_packet_count; }; +struct switch_rtcp_source { + unsigned ssrc1:32; + unsigned fraction_lost:8; + unsigned cumulative_lost:24; + unsigned hi_seq_recieved:32; + unsigned interarrival_jitter:32; + unsigned lsr:32; + unsigned lsr_delay:32; +}; + + +#if SWITCH_BYTE_ORDER == __BIG_ENDIAN +struct switch_rtcp_s_desc_head { + unsigned v:2; + unsigned padding:1; + unsigned sc:5; + unsigned pt:8; + unsigned length:16; +}; + +#else /* BIG_ENDIAN */ + +struct switch_rtcp_s_desc_head { + unsigned sc:5; + unsigned padding:1; + unsigned v:2; + unsigned pt:8; + unsigned length:16; +}; + +#endif + + +struct switch_rtcp_s_desc_trunk { + unsigned ssrc:32; + unsigned cname:8; + unsigned length:8; + char text[1]; +}; + struct switch_rtcp_senderinfo { unsigned ssrc:32; unsigned ntp_msw:32; @@ -271,6 +311,9 @@ struct switch_rtcp_senderinfo { unsigned ts:32; unsigned pc:32; unsigned oc:32; + struct switch_rtcp_source sr_source; + struct switch_rtcp_s_desc_head sr_desc_head; + struct switch_rtcp_s_desc_trunk sr_desc_ssrc; }; typedef enum { @@ -1637,8 +1680,8 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_create(switch_rtp_t **new_rtp_session rtp_session->rtcp_send_msg.header.version = 2; rtp_session->rtcp_send_msg.header.p = 0; rtp_session->rtcp_send_msg.header.type = 200; - rtp_session->rtcp_send_msg.header.count = 0; - rtp_session->rtcp_send_msg.header.length = htons(6); + rtp_session->rtcp_send_msg.header.count = 1; + rtp_session->rtcp_send_msg.header.length = htons(12); switch_rtp_set_interval(rtp_session, ms_per_packet, samples_per_interval); @@ -2823,9 +2866,10 @@ static switch_status_t read_rtcp_packet(switch_rtp_t *rtp_session, switch_size_t rtp_session->stats.rtcp.packet_count += sr->pc; rtp_session->stats.rtcp.octet_count += sr->oc; + rtp_session->stats.rtcp.peer_ssrc = ntohl(sr->ssrc); /* sender report */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10,"Received a SR with %d report blocks, " \ + switch_log_printf(SWITCH_CHANNEL_LOG, /*SWITCH_LOG_DEBUG10*/ SWITCH_LOG_INFO,"Received a SR with %d report blocks, " \ "length in words = %d, " \ "SSRC = 0x%X, " \ "NTP MSW = %u, " \ @@ -4025,15 +4069,52 @@ static int rtp_common_write(switch_rtp_t *rtp_session, switch_test_flag(rtp_session, SWITCH_RTP_FLAG_ENABLE_RTCP) && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_RTCP_PASSTHRU) && rtp_session->rtcp_interval && (rtp_session->stats.outbound.packet_count % rtp_session->rtcp_interval) == 0) { struct switch_rtcp_senderinfo* sr = (struct switch_rtcp_senderinfo*)rtp_session->rtcp_send_msg.body; + const char* str_cname=NULL; sr->ssrc = send_msg->header.ssrc; - sr->ntp_msw = htonl((u_long)rtp_session->send_time / 1000000 + 2208988800UL); + sr->ntp_msw = htonl((u_long)(rtp_session->send_time / 1000000 + 2208988800UL)); + /* sr->ntp_lsw = htonl((u_long)(rtp_session->send_time % 1000000 * ((UINT_MAX * 1.0)/ 1000000.0))); + */ + sr->ntp_lsw = htonl((u_long)(rtp_session->send_time % 1000000 * 4294.967296)); sr->ts = send_msg->header.ts; sr->pc = htonl(rtp_session->stats.outbound.packet_count); sr->oc = htonl((rtp_session->stats.outbound.raw_bytes - rtp_session->stats.outbound.packet_count * sizeof(srtp_hdr_t))); - rtcp_bytes = sizeof(switch_rtcp_hdr_t) + sizeof(struct switch_rtcp_senderinfo); + + sr->sr_source.ssrc1 = htonl(rtp_session->stats.rtcp.peer_ssrc); + sr->sr_source.fraction_lost |= 0; + sr->sr_source.cumulative_lost |= 0; + sr->sr_source.hi_seq_recieved = htonl(rtp_session->last_seq); + sr->sr_source.interarrival_jitter = htonl(0); + sr->sr_source.lsr = htonl(0); + sr->sr_source.lsr_delay = htonl(0); + + sr->sr_desc_head.v = 0x02; + sr->sr_desc_head.padding = 0; + sr->sr_desc_head.sc = 1; + sr->sr_desc_head.pt = 202; + sr->sr_desc_head.length = htons(5); + + + sr->sr_desc_ssrc.ssrc = send_msg->header.ssrc; /*htonl(rtp_session->stats.rtcp.peer_ssrc); */ + sr->sr_desc_ssrc.cname = 0x1; + { + char bufa[30]; + str_cname = switch_get_addr(bufa, sizeof(bufa), rtp_session->rtcp_local_addr); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting RTCP src-1 to %s\n", str_cname); + sr->sr_desc_ssrc.length = strlen(str_cname); + memcpy ((char*)sr->sr_desc_ssrc.text, str_cname, strlen(str_cname)); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting RTCP src-1 LENGTH to %d (%d, %s)\n", sr->sr_desc_ssrc.length, sr->sr_desc_head.length, str_cname); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting msw = %d, lsw = %d \n", sr->ntp_msw, sr->ntp_lsw); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "now = %lld, now lo = %d, now hi = %d\n", (int64_t)now, (int32_t)(now&0xFFFFFFFF), (int32_t)((now>>32&0xFFFFFFFF))); + + + rtcp_bytes = sizeof(switch_rtcp_hdr_t) + sizeof(struct switch_rtcp_senderinfo) + sr->sr_desc_ssrc.length -1 ; + + #ifdef ENABLE_SRTP if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE_SEND)) { int sbytes = (int) rtcp_bytes; From 5bfc1473cb0878fb013ce9493df67b977d9d5dbe Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 16:04:43 -0400 Subject: [PATCH 295/493] Added mod_rad_auth --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 2a73456541..559b06e8ea 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -13,3 +13,4 @@ xml_int/mod_xml_cdr event_handlers/mod_event_socket codecs/mod_sangoma_codec event_handlers/mod_radius_cdr +applications/mod_rad_auth From fff6a923fe77d4591f4c7f925aed6a526c1735af Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 3 Jul 2012 16:35:06 -0400 Subject: [PATCH 296/493] Added freeradius-client --- src/mod/applications/mod_rad_auth/Makefile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/mod/applications/mod_rad_auth/Makefile b/src/mod/applications/mod_rad_auth/Makefile index d2e91c24b3..79021e86fe 100644 --- a/src/mod/applications/mod_rad_auth/Makefile +++ b/src/mod/applications/mod_rad_auth/Makefile @@ -10,5 +10,20 @@ RADCLIENT_LA=${RADCLIENT_LIBDIR}/libfreeradius-client.la LOCAL_CFLAGS=-I$(RADCLIENT_DIR)/include LOCAL_LIBADD=$(RADCLIENT_LA) + include $(switch_srcdir)/build/modmake.rules +$(RADCLIENT_DIR): + $(GETLIB) $(RADCLIENT).tar.gz + +$(RADCLIENT_BUILDDIR)/Makefile: $(RADCLIENT_DIR) + mkdir -p $(RADCLIENT_BUILDDIR) + cd $(RADCLIENT_BUILDDIR) && $(DEFAULT_VARS) $(RADCLIENT_DIR)/configure $(DEFAULT_ARGS) --srcdir=$(RADCLIENT_DIR) + $(TOUCH_TARGET) + +$(RADCLIENT_LA): $(RADCLIENT_BUILDDIR)/Makefile + cd $(RADCLIENT_BUILDDIR) && CFLAGS="$(CFLAGS)" $(MAKE) + $(TOUCH_TARGET) + + + From edd718d258306d16e2142f9cf0b9955871f137e2 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 4 Jul 2012 10:00:23 -0400 Subject: [PATCH 297/493] ss7: fix a wired crash on remind ticket 4972 - change dynamic memory allocation/deallocation to char array --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2f4c18d4c3..8c5c221e0e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -643,7 +643,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt) { - char *val=NULL; + char val[(MF_SIZE_TKNSTRE + 7) & 0xff8]; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; if (accTrnspt->eh.pres != PRSNT_NODEF || accTrnspt->infoElmts.pres !=PRSNT_NODEF) { @@ -651,10 +651,8 @@ ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccT return FTDM_SUCCESS; } - val = ftdm_malloc(3*accTrnspt->infoElmts.len); ftdm_url_encode((const char*)accTrnspt->infoElmts.val, val, accTrnspt->infoElmts.len); sngss7_add_var (sngss7_info, "ss7_access_transport_urlenc", val); - ftdm_safe_free(val); return FTDM_SUCCESS; } From 64f33c25da177ce225ff3b24c23fffad97e126fd Mon Sep 17 00:00:00 2001 From: James Zhang Date: Wed, 4 Jul 2012 10:09:19 -0400 Subject: [PATCH 298/493] ss7: fix on last fix, make enough memory for bad encode cases --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 8c5c221e0e..c47b580ef6 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -643,7 +643,7 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt) { - char val[(MF_SIZE_TKNSTRE + 7) & 0xff8]; + char val[3*((MF_SIZE_TKNSTRE + 7) & 0xff8)]; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; if (accTrnspt->eh.pres != PRSNT_NODEF || accTrnspt->infoElmts.pres !=PRSNT_NODEF) { From 7db1cdefb92e8da374875b43af610ffbfc6bc2be Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 4 Jul 2012 21:52:44 +0530 Subject: [PATCH 299/493] Audit code commit --- .../media_gateway_cmd_handler.c | 283 +++++++++++++++++- .../mod_media_gateway/media_gateway_stack.h | 6 +- .../mod_media_gateway/media_gateway_utils.c | 65 +++- .../mod_media_gateway/mod_media_gateway.c | 3 - 4 files changed, 346 insertions(+), 11 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index bbc538a58f..696e7579f8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -258,6 +258,14 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) MgMgcoAuditItem *audit_item; int i; int err_code; + MgMgcoCommand reply; + MgMgcoAuditReply *adtRep = NULLP; + U16 numOfParms; + MgMgcoMediaDesc* media; + MgMgcoCtxt ctxt; + switch_status_t ret; + + memset(&reply, 0, sizeof(reply)); audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; @@ -269,8 +277,8 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) audit_desc = &audit->audit; if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); - return SWITCH_STATUS_FALSE; + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); + return mg_send_heartbeat_audit_rsp(suId, auditReq); } /* dump AUDIT message information */ @@ -283,6 +291,9 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) term_list = mg_get_term_id_list(auditReq); termId = term_list->terms[0]; + /*********************************************************************************************************************/ + /**************************** Validating Audit Request ***************************************************************/ + /*********************************************************************************************************************/ /*-- Start with Context level checks --*/ /*-- CHOOSE Context not allowed --*/ if ((NOTPRSNT != ctxtId->type.pres) && @@ -322,7 +333,38 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) goto error; } - /* validation done , now processing command */ + /*********************************************************************************************************************/ + /**************************** Preparing Response Structure ***********************************************************/ + /*********************************************************************************************************************/ + /*copy transaction-id*/ + memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); + /*copy context-id*/ + memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); + /*copy peer identifier */ + memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; + + + adtRep = &(reply.u.mgCmdRsp[0]->u.aval); + + adtRep->type.pres = PRSNT_NODEF; + adtRep->type.val = MGT_TERMAUDIT; + adtRep->u.other.pres.pres = PRSNT_NODEF; + mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + /* NOW for each requested AUDIT descriptor we need to add entry to adtRep->u.other.audit.parms list */ + + /*********************************************************************************************************************/ + /**************************** Processing Audit Request Descriptors **************************************************/ + /*********************************************************************************************************************/ for (i = 0; i < audit_desc->num.val; i++) { @@ -342,6 +384,25 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) case MGT_MEDIADESC: { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MEDIA \n"); + + /* Grow the list of reply parameters */ + if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), + &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + numOfParms = adtRep->u.other.audit.num.val; + adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; + adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_MEDIADESC; + + media = get_default_media_desc(); + if(!media){ + return SWITCH_STATUS_FALSE; + } + mgUtlCpyMgMgcoMediaDesc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.media, media, &reply.u.mgCmdRsp[0]->memCp); + break; } case MGT_MODEMDESC: @@ -387,7 +448,22 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) case MGT_PKGSDESC: { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Packages \n"); - handle_pkg_audit(suId, auditReq); + /* Grow the list of reply parameters */ + if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), + &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + numOfParms = adtRep->u.other.audit.num.val; + adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; + adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_PKGSDESC; + + if(SWITCH_STATUS_FALSE == mg_build_pkg_desc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.pkgs)){ + return SWITCH_STATUS_FALSE; + } + break; } case MGT_INDAUD_TERMAUDDESC: @@ -405,6 +481,26 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) }/*if (NOTPRSNT != audit_item->auditItem.pres)*/ }/*for loop - audit_desc->num.val */ + /*********************************************************************************************************************/ + /**************************** Send Audit Command Reply***************************************************************/ + /*********************************************************************************************************************/ + reply.cmdStatus.pres = PRSNT_NODEF; + reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + reply.cmdType.pres = PRSNT_NODEF; + reply.cmdType.val = CH_CMD_TYPE_RSP; + + /* send command reply */ + sng_mgco_send_cmd(suId, &reply); + + /* send indication to stack , so he can send response back to peer */ + memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + sng_mgco_send_axn_req(suId, &ctxt); + /***********************************************************************************************************************************/ + return SWITCH_STATUS_SUCCESS; error: @@ -417,6 +513,181 @@ error: return SWITCH_STATUS_FALSE; } +/*****************************************************************************************************************************/ +switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) +{ + MgMgcoCtxt ctxt; + switch_status_t ret; + MgMgcoCommand reply; + MgMgcoTermIdLst *term_list; + MgMgcoTermId *termId; + MgMgcoSubAudReq *audit; + MgMgcoAuditReply *adtRep = NULLP; + + memset(&reply, 0, sizeof(reply)); + audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; + + if(NOTPRSNT == audit->pres.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + /*-- Get termination list --*/ + term_list = mg_get_term_id_list(auditReq); + termId = term_list->terms[0]; + + + /*copy transaction-id*/ + memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); + /*copy context-id*/ + memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); + /*copy peer identifier */ + memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; + + + adtRep = &(reply.u.mgCmdRsp[0]->u.aval); + + adtRep->type.pres = PRSNT_NODEF; + adtRep->type.val = MGT_TERMAUDIT; + adtRep->u.other.pres.pres = PRSNT_NODEF; + adtRep->u.other.audit.num.pres = 0x00; + mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + + /* We will always send one command at a time..*/ + reply.cmdStatus.pres = PRSNT_NODEF; + reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + reply.cmdType.pres = PRSNT_NODEF; + reply.cmdType.val = CH_CMD_TYPE_RSP; + + ret = sng_mgco_send_cmd(suId, &reply); + + /*will send once all audit done*/ + memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); + + return ret; +} + +/*****************************************************************************************************************************/ +switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq) +{ + switch_status_t ret; + MgMgcoCommand reply; + MgMgcoTermIdLst *term_list; + MgMgcoTermId *termId; + MgMgcoSubAudReq *audit; + MgMgcoAuditDesc *audit_desc; + MgMgcoAuditReply *adtRep = NULLP; + U16 numOfParms; + MgMgcoMediaDesc* media; + + + memset(&reply, 0, sizeof(reply)); + audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; + + if(NOTPRSNT == audit->pres.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + audit_desc = &audit->audit; + + if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); + return SWITCH_STATUS_FALSE; + } + + /* dump AUDIT message information */ + /*mgAccEvntPrntMgMgcoSubAudReq(auditReq,stdout);*/ + + /*-- Get termination list --*/ + term_list = mg_get_term_id_list(auditReq); + termId = term_list->terms[0]; + + + /*copy transaction-id*/ + memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); + /*copy context-id*/ + memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); + /*copy peer identifier */ + memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; + + + adtRep = &(reply.u.mgCmdRsp[0]->u.aval); + + adtRep->type.pres = PRSNT_NODEF; + adtRep->type.val = MGT_TERMAUDIT; + adtRep->u.other.pres.pres = PRSNT_NODEF; + mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + /* Grow the list of reply parameters */ + if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), + &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + numOfParms = adtRep->u.other.audit.num.val; + adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; + adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_MEDIADESC; + + media = get_default_media_desc(); + if(!media){ + return SWITCH_STATUS_FALSE; + } + mgUtlCpyMgMgcoMediaDesc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.media, media, &reply.u.mgCmdRsp[0]->memCp); + + /* We will always send one command at a time..*/ + reply.cmdStatus.pres = PRSNT_NODEF; + reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + reply.cmdType.pres = PRSNT_NODEF; + reply.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(suId, &reply); + +#if 0 + /*will send once all audit done*/ + memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); + memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); + memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); + ctxt.cmdStatus.pres = PRSNT_NODEF; + ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; + ret = sng_mgco_send_axn_req(suId, &ctxt); +#endif + + return ret; + + + +} + /*****************************************************************************************************************************/ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) { @@ -428,7 +699,6 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) MgMgcoAuditDesc *audit_desc; MgMgcoAuditReply *adtRep = NULLP; U16 numOfParms; - MgMgcoCtxt ctxt; memset(&reply, 0, sizeof(reply)); audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; @@ -503,12 +773,15 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) ret = sng_mgco_send_cmd(suId, &reply); +#if 0 + /*will send once all audit done*/ memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); ctxt.cmdStatus.pres = PRSNT_NODEF; ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; ret = sng_mgco_send_axn_req(suId, &ctxt); +#endif return ret; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index c1b6db23de..fbd598ab3c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -121,9 +121,10 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont void mgco_print_sdp(CmSdpInfoSet *sdp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); +switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); +MgMgcoMediaDesc* get_default_media_desc(void); +switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); @@ -137,6 +138,7 @@ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId); MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); +switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 6f97ee0b34..39f7fb71d2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -64,7 +64,7 @@ switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) /*****************************************************************************************************************************/ -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) +switch_status_t mg_stack_free_mem(void* msg) { if ( !msg ) { @@ -432,3 +432,66 @@ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ +MgMgcoMediaDesc* get_default_media_desc() +{ + MgMgcoMediaDesc *media = NULL; + MgMgcoMediaPar *mediaPar = NULL; + MgMgcoTermStateParm *trmStPar = NULL; + + mg_stack_alloc_mem((Ptr)&media, sizeof(MgMgcoMediaDesc)); + + if (!media) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + return NULL; + } + media->num.pres = PRSNT_NODEF; + media->num.val = 1; + mg_stack_alloc_mem((Ptr)&mediaPar, sizeof(MgMgcoMediaPar)); + + if (!mediaPar) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + mg_stack_free_mem(media); + return NULL; + } + mg_stack_alloc_mem((Ptr)&media->parms, sizeof(MgMgcoMediaPar *)); + + if (!media->parms) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + mg_stack_free_mem((void*)mediaPar); + mg_stack_free_mem((void*)media); + return NULL; + } + mediaPar->type.pres = PRSNT_NODEF; + mediaPar->type.val = MGT_MEDIAPAR_TERMST; + mediaPar->u.tstate.numComp.pres = PRSNT_NODEF; + mediaPar->u.tstate.numComp.val = 1; + mg_stack_alloc_mem((Ptr)&trmStPar, sizeof(MgMgcoTermStateParm)); + + if (!trmStPar) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + mg_stack_free_mem((void*)mediaPar); + mg_stack_free_mem((void*)media->parms); + mg_stack_free_mem((void*)media); + return NULL; + } + mg_stack_alloc_mem((Ptr)&mediaPar->u.tstate.trmStPar, sizeof(MgMgcoTermStateParm *)); + if (!mediaPar->u.tstate.trmStPar) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + mg_stack_free_mem((void*)trmStPar); + mg_stack_free_mem((void*)mediaPar); + mg_stack_free_mem((void*)media->parms); + mg_stack_free_mem((void*)media); + return NULL; + } + trmStPar->type.pres = PRSNT_NODEF; + trmStPar->type.val = MGT_TERMST_SVCST; + trmStPar->u.svcState.pres = PRSNT_NODEF; + /*TODO - ADD CHECK if term is in svc or not */ + trmStPar->u.svcState.val = MGT_SVCST_INSVC; + + mediaPar->u.tstate.trmStPar[0] = trmStPar; + media->parms[0] = mediaPar; + + return media; +} +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index b3078fd046..d2f5b2b71b 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -448,9 +448,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); handle_mg_audit_cmd(suId, cmd); - /*need to call this for other types of audit.. - * ideally from the request apis we should send response..keeping now here just to send dummy responses*/ - mg_send_audit_rsp(suId, cmd); break; } break; From 642b1a2e6d8a2679f3ee2573852f5c4d9633dcd7 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 5 Jul 2012 10:39:36 +0530 Subject: [PATCH 300/493] adding code for sending termination service change and respective CLI command --- .../mod_media_gateway/media_gateway_cli.c | 22 + .../media_gateway_cmd_handler.c | 114 +++- .../mod_media_gateway/media_gateway_stack.h | 20 +- .../media_gateway_stack_alarms.c | 3 + .../mod_media_gateway/media_gateway_utils.c | 511 ++++++++++++------ 5 files changed, 506 insertions(+), 164 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index e21fc9d3af..9d1c27e007 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -94,6 +94,28 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } else { stream->write_function(stream, "-ERR No such profile\n"); } +/**********************************************************************************/ + }else if(!strcmp(argv[2], "send")) { +/**********************************************************************************/ + /* mg profile send sc */ + printf("count = %d \n",argc); + if(argc < 7){ + goto usage; + } + if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){ + goto usage; + } + + if (profile) { + printf("Input to Send Service Change command : " + "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", + profile->name, argv[4], argv[5], argv[6]); + + megaco_profile_release(profile); + mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6])); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } /**********************************************************************************/ }else { /**********************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 696e7579f8..b4e8d04442 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -9,6 +9,15 @@ #include "mod_media_gateway.h" #include "media_gateway_stack.h" +U32 outgoing_txn_id; + +/*****************************************************************************************************************************/ +const char *mg_service_change_reason[] = { + "\"NOT USED\"", + "\"900 ServiceRestored\"", + "\"905 Termination taken out of service\"", + 0 +}; /*****************************************************************************************************************************/ @@ -134,7 +143,7 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) #else termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); #endif - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ /* We will always send one command at a time..*/ cmd.cmdStatus.pres = PRSNT_NODEF; @@ -197,7 +206,7 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) { - MgMgcoInd *mgErr; + MgMgcoInd *mgErr = NULL; S16 ret; mgErr = NULLP; @@ -584,6 +593,8 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) } /*****************************************************************************************************************************/ +#if 0 +/* Kapil - Not using any more */ switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq) { switch_status_t ret; @@ -788,7 +799,10 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) } +#endif /*****************************************************************************************************************************/ +#if 0 +/* Kapil - Not using any more */ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) { MgMgcoCommand cmd; @@ -858,6 +872,7 @@ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) return ret; } +#endif /*****************************************************************************************************************************/ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) @@ -897,7 +912,7 @@ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) #else termId = &(cmd.u.mgCmdRsp[0]->u.mod.termId); #endif - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ /* We will always send one command at a time..*/ cmd.cmdStatus.pres = PRSNT_NODEF; @@ -958,7 +973,7 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) #else termId = &(cmd.u.mgCmdRsp[0]->u.sub.termId); #endif - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); + /*mg_fill_mgco_termid(termId, (char *)"term1",&req->u.mgCmdRsp[0]->memCp);*/ /* We will always send one command at a time..*/ cmd.cmdStatus.pres = PRSNT_NODEF; @@ -979,3 +994,94 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) return ret; } +/*****************************************************************************************************************************/ +U32 get_txn_id(){ + outgoing_txn_id++; + return outgoing_txn_id; +} +/*****************************************************************************************************************************/ +/* Note : API to send Service Change */ +/* INPUT : +* method - Service change method type (can be MGT_SVCCHGMETH_RESTART/MGT_SVCCHGMETH_FORCED (please refer to sng_ss7/cm/mgt.h for more values)) +* MgServiceChangeReason_e - Service Change reason +* SuId - Service User ID for MG SAP - it will be same like mg_profile_t->idx (refer to media_gateway_xml.c->mg_sap_id) +* term_name - String format defined termination name +*/ +switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason) +{ + MgMgcoSvcChgPar srvPar; + MgMgcoTermId* termId; + switch_status_t ret; + MgMgcoCommand request; + MgMgcoSvcChgReq *svc; + + MG_ZERO(&srvPar, sizeof(MgMgcoSvcChgPar)); + MG_ZERO(&request, sizeof(request)); + + + + if(SWITCH_STATUS_FALSE == (ret = mg_create_mgco_command(&request, CH_CMD_TYPE_REQ, MGT_SVCCHG))){ + goto err; + } + + /*fill txn id */ + request.transId.pres = PRSNT_NODEF; + request.transId.val = get_txn_id(); + + request.contextId.type.pres = PRSNT_NODEF; + request.contextId.type.val = MGT_CXTID_NULL; + +#if 0 + /* TODO - fill of below fields */ +#ifdef GCP_MGCO +#ifdef GCP_VER_2_1 + MgMgcoSegNum segNum; + MgMgcoSegCmpl segCmpl; +#endif +#endif /* GCP_MGCO */ +#endif + request.cmdStatus.pres = PRSNT_NODEF; + request.cmdStatus.val = CH_CMD_STATUS_END_OF_TXN; + + request.cmdType.pres = PRSNT_NODEF; + request.cmdType.val = CH_CMD_TYPE_REQ; + + svc = &request.u.mgCmdReq[0]->cmd.u.svc; + + if(SWITCH_STATUS_FALSE == (ret = mg_fill_svc_change(&svc->parm, method, mg_service_change_reason[reason]))){ + return ret; + } + + /*mgUtlCpyMgMgcoSvcChgPar(&svc->parm, &srvPar, &request.u.mgCmdReq[0]->memCp);*/ + + printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len); + + + if (mgUtlGrowList((void ***)&svc->termIdLst.terms, sizeof(MgMgcoTermIdLst), + &svc->termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + +#ifdef GCP_VER_2_1 + termId = svc->termIdLst.terms[0]; +#else + termId = &(svc->termId); +#endif + + + mg_fill_mgco_termid(termId, (char*)term_name ,strlen(term_name), &request.u.mgCmdReq[0]->memCp); + + + printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len); + + sng_mgco_send_cmd(suId, &request); + + return SWITCH_STATUS_SUCCESS; + +err: + mgUtlDelMgMgcoSvcChgPar(&srvPar); + return ret; +} +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index fbd598ab3c..a90e6dc2c4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -60,6 +60,13 @@ typedef struct _mgPackage extern MgPackage_t mg_pkg_list[]; +/* Service change Reason */ +typedef enum { + MG_SVC_REASON_NOTUSED = 0, + MG_SVC_REASON_900_RESTORED = 1, + MG_SVC_REASON_905_TERM_OOS = 2, + MG_SVC_REASON_LAST = 4 +} MgServiceChangeReason_e; #define MG_TXN_INVALID 0 @@ -74,6 +81,12 @@ extern MgPackage_t mg_pkg_list[]; MG_SET_PRES((tkn).pres); \ (tkn).val = _val; +#define MG_SET_TKN_VAL_PRES(_tkn, _val, _pres) \ +{ \ + (_tkn)->val = _val; \ + (_tkn)->pres = _pres; \ +} + #define MG_MEM_COPY(_dst, _src, _len) \ cmMemcpy((U8*) (_dst), (const U8*) (_src), _len) @@ -126,7 +139,7 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); MgMgcoMediaDesc* get_default_media_desc(void); switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp); void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); @@ -139,6 +152,11 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); +void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp); +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason); +void mg_fill_null_context(MgMgcoContextId* ctxt); +switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason); +switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index fc09a6bea4..5281a7942a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -208,6 +208,9 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) case LMG_EVENT_PEER_ENABLED: { len = len + sprintf(prBuf+len, "gateway enabled"); + /* gateway enabled now we can send termination service change */ + /*TODO - probably we cannt immediate send Service change - we have to find proper place */ + /*mg_send_service_change(0x01, "A01", MGT_SVCCHGMETH_RESTART,MG_SVC_REASON_900_RESTORED );*/ break; } case LMG_EVENT_PEER_DISCOVERED: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 39f7fb71d2..ed70b74173 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -80,45 +80,65 @@ switch_status_t mg_stack_free_mem(void* msg) /*****************************************************************************************************************************/ -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp) +S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp) { #ifdef GCP_ASN - Size size; + Size size; #endif - S16 ret = ROK; + S16 ret = ROK; - termId->name.pres.pres = PRSNT_NODEF; - /* mg011.105: Bug fixes */ - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = cmStrlen((CONSTANT U8*)str); - MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len, memCp, ret); - if( ret != ROK) - RETVALUE(ret); + termId->type.pres = PRSNT_NODEF; + termId->type.val = MGT_TERMID_OTHER; - cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)str,termId->name.lcl.len); + termId->name.dom.pres = NOTPRSNT; + termId->name.dom.len = 0x00; -#ifdef GCP_ASN - /* Remove comment to fill other term ID - termId->wildcard.num.pres = NOTPRSNT; */ - /* Remove comment to fill wilcard term ID */ - termId->wildcard.num.pres = PRSNT_NODEF; - termId->wildcard.num.val = 1; - size = ((sizeof(MgMgcoWildcardField*))); - MG_GETMEM((termId->wildcard.wildcard),size,memCp, ret); - if( ret != ROK) - RETVALUE(ret); + termId->name.pres.pres = PRSNT_NODEF; + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = term_len; + /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ + ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); - MG_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), - memCp, ret); - if( ret != ROK) - RETVALUE(ret); + printf("termId->name.lcl.val[%p]\n",termId->name.lcl.val); - termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; - termId->wildcard.wildcard[0]->len = 1; - termId->wildcard.wildcard[0]->val[0] = 0x55; + if( ret != ROK) + RETVALUE(ret); + + /*cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)term_str,termId->name.lcl.len);*/ + strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); + termId->name.lcl.val[termId->name.lcl.len] = '\0'; + + printf("mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + + +#ifdef GCP_ASN + if((termId->type.val == MGT_TERMID_ALL) || + (termId->type.val == MGT_TERMID_CHOOSE)){ + /* Remove comment to fill other term ID + termId->wildcard.num.pres = NOTPRSNT; */ + /* Remove comment to fill wilcard term ID */ + termId->wildcard.num.pres = PRSNT_NODEF; + termId->wildcard.num.val = 1; + size = ((sizeof(MgMgcoWildcardField*))); + MG_GETMEM((termId->wildcard.wildcard),size,memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + MG_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), + memCp, ret); + if( ret != ROK) + RETVALUE(ret); + + termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; + termId->wildcard.wildcard[0]->len = 1; + termId->wildcard.wildcard[0]->val[0] = 0x55; + + }else{ + termId->wildcard.num.pres = NOTPRSNT; + } #endif /* GCP_ASN */ - RETVALUE(ROK); + RETVALUE(ROK); } /*****************************************************************************************************************************/ @@ -270,166 +290,166 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) { - MG_ZERO(errTxt->val, sizeof(errTxt->val)); - errTxt->len = 0; + MG_ZERO(errTxt->val, sizeof(errTxt->val)); + errTxt->len = 0; - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; - if (MG_TXN_INVALID == txnId ) - { - MG_MEM_COPY((&errTxt->val[errTxt->len]), "TransactionId=0", 15); - errTxt->len += 15; - } + if (MG_TXN_INVALID == txnId ) + { + MG_MEM_COPY((&errTxt->val[errTxt->len]), "TransactionId=0", 15); + errTxt->len += 15; + } - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" - "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) { - MG_ZERO((errTxt->val), sizeof(errTxt->val)); - errTxt->len = 0; - if(ctxtId->type.pres != NOTPRSNT) - { - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - if(ctxtId->type.val == MGT_CXTID_NULL) - { - errTxt->val[errTxt->len] = '-'; - errTxt->len += 1; - } - else if(ctxtId->type.val == MGT_CXTID_ALL) - { - errTxt->val[errTxt->len] = '*'; - errTxt->len += 1; - } - else if(ctxtId->type.val == MGT_CXTID_CHOOSE) - { - errTxt->val[errTxt->len] = '$'; - errTxt->len += 1; - } - else if((ctxtId->type.val == MGT_CXTID_OTHER) && (ctxtId->val.pres != NOTPRSNT)) - { + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; + if(ctxtId->type.pres != NOTPRSNT) + { + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + if(ctxtId->type.val == MGT_CXTID_NULL) + { + errTxt->val[errTxt->len] = '-'; + errTxt->len += 1; + } + else if(ctxtId->type.val == MGT_CXTID_ALL) + { + errTxt->val[errTxt->len] = '*'; + errTxt->len += 1; + } + else if(ctxtId->type.val == MGT_CXTID_CHOOSE) + { + errTxt->val[errTxt->len] = '$'; + errTxt->len += 1; + } + else if((ctxtId->type.val == MGT_CXTID_OTHER) && (ctxtId->val.pres != NOTPRSNT)) + { #ifdef BIT_64 - sprintf((char*)&errTxt->val[errTxt->len], "%d", ctxtId->val.val); + sprintf((char*)&errTxt->val[errTxt->len], "%d", ctxtId->val.val); #else - sprintf((char*)&errTxt->val[errTxt->len], "%lu", ctxtId->val.val); + sprintf((char*)&errTxt->val[errTxt->len], "%lu", ctxtId->val.val); #endif - errTxt->len += cmStrlen((U8*)(&errTxt->val[errTxt->len])); - } + errTxt->len += cmStrlen((U8*)(&errTxt->val[errTxt->len])); + } - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" - "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ void mgco_print_sdp(CmSdpInfoSet *sdp) { - int i; - - - if (sdp->numComp.pres == NOTPRSNT) { - return; - } - - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; - - if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && - s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + int i; - if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", - s->conn.u.ip4.u.uniIp.b[0].val, - s->conn.u.ip4.u.uniIp.b[1].val, - s->conn.u.ip4.u.uniIp.b[2].val, - s->conn.u.ip4.u.uniIp.b[3].val); - } - if (s->attrSet.numComp.pres) { - for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ - - - } - } - if (s->mediaDescSet.numComp.pres) { - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); - - } - } - } - } - } + if (sdp->numComp.pres == NOTPRSNT) { + return; + } + + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; + + if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && + s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->conn.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->conn.u.ip4.u.uniIp.b[0].val, + s->conn.u.ip4.u.uniIp.b[1].val, + s->conn.u.ip4.u.uniIp.b[2].val, + s->conn.u.ip4.u.uniIp.b[3].val); + } + if (s->attrSet.numComp.pres) { + for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { + /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ + + + } + } + + if (s->mediaDescSet.numComp.pres) { + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; + + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + + } + } + } + } + } } /*****************************************************************************************************************************/ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) { - MG_ZERO((errTxt->val), sizeof(errTxt->val)); - errTxt->len = 0; + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; - if(termId->type.pres != NOTPRSNT) - { - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; + if(termId->type.pres != NOTPRSNT) + { + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; - if(termId->type.val == MGT_TERMID_ROOT) - { - MG_MEM_COPY((&errTxt->val[errTxt->len]), "ROOT", 4); - errTxt->len += 4; - } - else if(termId->type.val == MGT_TERMID_ALL) - { - errTxt->val[errTxt->len] = '*'; - errTxt->len += 1; - } - else if(termId->type.val == MGT_TERMID_CHOOSE) - { - errTxt->val[errTxt->len] = '$'; - errTxt->len += 1; - } - else if((termId->type.val == MGT_TERMID_OTHER) && (termId->name.pres.pres != NOTPRSNT)) - { - if(termId->name.lcl.pres != NOTPRSNT) - { - MG_MEM_COPY(&(errTxt->val[errTxt->len]), termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); - errTxt->len += termId->name.lcl.len; - } - if(termId->name.dom.pres != NOTPRSNT) - { - MG_MEM_COPY(&(errTxt->val[errTxt->len]), - termId->name.dom.val, sizeof(U8) * termId->name.dom.len); - errTxt->len += termId->name.dom.len; - } - } - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - } + if(termId->type.val == MGT_TERMID_ROOT) + { + MG_MEM_COPY((&errTxt->val[errTxt->len]), "ROOT", 4); + errTxt->len += 4; + } + else if(termId->type.val == MGT_TERMID_ALL) + { + errTxt->val[errTxt->len] = '*'; + errTxt->len += 1; + } + else if(termId->type.val == MGT_TERMID_CHOOSE) + { + errTxt->val[errTxt->len] = '$'; + errTxt->len += 1; + } + else if((termId->type.val == MGT_TERMID_OTHER) && (termId->name.pres.pres != NOTPRSNT)) + { + if(termId->name.lcl.pres != NOTPRSNT) + { + MG_MEM_COPY(&(errTxt->val[errTxt->len]), termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + errTxt->len += termId->name.lcl.len; + } + if(termId->name.dom.pres != NOTPRSNT) + { + MG_MEM_COPY(&(errTxt->val[errTxt->len]), + termId->name.dom.val, sizeof(U8) * termId->name.dom.len); + errTxt->len += termId->name.dom.len; + } + } + errTxt->val[errTxt->len] = '\"'; + errTxt->len += 1; + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" - "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ MgMgcoMediaDesc* get_default_media_desc() @@ -495,3 +515,176 @@ MgMgcoMediaDesc* get_default_media_desc() return media; } /*****************************************************************************************************************************/ + +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason) +{ + MG_SET_TKN_VAL_PRES(&srvPar->pres, 0, PRSNT_NODEF); + MG_SET_TKN_VAL_PRES(&srvPar->meth.pres, 0, PRSNT_NODEF); + MG_SET_TKN_VAL_PRES(&srvPar->meth.type, method, PRSNT_NODEF); + + /* Set the reason */ + srvPar->reason.pres = PRSNT_NODEF; + srvPar->reason.len = cmStrlen((const U8 *)reason); + + mg_stack_alloc_mem((Ptr*)&srvPar->reason.val, srvPar->reason.len); + if (NULL == srvPar->reason.val) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + return SWITCH_STATUS_FALSE; + } + + strncpy((char*)srvPar->reason.val, + (const char *)reason, + srvPar->reason.len); + + srvPar->reason.val[srvPar->reason.len] = '\0'; + + mg_get_time_stamp(&srvPar->time); + + printf("reason[%s], len[%d]\n",srvPar->reason.val, srvPar->reason.len); + + + return SWITCH_STATUS_SUCCESS; +} +/*****************************************************************************************************************************/ + +void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp) +{ + DateTime dt; + Txt dmBuf[16]; + U32 usec; + + usec = 0; + + /*-- Get system date and time via Trillium stack API --*/ + SGetRefDateTimeAdj(0, 0, &dt, &usec); + + /*-- Now fill the time and date in the target --*/ + MG_ZERO(&dmBuf[0], 16); + + sprintf(dmBuf, "%04d%02d%02d", + (S16)(dt.year) + 1900, (S16)(dt.month), (S16)(dt.day)); + cmMemcpy((U8*) &timeStamp->date.val[0], (U8*) &dmBuf[0], 8); + + MG_ZERO(&dmBuf[0], 16); + sprintf(dmBuf, "%02d%02d%02d%02d", + (S16)(dt.hour), (S16)(dt.min), (S16)(dt.sec), (S16)(usec/10000)); + cmMemcpy((U8*) &timeStamp->time.val[0], (U8*) &dmBuf[0], 8); + + /*-- Setup the other stuff --*/ + timeStamp->pres.pres = PRSNT_NODEF; + timeStamp->date.pres = PRSNT_NODEF; + timeStamp->date.len = 8; + timeStamp->time.pres = PRSNT_NODEF; + timeStamp->time.len = 8; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"mg_get_time_stamp: time(%s)\n", dmBuf); +} +/*****************************************************************************************************************************/ +switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType) +{ + MgMgcoCommandReq *cmdReq; + MgMgcoCmdReply *cmdRep; + switch_status_t ret; + + cmdReq = NULL; + cmdRep = NULL; + + cmMemset((U8 *)cmd, 0, sizeof(MgMgcoCommand)); + + MG_SET_VAL_PRES(cmd->cmdType, apiType); + + /* Allocate the event structure */ + switch(apiType) + { + /* For command Request */ + case CH_CMD_TYPE_REQ: + { + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd->u.mgCmdReq[0],sizeof(MgMgcoCommandReq)))){ + return ret; + } + + if (NULL == cmd->u.mgCmdReq[0]) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); + return SWITCH_STATUS_FALSE; + } + + cmdReq = cmd->u.mgCmdReq[0]; + cmdReq->pres.pres = PRSNT_NODEF; + cmdReq->cmd.type.pres = PRSNT_NODEF; + cmdReq->cmd.type.val = cmdType; + switch (cmdType) + { + case MGT_SVCCHG: + cmdReq->cmd.u.svc.pres.pres = PRSNT_NODEF; + break; + + case MGT_NTFY: + cmdReq->cmd.u.ntfy.pres.pres = PRSNT_NODEF; + break; + } /* switch cmdType */ + break; + } + + /* For command Response */ + case CH_CMD_TYPE_RSP: + { + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd->u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + if (NULL == cmd->u.mgCmdRsp[0]) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); + return SWITCH_STATUS_FALSE; + } + cmdRep = cmd->u.mgCmdRsp[0]; + cmdRep->pres.pres = PRSNT_NODEF; + cmdRep->type.pres = PRSNT_NODEF; + cmdRep->type.val = cmdType; + switch (cmdType) + { + case MGT_ADD: + cmdRep->u.add.pres.pres = PRSNT_NODEF; + break; + + case MGT_MOVE: + cmdRep->u.move.pres.pres = PRSNT_NODEF; + break; + + case MGT_MODIFY: + cmdRep->u.mod.pres.pres = PRSNT_NODEF; + break; + + case MGT_SUB: + cmdRep->u.sub.pres.pres = PRSNT_NODEF; + break; + + case MGT_SVCCHG: + cmdRep->u.svc.pres.pres = PRSNT_NODEF; + break; + + case MGT_AUDITVAL: + cmdRep->u.aval.type.pres = PRSNT_NODEF; + break; + case MGT_AUDITCAP: + cmdRep->u.acap.type.pres = PRSNT_NODEF; + break; + + } /* switch cmdType */ + break; + } + + default: + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, invalid Cmd type[%d]\n",apiType); + return SWITCH_STATUS_FALSE; + } /* switch -apiType */ + + return SWITCH_STATUS_SUCCESS; +} +/*****************************************************************************************************************************/ + +void mg_fill_null_context(MgMgcoContextId* ctxt) +{ + MG_SET_TKN_VAL_PRES(&ctxt->type, MGT_CXTID_NULL, PRSNT_NODEF); +} +/*****************************************************************************************************************************/ From 4ead147e100d0bc38f17922dc49bdce3ae0615db Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 6 Jul 2012 12:04:52 -0400 Subject: [PATCH 301/493] chlog:Support for send-connect-ack parameter --- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 3 +-- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c | 3 +++ .../ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index 92054b8869..4e9c9dcadd 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -275,7 +275,6 @@ typedef struct sngisdn_span_data { uint8_t force_sending_complete; uint8_t cid_name_method; uint8_t send_cid_name; - int32_t timer_t301; int32_t timer_t302; int32_t timer_t303; @@ -292,7 +291,7 @@ typedef struct sngisdn_span_data { int32_t timer_t318; int32_t timer_t319; int32_t timer_t322; - + uint8_t send_connect_ack; char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS]; ftdm_timer_id_t timers[SNGISDN_NUM_SPAN_TIMERS]; ftdm_sched_t *sched; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c index 5b3db934a5..52c4ecd8de 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c @@ -302,6 +302,7 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_ signal_data->cid_name_method = SNGISDN_CID_NAME_AUTO; signal_data->send_cid_name = SNGISDN_OPT_DEFAULT; + signal_data->send_connect_ack = SNGISDN_OPT_DEFAULT; span->default_caller_data.dnis.plan = FTDM_NPI_INVALID; span->default_caller_data.dnis.type = FTDM_TON_INVALID; @@ -465,6 +466,8 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_ parse_timer(val, &signal_data->timer_t319); } else if (!strcasecmp(var, "timer-t322")) { parse_timer(val, &signal_data->timer_t322); + } else if (!strcasecmp(var, "send-connect-ack")) { + parse_yesno(var, val, &signal_data->send_connect_ack); } else { ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c index a1229dcab9..0a45f2e562 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c @@ -695,6 +695,14 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) } } + if (signal_data->send_connect_ack != SNGISDN_OPT_DEFAULT) { + if (signal_data->send_connect_ack == SNGISDN_OPT_TRUE) { + cfg.t.cfg.s.inDLSAP.ackOpt = TRUE; + } else { + cfg.t.cfg.s.inDLSAP.ackOpt = FALSE; + } + } + /* Override the restart options if user selected that option */ if (signal_data->restart_opt != SNGISDN_OPT_DEFAULT) { if (signal_data->restart_opt == SNGISDN_OPT_TRUE) { From 03be3a3a74e57568df134bc54cc95fecc30211c1 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 2 Sep 2011 16:59:59 -0500 Subject: [PATCH 302/493] don't parse signals in the set_running_state function to avoid livelock situation --- src/include/switch_channel.h | 4 ++++ src/switch_channel.c | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 176b841147..a4e44083df 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -87,6 +87,10 @@ SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_ #define switch_channel_up(_channel) (switch_channel_check_signal(_channel, SWITCH_TRUE) || switch_channel_get_state(_channel) < CS_HANGUP) #define switch_channel_down(_channel) (switch_channel_check_signal(_channel, SWITCH_TRUE) || switch_channel_get_state(_channel) >= CS_HANGUP) + +#define switch_channel_up_nosig(_channel) switch_channel_get_state(_channel) < CS_HANGUP +#define switch_channel_down_nosig(_channel) switch_channel_get_state(_channel) >= CS_HANGUP + #define switch_channel_media_ack(_channel) (!switch_channel_test_cap(_channel, CC_MEDIA_ACK) || switch_channel_test_flag(_channel, CF_MEDIA_ACK)) SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, switch_channel_t *other_channel, switch_channel_state_t want_state); diff --git a/src/switch_channel.c b/src/switch_channel.c index 3f96616794..c11754d48a 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1839,8 +1839,11 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_set_running_state( channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Presence-Call-Direction", channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound"); - - if (switch_channel_down(channel)) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-HIT-Dialplan", + switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND || + switch_channel_test_flag(channel, CF_DIALPLAN) ? "true" : "false"); + + if (switch_channel_down_nosig(channel)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "hangup"); } else if (switch_channel_test_flag(channel, CF_ANSWERED)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "answered"); @@ -2123,7 +2126,7 @@ SWITCH_DECLARE(void) switch_channel_event_set_basic_data(switch_channel_t *chann switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Call-UUID", v); } - if (switch_channel_down(channel)) { + if (switch_channel_down_nosig(channel)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "hangup"); } else if (switch_channel_test_flag(channel, CF_ANSWERED)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "answered"); From 7381343e046d2a1eee005a4038c04f4a8d39e75f Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 16 Jul 2012 11:18:24 -0400 Subject: [PATCH 303/493] fix compile --- src/mod/endpoints/mod_sofia/rtp.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index e99eef1b76..9deddf5922 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -37,6 +37,10 @@ #define kLOCALPORT "local_port" #define kREMOTEADDR "remote_addr" #define kREMOTEPORT "remote_port" +#define kCODEC "codec" +#define kPTIME "ptime" +#define kRFC2833PT "rfc2833_pt" +#define kMODE "mode" static struct { switch_memory_pool_t *pool; @@ -53,14 +57,16 @@ typedef struct { switch_rtp_t *rtp_session; const char *bind_address; - + const char *codec; + int ptime; const switch_codec_implementation_t *negotiated_codecs[SWITCH_MAX_CODECS]; int num_negotiated_codecs; char *origin; - int local_port; + switch_port_t local_port; + switch_port_t remote_port; } crtp_private_t; @@ -89,15 +95,11 @@ switch_io_routines_t crtp_io_routines = { .send_dtmf = channel_send_dtmf }; -SWITCH_STANDARD_API(test_function) -{ - return SWITCH_STATUS_SUCCESS; -} void crtp_init(switch_loadable_module_interface_t *module_interface) { switch_endpoint_interface_t *endpoint_interface; - switch_api_interface_t *api_interface; + //switch_api_interface_t *api_interface; crtp.pool = module_interface->pool; endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); @@ -106,7 +108,7 @@ void crtp_init(switch_loadable_module_interface_t *module_interface) endpoint_interface->state_handler = &crtp_state_handlers; crtp.endpoint_interface = endpoint_interface; - SWITCH_ADD_API(api_interface, "rtp_test", "test", test_function, ""); + //SWITCH_ADD_API(api_interface, "rtp_test", "test", test_function, ""); } static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, @@ -120,11 +122,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *dname = "PCMU"; uint32_t interval = 20; crtp_private_t *tech_pvt = NULL; -#if 0 - const char *r_sdp = switch_event_get_header(var_event, kRSDP); -#endif - const char *l_sdp = switch_event_get_header(var_event, kLSDP); - const char *codec_string = switch_event_get_header_nil(var_event, kCODECSTRING); + //const char *l_sdp = switch_event_get_header(var_event, kLSDP); + //const char *codec_string = switch_event_get_header_nil(var_event, kCODECSTRING); if (!(*new_session = switch_core_session_request(crtp.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { @@ -142,9 +141,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->bind_address = switch_core_session_strdup(*new_session, switch_event_get_header_nil(var_event, kBINDADDRESS)); switch_core_session_set_private(*new_session, tech_pvt); - if (setup_local_rtp(tech_pvt, l_sdp, codec_string) != SWITCH_STATUS_SUCCESS) { - goto fail; - } snprintf(name, sizeof(name), "rtp/ctrl"); /* TODO add addresses */ switch_channel_set_name(channel, name); From 42cb846f39132f733d32cf05a2cf5079543b3321 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 16 Jul 2012 11:23:14 -0400 Subject: [PATCH 304/493] fix compile part 2 --- src/switch_rtp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index ff03a8d054..bc25d3f39f 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -4109,7 +4109,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting RTCP src-1 LENGTH to %d (%d, %s)\n", sr->sr_desc_ssrc.length, sr->sr_desc_head.length, str_cname); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting msw = %d, lsw = %d \n", sr->ntp_msw, sr->ntp_lsw); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "now = %lld, now lo = %d, now hi = %d\n", (int64_t)now, (int32_t)(now&0xFFFFFFFF), (int32_t)((now>>32&0xFFFFFFFF))); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "now = %"SWITCH_TIME_T_FMT", now lo = %d, now hi = %d\n", (int64_t)now, (int32_t)(now&0xFFFFFFFF), (int32_t)((now>>32&0xFFFFFFFF))); rtcp_bytes = sizeof(switch_rtcp_hdr_t) + sizeof(struct switch_rtcp_senderinfo) + sr->sr_desc_ssrc.length -1 ; From d139a8ef6378ae4f1eea830448aae14905df314b Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 16 Jul 2012 11:24:04 -0400 Subject: [PATCH 305/493] fix compile part 2 --- src/switch_rtp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index bc25d3f39f..93f7c56254 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -4109,7 +4109,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting RTCP src-1 LENGTH to %d (%d, %s)\n", sr->sr_desc_ssrc.length, sr->sr_desc_head.length, str_cname); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Setting msw = %d, lsw = %d \n", sr->ntp_msw, sr->ntp_lsw); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "now = %"SWITCH_TIME_T_FMT", now lo = %d, now hi = %d\n", (int64_t)now, (int32_t)(now&0xFFFFFFFF), (int32_t)((now>>32&0xFFFFFFFF))); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "now = %"SWITCH_TIME_T_FMT", now lo = %d, now hi = %d\n", (switch_time_t)now, (int32_t)(now&0xFFFFFFFF), (int32_t)((now>>32&0xFFFFFFFF))); rtcp_bytes = sizeof(switch_rtcp_hdr_t) + sizeof(struct switch_rtcp_senderinfo) + sr->sr_desc_ssrc.length -1 ; From 9a817c7aa24ef5259dc7765d82597bb11e3d2654 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 16 Jul 2012 12:48:57 -0400 Subject: [PATCH 306/493] service change code modification --- .../mod_media_gateway/media_gateway.c | 3 +- .../mod_media_gateway/media_gateway_cli.c | 7 +- .../media_gateway_cmd_handler.c | 27 +- .../mod_media_gateway/media_gateway_stack.h | 2 +- .../mod_media_gateway/mod_media_gateway.c | 533 +----------------- 5 files changed, 39 insertions(+), 533 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index e618b5ef6c..0c43adab6b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -74,6 +74,7 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile) { mg_context_t *ctx; + int i = 0x0;; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ @@ -86,7 +87,7 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) if ((profile->contexts_bitmap[profile->next_context_id % 8] & (1 << (profile->next_context_id / 8))) == 0) { /* Found! */ profile->contexts_bitmap[profile->next_context_id % 8] |= 1 << (profile->next_context_id / 8); - int i = profile->next_context_id % MG_CONTEXT_MODULO; + i = profile->next_context_id % MG_CONTEXT_MODULO; ctx = malloc(sizeof *ctx); ctx->context_id = profile->next_context_id; ctx->profile = profile; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 9d1c27e007..3e3b034df5 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -26,6 +26,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre int argc; char* argv[10]; char* dup = NULL; + int wild = 0x00; megaco_profile_t* profile = NULL; if (zstr(cmd)) { @@ -107,12 +108,16 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } if (profile) { + if(!zstr(argv[7]) && !strcasecmp(argv[7],"wild")){ + wild = 0x01; + } + printf("Input to Send Service Change command : " "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", profile->name, argv[4], argv[5], argv[6]); megaco_profile_release(profile); - mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6])); + mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]),wild); } else { stream->write_function(stream, "-ERR No such profile\n"); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index b4e8d04442..7855bcd9d9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -273,10 +273,14 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) MgMgcoMediaDesc* media; MgMgcoCtxt ctxt; switch_status_t ret; + uint8_t wild = 0x00; memset(&reply, 0, sizeof(reply)); audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; + wild = auditReq->u.mgCmdReq[0]->wild.pres; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"%s :: wild card request = %s \n",__FUNCTION__,(1==wild)?"TRUE":"FALSE"); if(NOTPRSNT == audit->pres.pres){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); @@ -498,6 +502,11 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) reply.cmdType.pres = PRSNT_NODEF; reply.cmdType.val = CH_CMD_TYPE_RSP; + if(wild){ + reply.u.mgCmdRsp[0]->wild.pres = PRSNT_NODEF; + } + + /* send command reply */ sng_mgco_send_cmd(suId, &reply); @@ -942,9 +951,12 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) int ret = 0x00; MgMgcoTermId *termId; MgMgcoCtxt ctxt; + uint8_t wild = 0x00; memset(&cmd,0, sizeof(cmd)); + wild = req->u.mgCmdReq[0]->wild.pres; + /*copy transaction-id*/ memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); @@ -959,6 +971,10 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) return ret; } + if(wild){ + cmd.u.mgCmdRsp[0]->wild.pres = PRSNT_NODEF; + } + cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->type.val = MGT_SUB; @@ -1007,7 +1023,7 @@ U32 get_txn_id(){ * SuId - Service User ID for MG SAP - it will be same like mg_profile_t->idx (refer to media_gateway_xml.c->mg_sap_id) * term_name - String format defined termination name */ -switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason) +switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild) { MgMgcoSvcChgPar srvPar; MgMgcoTermId* termId; @@ -1054,9 +1070,6 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t /*mgUtlCpyMgMgcoSvcChgPar(&svc->parm, &srvPar, &request.u.mgCmdReq[0]->memCp);*/ - printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len); - - if (mgUtlGrowList((void ***)&svc->termIdLst.terms, sizeof(MgMgcoTermIdLst), &svc->termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK) { @@ -1073,8 +1086,12 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t mg_fill_mgco_termid(termId, (char*)term_name ,strlen(term_name), &request.u.mgCmdReq[0]->memCp); + if(wild){ + request.u.mgCmdReq[0]->wild.pres = PRSNT_NODEF; + } - printf("reason[%p = %s], len[%d]\n",svc->parm.reason.val, svc->parm.reason.val, svc->parm.reason.len); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Sending %s Service Change for termId[%s] with reason[%s], len[%d]\n", + ((1==wild)?"WildCard":"Non Wild Card"), term_name, svc->parm.reason.val, svc->parm.reason.len); sng_mgco_send_cmd(suId, &request); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index a90e6dc2c4..cdbde20c13 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -155,7 +155,7 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp); switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason); void mg_fill_null_context(MgMgcoContextId* ctxt); -switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason); +switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild); switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 26d36c7a05..7e4be231ca 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -19,15 +19,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown); SWITCH_MODULE_DEFINITION(mod_media_gateway, mod_media_gateway_load, mod_media_gateway_shutdown, NULL); -switch_status_t handle_mg_add_cmd(SuId suId, MgMgcoCommand *req, MgMgcoAmmReq *addReq); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg); -switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); -switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp); -void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); -switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); - /**************************************************************************************************************/ SWITCH_STANDARD_API(megaco_function) @@ -169,58 +160,9 @@ void handle_sng_log(uint8_t level, char *fmt, ...) va_end(ptr); } +/*****************************************************************************************************************************/ -static void mgco_print_sdp(CmSdpInfoSet *sdp) -{ - int i; - - - if (sdp->numComp.pres == NOTPRSNT) { - return; - } - - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; - - if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && - s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { - - if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", - s->conn.u.ip4.u.uniIp.b[0].val, - s->conn.u.ip4.u.uniIp.b[1].val, - s->conn.u.ip4.u.uniIp.b[2].val, - s->conn.u.ip4.u.uniIp.b[3].val); - } - if (s->attrSet.numComp.pres) { - for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ - - } - } - - if (s->mediaDescSet.numComp.pres) { - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); - - } - } - } - } - } -} - - +#if 0 static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet *sdp) { int i; @@ -263,7 +205,7 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet CmSdpAttr *a = s->attrSet.attr[mediaId]; local_sdp->info[i]->attrSet.attr[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpAttr)); *(local_sdp->info[i]->attrSet.attr[mediaId]) = *a; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media %p\n", a); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media %p\n", (void*)a); } } @@ -286,7 +228,10 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet } } } + + return SWITCH_STATUS_SUCCESS; } +#endif void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) { @@ -530,7 +475,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { case MGT_ADD: { - handle_mg_add_cmd(suId, cmd, &cmd->u.mgCmdInd[0]->cmd.u.add); + handle_mg_add_cmd(&cmd->u.mgCmdInd[0]->cmd.u.add); + mg_send_add_rsp(suId, cmd); break; } @@ -632,469 +578,6 @@ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason /*****************************************************************************************************************************/ -/* -* -* Fun: mg_get_term_id_list -* -* Desc: Utility function to get MgMgcoTermIdLst structure -* from MgMgcoCommand structure. -* GCP_VER_2_1 - we will have term id list instead of single term id -* -* Ret: If success, return pointer to MgMgcoTermIdLst. -* If failure, return Null. -* -* Notes: None -* -*/ - -MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) -{ - uint8_t cmd_type = MGT_NONE; - uint8_t api_type = CM_CMD_TYPE_NONE; - MgMgcoTermIdLst * term_id = NULL; - - - /*-- mgCmdInd type represents the data structure for both - * incoming and outgoing requests, hence we can get the - * command type from there itself --*/ - cmd_type = cmd->u.mgCmdInd[0]->cmd.type.val; - - /*-- Find apiType --*/ - api_type = cmd->cmdType.val; - - switch (api_type) - { - case CH_CMD_TYPE_REQ: - case CH_CMD_TYPE_IND: - /* Based on Command Type, get to the TermId structure */ - switch (cmd_type) - { - case MGT_ADD: - if (cmd->u.mgCmdInd[0]->cmd.u.add.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.add.termIdLst; - break; - - case MGT_MOVE: - if (cmd->u.mgCmdInd[0]->cmd.u.move.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.move.termIdLst; - break; - - case MGT_MODIFY: - if (cmd->u.mgCmdInd[0]->cmd.u.mod.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.mod.termIdLst; - break; - - case MGT_SUB: - if (cmd->u.mgCmdInd[0]->cmd.u.sub.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.sub.termIdLst; - break; - - case MGT_AUDITCAP: - if (cmd->u.mgCmdInd[0]->cmd.u.acap.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.acap.termIdLst; - break; - - case MGT_AUDITVAL: - if (cmd->u.mgCmdInd[0]->cmd.u.aval.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.aval.termIdLst; - break; - - case MGT_NTFY: - if (cmd->u.mgCmdInd[0]->cmd.u.ntfy.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.ntfy.termIdLst; - break; - - case MGT_SVCCHG: - if (cmd->u.mgCmdInd[0]->cmd.u.svc.pres.pres) - term_id = &cmd->u.mgCmdInd[0]->cmd.u.svc.termIdLst; - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); - break; - } - break; - - case CH_CMD_TYPE_RSP: - case CH_CMD_TYPE_CFM: - - cmd_type = cmd->u.mgCmdRsp[0]->type.val; - - switch (cmd_type) - { - case MGT_ADD: - if (cmd->u.mgCmdRsp[0]->u.add.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.add.termIdLst; - break; - - case MGT_MOVE: - if (cmd->u.mgCmdRsp[0]->u.move.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.move.termIdLst; - break; - - case MGT_MODIFY: - if (cmd->u.mgCmdRsp[0]->u.mod.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.mod.termIdLst; - break; - - case MGT_SUB: - if (cmd->u.mgCmdRsp[0]->u.sub.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.sub.termIdLst; - break; - - case MGT_SVCCHG: - if (cmd->u.mgCmdRsp[0]->u.svc.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.svc.termIdLst; - break; - - case MGT_AUDITVAL: - if (cmd->u.mgCmdRsp[0]->u.aval.u.other.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.aval.u.other.termIdLst; - break; - - case MGT_AUDITCAP: - if (cmd->u.mgCmdRsp[0]->u.acap.u.other.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.acap.u.other.termIdLst; - break; - - case MGT_NTFY: - if (cmd->u.mgCmdRsp[0]->u.ntfy.pres.pres) - term_id = &cmd->u.mgCmdRsp[0]->u.ntfy.termIdLst; - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); - } /* switch command type for reply */ - break; - - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); - break; - } /* switch -api_type */ - - return (term_id); -} - -/*****************************************************************************************************************************/ - -switch_status_t handle_mg_add_cmd(SuId suId, MgMgcoCommand *req, MgMgcoAmmReq *addReq) -{ - int descId; - mg_context_t *ctx = NULL; - - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId, sizeof(MgMgcoTransId)); - - if (req->contextId.type.val == MGT_CXTID_CHOOSE) { - ctx = megaco_choose_context(NULL); - } else if (req->contextId.type.val == MGT_CXTID_OTHER) { - ctx = megaco_get_context(NULL, req->contextId.val.val); - } - - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId, sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId, sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - - for (descId = 0; descId < addReq->dl.num.val; descId++) { - switch (addReq->dl.descs[descId]->type.val) { - case MGT_MEDIADESC: - { - int mediaId; - for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; - switch (mediaPar->type.val) { - case MGT_MEDIAPAR_LOCAL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); - break; - } - case MGT_MEDIAPAR_REMOTE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); - break; - } - - case MGT_MEDIAPAR_LOCCTL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); - break; - } - case MGT_MEDIAPAR_TERMST: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); - break; - } - case MGT_MEDIAPAR_STRPAR: - { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); - } - - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); - } - - break; - } - } - } - } - case MGT_MODEMDESC: - case MGT_MUXDESC: - case MGT_REQEVTDESC: - case MGT_EVBUFDESC: - case MGT_SIGNALSDESC: - case MGT_DIGMAPDESC: - case MGT_AUDITDESC: - case MGT_STATSDESC: - break; - } - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; - cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; - - - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; - - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); -#endif - /* FIXME */ - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &cmd); - - memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &cmd.contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - - return sng_mgco_send_axn_req(suId, &ctxt);; -} - -/*****************************************************************************************************************************/ -switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) -{ - Mem sMem; - - sMem.region = 0; - sMem.pool = 0; - - if ( _memSize <= 0 ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); - return SWITCH_STATUS_FALSE; - } - - if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n", (int)_memSize); - return SWITCH_STATUS_FALSE; - } - - // Note: memset done inside stack api - - return SWITCH_STATUS_SUCCESS; -} - -switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) -{ - if ( _memSize <= 0 ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); - return SWITCH_STATUS_FALSE; - } - - if ( !msg ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); - return SWITCH_STATUS_FALSE; - } - - if ( cmGetMem( (Ptr)msg, _memSize, (Ptr*)_memPtr ) != ROK ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", _memSize ); - return SWITCH_STATUS_FALSE; - } - - // Note: memset done inside stack api - - return SWITCH_STATUS_SUCCESS; -} - - -switch_status_t mg_stack_free_mem(MgMgcoMsg* msg) -{ - if ( !msg ) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_free_mem: invalid message\n"); - return SWITCH_STATUS_FALSE; - } - - cmFreeMem( (Ptr)msg ); - - return SWITCH_STATUS_SUCCESS; -} - -#define MG_ACC_GETMEM(_ptr,_len,_memCp,_ret) \ -{ \ - ret = cmGetMem((_memCp), (_len), (Ptr *)&(_ptr)); \ - if( ret == ROK) \ - cmMemset((U8 *)(_ptr), (U8)0, (PTR)(_len)); \ -} - - -S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, CONSTANT U8 *str, CmMemListCp *memCp) -{ -#ifdef GCP_ASN - Size size; -#endif - S16 ret = ROK; - - termId->name.pres.pres = PRSNT_NODEF; - /* mg011.105: Bug fixes */ - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = cmStrlen((CONSTANT U8*)str); - MG_ACC_GETMEM((termId->name.lcl.val), termId->name.lcl.len, memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)str,termId->name.lcl.len); - -#ifdef GCP_ASN - /* Remove comment to fill other term ID - termId->wildcard.num.pres = NOTPRSNT; */ - /* Remove comment to fill wilcard term ID */ - termId->wildcard.num.pres = PRSNT_NODEF; - termId->wildcard.num.val = 1; - size = ((sizeof(MgMgcoWildcardField*))); - MG_ACC_GETMEM((termId->wildcard.wildcard),size,memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - MG_ACC_GETMEM( ((termId->wildcard.wildcard)[0]),sizeof(MgMgcoWildcardField), - memCp, ret); - if( ret != ROK) - RETVALUE(ret); - - termId->wildcard.wildcard[0]->pres = PRSNT_NODEF; - termId->wildcard.wildcard[0]->len = 1; - termId->wildcard.wildcard[0]->val[0] = 0x55; -#endif /* GCP_ASN */ - - RETVALUE(ROK); -} - -switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt) -{ - MgMgcoInd *mgErr; - S16 ret; - - mgErr = NULLP; - ret = ROK; - - /* Allocate for AG error */ - mg_stack_alloc_mem((Ptr*)&mgErr, sizeof(MgMgcoInd)); - if (NULL == mgErr) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); - return SWITCH_STATUS_FALSE; - } - - /* Set transaction Id in the error request */ - mg_util_set_val_pres(mgErr->transId, trans_id); - - /* Copy the context Id */ - mg_mem_copy(&mgErr->cntxtId, - ctxt_id, - sizeof(MgMgcoContextId)); - - /* Set the peerId */ - mgErr->peerId.pres = NOTPRSNT; - - /* Set the error code */ - mg_util_set_pres(mgErr->err.pres.pres); - mg_util_set_pres(mgErr->err.code.pres); - mg_util_set_val_pres(mgErr->err.code, err); - - if(errTxt->len) - { - mg_get_mem(&mgErr->memCp, (errTxt->len)*sizeof(U8), mgErr->err.text.val, &ret); - if (ROK != ret) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); - return SWITCH_STATUS_FALSE; - } - mgErr->err.text.pres = PRSNT_NODEF; - mgErr->err.text.len = errTxt->len; - mg_mem_copy(mgErr->err.text.val, errTxt->val, errTxt->len); - } - - /* Set the output value */ - *errcmd = mgErr; - - return SWITCH_STATUS_SUCCESS; -} - -void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) -{ - mg_zero((errTxt->val), sizeof(errTxt->val)); - errTxt->len = 0; - - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - - if (MG_TXN_INVALID == txnId ) - { - mg_mem_copy((&errTxt->val[errTxt->len]), "TransactionId=0", 15); - errTxt->len += 15; - } - - errTxt->val[errTxt->len] = '\"'; - errTxt->len += 1; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" - "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); - -} - - - /*****************************************************************************************************************************/ /* For Emacs: * Local Variables: From 0ecd5678d1217886f06da8a61be93b4032b32b2b Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 16 Jul 2012 18:31:13 -0400 Subject: [PATCH 307/493] Update the rtp endpoint so it gets a fixed configuration from var_event --- src/mod/endpoints/mod_sofia/rtp.c | 140 ++++++++++++++++++++++++------ 1 file changed, 115 insertions(+), 25 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 9deddf5922..a269ec6cc9 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -32,15 +32,16 @@ #include #include "mod_sofia.h" -#define kBINDADDRESS "bind_address" #define kLOCALADDR "local_addr" #define kLOCALPORT "local_port" #define kREMOTEADDR "remote_addr" #define kREMOTEPORT "remote_port" #define kCODEC "codec" #define kPTIME "ptime" +#define kPT "pt" #define kRFC2833PT "rfc2833_pt" #define kMODE "mode" +#define kRATE "rate" static struct { switch_memory_pool_t *pool; @@ -53,10 +54,15 @@ typedef struct { switch_codec_t read_codec, write_codec; switch_frame_t read_frame; + + switch_rtp_bug_flag_t rtp_bugs; switch_rtp_t *rtp_session; - const char *bind_address; + uint32_t timestamp_send; + + const char *local_address; + const char *remote_address; const char *codec; int ptime; @@ -67,6 +73,8 @@ typedef struct { switch_port_t local_port; switch_port_t remote_port; + switch_payload_t agreed_pt; /*XXX*/ + sofia_dtmf_t dtmf_type; } crtp_private_t; @@ -100,7 +108,7 @@ void crtp_init(switch_loadable_module_interface_t *module_interface) { switch_endpoint_interface_t *endpoint_interface; //switch_api_interface_t *api_interface; - + crtp.pool = module_interface->pool; endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE); endpoint_interface->interface_name = "rtp"; @@ -119,11 +127,30 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi { switch_channel_t *channel; char name[128]; - const char *dname = "PCMU"; - uint32_t interval = 20; - crtp_private_t *tech_pvt = NULL; - //const char *l_sdp = switch_event_get_header(var_event, kLSDP); - //const char *codec_string = switch_event_get_header_nil(var_event, kCODECSTRING); + crtp_private_t *tech_pvt = NULL; + + const char *err; + + const char *local_addr = switch_event_get_header_nil(var_event, kLOCALADDR), + *szlocal_port = switch_event_get_header_nil(var_event, kLOCALPORT), + *remote_addr = switch_event_get_header_nil(var_event, kREMOTEADDR), + *szremote_port = switch_event_get_header_nil(var_event, kREMOTEPORT), + *codec = switch_event_get_header_nil(var_event, kCODEC), + *szptime = switch_event_get_header_nil(var_event, kPTIME), + *mode = switch_event_get_header_nil(var_event, kMODE), + *szrfc2833_pt = switch_event_get_header_nil(var_event, kRFC2833PT), + *szrate = switch_event_get_header_nil(var_event, kRATE), + *szpt = switch_event_get_header_nil(var_event, kPT); + + + switch_port_t local_port = !zstr(szlocal_port) ? atoi(szlocal_port) : 0, + remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; + + int ptime = !zstr(szptime) ? atoi(szptime) : 0, + rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, + rate = !zstr(szrate) ? atoi(szrate) : 8000, + pt = !zstr(szpt) ? atoi(szpt) : 0; + if (!(*new_session = switch_core_session_request(crtp.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { @@ -133,41 +160,45 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); - - tech_pvt = switch_core_session_alloc(*new_session, sizeof *tech_pvt); tech_pvt->session = *new_session; tech_pvt->channel = channel; - tech_pvt->bind_address = switch_core_session_strdup(*new_session, switch_event_get_header_nil(var_event, kBINDADDRESS)); + tech_pvt->local_address = switch_core_session_strdup(*new_session, local_addr); + tech_pvt->local_port = local_port; + tech_pvt->remote_address = switch_core_session_strdup(*new_session, remote_addr); + tech_pvt->remote_port = remote_port; + tech_pvt->ptime = ptime; + tech_pvt->agreed_pt = pt; + tech_pvt->dtmf_type = DTMF_2833; /* XXX */ + switch_core_session_set_private(*new_session, tech_pvt); - snprintf(name, sizeof(name), "rtp/ctrl"); /* TODO add addresses */ + snprintf(name, sizeof(name), "rtp/ctrl"); switch_channel_set_name(channel, name); switch_channel_set_state(channel, CS_INIT); if (switch_core_codec_init(&tech_pvt->read_codec, - dname, + codec, NULL, - 8000, - interval, + rate, + ptime, 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + /*SWITCH_CODEC_FLAG_ENCODE |*/ SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; } else { if (switch_core_codec_init(&tech_pvt->write_codec, - dname, + codec, NULL, - 8000, - interval, + rate, + ptime, 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); - switch_core_codec_destroy(&tech_pvt->read_codec); goto fail; } } @@ -178,7 +209,15 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi } if (switch_core_session_set_write_codec(*new_session, &tech_pvt->write_codec) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n"); + goto fail; + } + + if (!(tech_pvt->rtp_session = switch_rtp_new(local_addr, local_port, remote_addr, remote_port, tech_pvt->agreed_pt, + tech_pvt->read_codec.implementation->samples_per_packet, ptime * 1000, + flags, "soft", &err, switch_core_session_get_pool(*new_session)))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't setup RTP session: [%s]\n", err); + goto fail; } if (switch_core_session_thread_launch(*new_session) != SWITCH_STATUS_SUCCESS) { @@ -214,7 +253,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_channel_set_state(channel, CS_ROUTING); - return SWITCH_STATUS_SUCCESS; + return SWITCH_STATUS_SUCCESS; } static switch_status_t channel_on_destroy(switch_core_session_t *session) @@ -240,6 +279,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch { crtp_private_t *tech_pvt; switch_channel_t *channel; + switch_status_t status; channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -247,6 +287,31 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch tech_pvt = switch_core_session_get_private(session); assert(tech_pvt != NULL); + if (!tech_pvt->rtp_session) { + goto cng; + } + + if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) { + switch_dtmf_t dtmf = { 0 }; + switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, &dtmf); + switch_channel_queue_dtmf(channel, &dtmf); + } + + tech_pvt->read_frame.flags = SFF_NONE; + status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame, flags); + + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + goto cng; + } + +done: + *frame = &tech_pvt->read_frame; + return SWITCH_STATUS_SUCCESS; + +cng: + *frame = &tech_pvt->read_frame; + tech_pvt->read_frame.flags |= SFF_CNG; + tech_pvt->read_frame.datalen = 0; return SWITCH_STATUS_SUCCESS; } @@ -255,6 +320,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc { crtp_private_t *tech_pvt; switch_channel_t *channel; + int frames = 0, bytes = 0, samples = 0; channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -263,8 +329,20 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc assert(tech_pvt != NULL); - return SWITCH_STATUS_SUCCESS; + if (!switch_test_flag(frame, SFF_CNG) && !switch_test_flag(frame, SFF_PROXY_PACKET)) { + if (tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { + bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet; + frames = ((int) frame->datalen / bytes); + } else + frames = 1; + + samples = frames * tech_pvt->read_codec.implementation->samples_per_packet; + } + + tech_pvt->timestamp_send += samples; + switch_rtp_write_frame(tech_pvt->rtp_session, frame); + return SWITCH_STATUS_SUCCESS; } static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf) @@ -274,8 +352,20 @@ static switch_status_t channel_send_dtmf(switch_core_session_t *session, const s tech_pvt = switch_core_session_get_private(session); assert(tech_pvt != NULL); + switch(tech_pvt->dtmf_type) { + case DTMF_2833: + { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Enqueuing RFC2833 DTMF %c of length %d\n", dtmf->digit, dtmf->duration); + return switch_rtp_queue_rfc2833(tech_pvt->rtp_session, dtmf); + } + case DTMF_NONE: + default: + { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Discarding DTMF %c of length %d, DTMF type is NONE\n", dtmf->digit, dtmf->duration); + } + } - return SWITCH_STATUS_SUCCESS; + return SWITCH_STATUS_SUCCESS; } static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) From 36719e301750031ee27a4c7f29a87d72f44a3457 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 17 Jul 2012 10:15:25 -0400 Subject: [PATCH 308/493] comment out unused vars --- src/mod/endpoints/mod_sofia/rtp.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index a269ec6cc9..679a9a0e22 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -137,8 +137,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi *szremote_port = switch_event_get_header_nil(var_event, kREMOTEPORT), *codec = switch_event_get_header_nil(var_event, kCODEC), *szptime = switch_event_get_header_nil(var_event, kPTIME), - *mode = switch_event_get_header_nil(var_event, kMODE), - *szrfc2833_pt = switch_event_get_header_nil(var_event, kRFC2833PT), + //*mode = switch_event_get_header_nil(var_event, kMODE), + //*szrfc2833_pt = switch_event_get_header_nil(var_event, kRFC2833PT), *szrate = switch_event_get_header_nil(var_event, kRATE), *szpt = switch_event_get_header_nil(var_event, kPT); @@ -147,7 +147,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; int ptime = !zstr(szptime) ? atoi(szptime) : 0, - rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, + //rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, rate = !zstr(szrate) ? atoi(szrate) : 8000, pt = !zstr(szpt) ? atoi(szpt) : 0; @@ -196,7 +196,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi rate, ptime, 1, - SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, + SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; @@ -304,7 +304,6 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch goto cng; } -done: *frame = &tech_pvt->read_frame; return SWITCH_STATUS_SUCCESS; From 6acde3a86996afffa64c96492b37f21a51e33fe3 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 17 Jul 2012 13:07:32 -0400 Subject: [PATCH 309/493] adding validation of megaco commands code and modification in handling ADD message --- .../mod_media_gateway/media_gateway.c | 57 +++++++++ .../media_gateway_cmd_handler.c | 68 +++++++++- .../mod_media_gateway/media_gateway_stack.h | 4 +- .../mod_media_gateway/media_gateway_utils.c | 57 +++++++++ .../mod_media_gateway/mod_media_gateway.c | 117 +++++++++++++++--- .../mod_media_gateway/mod_media_gateway.h | 3 + 6 files changed, 282 insertions(+), 24 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 0c43adab6b..769bdc5465 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -46,6 +46,63 @@ void megaco_peer_profile_release(mg_peer_profile_t *profile) switch_thread_rwlock_unlock(profile->rwlock); } +megaco_profile_t* megaco_get_profile_by_suId(SuId suId) +{ + megaco_profile_t* profile = NULL; + void *val = NULL; + switch_hash_index_t *hi = NULL; + int found = 0x00; + const void *var; + + /*iterate through profile list to get requested suID profile */ + for (hi = switch_hash_first(NULL, megaco_globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + profile = (megaco_profile_t *) val; + if (profile->idx == suId) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got profile[%s] associated with suId[%d]\n",profile->name, suId); + found = 0x01; + break; + } + } + + if(!found){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Not able to find profile associated with suId[%d]\n",suId); + return NULL; + } + + return profile; +} + +mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id) +{ + mg_context_t *result = NULL; + megaco_profile_t* profile = NULL; + + if(NULL == (profile = megaco_get_profile_by_suId(suId))){ + return NULL; + } + + + if (context_id > MG_MAX_CONTEXTS) { + return NULL; + } + + switch_thread_rwlock_rdlock(profile->contexts_rwlock); + + /* Context exists */ + if (profile->contexts_bitmap[context_id % 8] & (1 << (context_id / 8))) { + for (result = profile->contexts[context_id % MG_CONTEXT_MODULO]; result; result = result->next) { + if (result->context_id == context_id) { + break; + } + } + } + + switch_thread_rwlock_unlock(profile->contexts_rwlock); + + return result; +} + mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) { mg_context_t *result = NULL; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 7855bcd9d9..b19d799a9d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -29,16 +29,65 @@ const char *mg_service_change_reason[] = { * * */ -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) { - int descId; - for (descId = 0; descId < addReq->dl.num.val; descId++) { - switch (addReq->dl.descs[descId]->type.val) { + MgMgcoContextId *ctxtId; + int descId; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoTermIdLst* termLst; + int err_code; + MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; + U32 txn_id = inc_cmd->transId.val; + + /********************************************************************/ + ctxtId = &inc_cmd->contextId; + termLst = mg_get_term_id_list(inc_cmd); + termId = termLst->terms[0]; + + /********************************************************************/ + /* Validating ADD request *******************************************/ + + /*-- NULL Context & ALL Context not applicable for ADD request --*/ + if ((NOTPRSNT != ctxtId->type.pres) && + ((MGT_CXTID_ALL == ctxtId->type.val) || + (MGT_CXTID_NULL == ctxtId->type.val))) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); + + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } + + /********************************************************************/ + /* Allocate context - if context type is CHOOSE */ + if ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_CHOOSE == ctxtId->type.val)){ + + /* TODO - Matt */ + } + + /********************************************************************/ + /* Allocate new RTP termination - If term type is CHOOSE */ + if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_CHOOSE == termId->type.val)){ + + /* TODO - Matt */ + /* allocate rtp term and associated the same to context */ + } + + /********************************************************************/ + + + for (descId = 0; descId < cmd->dl.num.val; descId++) { + switch (cmd->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { int mediaId; - for (mediaId = 0; mediaId < addReq->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = addReq->dl.descs[descId]->u.media.parms[mediaId]; + for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; switch (mediaPar->type.val) { case MGT_MEDIAPAR_LOCAL: { @@ -94,6 +143,13 @@ switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq) return SWITCH_STATUS_SUCCESS; +error: + if (SWITCH_STATUS_SUCCESS == + mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(mg_profile->idx, mgErr); + } + mg_free_cmd(cmd); + return SWITCH_STATUS_FALSE; } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index cdbde20c13..8225ee9570 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -133,7 +133,7 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, m switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); void mgco_print_sdp(CmSdpInfoSet *sdp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); -switch_status_t handle_mg_add_cmd(MgMgcoAmmReq *addReq); +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *addReq); switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); MgMgcoMediaDesc* get_default_media_desc(void); @@ -144,6 +144,8 @@ void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); +switch_status_t mg_stack_termination_is_in_service(char* term_str, int len); +void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd); switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req); switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index ed70b74173..e536fd83bf 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -78,6 +78,14 @@ switch_status_t mg_stack_free_mem(void* msg) } +/*****************************************************************************************************************************/ + +/* TODO - Matt - to see if term is in service or not */ +switch_status_t mg_stack_termination_is_in_service(char* term_str,int len) +{ + return SWITCH_STATUS_SUCCESS; +} + /*****************************************************************************************************************************/ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp) @@ -351,6 +359,55 @@ void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } +/*****************************************************************************************************************************/ + +void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) +{ + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = 0; + + if ((!cmd) && (!cmd->u.mgCmdInd[0])) { + switch(cmd->u.mgCmdInd[0]->cmd.type.val) + { + case MGT_AUDITCAP: + errTxt->val[0]='\"'; + errTxt->val[1]='A'; + errTxt->val[2]='u'; + errTxt->val[3]='d'; + errTxt->val[4]='i'; + errTxt->val[5]='t'; + errTxt->val[6]='C'; + errTxt->val[7]='a'; + errTxt->val[8]='p'; + errTxt->val[9]='a'; + errTxt->val[10]='b'; + errTxt->val[11]='i'; + errTxt->val[12]='l'; + errTxt->val[13]='i'; + errTxt->val[14]='t'; + errTxt->val[15]='y'; + errTxt->val[16]='\"'; + errTxt->len = 17; + break; + + case MGT_MOVE: + errTxt->val[0]='\"'; + errTxt->val[1]='M'; + errTxt->val[2]='o'; + errTxt->val[3]='v'; + errTxt->val[4]='e'; + errTxt->val[5]='\"'; + errTxt->len = 6; + break; + + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Not expected command Type[%d]\n", + __PRETTY_FUNCTION__,cmd->u.mgCmdInd[0]->cmd.type.val); + + break; + } + } +} /*****************************************************************************************************************************/ void mgco_print_sdp(CmSdpInfoSet *sdp) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 7e4be231ca..a6202295fd 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -233,6 +233,9 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet } #endif +/* KAPIL- NOTE : We are using Command mode operation of MEGACO stack, so we will always get command indication instead of transaction */ +/* Below API is not useful ... just leaving as it is...*/ + void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) { size_t txnIter; @@ -425,8 +428,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) MgMgcoInd *mgErr; MgStr errTxt; MgMgcoContextId ctxtId; + MgMgcoContextId *inc_context; MgMgcoTermIdLst* termLst; - + MgMgcoTermId *termId; + int count; + int err_code; + megaco_profile_t* mg_profile; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); @@ -442,15 +449,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) ctxtId.val.pres = NOTPRSNT; mg_util_set_txn_string(&errTxt, &txn_id); - - if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, - MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER, &errTxt)) { - sng_mgco_send_err(suId, mgErr); - } - - /* deallocate the msg */ - mg_free_cmd(cmd); - return ; + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; } /* Get the termination Id list from the command(Note: GCP_2_1 has termination list , else it will be termination Id) */ @@ -458,12 +458,80 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if ((NULL == termLst) || (NOTPRSNT == termLst->num.pres)) { /* termination-id not present , error */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination-Id Not received..rejecting command \n"); - mg_free_cmd(cmd); - return ; + + /*-- Send Error to MG Stack --*/ + MG_ZERO(&ctxtId, sizeof(MgMgcoContextId)); + ctxtId.type.pres = NOTPRSNT; + ctxtId.val.pres = NOTPRSNT; + mg_util_set_txn_string(&errTxt, &txn_id); + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; } + termId = termLst->terms[0]; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); + + /* Not sure - IF Stack fills term type properly..but adding code just to be sure ...*/ + if ((PRSNT_NODEF == termId->type.pres) && + (MGT_TERMID_OTHER == termId->type.val)) { + /* Checking the $ in the pathname */ + if ((PRSNT_NODEF == termId->name.pres.pres) && + (PRSNT_NODEF == termId->name.lcl.pres)) { + for (count = 0; count < termId->name.lcl.len; count++) { + if (termId->name.lcl.val[count] == '$') { + termId->type.val = MGT_TERMID_CHOOSE; + break; + } + + if (termId->name.lcl.val[count] == '*') { + termId->type.val = MGT_TERMID_ALL; + break; + } + } + } + } + + /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ + if (MGT_TERMID_OTHER == termId->type.val){ + if(SWITCH_STATUS_FALSE != mg_stack_termination_is_in_service((char*)termId->name.lcl.val, termId->name.lcl.len)){ + mg_util_set_term_string(&errTxt, termId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; + goto error; + } + } + + + /* Validate Context - if context is specified then check if its present with us */ + inc_context = &cmd->contextId; + MG_ZERO(&ctxtId, sizeof(MgMgcoContextId)); + memcpy(&ctxtId, inc_context, sizeof(MgMgcoContextId)); + + if(NOTPRSNT == inc_context->type.pres){ + goto ctxt_error; + + }else if(MGT_CXTID_OTHER == inc_context->type.pres){ + + if(NOTPRSNT != inc_context->val.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Context specific request for contextId[%d]\n",inc_context->val.val); + /* check if context present with us */ + if(NULL == megaco_find_context_by_suid(suId, inc_context->val.val)){ + goto ctxt_error; + } + }else{ + /* context id value not present - in case of type OTHER we should have context value */ + goto ctxt_error; + } + } + + /*mgAccEvntPrntMgMgcoCommand(cmd, stdout);*/ + /*get mg profile associated with SuId */ + if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ + goto error1; + } + switch(cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -475,7 +543,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { case MGT_ADD: { - handle_mg_add_cmd(&cmd->u.mgCmdInd[0]->cmd.u.add); + handle_mg_add_cmd(mg_profile, cmd); mg_send_add_rsp(suId, cmd); break; } @@ -488,9 +556,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } case MGT_MOVE: { - /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.move;*/ - break; - + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MOVE Method Not Yet Supported\n"); + err_code = MGT_MGCO_RSP_CODE_UNSUPPORTED_CMD; + mg_util_set_cmd_name_string(&errTxt, cmd); + goto error; } case MGT_SUB: { @@ -511,7 +580,9 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_AUDITCAP: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Audit-Capability Method Not Yet Supported\n"); - break; + err_code = MGT_MGCO_RSP_CODE_UNSUPPORTED_CMD; + mg_util_set_cmd_name_string(&errTxt, cmd); + goto error; } case MGT_AUDITVAL: { @@ -542,6 +613,18 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } return; + +ctxt_error: + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; + +error: + if (SWITCH_STATUS_SUCCESS == + mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(suId, mgErr); + } +error1: + mg_free_cmd(cmd); + return; } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 91dc74210c..f1da14a4f2 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -139,6 +139,9 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile); void megaco_release_context(mg_context_t *ctx); +megaco_profile_t* megaco_get_profile_by_suId(SuId suId); +mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id); + switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload); switch_status_t sng_mgco_start(megaco_profile_t* profile); switch_status_t sng_mgco_stop(megaco_profile_t* profile); From 4c4a7b7486f810804b988f61a11683bf445f0b97 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 17 Jul 2012 16:12:54 -0400 Subject: [PATCH 310/493] adding MEGACO Media Descriptors prints --- .../media_gateway_cmd_handler.c | 133 +++++++++++++++++- 1 file changed, 130 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index b19d799a9d..3e1aeb462d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -38,13 +38,27 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MgMgcoTermId *termId; MgMgcoTermIdLst* termLst; int err_code; + int i; + int j; + int fmtCnt; MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; U32 txn_id = inc_cmd->transId.val; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc *remote; + MgMgcoLclCtlDesc *locCtl; + CmSdpInfo *sdp; + MgMgcoLocalParm *lclParm; + MgMgcoTermStateDesc *tstate; + CmSdpMedFmtRtpList *fmt_list; + MgMgcoTermStateParm *tsp; + TknU8 *fmt; + CmSdpMedProtoFmts *format; /********************************************************************/ ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; + /* For Matt - termId->name.lcl.val - to get the termination id name */ /********************************************************************/ /* Validating ADD request *******************************************/ @@ -76,10 +90,11 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* TODO - Matt */ /* allocate rtp term and associated the same to context */ - } - /********************************************************************/ - + }else{ /* Physical termination */ + /* TODO - Matt - associate physical termination to context */ + } + /********************************************************************/ for (descId = 0; descId < cmd->dl.num.val; descId++) { switch (cmd->dl.descs[descId]->type.val) { @@ -92,22 +107,126 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i case MGT_MEDIAPAR_LOCAL: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + /* Matt - check local descriptor processing */ + local = &mediaPar->u.local; + sdp = local->sdp.info[0]; + for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { + /* sdp formats */ + for (j = 0; j < + sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) + { + format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; + /* Matt - format has field for T38 also */ + if ((format->protType.pres != NOTPRSNT) && + (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { + + /* protocol type RTP */ + fmt_list = &format->u.rtp; + + /* print format */ + for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ + fmt = &fmt_list->fmts[i]->val; + if(fmt->pres == NOTPRSNT) continue; + printf("Format [%d]\n", fmt->val); + } + } + } + } + break; } + case MGT_MEDIAPAR_REMOTE: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + /* Matt - check remote descriptor processing */ + remote = &mediaPar->u.remote; + sdp = remote->sdp.info[0]; + /* for Matt - same like local descriptor */ break; } case MGT_MEDIAPAR_LOCCTL: { + /* Matt - check Local Control descriptor processing */ + locCtl = &mediaPar->u.locCtl; + for (i = 0; i < locCtl->num.val; i++){ + lclParm = locCtl->parms[i]; + if (PRSNT_NODEF == lclParm->type.pres){ + switch(lclParm->type.val) + { + case MGT_LCLCTL_MODE: + { + /* Mode Property */ + printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + break; + } + case MGT_LCLCTL_RESVAL: + { + /* Reserve Value */ + printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + break; + } + case MGT_LCLCTL_RESGRP: + { + /* Reserve group */ + printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + break; + } + case MGT_LCLCTL_PROPPARM: + { + /* Properties (of a termination) */ + /* Matt - See how we can apply this to a termination */ + printf("MGT_LCLCTL_PROPPARM: \n"); + break; + } + default: + printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); + break; + } + } + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); break; } case MGT_MEDIAPAR_TERMST: { + /* Matt - apply termination state descriptor */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + tstate = &mediaPar->u.tstate; + for (i = 0; i < tstate->numComp.val; i++) + { + /* Matt to see how to apply below descriptors to a termination */ + tsp = tstate->trmStPar[i]; + if (PRSNT_NODEF == tsp->type.pres) { + switch(tsp->type.val) + { + case MGT_TERMST_PROPLST: + { + /* Matt to see how to apply properties to a termination */ + /* Properties of a termination */ + printf("MGT_TERMST_PROPLST:\n"); + break; + } + case MGT_TERMST_EVTBUFCTL: + { + /* Event /buffer Control Properties */ + printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); + break; + } + case MGT_TERMST_SVCST: + { + /* Service State Properties */ + printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); + break; + } + default: + printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); + break; + } + } + } break; } case MGT_MEDIAPAR_STRPAR: @@ -141,6 +260,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } + /* Matt - to provide the response SDP structure which needs to fill in ADD command response */ + + /* Matt - to indicate if there is any failure while processing add message */ + + /* Kapil - to return error if there is any failure based on Matt's indication */ + + /* Kapil - to fill the response structure and call the response API to send ADD response */ + return SWITCH_STATUS_SUCCESS; error: From 62787362ce075ba665ee05197c4f4439079660b0 Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 18 Jul 2012 10:11:51 -0400 Subject: [PATCH 311/493] adding service change wrapper APIs --- .../media_gateway_cmd_handler.c | 32 +++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 3 ++ 2 files changed, 35 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 3e1aeb462d..8c86389e96 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -521,6 +521,7 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) (MGT_TERMID_ROOT == termId->type.val)) && ((NOTPRSNT != ctxtId->type.pres) && (MGT_CXTID_OTHER == ctxtId->type.val))) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, Term: Invalid combination, ROOT Term with OTHER CONTEXT\n"); @@ -1199,6 +1200,37 @@ U32 get_txn_id(){ return outgoing_txn_id; } /*****************************************************************************************************************************/ +/* Note : API to send Service Change when termination is coming up(in-service) */ +/* INPUT : MG Profile structure and termination name */ +/* wild flag will tell if service change request needs to be in W-SC format as we can have W-SC=A01* or SC=A01* */ +switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild) +{ + switch_assert(term_name); + switch_assert(mg_profile); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "Sending In-Service Service Change for termination[%s] configured in mg profile[%s], suId[%d]\n", + term_name, mg_profile->name, mg_profile->idx); + + return mg_send_service_change(mg_profile->idx, term_name, MGT_SVCCHGMETH_RESTART, MG_SVC_REASON_900_RESTORED, wild); +} + +/*****************************************************************************************************************************/ +/* Note : API to send Service Change when termination is going down (out-of-service) */ +/* INPUT : MG Profile structure and termination name */ +/* wild flag will tell if service change request needs to be in W-SC format as we can have W-SC=A01* or SC=A01* */ +switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild) +{ + switch_assert(term_name); + switch_assert(mg_profile); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "Sending Out-Of-Service Service Change for termination[%s] configured in mg profile[%s], suId[%d]\n", + term_name, mg_profile->name, mg_profile->idx); + + return mg_send_service_change(mg_profile->idx, term_name, MGT_SVCCHGMETH_FORCED, MG_SVC_REASON_905_TERM_OOS, wild); +} +/*****************************************************************************************************************************/ /* Note : API to send Service Change */ /* INPUT : * method - Service change method type (can be MGT_SVCCHGMETH_RESTART/MGT_SVCCHGMETH_FORCED (please refer to sng_ss7/cm/mgt.h for more values)) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 8225ee9570..bbc3141d37 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -160,6 +160,9 @@ void mg_fill_null_context(MgMgcoContextId* ctxt); switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild); switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); +switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); +switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); + /****************************************************************************************************************/ From 9b73c8087e520836d414e178e5912ab4e44f1b8e Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 18 Jul 2012 12:05:15 -0400 Subject: [PATCH 312/493] adding MODIFY command handler API --- .../media_gateway_cmd_handler.c | 265 ++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 3 +- .../mod_media_gateway/mod_media_gateway.c | 1 + 3 files changed, 268 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 8c86389e96..7da367155a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -279,6 +279,271 @@ error: return SWITCH_STATUS_FALSE; } +/*****************************************************************************************************************************/ + +/* +* +* Fun: handle_mg_modify_cmd +* +* Desc: this api will handle the Modify request received from MG stack +* +* +*/ +switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) +{ + MgMgcoContextId *ctxtId; + int descId; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoTermIdLst* termLst; + int err_code; + int i; + int j; + int fmtCnt; + MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod; + U32 txn_id = inc_cmd->transId.val; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc *remote; + MgMgcoLclCtlDesc *locCtl; + CmSdpInfo *sdp; + MgMgcoLocalParm *lclParm; + MgMgcoTermStateDesc *tstate; + CmSdpMedFmtRtpList *fmt_list; + MgMgcoTermStateParm *tsp; + TknU8 *fmt; + CmSdpMedProtoFmts *format; + + /********************************************************************/ + ctxtId = &inc_cmd->contextId; + termLst = mg_get_term_id_list(inc_cmd); + termId = termLst->terms[0]; + /* For Matt - termId->name.lcl.val - to get the termination id name */ + + /********************************************************************/ + /* Validation *******************************************/ + /********************************************************************/ + + /*** CHOOSE Context NOT ALLOWED ***/ + if ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_CHOOSE == ctxtId->type.val)) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "Modify request processing failure, CHOOSE Context should not present in Modify\n"); + + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + mg_util_set_ctxt_string(&errTxt, ctxtId); + goto error; + } + /*** CHOOSE Termination NOT ALLOWED **/ + else if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_CHOOSE == termId->type.val)) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "Modify request processing failure, CHOOSE Termination should not present in Modify\n"); + + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + mg_util_set_term_string(&errTxt,termId); + goto error; + } + + /********************************************************************/ + /* context id presence check is already being done, we are here it means context-id requested in megaco message is present */ + + /* Matt - to check if we have terminations in the context */ + + /* TODO - Matt */ + + /* Matt to indicate ERROR - If there is no terminations in requested context */ + + /* Kapil - If there is an error - send response back to MG stack with MGT_MGCO_RSP_CODE_NO_TERM_CTXT error code*/ + + /********************************************************************/ + + + for (descId = 0; descId < cmd->dl.num.val; descId++) { + switch (cmd->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + /* Matt - check local descriptor processing */ + local = &mediaPar->u.local; + sdp = local->sdp.info[0]; + for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { + /* sdp formats */ + for (j = 0; j < + sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) + { + format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; + /* Matt - format has field for T38 also */ + if ((format->protType.pres != NOTPRSNT) && + (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { + + /* protocol type RTP */ + fmt_list = &format->u.rtp; + + /* print format */ + for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ + fmt = &fmt_list->fmts[i]->val; + if(fmt->pres == NOTPRSNT) continue; + printf("Format [%d]\n", fmt->val); + } + } + } + } + + break; + } + + case MGT_MEDIAPAR_REMOTE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + /* Matt - check remote descriptor processing */ + remote = &mediaPar->u.remote; + sdp = remote->sdp.info[0]; + /* for Matt - same like local descriptor */ + break; + } + + case MGT_MEDIAPAR_LOCCTL: + { + /* Matt - check Local Control descriptor processing */ + locCtl = &mediaPar->u.locCtl; + for (i = 0; i < locCtl->num.val; i++){ + lclParm = locCtl->parms[i]; + if (PRSNT_NODEF == lclParm->type.pres){ + switch(lclParm->type.val) + { + case MGT_LCLCTL_MODE: + { + /* Mode Property */ + printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + break; + } + case MGT_LCLCTL_RESVAL: + { + /* Reserve Value */ + printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + break; + } + case MGT_LCLCTL_RESGRP: + { + /* Reserve group */ + printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + break; + } + case MGT_LCLCTL_PROPPARM: + { + /* Properties (of a termination) */ + /* Matt - See how we can apply this to a termination */ + printf("MGT_LCLCTL_PROPPARM: \n"); + break; + } + default: + printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); + break; + } + } + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); + break; + } + case MGT_MEDIAPAR_TERMST: + { + /* Matt - apply termination state descriptor */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + tstate = &mediaPar->u.tstate; + for (i = 0; i < tstate->numComp.val; i++) + { + /* Matt to see how to apply below descriptors to a termination */ + tsp = tstate->trmStPar[i]; + if (PRSNT_NODEF == tsp->type.pres) { + switch(tsp->type.val) + { + case MGT_TERMST_PROPLST: + { + /* Matt to see how to apply properties to a termination */ + /* Properties of a termination */ + printf("MGT_TERMST_PROPLST:\n"); + break; + } + case MGT_TERMST_EVTBUFCTL: + { + /* Event /buffer Control Properties */ + printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); + break; + } + case MGT_TERMST_SVCST: + { + /* Service State Properties */ + printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); + break; + } + default: + printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); + break; + } + } + } + break; + } + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_print_sdp(&mgStream->sl.remote.sdp); + } + + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_print_sdp(&mgStream->sl.local.sdp); + } + + break; + } + } + } + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_REQEVTDESC: + case MGT_EVBUFDESC: + case MGT_SIGNALSDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + } + } + + /* Matt - to provide the response SDP structure which needs to fill in Modify command response */ + + /* Matt - to indicate if there is any failure while processing add message */ + + /* Kapil - to return error if there is any failure based on Matt's indication */ + + /* Kapil - to fill the response structure and call the response API to send Modify response */ + + + return SWITCH_STATUS_SUCCESS; +error: + if (SWITCH_STATUS_SUCCESS == + mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(mg_profile->idx, mgErr); + } + mg_free_cmd(cmd); + return SWITCH_STATUS_FALSE; +} + /*****************************************************************************************************************************/ /* * diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index bbc3141d37..d06fd727a1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -133,7 +133,8 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, m switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); void mgco_print_sdp(CmSdpInfoSet *sdp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); -switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *addReq); +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); +switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); MgMgcoMediaDesc* get_default_media_desc(void); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index a6202295fd..4336b90982 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -551,6 +551,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_MODIFY: { /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ + handle_mg_modify_cmd(mg_profile, cmd); mg_send_modify_rsp(suId, cmd); break; } From 909d464abd35d9988b686104f908598f68ac4c37 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 19 Jul 2012 17:51:25 -0400 Subject: [PATCH 313/493] add/sub done but untested, mod remains. this commit also adds a message handler inside the rtp endpoint so it can properly flush streams, setup jitter buffering, and honor uuid_debug_audio requests --- libs/freetdm/mod_freetdm/tdm.c | 2 +- .../mod_media_gateway/media_gateway.c | 183 ++++++++++++++++-- .../mod_media_gateway/mod_media_gateway.h | 49 +++-- src/mod/endpoints/mod_sofia/rtp.c | 156 ++++++++++++++- 4 files changed, 353 insertions(+), 37 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 61a145ed3b..a3369f1f7b 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -112,7 +112,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ctdm_private_t *tech_pvt = NULL; if (zstr(szchanid) || zstr(szspanid)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both "kSPAN_ID" and "kCHAN_ID" have to be set.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both ["kSPAN_ID"] and ["kCHAN_ID"] have to be set.\n"); goto fail; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 769bdc5465..b596cdb819 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -55,6 +55,8 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) const void *var; /*iterate through profile list to get requested suID profile */ + + switch_thread_rwlock_rdlock(megaco_globals.profile_rwlock); for (hi = switch_hash_first(NULL, megaco_globals.profile_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, &var, NULL, &val); profile = (megaco_profile_t *) val; @@ -66,13 +68,172 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) } if(!found){ + profile = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Not able to find profile associated with suId[%d]\n",suId); - return NULL; } + + switch_thread_rwlock_unlock(megaco_globals.profile_rwlock); return profile; } +/* + * Creates a freeswitch channel for the specified termination. + * The channel will be parked until future actions are taken + */ +switch_status_t megaco_activate_termination(mg_termination_t *term) +{ + switch_event_t *var_event = NULL; + switch_core_session_t *session = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + char dialstring[100]; + switch_call_cause_t cause; + + if (!zstr(term->uuid)) { + /* A UUID is present, check if the channel still exists */ + switch_core_session_t *session; + if ((session = switch_core_session_locate(term->uuid))) { + switch_core_session_rwunlock(session); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel [%s] already exists for termination [%s]\n", term->uuid, term->name); + return SWITCH_STATUS_SUCCESS; + } + + /* The referenced channel doesn't exist anymore, clear it */ + term->uuid = NULL; + } + + switch_event_create(&var_event, SWITCH_EVENT_CLONE); + + if (term->type == MG_TERM_RTP) { + switch_snprintf(dialstring, sizeof dialstring, "rtp/%s", term->name); + + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kLOCALADDR, term->u.rtp.local_addr); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kLOCALPORT, "%d", term->u.rtp.local_port); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kREMOTEADDR, term->u.rtp.remote_addr); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kREMOTEPORT, "%d", term->u.rtp.remote_port); + + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kPTIME, "%d", term->u.rtp.ptime); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kPT, "%d", term->u.rtp.pt); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kRFC2833PT, "%d", term->u.rtp.rfc2833_pt); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kRATE, "%d", term->u.rtp.rate); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kCODEC, term->u.rtp.codec); + } else if (term->type == MG_TERM_TDM) { + switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); + + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kSPAN_ID, "%d", term->u.tdm.span); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kCHAN_ID, "%d", term->u.tdm.channel); + } + + /* Set common variables on the channel */ + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true"); + + if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); + status = SWITCH_STATUS_FALSE; + goto done; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + +done: + if (session) { + switch_core_session_rwunlock(session); + } + switch_event_destroy(&var_event); +} + +mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix) +{ + mg_termination_type_t termtype; + + /* Check the termination type by prefix */ + if (strncasecmp(prefix, profile->rtp_termination_id_prefix, strlen(profile->rtp_termination_id_prefix)) == 0) { + termtype = MG_TERM_RTP; + } else { + /* TODO Math: look through TDM channels */ + return NULL; + } + + +} + +mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name) +{ + mg_termination_t *term = switch_core_hash_find_rdlock(profile->terminations, name, profile->terminations_rwlock); + return term; + +} + +void megaco_termination_destroy(mg_termination_t *term) +{ + /* Lookup the FS session and hang it up */ + switch_core_session_t *session; + switch_channel_t *channel; + + if ((session = switch_core_session_locate(term->uuid))) { + channel = switch_core_session_get_channel(session); + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + switch_core_session_rwunlock(session); + term->uuid = NULL; + } + + switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); +} + +switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term) +{ + + switch_assert(ctx != NULL); + switch_assert(term != NULL); + + /* Check if the current context has existing terminations */ + if (ctx->terminations[0] && ctx->terminations[1]) { + /* Context is full */ + return SWITCH_STATUS_FALSE; + } + + if (ctx->terminations[0]) { + ctx->terminations[1] = term; + } else if (ctx->terminations[1]) { + ctx->terminations[0] = term; + } else { + ctx->terminations[0] = term; + } + + if (ctx->terminations[0] && ctx->terminations[1]) { + if (zstr(ctx->terminations[0]->uuid)) { + megaco_activate_termination(ctx->terminations[0]); + } + if (zstr(ctx->terminations[1]->uuid)) { + megaco_activate_termination(ctx->terminations[1]); + } + + switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); + } +} + + +switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination_t *term) +{ + switch_assert(ctx != NULL); + switch_assert(term != NULL); + + /* Channels will automatically go to park once the bridge ends */ + if (ctx->terminations[0] == term) { + ctx->terminations[0] = NULL; + } else if (ctx->terminations[1] == term) { + ctx->terminations[1] = NULL; + } + + megaco_termination_destroy(term); +} + + +switch_status_t megaco_context_move_termination(mg_context_t *dst, mg_termination_t *term) +{ + +} + mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id) { mg_context_t *result = NULL; @@ -87,20 +248,7 @@ mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id) return NULL; } - switch_thread_rwlock_rdlock(profile->contexts_rwlock); - - /* Context exists */ - if (profile->contexts_bitmap[context_id % 8] & (1 << (context_id / 8))) { - for (result = profile->contexts[context_id % MG_CONTEXT_MODULO]; result; result = result->next) { - if (result->context_id == context_id) { - break; - } - } - } - - switch_thread_rwlock_unlock(profile->contexts_rwlock); - - return result; + return megaco_get_context(profile, context_id); } mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) @@ -213,8 +361,9 @@ switch_status_t megaco_profile_start(const char *profilename) switch_thread_rwlock_create(&profile->rwlock, pool); switch_thread_rwlock_create(&profile->contexts_rwlock, pool); + switch_thread_rwlock_create(&profile->terminations_rwlock, pool); -// switch_core_hash_init(&profile->contexts_hash, pool); + switch_core_hash_init(&profile->terminations, pool); if (SWITCH_STATUS_SUCCESS != config_profile(profile, SWITCH_FALSE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error configuring profile %s\n", profile->name); @@ -235,7 +384,7 @@ switch_status_t megaco_profile_start(const char *profilename) fail: switch_core_destroy_memory_pool(&pool); return SWITCH_STATUS_FALSE; -} +} switch_status_t megaco_profile_destroy(megaco_profile_t **profile) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index f1da14a4f2..1fe81c8825 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -64,25 +64,46 @@ typedef enum { typedef struct megaco_profile_s megaco_profile_t; typedef struct mg_context_s mg_context_t; +/* RTP parameters understood by the controllable channel */ +#define kLOCALADDR "local_addr" +#define kLOCALPORT "local_port" +#define kREMOTEADDR "remote_addr" +#define kREMOTEPORT "remote_port" +#define kCODEC "codec" +#define kPTIME "ptime" +#define kPT "pt" +#define kRFC2833PT "rfc2833_pt" +#define kMODE "mode" +#define kRATE "rate" + +/* TDM parameters understood by the controllable channel */ +#define kSPAN_ID "span" +#define kCHAN_ID "chan" + typedef struct mg_termination_s { mg_termination_type_t type; - const char *uuid; - mg_context_t *context; + const char *name; /*!< Megaco Name */ + const char *uuid; /*!< UUID of the associated FS channel, or NULL if it's not activated */ + mg_context_t *context; /*!< Context in which this termination is connected, or NULL */ + megaco_profile_t *profile; /*!< Parent MG profile */ union { struct { - const char *codec; - int ptime; - const char *remote_address; - switch_port_t remote_port; + /* The RTP termination will automatically operate as "sendonly" or "recvonly" as soon as + * one of the network addresses are NULL */ + const char *local_addr; switch_port_t local_port; - CmSdpInfoSet *local_sdp; - CmSdpInfoSet *remote_sdp; - - unsigned mode:2; - unsigned :0; + const char *remote_addr; + switch_port_t remote_port; + + int ptime; + int pt; + int rfc2833_pt; + int rate; + const char *codec; } rtp; + struct { int span; int channel; @@ -93,7 +114,7 @@ typedef struct mg_termination_s { struct mg_context_s { uint32_t context_id; - mg_termination_t terminations[MG_CONTEXT_MAX_TERMS]; + mg_termination_t *terminations[MG_CONTEXT_MAX_TERMS]; megaco_profile_t *profile; mg_context_t *next; switch_memory_pool_t *pool; @@ -102,6 +123,7 @@ struct mg_context_s { #define MG_CONTEXT_MODULO 16 #define MG_MAX_CONTEXTS 32768 + struct megaco_profile_s { char *name; switch_memory_pool_t *pool; @@ -125,6 +147,9 @@ struct megaco_profile_s { uint32_t next_context_id; uint8_t contexts_bitmap[MG_MAX_CONTEXTS/8]; /* Availability matrix, enough bits for a 32768 bitmap */ mg_context_t *contexts[MG_CONTEXT_MODULO]; + + switch_hash_t *terminations; + switch_thread_rwlock_t *terminations_rwlock; }; diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 679a9a0e22..a464beb1be 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -75,7 +75,11 @@ typedef struct { switch_port_t remote_port; switch_payload_t agreed_pt; /*XXX*/ sofia_dtmf_t dtmf_type; - + enum { + RTP_SENDONLY, + RTP_RECVONLY, + RTP_SENDRECV + } mode; } crtp_private_t; static switch_status_t channel_on_init(switch_core_session_t *session); @@ -128,8 +132,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_channel_t *channel; char name[128]; crtp_private_t *tech_pvt = NULL; + switch_caller_profile_t *caller_profile; const char *err; + const char *local_addr = switch_event_get_header_nil(var_event, kLOCALADDR), *szlocal_port = switch_event_get_header_nil(var_event, kLOCALPORT), @@ -150,8 +156,16 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi //rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, rate = !zstr(szrate) ? atoi(szrate) : 8000, pt = !zstr(szpt) ? atoi(szpt) : 0; - - + + if ( + ((zstr(remote_addr) || remote_port == 0) && (zstr(local_addr) || local_port == 0)) || + zstr(codec) || + zstr(szpt)) { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing required arguments\n"); + goto fail; + } + if (!(*new_session = switch_core_session_request(crtp.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); @@ -171,10 +185,21 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->agreed_pt = pt; tech_pvt->dtmf_type = DTMF_2833; /* XXX */ + if (zstr(local_addr) || local_port == 0) { + tech_pvt->mode = RTP_SENDONLY; + } else if (zstr(remote_addr) || remote_port == 0) { + tech_pvt->mode = RTP_SENDRECV; + } else { + + } + switch_core_session_set_private(*new_session, tech_pvt); + caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); + switch_channel_set_caller_profile(channel, caller_profile); - snprintf(name, sizeof(name), "rtp/ctrl"); + + snprintf(name, sizeof(name), "rtp/%s", outbound_profile->destination_number); switch_channel_set_name(channel, name); switch_channel_set_state(channel, CS_INIT); @@ -251,7 +276,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session) switch_channel_t *channel = switch_core_session_get_channel(session); - switch_channel_set_state(channel, CS_ROUTING); + switch_channel_set_state(channel, CS_CONSUME_MEDIA); return SWITCH_STATUS_SUCCESS; } @@ -290,7 +315,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch if (!tech_pvt->rtp_session) { goto cng; } - + if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) { switch_dtmf_t dtmf = { 0 }; switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, &dtmf); @@ -319,7 +344,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc { crtp_private_t *tech_pvt; switch_channel_t *channel; - int frames = 0, bytes = 0, samples = 0; + //int frames = 0, bytes = 0, samples = 0; channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -328,6 +353,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc assert(tech_pvt != NULL); +#if 0 if (!switch_test_flag(frame, SFF_CNG) && !switch_test_flag(frame, SFF_PROXY_PACKET)) { if (tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet; @@ -339,6 +365,8 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc } tech_pvt->timestamp_send += samples; +#endif + switch_rtp_write_frame(tech_pvt->rtp_session, frame); return SWITCH_STATUS_SUCCESS; @@ -369,6 +397,120 @@ static switch_status_t channel_send_dtmf(switch_core_session_t *session, const s static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) { + crtp_private_t *tech_pvt = NULL; + + tech_pvt = switch_core_session_get_private(session); + assert(tech_pvt != NULL); + + switch (msg->message_id) { + case SWITCH_MESSAGE_INDICATE_DEBUG_AUDIO: + { + if (switch_rtp_ready(tech_pvt->rtp_session) && !zstr(msg->string_array_arg[0]) && !zstr(msg->string_array_arg[1])) { + int32_t flags = 0; + if (!strcasecmp(msg->string_array_arg[0], "read")) { + flags |= SWITCH_RTP_FLAG_DEBUG_RTP_READ; + } else if (!strcasecmp(msg->string_array_arg[0], "write")) { + flags |= SWITCH_RTP_FLAG_DEBUG_RTP_WRITE; + } else if (!strcasecmp(msg->string_array_arg[0], "both")) { + flags |= SWITCH_RTP_FLAG_DEBUG_RTP_READ | SWITCH_RTP_FLAG_DEBUG_RTP_WRITE; + } + + if (flags) { + if (switch_true(msg->string_array_arg[1])) { + switch_rtp_set_flag(tech_pvt->rtp_session, flags); + } else { + switch_rtp_clear_flag(tech_pvt->rtp_session, flags); + } + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Options\n"); + } + } + break; + } + case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC: + if (switch_rtp_ready(tech_pvt->rtp_session)) { + rtp_flush_read_buffer(tech_pvt->rtp_session, SWITCH_RTP_FLUSH_ONCE); + } + break; + case SWITCH_MESSAGE_INDICATE_JITTER_BUFFER: + { + if (switch_rtp_ready(tech_pvt->rtp_session)) { + int len = 0, maxlen = 0, qlen = 0, maxqlen = 50, max_drift = 0; + + if (msg->string_arg) { + char *p, *q; + const char *s; + + if (!strcasecmp(msg->string_arg, "pause")) { + switch_rtp_pause_jitter_buffer(tech_pvt->rtp_session, SWITCH_TRUE); + goto end; + } else if (!strcasecmp(msg->string_arg, "resume")) { + switch_rtp_pause_jitter_buffer(tech_pvt->rtp_session, SWITCH_FALSE); + goto end; + } else if (!strncasecmp(msg->string_arg, "debug:", 6)) { + s = msg->string_arg + 6; + if (s && !strcmp(s, "off")) { + s = NULL; + } + switch_rtp_debug_jitter_buffer(tech_pvt->rtp_session, s); + goto end; + } + + + if ((len = atoi(msg->string_arg))) { + qlen = len / (tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); + if (qlen < 1) { + qlen = 3; + } + } + + if (qlen) { + if ((p = strchr(msg->string_arg, ':'))) { + p++; + maxlen = atol(p); + if ((q = strchr(p, ':'))) { + q++; + max_drift = abs(atol(q)); + } + } + } + + + if (maxlen) { + maxqlen = maxlen / (tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); + } + } + + if (qlen) { + if (maxqlen < qlen) { + maxqlen = qlen * 5; + } + if (switch_rtp_activate_jitter_buffer(tech_pvt->rtp_session, qlen, maxqlen, + tech_pvt->read_codec.implementation->samples_per_packet, + tech_pvt->read_codec.implementation->samples_per_second, max_drift) == SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), + SWITCH_LOG_DEBUG, "Setting Jitterbuffer to %dms (%d frames) (%d max frames) (%d max drift)\n", + len, qlen, maxqlen, max_drift); + switch_channel_set_flag(tech_pvt->channel, CF_JITTERBUFFER); + if (!switch_false(switch_channel_get_variable(tech_pvt->channel, "sip_jitter_buffer_plc"))) { + switch_channel_set_flag(tech_pvt->channel, CF_JITTERBUFFER_PLC); + } + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), + SWITCH_LOG_WARNING, "Error Setting Jitterbuffer to %dms (%d frames)\n", len, qlen); + } + + } else { + switch_rtp_deactivate_jitter_buffer(tech_pvt->rtp_session); + } + } + } + break; + + default: + break; + } +end: return SWITCH_STATUS_SUCCESS; } From d6d136505365420cb3f23458e66b47dc5724a334 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 19 Jul 2012 18:06:13 -0400 Subject: [PATCH 314/493] add comments --- .../mod_media_gateway/mod_media_gateway.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 1fe81c8825..1c9ff91b0d 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -91,17 +91,17 @@ typedef struct mg_termination_s { struct { /* The RTP termination will automatically operate as "sendonly" or "recvonly" as soon as * one of the network addresses are NULL */ - const char *local_addr; - switch_port_t local_port; + const char *local_addr; /*!< RTP Session's Local IP address */ + switch_port_t local_port; /*!< RTP Session's Local IP address */ - const char *remote_addr; - switch_port_t remote_port; + const char *remote_addr; /*!< RTP Session's Remote IP address */ + switch_port_t remote_port; /*!< RTP Session's Remote IP address */ - int ptime; - int pt; - int rfc2833_pt; - int rate; - const char *codec; + int ptime; /*!< Packetization Interval, in miliseconds. The default is 20, but it has to be set */ + int pt; /*!< Payload type */ + int rfc2833_pt; /*!< If the stream is using rfc2833 for dtmf events, this has to be set to its negotiated payload type */ + int rate; /*!< Sampling rate */ + const char *codec; /*!< Codec to use, using the freeswitch nomenclature. This could be "PCMU" for G711.U, "PCMA" for G711.A, or "G729" for g729 */ } rtp; struct { From 96fd063ae3cb9e264fdc2bd6d669078f88567ea3 Mon Sep 17 00:00:00 2001 From: Kapil Date: Fri, 20 Jul 2012 09:58:43 -0400 Subject: [PATCH 315/493] adding add/mod/sub api and alloc context during add and release context while processing subtract code --- .../mod_media_gateway/media_gateway.c | 12 +- .../media_gateway_cmd_handler.c | 786 +++++++++++++----- .../media_gateway_packages.c | 34 +- .../mod_media_gateway/media_gateway_stack.h | 3 +- .../mod_media_gateway/mod_media_gateway.c | 18 +- 5 files changed, 615 insertions(+), 238 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index b596cdb819..8ed5590e54 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -140,6 +140,8 @@ done: switch_core_session_rwunlock(session); } switch_event_destroy(&var_event); + + return SWITCH_STATUS_SUCCESS; } mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix) @@ -154,7 +156,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha return NULL; } - + return SWITCH_STATUS_SUCCESS; } mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name) @@ -210,6 +212,8 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); } + + return SWITCH_STATUS_SUCCESS; } @@ -226,17 +230,19 @@ switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination } megaco_termination_destroy(term); + + return SWITCH_STATUS_SUCCESS; } switch_status_t megaco_context_move_termination(mg_context_t *dst, mg_termination_t *term) { - + + return SWITCH_STATUS_SUCCESS; } mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id) { - mg_context_t *result = NULL; megaco_profile_t* profile = NULL; if(NULL == (profile = megaco_get_profile_by_suId(suId))){ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 7da367155a..8cc0e41268 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -29,254 +29,441 @@ const char *mg_service_change_reason[] = { * * */ -switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId) { - MgMgcoContextId *ctxtId; - int descId; - MgStr errTxt; - MgMgcoInd *mgErr; - MgMgcoTermId *termId; - MgMgcoTermIdLst* termLst; - int err_code; - int i; - int j; - int fmtCnt; - MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; - U32 txn_id = inc_cmd->transId.val; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc *remote; - MgMgcoLclCtlDesc *locCtl; - CmSdpInfo *sdp; - MgMgcoLocalParm *lclParm; - MgMgcoTermStateDesc *tstate; - CmSdpMedFmtRtpList *fmt_list; - MgMgcoTermStateParm *tsp; - TknU8 *fmt; - CmSdpMedProtoFmts *format; + MgMgcoContextId *ctxtId; + int descId; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoTermIdLst* termLst; + int err_code; + int i; + int j; + int is_rtp = 0x00; + char rtp_term_name[32]; + int fmtCnt; + MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; + U32 txn_id = inc_cmd->transId.val; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc *remote; + MgMgcoLclCtlDesc *locCtl; + CmSdpInfo *sdp; + MgMgcoLocalParm *lclParm; + MgMgcoTermStateDesc *tstate; + CmSdpMedFmtRtpList *fmt_list; + MgMgcoTermStateParm *tsp; + TknU8 *fmt; + CmSdpMedProtoFmts *format; + MgMgcoMediaDesc* inc_med_desc; + MgMgcoAudRetParm *desc; + mg_context_t* mg_ctxt; - /********************************************************************/ - ctxtId = &inc_cmd->contextId; - termLst = mg_get_term_id_list(inc_cmd); - termId = termLst->terms[0]; - /* For Matt - termId->name.lcl.val - to get the termination id name */ + memset(&rtp_term_name[0], 0, 32); - /********************************************************************/ - /* Validating ADD request *******************************************/ - /*-- NULL Context & ALL Context not applicable for ADD request --*/ - if ((NOTPRSNT != ctxtId->type.pres) && - ((MGT_CXTID_ALL == ctxtId->type.val) || - (MGT_CXTID_NULL == ctxtId->type.val))) { + /********************************************************************/ + ctxtId = &inc_cmd->contextId; + termLst = mg_get_term_id_list(inc_cmd); + termId = termLst->terms[0]; + /* For Matt - termId->name.lcl.val - to get the termination id name */ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); + /********************************************************************/ + /* Validating ADD request *******************************************/ - mg_util_set_ctxt_string(&errTxt, ctxtId); - err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; - goto error; - } + /*-- NULL Context & ALL Context not applicable for ADD request --*/ + if ((NOTPRSNT != ctxtId->type.pres) && + ((MGT_CXTID_ALL == ctxtId->type.val) || + (MGT_CXTID_NULL == ctxtId->type.val))) { - /********************************************************************/ - /* Allocate context - if context type is CHOOSE */ - if ((NOTPRSNT != ctxtId->type.pres) && - (MGT_CXTID_CHOOSE == ctxtId->type.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); - /* TODO - Matt */ - } + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } - /********************************************************************/ - /* Allocate new RTP termination - If term type is CHOOSE */ - if ((NOTPRSNT != termId->type.pres) && - (MGT_TERMID_CHOOSE == termId->type.val)){ + /********************************************************************/ + /* Allocate context - if context type is CHOOSE */ + if ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_CHOOSE == ctxtId->type.val)){ - /* TODO - Matt */ - /* allocate rtp term and associated the same to context */ - /********************************************************************/ - }else{ /* Physical termination */ - /* TODO - Matt - associate physical termination to context */ - } - /********************************************************************/ + mg_ctxt = megaco_choose_context(mg_profile); - for (descId = 0; descId < cmd->dl.num.val; descId++) { - switch (cmd->dl.descs[descId]->type.val) { - case MGT_MEDIADESC: - { - int mediaId; - for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; - switch (mediaPar->type.val) { - case MGT_MEDIAPAR_LOCAL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); - /* Matt - check local descriptor processing */ - local = &mediaPar->u.local; - sdp = local->sdp.info[0]; - for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { - /* sdp formats */ - for (j = 0; j < - sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) - { - format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; - /* Matt - format has field for T38 also */ - if ((format->protType.pres != NOTPRSNT) && - (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); - /* protocol type RTP */ - fmt_list = &format->u.rtp; + /* fill Trillium Context structure with allocated context */ + MG_SET_VAL_PRES(new_ctxtId->type, MGT_CXTID_OTHER); + MG_SET_VAL_PRES(new_ctxtId->val, mg_ctxt->context_id); + } + else { + /* context already present */ + memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + } - /* print format */ - for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ - fmt = &fmt_list->fmts[i]->val; - if(fmt->pres == NOTPRSNT) continue; - printf("Format [%d]\n", fmt->val); - } - } - } - } + /********************************************************************/ + /* Allocate new RTP termination - If term type is CHOOSE */ + if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_CHOOSE == termId->type.val)){ - break; - } + is_rtp = 0x01; + strcpy(rtp_term_name,"rtp/1"); - case MGT_MEDIAPAR_REMOTE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); - /* Matt - check remote descriptor processing */ - remote = &mediaPar->u.remote; - sdp = remote->sdp.info[0]; - /* for Matt - same like local descriptor */ - break; - } + /* TODO - Matt */ + /* allocate rtp term and associated the same to context */ + /********************************************************************/ + }else{ /* Physical termination */ + /* TODO - Matt - associate physical termination to context */ + } + /********************************************************************/ - case MGT_MEDIAPAR_LOCCTL: - { - /* Matt - check Local Control descriptor processing */ - locCtl = &mediaPar->u.locCtl; - for (i = 0; i < locCtl->num.val; i++){ - lclParm = locCtl->parms[i]; - if (PRSNT_NODEF == lclParm->type.pres){ - switch(lclParm->type.val) - { - case MGT_LCLCTL_MODE: - { - /* Mode Property */ - printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); - break; - } - case MGT_LCLCTL_RESVAL: - { - /* Reserve Value */ - printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); - break; - } - case MGT_LCLCTL_RESGRP: - { - /* Reserve group */ - printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); - break; - } - case MGT_LCLCTL_PROPPARM: - { - /* Properties (of a termination) */ - /* Matt - See how we can apply this to a termination */ - printf("MGT_LCLCTL_PROPPARM: \n"); - break; - } - default: - printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); - break; - } - } - } + for (descId = 0; descId < cmd->dl.num.val; descId++) { + switch (cmd->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + inc_med_desc = &cmd->dl.descs[descId]->u.media; + for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + /* Matt - check local descriptor processing */ + local = &mediaPar->u.local; + sdp = local->sdp.info[0]; + for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { + /* sdp formats */ + for (j = 0; j < + sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) + { + format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; + /* Matt - format has field for T38 also */ + if ((format->protType.pres != NOTPRSNT) && + (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); - break; - } - case MGT_MEDIAPAR_TERMST: - { - /* Matt - apply termination state descriptor */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); - tstate = &mediaPar->u.tstate; - for (i = 0; i < tstate->numComp.val; i++) - { - /* Matt to see how to apply below descriptors to a termination */ - tsp = tstate->trmStPar[i]; - if (PRSNT_NODEF == tsp->type.pres) { - switch(tsp->type.val) - { - case MGT_TERMST_PROPLST: - { - /* Matt to see how to apply properties to a termination */ - /* Properties of a termination */ - printf("MGT_TERMST_PROPLST:\n"); - break; - } - case MGT_TERMST_EVTBUFCTL: - { - /* Event /buffer Control Properties */ - printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); - break; - } - case MGT_TERMST_SVCST: - { - /* Service State Properties */ - printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); - break; - } - default: - printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); - break; - } - } - } - break; - } - case MGT_MEDIAPAR_STRPAR: - { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + /* protocol type RTP */ + fmt_list = &format->u.rtp; - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); - } + /* print format */ + for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ + fmt = &fmt_list->fmts[i]->val; + if(fmt->pres == NOTPRSNT) continue; + printf("Format [%d]\n", fmt->val); + } + } + } + } - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); - } + break; + } - break; - } - } - } - } - case MGT_MODEMDESC: - case MGT_MUXDESC: - case MGT_REQEVTDESC: - case MGT_EVBUFDESC: - case MGT_SIGNALSDESC: - case MGT_DIGMAPDESC: - case MGT_AUDITDESC: - case MGT_STATSDESC: - break; - } - } + case MGT_MEDIAPAR_REMOTE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + /* Matt - check remote descriptor processing */ + remote = &mediaPar->u.remote; + sdp = remote->sdp.info[0]; + /* for Matt - same like local descriptor */ + break; + } - /* Matt - to provide the response SDP structure which needs to fill in ADD command response */ + case MGT_MEDIAPAR_LOCCTL: + { + /* Matt - check Local Control descriptor processing */ + locCtl = &mediaPar->u.locCtl; + for (i = 0; i < locCtl->num.val; i++){ + lclParm = locCtl->parms[i]; + if (PRSNT_NODEF == lclParm->type.pres){ + switch(lclParm->type.val) + { + case MGT_LCLCTL_MODE: + { + /* Mode Property */ + printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + break; + } + case MGT_LCLCTL_RESVAL: + { + /* Reserve Value */ + printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + break; + } + case MGT_LCLCTL_RESGRP: + { + /* Reserve group */ + printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + break; + } + case MGT_LCLCTL_PROPPARM: + { + /* Properties (of a termination) */ + /* Matt - See how we can apply this to a termination */ + printf("MGT_LCLCTL_PROPPARM: \n"); + break; + } + default: + printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); + break; + } + } + } - /* Matt - to indicate if there is any failure while processing add message */ - - /* Kapil - to return error if there is any failure based on Matt's indication */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); + break; + } + case MGT_MEDIAPAR_TERMST: + { + /* Matt - apply termination state descriptor */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + tstate = &mediaPar->u.tstate; + for (i = 0; i < tstate->numComp.val; i++) + { + /* Matt to see how to apply below descriptors to a termination */ + tsp = tstate->trmStPar[i]; + if (PRSNT_NODEF == tsp->type.pres) { + switch(tsp->type.val) + { + case MGT_TERMST_PROPLST: + { + /* Matt to see how to apply properties to a termination */ + /* Properties of a termination */ + printf("MGT_TERMST_PROPLST:\n"); + break; + } + case MGT_TERMST_EVTBUFCTL: + { + /* Event /buffer Control Properties */ + printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); + break; + } + case MGT_TERMST_SVCST: + { + /* Service State Properties */ + printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); + break; + } + default: + printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); + break; + } + } + } + break; + } + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - /* Kapil - to fill the response structure and call the response API to send ADD response */ - + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_print_sdp(&mgStream->sl.remote.sdp); + } - return SWITCH_STATUS_SUCCESS; + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_print_sdp(&mgStream->sl.local.sdp); + } + + break; + } + } + } + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_REQEVTDESC: + case MGT_EVBUFDESC: + case MGT_SIGNALSDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + } + } + + /* Matt - to provide the response SDP structure which needs to fill in ADD command response */ + + /* Matt - to indicate if there is any failure while processing add message */ + + /* Kapil - to return error if there is any failure based on Matt's indication */ + + /* Kapil - to fill the response structure and call the response API to send ADD response */ + + /*************************************************************************************************************************/ + /* sample resp code -- begin */ + { + MgMgcoCommand rsp; + int ret = 0x00; + MgMgcoTermId *out_termId; + + memset(&rsp,0, sizeof(rsp)); + + /*copy transaction-id*/ + memcpy(&rsp.transId, &inc_cmd->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ + memcpy(&rsp.contextId, new_ctxtId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&rsp.peerId, &inc_cmd->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&rsp.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + rsp.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.val = MGT_ADD; + rsp.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; + + if(!is_rtp){ + /* IF ADD request is for Physical term then we can simply copy incoming + * termination */ + mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + +#ifdef GCP_VER_2_1 + out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; +#else + out_termId = &(rsp.u.mgCmdRsp[0]->u.add.termId); +#endif + }else{ + /* ADD request is for RTP term we need to create termination */ + + /* Grow the list of reply parameters */ + if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms, sizeof(MgMgcoTermId), + &rsp.u.mgCmdRsp[0]->u.add.termIdLst.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[rsp.u.mgCmdRsp[0]->u.add.termIdLst.num.val-1]; + mg_fill_mgco_termid(out_termId, (char*)rtp_term_name, strlen((char*)rtp_term_name), &rsp.u.mgCmdRsp[0]->memCp); + } + + /* Whatever Media descriptor we have received, we can copy that and then + * whatever we want we can modify the fields */ + /* Kapil - TODO - will see if there is any problem of coping the + * descriptor */ + + if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.audit.parms, sizeof(MgMgcoAudRetParm), + &rsp.u.mgCmdRsp[0]->u.add.audit.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + /* copy media descriptor */ + + desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; + desc->type.pres = PRSNT_NODEF; + desc->type.val = MGT_MEDIADESC; + mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); + +#if 0 + + /* Most probably we need to add local descriptor */ + { + MgMgcoStreamDesc *stream; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc* remote; + CmSdpInfoSet *psdp; + CmSdpInfoSet *prsdp; + char* ipAddress = "192.168.1.1"; + + /* TODO - considering only one descriptor*/ + stream = &desc->u.media.parms[0]->u.stream; + local = &stream->sl.local; + remote = &stream->sl.remote; + + if(!local->pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); + local->pres.pres = PRSNT_NODEF; + psdp = &(local->sdp); + prsdp = &(remote->sdp); + + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + psdp->info[0]->pres.pres = PRSNT_NODEF; + + /* fill version */ + memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); + + /* fill orig */ + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), ipAddress[3]); + + /* fill session name */ + memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL)); + + /* fill info */ + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); + + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn)); + + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->mediaDescSet; + CmSdpMediaDesc* m; + + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + } + + m = med->mediaDesc[0]; + + m->pres.pres = PRSNT_NODEF; + } + else { + printf("!local->pres.pres false \n"); + } + } +#endif + + + + /* We will always send one command at a time..*/ + rsp.cmdStatus.pres = PRSNT_NODEF; + rsp.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + rsp.cmdType.pres = PRSNT_NODEF; + rsp.cmdType.val = CH_CMD_TYPE_RSP; + + ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); + + return ret; + + } + /* sample resp code -- end */ + /*************************************************************************************************************************/ + + + return SWITCH_STATUS_SUCCESS; error: - if (SWITCH_STATUS_SUCCESS == - mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { - sng_mgco_send_err(mg_profile->idx, mgErr); - } - mg_free_cmd(cmd); - return SWITCH_STATUS_FALSE; + if (SWITCH_STATUS_SUCCESS == + mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(mg_profile->idx, mgErr); + } + mg_free_cmd(cmd); + return SWITCH_STATUS_FALSE; } /*****************************************************************************************************************************/ @@ -341,7 +528,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "Modify request processing failure, CHOOSE Termination should not present in Modify\n"); - + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; mg_util_set_term_string(&errTxt,termId); goto error; @@ -359,7 +546,11 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Kapil - If there is an error - send response back to MG stack with MGT_MGCO_RSP_CODE_NO_TERM_CTXT error code*/ /********************************************************************/ - + + + /* Media Descriptor processing same as ADD command */ + + /* TODO - Will see If we can have common media_descriptor processing API which we can use for both ADD/MODIFY */ for (descId = 0; descId < cmd->dl.num.val; descId++) { switch (cmd->dl.descs[descId]->type.val) { @@ -528,11 +719,11 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Matt - to provide the response SDP structure which needs to fill in Modify command response */ /* Matt - to indicate if there is any failure while processing add message */ - + /* Kapil - to return error if there is any failure based on Matt's indication */ /* Kapil - to fill the response structure and call the response API to send Modify response */ - + return SWITCH_STATUS_SUCCESS; error: @@ -544,6 +735,147 @@ error: return SWITCH_STATUS_FALSE; } +/*****************************************************************************************************************************/ + +/* +* +* Fun: handle_mg_subtract_cmd +* +* Desc: this api will handle the Subtract request received from MG stack +* +* +*/ +switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) +{ + MgMgcoContextId *ctxtId; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoTermIdLst* termLst; + int err_code; + MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; + U32 txn_id = inc_cmd->transId.val; + mg_context_t* mg_ctxt; + uint8_t wild = 0x00; + + wild = inc_cmd->u.mgCmdReq[0]->wild.pres; + + + /********************************************************************/ + ctxtId = &inc_cmd->contextId; + termLst = mg_get_term_id_list(inc_cmd); + termId = termLst->terms[0]; + + /********************************************************************/ + /* Validating Subtract request *******************************************/ + + /*-- NULL Context & CHOOSE Context not applicable for SUB request --*/ + if ((NOTPRSNT != ctxtId->type.pres) && + ((MGT_CXTID_CHOOSE == ctxtId->type.val) || + (MGT_CXTID_NULL == ctxtId->type.val))) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Context CHOOSE/NULL not allowed\n"); + + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } + /* ROOT Termination & CHOOSE Termination not allowed */ + else if ((NOTPRSNT != termId->type.pres) && + ((MGT_TERMID_ROOT == termId->type.val) || + (MGT_TERMID_CHOOSE == termId->type.val))) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Termination ROOT/CHOOSE not allowed\n"); + + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; + goto error; + } + + + /********************************************************************/ + /* Matt - TODO - check if we have terminations in the context */ + + /* Matt to indicate ERROR - If there is no terminations in requested context */ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received context_id[%d]\n", ctxtId->val.val); + + /*find context based on received context-id */ + mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); + + /* TODO - remove terminations from context....as if now there is no termination associated with Context */ + + /* release context*/ + megaco_release_context(mg_ctxt); + + /*************************************************************************************************************************/ + /* resp code -- begin */ + { + MgMgcoCommand rsp; + int ret = 0x00; + MgMgcoTermId *out_termId; + + memset(&rsp,0, sizeof(rsp)); + + /*copy transaction-id*/ + memcpy(&rsp.transId, &inc_cmd->transId, sizeof(MgMgcoTransId)); + + /*copy context-id*/ + memcpy(&rsp.contextId, &inc_cmd->contextId, sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&rsp.peerId, &inc_cmd->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&rsp.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + rsp.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.val = MGT_SUB; + rsp.u.mgCmdRsp[0]->u.sub.pres.pres = PRSNT_NODEF; + + if(wild){ + rsp.u.mgCmdRsp[0]->wild.pres = PRSNT_NODEF; + } + + mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + +#ifdef GCP_VER_2_1 + out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; +#else + out_termId = &(rsp.u.mgCmdRsp[0]->u.add.termId); +#endif + + /* We will always send one command at a time..*/ + rsp.cmdStatus.pres = PRSNT_NODEF; + rsp.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + rsp.cmdType.pres = PRSNT_NODEF; + rsp.cmdType.val = CH_CMD_TYPE_RSP; + + ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); + + return ret; + + } + /* sample resp code -- end */ + /*************************************************************************************************************************/ + + + return SWITCH_STATUS_SUCCESS; +error: + if (SWITCH_STATUS_SUCCESS == + mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { + sng_mgco_send_err(mg_profile->idx, mgErr); + } + mg_free_cmd(cmd); + return SWITCH_STATUS_FALSE; +} + /*****************************************************************************************************************************/ /* * diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c index 19c1b1dae7..0c6f17b0df 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c @@ -47,10 +47,11 @@ MgPackage_t mg_pkg_list [] = 1, /* Version 1 */ "tdmc", /* Package name */ }, + /* TODO - not sure IF we need this */ { /* INDEX : 7 */ - MGT_PKG_QTY_ALT, /*55*/ + MGT_PKG_SEGMENTATION, 1, /* Version 1 */ - "qac", /* Package name */ + "seg", /* Package name */ }, { /* INDEX : 8 */ MGT_PKG_EN_ALERT, /*59*/ @@ -58,9 +59,9 @@ MgPackage_t mg_pkg_list [] = "alert", /* Package name */ }, { /* INDEX : 9 */ - MGT_PKG_AN_DISP, /*60*/ + MGT_PKG_CONTINUITY, /*60*/ 2, /* Version 1 */ - "andisp", /* Package name */ + "ct", /* Package name */ }, { /* INDEX : 10 */ MGT_PKG_INACTTIMER, /*69*/ @@ -97,6 +98,31 @@ MgPackage_t mg_pkg_list [] = 1, /* Version 1 */ "etsi_nr", /* Package name */ }, + { /* INDEX : 17 */ + MGT_PKG_TONEGEN, + 1, /* Version 1 */ + "tonegen", /* Package name */ + }, + { /* INDEX : 18 */ + MGT_PKG_DTMFGEN, + 1, /* Version 1 */ + "tonegen", /* Package name */ + }, + { /* INDEX : 19 */ + MGT_PKG_CALLPROGGEN, + 1, /* Version 1 */ + "tonegen", /* Package name */ + }, + { /* INDEX : 20 */ + MGT_PKG_CALLPROGDET, + 1, /* Version 1 */ + "tonedet", /* Package name */ + }, + { /* INDEX : 21 */ + MGT_PKG_ANALOG, + 1, /* Version 1 */ + "analog", /* Package name */ + }, /* Add more packages */ }; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index d06fd727a1..b207f2e75a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -133,7 +133,8 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, m switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); void mgco_print_sdp(CmSdpInfoSet *sdp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); -switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId); +switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd); switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 4336b90982..cbdf144a6a 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -424,6 +424,7 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) /*****************************************************************************************************************************/ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { + MgMgcoContextId out_ctxt; U32 txn_id = 0x00; MgMgcoInd *mgErr; MgStr errTxt; @@ -435,6 +436,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) int err_code; megaco_profile_t* mg_profile; + memset(&out_ctxt,0,sizeof(out_ctxt)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); /* validate Transaction Id */ @@ -532,6 +535,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) goto error1; } + memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); + switch(cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -543,8 +548,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { case MGT_ADD: { - handle_mg_add_cmd(mg_profile, cmd); - mg_send_add_rsp(suId, cmd); + handle_mg_add_cmd(mg_profile, cmd, &out_ctxt); + /*mg_send_add_rsp(suId, cmd);*/ break; } @@ -565,7 +570,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_SUB: { /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ - mg_send_subtract_rsp(suId, cmd); + handle_mg_subtract_cmd(mg_profile, cmd); + /*mg_send_subtract_rsp(suId, cmd);*/ break; } case MGT_SVCCHG: @@ -613,6 +619,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) return; } + /* END OF TXN received - means last command in txn to process. + * Send response to peer */ + if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val){ + mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); + } + return; ctxt_error: From fffc9d4eec85964a6fa1c439b5322bc99ef0ec15 Mon Sep 17 00:00:00 2001 From: Kapil Date: Fri, 20 Jul 2012 13:25:16 -0400 Subject: [PATCH 316/493] Adding code to print SDP structure --- .../mod_media_gateway/media_gateway_utils.c | 673 +++++++++++++++++- 1 file changed, 637 insertions(+), 36 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index e536fd83bf..b4728a2bc0 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -410,55 +410,656 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) } /*****************************************************************************************************************************/ +void mgco_print_sdp_attr_set(CmSdpAttrSet *s) +{ + int i=0x00; + if (s->numComp.pres) { + for (i = 0; i < s->numComp.val; i++) { + CmSdpAttr *a = s->attr[i]; + + if(NOTPRSNT == a->type.pres) continue; + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Attribute Type[%d]\n",a->type.val); + + switch(a->type.val) + { + case CM_SDP_ATTR_GENERIC: + { + break; + } + case CM_SDP_ATTR_CAT: + { + break; + } + + case CM_SDP_ATTR_KEYWDS: + { + break; + } + case CM_SDP_ATTR_TOOL: + { + break; + } + case CM_SDP_ATTR_PTIME: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %d \n", + (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); + break; + } + case CM_SDP_ATTR_RECVONLY: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_RECVONLY: \n"); + break; + } + case CM_SDP_ATTR_SENDRECV: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_SENDRECV: \n"); + break; + } + case CM_SDP_ATTR_SENDONLY: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_SENDONLY: \n"); + break; + } + case CM_SDP_ATTR_ORIENT: + { + break; + } + case CM_SDP_ATTR_TYPE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_TYPE: \n"); + break; + } + case CM_SDP_ATTR_CHARSET: + { + break; + } + + case CM_SDP_ATTR_SDPLANG: + { + break; + } + + case CM_SDP_ATTR_LANG: + { + break; + } + case CM_SDP_ATTR_FRAMERATE: + { + break; + } + case CM_SDP_ATTR_QUALITY: + { + break; + } + case CM_SDP_ATTR_FMTP: + { + CmSdpAttrFmtp* f = &a->u.fmtp; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_FMTP: \n"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Format Type = %d \n",(NOTPRSNT == f->type.pres)?f->type.val:-1); + + break; + } + case CM_SDP_ATTR_RTPMAP: + { + CmSdpAttrRtpMap* r = &a->u.rtpmap; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_RTPMAP: \n"); + + if(NOTPRSNT != r->pres.pres){ + + /* payload type */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Payload Type = %d \n", + (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); + + /* payload value */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Payload Value = %d \n", + (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); + + /* encoding name */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Name value = %d \n", + (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Name name = %s \n", + (NOTPRSNT != r->enc.name.pres)?(char*)r->enc.name.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Clock Rate = %d \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Parameters = %s \n", + (NOTPRSNT != r->parms.pres)?(char*)r->parms.val:"Not Present"); + } + break; + } + case CM_SDP_ATTR_INACTIVE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_INACTIVE: \n"); + break; + } + case CM_SDP_ATTR_CONTROL: + { + break; + } + case CM_SDP_ATTR_RANGE: + { + break; + } + case CM_SDP_ATTR_ETAG: + { + break; + } + case CM_SDP_ATTR_ATMMAP: + { + break; + } + case CM_SDP_ATTR_EECID: + { + break; + } + case CM_SDP_ATTR_AALTYPE: + { + break; + } + case CM_SDP_ATTR_SILENCESUPP: + { + break; + } + case CM_SDP_ATTR_ECAN: + { + break; + } + case CM_SDP_ATTR_GC: + { + break; + } + case CM_SDP_ATTR_PROFILEDESC: + { + break; + } + case CM_SDP_ATTR_VSEL: + { + break; + } + case CM_SDP_ATTR_DSEL: + { + break; + } + case CM_SDP_ATTR_FSEL: + { + break; + } + case CM_SDP_ATTR_CAPABILITY: + { + break; + } + case CM_SDP_ATTR_QOSCLASS: + { + break; + } + case CM_SDP_ATTR_BCOB: + { + break; + } + case CM_SDP_ATTR_STC: + { + break; + } + case CM_SDP_ATTR_UPCC: + { + break; + } + case CM_SDP_ATTR_ATMQOSPARMS: + { + break; + } + case CM_SDP_ATTR_AAL2QOSFPARMS: + { + break; + } + case CM_SDP_ATTR_AAL2QOSBPARMS: + { + break; + } + case CM_SDP_ATTR_ATMTRFCDESC: + { + break; + } + case CM_SDP_ATTR_AAL2FTRFCDESC: + { + break; + } + case CM_SDP_ATTR_AAL2BTRFCDESC: + { + break; + } + case CM_SDP_ATTR_ABRPARMS: + { + break; + } + case CM_SDP_ATTR_CLKREC: + { + break; + } + case CM_SDP_ATTR_FEC: + { + break; + } + case CM_SDP_ATTR_PRTFL: + { + break; + } + case CM_SDP_ATTR_BEARERTYPE: + { + break; + } + case CM_SDP_ATTR_STRUCTURE: + { + break; + } + case CM_SDP_ATTR_SBC: + { + break; + } + case CM_SDP_ATTR_CPSSDUSIZE: + { + break; + } + case CM_SDP_ATTR_AAL2CPS: + { + break; + } + case CM_SDP_ATTR_ANYCAST: + { + break; + } + case CM_SDP_ATTR_WTP: + { + break; + } + case CM_SDP_ATTR_CACHE: + { + break; + } + case CM_SDP_ATTR_CHAIN: + { + break; + } + case CM_SDP_ATTR_PHONECONTEXT: + { + break; + } + case CM_SDP_ATTR_CLIR: + { + break; + } + case CM_SDP_ATTR_DIRECTION: + { + break; + } + case CM_SDP_ATTR_MAXPTIME: + { + break; + } + case CM_SDP_ATTR_T38_FAX: + { + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Not supported Type[%d]\n",a->type.val); + break; + } + } + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "a-line not present \n"); + } + + +} + +void mgco_print_sdp_c_line(CmSdpConn *s) +{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP connection line ****** \n"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", + (NOTPRSNT != s->netType.type.pres)?s->netType.type.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", + (NOTPRSNT != s->addrType.pres)?s->addrType.val:-1); + + if (s->addrType.pres && s->addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->netType.type.val == CM_SDP_NET_TYPE_IN && + s->u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->u.ip4.u.uniIp.b[0].val, + s->u.ip4.u.uniIp.b[1].val, + s->u.ip4.u.uniIp.b[2].val, + s->u.ip4.u.uniIp.b[3].val); + } + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); +} + +void mgco_print_CmSdpU8OrNil(CmSdpU8OrNil* p) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Type = %d \n", (NOTPRSNT != p->type.pres)?p->type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Value = %d \n", (NOTPRSNT != p->val.pres)?p->val.val:-1); +} + +void mgco_print_sdp_media_param(CmSdpMedPar *s) +{ + int i=0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "***** Media Parameter *********** \n"); + if (s->numProtFmts.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media Formats = %d \n", s->numProtFmts.val); + for (i = 0; i < s->numProtFmts.val; i++) { + CmSdpMedProtoFmts *a = s->pflst[i]; + + /*Prot*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type = %d \n", (NOTPRSNT != a->prot.type.pres)?a->prot.type.val:-1); + switch(a->prot.type.val) + { + case CM_SDP_MEDIA_PROTO_UNKNOWN: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type Unknown , name = %s \n", + (NOTPRSNT != a->prot.u.name.pres)?(char*)a->prot.u.name.val:"Not Present "); + break; + } + case CM_SDP_MEDIA_PROTO_RTP: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type RTP , subtype = %d \n", + (NOTPRSNT != a->prot.u.subtype.type.pres)?a->prot.u.subtype.type.val: -1); + break; + } + } + + /*repeated from "prot" field */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type = %d \n", + (NOTPRSNT != a->protType.pres)?a->protType.val: -1); + + switch(a->protType.val) + { + case CM_SDP_MEDIA_PROTO_RTP: + { + CmSdpMedFmtRtpList* r = &a->u.rtp; + int i = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " CM_SDP_MEDIA_PROTO_RTP: \n"); + if(NOTPRSNT != r->num.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Number of Formats[%d] \n", r->num.val); + + for(i=0;inum.val;i++){ + mgco_print_CmSdpU8OrNil(r->fmts[i]); + } + } + break; + } + + case CM_SDP_UDPTL_FMT_T38: + { + /*CmSdpMedFmtUdptlList* t = &a->u.t38;*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " CM_SDP_UDPTL_FMT_T38: \n"); + break; + } + default: + break; + } + } + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); +} + void mgco_print_sdp(CmSdpInfoSet *sdp) { - int i; + int i; - if (sdp->numComp.pres == NOTPRSNT) { - return; - } + if (sdp->numComp.pres == NOTPRSNT) { + return; + } - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; - if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && - s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + /************************************************************************************************************************/ + /* info presence check */ + if(NOTPRSNT == s->pres.pres) continue; - if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", - s->conn.u.ip4.u.uniIp.b[0].val, - s->conn.u.ip4.u.uniIp.b[1].val, - s->conn.u.ip4.u.uniIp.b[2].val, - s->conn.u.ip4.u.uniIp.b[3].val); - } - if (s->attrSet.numComp.pres) { - for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - /*CmSdpAttr *a = s->attrSet.attr[mediaId];*/ + /************************************************************************************************************************/ + /* Version */ + if(NOTPRSNT != s->ver.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " SDP Version = %d \n", s->ver.val); + } + + /************************************************************************************************************************/ + /* Orig */ + if(NOTPRSNT != s->orig.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); + + if(NOTPRSNT != s->orig.orig.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t User Name = %s \n", + (NOTPRSNT != s->orig.orig.usrName.pres)?(char*)s->orig.orig.usrName.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Id = %s \n", + (NOTPRSNT != s->orig.orig.sessId.pres)?(char*)s->orig.orig.sessId.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Version = %s \n", + (NOTPRSNT != s->orig.orig.sessVer.pres)?(char*)s->orig.orig.sessVer.val:"Not Present"); + + /* sdpAddr */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", + (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)?s->orig.orig.sdpAddr.netType.type.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", + (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres)?s->orig.orig.sdpAddr.addrType.val:-1); + + /* print IPV4 address */ + if (s->orig.orig.sdpAddr.addrType.pres && s->orig.orig.sdpAddr.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->orig.orig.sdpAddr.netType.type.val == CM_SDP_NET_TYPE_IN && + s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->orig.orig.sdpAddr.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->orig.orig.sdpAddr.u.ip4.u.ip.b[0].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[1].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[2].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[3].val); + } + + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** ****** \n"); + } + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + } + /************************************************************************************************************************/ + /* Session Name (s = line) */ + + if(NOTPRSNT != s->sessName.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Name = %s \n", s->sessName.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t s-line not present \n"); + } + + /************************************************************************************************************************/ + /* Session Info(i= line) */ + + if(NOTPRSNT != s->info.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Info = %s \n", s->info.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t i-line not present \n"); + } + + /************************************************************************************************************************/ + /* Session Uri */ + + if(NOTPRSNT != s->uri.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Uri = %s \n", s->uri.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t uri not present \n"); + } + + /************************************************************************************************************************/ + /* E-Mail */ + /* TODO */ - } - } + /************************************************************************************************************************/ + /* Phone */ + /* TODO */ - if (s->mediaDescSet.numComp.pres) { - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; + /************************************************************************************************************************/ + /* connection line */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + mgco_print_sdp_c_line(&s->conn); + /************************************************************************************************************************/ + /* Bandwidth */ + /* TODO */ - } - } - } - } - } + /************************************************************************************************************************/ + /* SDP Time (t= line)*/ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "*** t-line **************** \n"); + if(NOTPRSNT != s->sdpTime.pres.pres) { + if(NOTPRSNT != s->sdpTime.sdpOpTimeSet.numComp.pres) { + int i = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); + for (i = 0;isdpTime.sdpOpTimeSet.numComp.val;i++){ + CmSdpOpTime* t = s->sdpTime.sdpOpTimeSet.sdpOpTime[i]; + if(NOTPRSNT == t->pres.pres) continue; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Start Time = %s \n", + (NOTPRSNT != t->startTime.pres)?(char*)t->startTime.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Stop Time = %s \n", + (NOTPRSNT != t->stopTime.pres)?(char*)t->stopTime.val:"Not Present"); + + /*repeat time repFieldSet */ + + if(NOTPRSNT != t->repFieldSet.numComp.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time present with total component[%d]\n", + t->repFieldSet.numComp.val); + + /*TODO - print repeat fields */ + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time not present \n"); + } + } /* sdpOpTimeSet.numComp for loop -- end */ + }else{/*sdpOpTimeSet.numComp.pres if -- end */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time not present \n"); + } + + /*TODO - zoneAdjSet */ + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "t-line not present \n"); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); + + + /************************************************************************************************************************/ + /* key type (k= line)*/ + + if(NOTPRSNT != s->keyType.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Type = %d \n", + (NOTPRSNT != s->keyType.keyType.pres)?s->keyType.keyType.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Data = %s \n", + (NOTPRSNT != s->keyType.key_data.pres)?(char*)s->keyType.key_data.val:"Not Present"); + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "k-line not present \n"); + } + + /************************************************************************************************************************/ + /* Attribute Set */ + + mgco_print_sdp_attr_set(&s->attrSet); + + /************************************************************************************************************************/ + /* Media Descriptor Set */ + + if (s->mediaDescSet.numComp.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; + + if(NOTPRSNT == desc->pres.pres) continue; + + /* Media Field */ + { + CmSdpMediaField* f = &desc->field; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media Type = %d \n",(NOTPRSNT == f->mediaType.pres)?f->mediaType.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media = %s \n",(NOTPRSNT == f->media.pres)?(char*)f->media.val:"Not Present"); + /* Channel ID */ + if(NOTPRSNT != f->id.type.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t VcId Type = %d \n", f->id.type.val); + switch(f->id.type.val){ + case CM_SDP_VCID_PORT: + { + CmSdpPort *p = &f->id.u.port; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "CM_SDP_VCID_PORT:\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t SDP port type = %d \n", (NOTPRSNT == p->type.pres)?p->type.val:-1); + switch(p->type.val) + { + case CM_SDP_PORT_INT: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_INT: SDP port = %d type = %d \n", p->u.portInt.port.val.val, p->u.portInt.port.type.val); + break; + } + case CM_SDP_PORT_VPCID: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_VPCID: \n"); + break; + } + default: + break; + } + break; + } + default: + break; + } + } + mgco_print_sdp_media_param(&f->par); + } + + /*info */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Info = %s \n",(NOTPRSNT == desc->info.pres)?(char*)desc->info.val:"Not Present"); + + /*connection set */ + { + int cnt=0x00; + if(NOTPRSNT != desc->connSet.numComp.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Number of Connection component[%d]\n",desc->connSet.numComp.val); + for(cnt=0;cntconnSet.numComp.val;cnt++){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + mgco_print_sdp_c_line(desc->connSet.connSet[cnt]); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + } + } + } + + /* attribute set */ + mgco_print_sdp_attr_set(&desc->attrSet); + + + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + + } + } + } + } } /*****************************************************************************************************************************/ From dd633cfbfd47f9afcdc0206fdc3a41a8c4024762 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 20 Jul 2012 14:33:36 -0400 Subject: [PATCH 317/493] Pre-fill values for rtp terms (local address + reserved rtp port). Add functions to pick rtp term ids, add a memory pool in the termination struct. --- .../mod_media_gateway/media_gateway.c | 54 +++++++++++++++++++ .../mod_media_gateway/mod_media_gateway.h | 50 +++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index b596cdb819..3a5e7bbb8c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -145,16 +145,40 @@ done: mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix) { mg_termination_type_t termtype; + switch_memory_pool_t *pool; + mg_termination_t *term = NULL; + char name[100]; + int term_id; /* Check the termination type by prefix */ if (strncasecmp(prefix, profile->rtp_termination_id_prefix, strlen(profile->rtp_termination_id_prefix)) == 0) { termtype = MG_TERM_RTP; + term_id = mg_rtp_request_id(profile); + switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id); } else { /* TODO Math: look through TDM channels */ return NULL; } + switch_core_new_memory_pool(&pool); + term = switch_core_alloc(pool, sizeof *term); + term->pool = pool; + term->type = termtype; + if (termtype == MG_TERM_RTP) { + /* Fill in local address and reserve an rtp port */ + term->u.rtp.local_addr = profile->my_ipaddr; + term->u.rtp.local_port = switch_rtp_request_port(term->u.rtp.local_addr); + term->u.rtp.codec = megaco_codec_str(profile->default_codec); + term->u.rtp.term_id = term_id; + term->name = switch_core_strdup(term->pool, name); + } else if (termtype == MG_TERM_TDM) { + /* XXX initialize tdm-specific fields */ + } + + switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); + + return term; } mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name) @@ -177,7 +201,12 @@ void megaco_termination_destroy(mg_termination_t *term) term->uuid = NULL; } + if (term->type == MG_TERM_RTP && term->u.rtp.local_port != 0) { + switch_rtp_release_port(term->u.rtp.local_addr, term->u.rtp.local_port); + } + switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); + switch_core_destroy_memory_pool(&term->pool); } switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term) @@ -210,6 +239,8 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); } + + return SWITCH_STATUS_SUCCESS; } @@ -226,6 +257,8 @@ switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination } megaco_termination_destroy(term); + + return SWITCH_STATUS_SUCCESS; } @@ -343,6 +376,27 @@ void megaco_release_context(mg_context_t *ctx) switch_thread_rwlock_unlock(profile->contexts_rwlock); } +uint32_t mg_rtp_request_id(megaco_profile_t *profile) +{ + if (profile->rtpid_next >= MG_MAX_RTPID || profile->rtpid_next == 0) { + profile->rtpid_next = 1; + } + + for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { + if ((profile->rtpid_bitmap[profile->rtpid_next % 8] & (1 << (profile->rtpid_next / 8))) == 0) { + profile->rtpid_bitmap[profile->rtpid_next % 8] |= 1 << (profile->rtpid_next / 8); + return profile->rtpid_next; + } + } + + return 0; +} + +void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id) +{ + profile->rtpid_bitmap[id % 8] &= ~(1 << (id / 8)); +} + switch_status_t megaco_profile_start(const char *profilename) { switch_memory_pool_t *pool; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 1c9ff91b0d..e62f59bf09 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -40,6 +40,9 @@ typedef enum { MEGACO_CODEC_G729, MEGACO_CODEC_G723_1, MEGACO_CODEC_ILBC, + + /* Nothing below this line */ + MEGACO_CODEC_INVALID = 0xFFFFFFFF } megaco_codec_t; typedef struct mg_peer_profile_s{ @@ -81,6 +84,7 @@ typedef struct mg_context_s mg_context_t; #define kCHAN_ID "chan" typedef struct mg_termination_s { + switch_memory_pool_t *pool; mg_termination_type_t type; const char *name; /*!< Megaco Name */ const char *uuid; /*!< UUID of the associated FS channel, or NULL if it's not activated */ @@ -102,6 +106,7 @@ typedef struct mg_termination_s { int rfc2833_pt; /*!< If the stream is using rfc2833 for dtmf events, this has to be set to its negotiated payload type */ int rate; /*!< Sampling rate */ const char *codec; /*!< Codec to use, using the freeswitch nomenclature. This could be "PCMU" for G711.U, "PCMA" for G711.A, or "G729" for g729 */ + int term_id; } rtp; struct { @@ -122,6 +127,7 @@ struct mg_context_s { #define MG_CONTEXT_MODULO 16 #define MG_MAX_CONTEXTS 32768 +#define MG_MAX_RTPID 32768 struct megaco_profile_s { @@ -148,10 +154,47 @@ struct megaco_profile_s { uint8_t contexts_bitmap[MG_MAX_CONTEXTS/8]; /* Availability matrix, enough bits for a 32768 bitmap */ mg_context_t *contexts[MG_CONTEXT_MODULO]; + uint8_t rtpid_bitmap[MG_MAX_CONTEXTS/8]; + uint32_t rtpid_next; switch_hash_t *terminations; switch_thread_rwlock_t *terminations_rwlock; }; +static inline const char *megaco_codec_str(megaco_codec_t codec) +{ + switch (codec) { + case MEGACO_CODEC_PCMU: + return "PCMU"; + case MEGACO_CODEC_PCMA: + return "PCMA"; + case MEGACO_CODEC_G729: + return "G729"; + case MEGACO_CODEC_G723_1: + return "G723"; /* XXX double check this */ + case MEGACO_CODEC_ILBC: + return "ILBC"; + case MEGACO_CODEC_INVALID: + default: + return NULL; + } +} + +static inline megaco_codec_t megaco_codec_parse(const char *codec) { + if (!strcasecmp(codec, "PCMU")) { + return MEGACO_CODEC_PCMU; + } else if (!strcasecmp(codec, "PCMA")) { + return MEGACO_CODEC_PCMA; + } else if (!strcasecmp(codec, "G729")) { + return MEGACO_CODEC_G729; + } else if (!strcasecmp(codec, "G723")) { + return MEGACO_CODEC_G723_1; + } else if (!strcasecmp(codec, "ILBC")) { + return MEGACO_CODEC_ILBC; + } else { + return MEGACO_CODEC_INVALID; + } +} + megaco_profile_t *megaco_profile_locate(const char *name); mg_peer_profile_t *megaco_peer_profile_locate(const char *name); @@ -160,10 +203,17 @@ void megaco_profile_release(megaco_profile_t *profile); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); +uint32_t mg_rtp_request_id(megaco_profile_t *profile); +void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id); + mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id); mg_context_t *megaco_choose_context(megaco_profile_t *profile); void megaco_release_context(mg_context_t *ctx); +mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix); +mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name); +void megaco_termination_destroy(mg_termination_t *term); + megaco_profile_t* megaco_get_profile_by_suId(SuId suId); mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id); From 63c53a858b5e5fb0247b500a1c1f3ebd2b62c0d6 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 23 Jul 2012 12:18:14 -0400 Subject: [PATCH 318/493] fixing issues found during seagull testing and add single common descriptors api --- .../mod_media_gateway/media_gateway.c | 1 + .../media_gateway_cmd_handler.c | 736 ++++++++++-------- .../mod_media_gateway/media_gateway_stack.h | 9 + .../mod_media_gateway/mod_media_gateway.c | 15 +- .../mod_media_gateway/mod_media_gateway.h | 3 +- 5 files changed, 434 insertions(+), 330 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 75687c2cf6..b0db09c6ab 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -166,6 +166,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term = switch_core_alloc(pool, sizeof *term); term->pool = pool; term->type = termtype; + term->active_events = NULL; if (termtype == MG_TERM_RTP) { /* Fill in local address and reserve an rtp port */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 8cc0e41268..b544f853f7 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -23,108 +23,85 @@ const char *mg_service_change_reason[] = { /* * -* Fun: handle_mg_add_cmd +* Fun: mg_prc_descriptors * -* Desc: this api will handle the ADD request received from MG stack +* Desc: this api will process the descriptors received from MG stack * * */ -switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId) +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *cmd, mg_termination_t* term) { - MgMgcoContextId *ctxtId; - int descId; - MgStr errTxt; - MgMgcoInd *mgErr; - MgMgcoTermId *termId; - MgMgcoTermIdLst* termLst; - int err_code; - int i; - int j; - int is_rtp = 0x00; - char rtp_term_name[32]; - int fmtCnt; - MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; - U32 txn_id = inc_cmd->transId.val; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc *remote; - MgMgcoLclCtlDesc *locCtl; - CmSdpInfo *sdp; - MgMgcoLocalParm *lclParm; - MgMgcoTermStateDesc *tstate; - CmSdpMedFmtRtpList *fmt_list; - MgMgcoTermStateParm *tsp; - TknU8 *fmt; CmSdpMedProtoFmts *format; - MgMgcoMediaDesc* inc_med_desc; - MgMgcoAudRetParm *desc; - mg_context_t* mg_ctxt; + TknU8 *fmt; + CmSdpMedFmtRtpList *fmt_list; + MgMgcoTermStateDesc *tstate; + int fmtCnt; + int i; + int descId = 0x00; + int j; + MgMgcoLocalParm *lclParm; + CmSdpInfo *sdp; + MgMgcoLclCtlDesc *locCtl; + MgMgcoTermStateParm *tsp; + MgMgcoAmmReq* desc = NULL; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc* remote; - memset(&rtp_term_name[0], 0, 32); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); - - /********************************************************************/ - ctxtId = &inc_cmd->contextId; - termLst = mg_get_term_id_list(inc_cmd); - termId = termLst->terms[0]; - /* For Matt - termId->name.lcl.val - to get the termination id name */ - - /********************************************************************/ - /* Validating ADD request *******************************************/ - - /*-- NULL Context & ALL Context not applicable for ADD request --*/ - if ((NOTPRSNT != ctxtId->type.pres) && - ((MGT_CXTID_ALL == ctxtId->type.val) || - (MGT_CXTID_NULL == ctxtId->type.val))) { - - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); - - mg_util_set_ctxt_string(&errTxt, ctxtId); - err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; - goto error; + switch (cmd->cmdType.val) + { + case CH_CMD_TYPE_IND: + switch(cmd->u.mgCmdInd[0]->cmd.type.val) + { + case MGT_ADD: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.add; + break; + } + case MGT_MOVE: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.move; + break; + } + case MGT_MODIFY: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.mod; + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid cmd.type[%d] for descriptor processing \n", + cmd->u.mgCmdInd[0]->cmd.type.val); + return SWITCH_STATUS_FALSE; + } + break; + default: + { + return SWITCH_STATUS_FALSE; + } } - /********************************************************************/ - /* Allocate context - if context type is CHOOSE */ - if ((NOTPRSNT != ctxtId->type.pres) && - (MGT_CXTID_CHOOSE == ctxtId->type.val)){ - - mg_ctxt = megaco_choose_context(mg_profile); - - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); - - /* fill Trillium Context structure with allocated context */ - MG_SET_VAL_PRES(new_ctxtId->type, MGT_CXTID_OTHER); - MG_SET_VAL_PRES(new_ctxtId->val, mg_ctxt->context_id); - } - else { - /* context already present */ - memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + if(NULL == desc){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); + return SWITCH_STATUS_FALSE; } - /********************************************************************/ - /* Allocate new RTP termination - If term type is CHOOSE */ - if ((NOTPRSNT != termId->type.pres) && - (MGT_TERMID_CHOOSE == termId->type.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); - is_rtp = 0x01; - strcpy(rtp_term_name,"rtp/1"); - - /* TODO - Matt */ - /* allocate rtp term and associated the same to context */ - /********************************************************************/ - }else{ /* Physical termination */ - /* TODO - Matt - associate physical termination to context */ + if(NOTPRSNT == desc->dl.num.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); + return SWITCH_STATUS_SUCCESS; } - /********************************************************************/ - for (descId = 0; descId < cmd->dl.num.val; descId++) { - switch (cmd->dl.descs[descId]->type.val) { + + for (descId = 0; descId < desc->dl.num.val; descId++) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + switch (desc->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { int mediaId; - inc_med_desc = &cmd->dl.descs[descId]->u.media; - for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; + for (mediaId = 0; mediaId < desc->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = desc->dl.descs[descId]->u.media.parms[mediaId]; switch (mediaPar->type.val) { case MGT_MEDIAPAR_LOCAL: { @@ -269,19 +246,160 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } } + break; + } + case MGT_REQEVTDESC: + { + MgMgcoReqEvtDesc* evt = &desc->dl.descs[descId]->u.evts; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Event descriptor\n"); + + /* If we receive events from MGC , means clear any ongoing events */ + /* as such we dont apply any events to term, so for us (as of now) clear events means clear active_events structure*/ + + if(NULL != term->active_events){ + mgUtlDelMgMgcoReqEvtDesc(term->active_events); + free(term->active_events); + term->active_events = NULL; + } + + term->active_events = malloc(sizeof(*term->active_events)); + + /* copy requested event */ + if(RFAILED == mgUtlCpyMgMgcoReqEvtDesc(term->active_events, evt, NULLP)){ + free(term->active_events); + term->active_events = NULL; + return SWITCH_STATUS_FALSE; + } + + /* print Requested event descriptor */ + mgAccEvntPrntMgMgcoReqEvtDesc(term->active_events, stdout); + + /* TODO - We can check for it/ito package*/ + + break; + } + case MGT_SIGNALSDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Signal descriptor\n"); + break; } case MGT_MODEMDESC: case MGT_MUXDESC: - case MGT_REQEVTDESC: case MGT_EVBUFDESC: - case MGT_SIGNALSDESC: case MGT_DIGMAPDESC: case MGT_AUDITDESC: case MGT_STATSDESC: break; + } } + return SWITCH_STATUS_SUCCESS; +} + + +/*****************************************************************************************************************************/ + +/* +* +* Fun: handle_mg_add_cmd +* +* Desc: this api will handle the ADD request received from MG stack +* +* +*/ +switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId) +{ + switch_status_t ret; + MgMgcoContextId *ctxtId; + MgStr errTxt; + MgMgcoInd *mgErr; + MgMgcoTermId *termId; + MgMgcoTermIdLst* termLst; + int err_code; + int is_rtp = 0x00; + char rtp_term_name[32]; + MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; + U32 txn_id = inc_cmd->transId.val; + mg_termination_t* term = NULL; + MgMgcoMediaDesc* inc_med_desc; + MgMgcoAudRetParm *desc; + mg_context_t* mg_ctxt; + MgMgcoStreamDesc *stream; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc* remote; + CmSdpInfoSet *psdp; + CmSdpInfoSet *prsdp; + char* ipAddress = "192.168.1.1"; + + /* TODO - Kapil dummy line , will need to add with proper code */ + inc_med_desc = &cmd->dl.descs[0]->u.media; + + memset(&rtp_term_name[0], 0, 32); + + + /********************************************************************/ + ctxtId = &inc_cmd->contextId; + termLst = mg_get_term_id_list(inc_cmd); + termId = termLst->terms[0]; + /* For Matt - termId->name.lcl.val - to get the termination id name */ + + /********************************************************************/ + /* Validating ADD request *******************************************/ + + /*-- NULL Context & ALL Context not applicable for ADD request --*/ + if ((NOTPRSNT != ctxtId->type.pres) && + ((MGT_CXTID_ALL == ctxtId->type.val) || + (MGT_CXTID_NULL == ctxtId->type.val))) { + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); + + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } + + /********************************************************************/ + /* Allocate context - if context type is CHOOSE */ + if ((NOTPRSNT != ctxtId->type.pres) && + (MGT_CXTID_CHOOSE == ctxtId->type.val)){ + + mg_ctxt = megaco_choose_context(mg_profile); + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); + + /* fill Trillium Context structure with allocated context */ + MG_SET_VAL_PRES(new_ctxtId->type, MGT_CXTID_OTHER); + MG_SET_VAL_PRES(new_ctxtId->val, mg_ctxt->context_id); + } + else { + /* context already present */ + memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + } + + /********************************************************************/ + /* Allocate new RTP termination - If term type is CHOOSE */ + if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_CHOOSE == termId->type.val)){ + + is_rtp = 0x01; + strcpy(rtp_term_name,"rtp/1"); + + /* TODO - Matt */ + /* allocate rtp term and associated the same to context */ + /********************************************************************/ + }else{ /* Physical termination */ + /* TODO - Matt - associate physical termination to context */ + } + /********************************************************************/ + + ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + + /* TODO - locally assigned SDP must be the part of termination...which we can use to fill responses*/ + + /********************************************************************/ + /* Matt - to provide the response SDP structure which needs to fill in ADD command response */ /* Matt - to indicate if there is any failure while processing add message */ @@ -362,81 +480,168 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i desc->type.val = MGT_MEDIADESC; mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); -#if 0 /* Most probably we need to add local descriptor */ - { - MgMgcoStreamDesc *stream; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc* remote; - CmSdpInfoSet *psdp; - CmSdpInfoSet *prsdp; - char* ipAddress = "192.168.1.1"; - /* TODO - considering only one descriptor*/ - stream = &desc->u.media.parms[0]->u.stream; + /* TODO - considering only one descriptor*/ + stream = &desc->u.media.parms[0]->u.stream; + stream->pres.pres = PRSNT_NODEF; + stream->sl.pres.pres = PRSNT_NODEF; + local = &stream->sl.local; + remote = &stream->sl.remote; + + if(!local->pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); + + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&desc->u.media.parms, sizeof(MgMgcoMediaPar), + &desc->u.media.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + desc->u.media.parms[desc->u.media.num.val-1]->type.pres = PRSNT_NODEF; + desc->u.media.parms[desc->u.media.num.val-1]->type.val = MGT_MEDIAPAR_STRPAR; + + + stream = &desc->u.media.parms[desc->u.media.num.val-1]->u.stream; + stream->pres.pres = PRSNT_NODEF; + stream->pres.val = 0x01; + stream->sl.pres.pres = PRSNT_NODEF; + stream->sl.pres.val = 0x01; local = &stream->sl.local; remote = &stream->sl.remote; - if(!local->pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); - local->pres.pres = PRSNT_NODEF; - psdp = &(local->sdp); - prsdp = &(remote->sdp); + memcpy(&stream->streamId, &desc->u.media.parms[0]->u.stream.streamId, sizeof(MgMgcoStreamId)); - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + local->pres.pres = PRSNT_NODEF; + psdp = &(local->sdp); + prsdp = &(remote->sdp); + + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + psdp->info[0]->pres.pres = PRSNT_NODEF; + + /* fill version */ + /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ + MG_INIT_TOKEN_VALUE(&(psdp->info[0]->ver),1); + + /* fill orig */ + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.usrName, 1, "-", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessId, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessVer, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + ipAddress[3]); + + /* fill session name */ + /*memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL));*/ + MG_SET_TKNSTROSXL(psdp->info[0]->sessName, 1, "-",&rsp.u.mgCmdRsp[0]->memCp); + + + /* fill info */ + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); + + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + /*memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn));*/ + + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->info[0]->mediaDescSet; + CmSdpMediaDesc* media; + + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } - psdp->info[0]->pres.pres = PRSNT_NODEF; + media = med->mediaDesc[0]; - /* fill version */ - memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); + MG_INIT_TOKEN_VALUE(&(media->pres),1); - /* fill orig */ - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), ipAddress[3]); + /* Fill CmSdpMediaField */ + MG_INIT_TOKEN_VALUE(&(media->field.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - /* fill session name */ - memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL)); + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), + CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); - /* fill info */ - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); - /* Fill the SDP Connection Info */ - /* "c=" line - ipaddress */ - memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn)); + MG_INIT_TOKEN_VALUE(&(media->field.par.numProtFmts),1); + MG_GETMEM((media->field.par.pflst),1*sizeof(CmSdpMedProtoFmts*),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_GETMEM((media->field.par.pflst[0]),sizeof(CmSdpMedProtoFmts),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.type), + CM_SDP_MEDIA_PROTO_RTP) + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.u.subtype.type), + CM_SDP_PROTO_RTP_AVP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->protType), + CM_SDP_MEDIA_PROTO_RTP); - /* fill media descriptors */ + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.num),1); + + MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts), + 1*sizeof(CmSdpU8OrNil *), &rsp.u.mgCmdRsp[0]->memCp, ret); + + MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts[0]), + sizeof(CmSdpU8OrNil), &rsp.u.mgCmdRsp[0]->memCp, ret); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->type), + CM_SDP_SPEC); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->val), + 4); + + /* Fill attribute if reqd */ { - CmSdpMediaDescSet* med = &psdp->mediaDescSet; - CmSdpMediaDesc* m; - - if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), - &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + MG_INIT_TOKEN_VALUE(&(media->attrSet.numComp),1); + MG_GETMEM((media->attrSet.attr),sizeof(CmSdpAttr*),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_GETMEM((media->attrSet.attr[0]),sizeof(CmSdpAttr),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); + media->attrSet.attr[0]->u.ptime.pres = PRSNT_NODEF; + media->attrSet.attr[0]->u.ptime.val = 30; } - m = med->mediaDesc[0]; + } + + printf("ret[%d]\n",ret); - m->pres.pres = PRSNT_NODEF; - } - else { - printf("!local->pres.pres false \n"); - } } -#endif + else { + printf("!local->pres.pres false \n"); + } @@ -479,27 +684,15 @@ error: switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) { MgMgcoContextId *ctxtId; - int descId; MgStr errTxt; MgMgcoInd *mgErr; MgMgcoTermId *termId; MgMgcoTermIdLst* termLst; + mg_termination_t* term = NULL; + switch_status_t ret; int err_code; - int i; - int j; - int fmtCnt; MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod; U32 txn_id = inc_cmd->transId.val; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc *remote; - MgMgcoLclCtlDesc *locCtl; - CmSdpInfo *sdp; - MgMgcoLocalParm *lclParm; - MgMgcoTermStateDesc *tstate; - CmSdpMedFmtRtpList *fmt_list; - MgMgcoTermStateParm *tsp; - TknU8 *fmt; - CmSdpMedProtoFmts *format; /********************************************************************/ ctxtId = &inc_cmd->contextId; @@ -546,175 +739,14 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Kapil - If there is an error - send response back to MG stack with MGT_MGCO_RSP_CODE_NO_TERM_CTXT error code*/ /********************************************************************/ + + /* TODO - dummy code will replace with proper choose_termination api */ + term = malloc(sizeof(*term)); + term->active_events = NULL; + ret = mg_prc_descriptors(mg_profile, inc_cmd, term); - /* Media Descriptor processing same as ADD command */ - - /* TODO - Will see If we can have common media_descriptor processing API which we can use for both ADD/MODIFY */ - - for (descId = 0; descId < cmd->dl.num.val; descId++) { - switch (cmd->dl.descs[descId]->type.val) { - case MGT_MEDIADESC: - { - int mediaId; - for (mediaId = 0; mediaId < cmd->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = cmd->dl.descs[descId]->u.media.parms[mediaId]; - switch (mediaPar->type.val) { - case MGT_MEDIAPAR_LOCAL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); - /* Matt - check local descriptor processing */ - local = &mediaPar->u.local; - sdp = local->sdp.info[0]; - for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { - /* sdp formats */ - for (j = 0; j < - sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) - { - format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; - /* Matt - format has field for T38 also */ - if ((format->protType.pres != NOTPRSNT) && - (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { - - /* protocol type RTP */ - fmt_list = &format->u.rtp; - - /* print format */ - for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ - fmt = &fmt_list->fmts[i]->val; - if(fmt->pres == NOTPRSNT) continue; - printf("Format [%d]\n", fmt->val); - } - } - } - } - - break; - } - - case MGT_MEDIAPAR_REMOTE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); - /* Matt - check remote descriptor processing */ - remote = &mediaPar->u.remote; - sdp = remote->sdp.info[0]; - /* for Matt - same like local descriptor */ - break; - } - - case MGT_MEDIAPAR_LOCCTL: - { - /* Matt - check Local Control descriptor processing */ - locCtl = &mediaPar->u.locCtl; - for (i = 0; i < locCtl->num.val; i++){ - lclParm = locCtl->parms[i]; - if (PRSNT_NODEF == lclParm->type.pres){ - switch(lclParm->type.val) - { - case MGT_LCLCTL_MODE: - { - /* Mode Property */ - printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); - break; - } - case MGT_LCLCTL_RESVAL: - { - /* Reserve Value */ - printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); - break; - } - case MGT_LCLCTL_RESGRP: - { - /* Reserve group */ - printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); - break; - } - case MGT_LCLCTL_PROPPARM: - { - /* Properties (of a termination) */ - /* Matt - See how we can apply this to a termination */ - printf("MGT_LCLCTL_PROPPARM: \n"); - break; - } - default: - printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); - break; - } - } - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); - break; - } - case MGT_MEDIAPAR_TERMST: - { - /* Matt - apply termination state descriptor */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); - tstate = &mediaPar->u.tstate; - for (i = 0; i < tstate->numComp.val; i++) - { - /* Matt to see how to apply below descriptors to a termination */ - tsp = tstate->trmStPar[i]; - if (PRSNT_NODEF == tsp->type.pres) { - switch(tsp->type.val) - { - case MGT_TERMST_PROPLST: - { - /* Matt to see how to apply properties to a termination */ - /* Properties of a termination */ - printf("MGT_TERMST_PROPLST:\n"); - break; - } - case MGT_TERMST_EVTBUFCTL: - { - /* Event /buffer Control Properties */ - printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); - break; - } - case MGT_TERMST_SVCST: - { - /* Service State Properties */ - printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); - break; - } - default: - printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); - break; - } - } - } - break; - } - case MGT_MEDIAPAR_STRPAR: - { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); - } - - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); - } - - break; - } - } - } - } - case MGT_MODEMDESC: - case MGT_MUXDESC: - case MGT_REQEVTDESC: - case MGT_EVBUFDESC: - case MGT_SIGNALSDESC: - case MGT_DIGMAPDESC: - case MGT_AUDITDESC: - case MGT_STATSDESC: - break; - } - } + /********************************************************************/ /* Matt - to provide the response SDP structure which needs to fill in Modify command response */ @@ -724,6 +756,55 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Kapil - to fill the response structure and call the response API to send Modify response */ + { /* send response */ + + MgMgcoCommand rsp; + int ret = 0x00; + + memset(&rsp,0, sizeof(rsp)); + + /*copy transaction-id*/ + memcpy(&rsp.transId, &inc_cmd->transId,sizeof(MgMgcoTransId)); + + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&rsp.contextId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + + /*copy peer identifier */ + memcpy(&rsp.peerId, &inc_cmd->peerId,sizeof(TknU32)); + + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&rsp.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } + + rsp.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.val = MGT_MODIFY; + rsp.u.mgCmdRsp[0]->u.mod.pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; + + mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + +#ifdef GCP_VER_2_1 + termId = rsp.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; +#else + termId = &(rsp.u.mgCmdRsp[0]->u.mod.termId); +#endif + /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ + + /* We will always send one command at a time..*/ + rsp.cmdStatus.pres = PRSNT_NODEF; + rsp.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + rsp.cmdType.pres = PRSNT_NODEF; + rsp.cmdType.val = CH_CMD_TYPE_RSP; + + + ret = sng_mgco_send_cmd(mg_profile->idx, &rsp); + + } + return SWITCH_STATUS_SUCCESS; error: @@ -755,7 +836,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma int err_code; MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; U32 txn_id = inc_cmd->transId.val; - mg_context_t* mg_ctxt; + mg_context_t* mg_ctxt = NULL; uint8_t wild = 0x00; wild = inc_cmd->u.mgCmdReq[0]->wild.pres; @@ -792,6 +873,8 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma goto error; } + /********************************************************************/ + /* TODO - see if we receive wild card SUB for ALL context */ /********************************************************************/ /* Matt - TODO - check if we have terminations in the context */ @@ -800,15 +883,20 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received context_id[%d]\n", ctxtId->val.val); +#if 0 /*find context based on received context-id */ mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); +#endif - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); + if(mg_ctxt){ - /* TODO - remove terminations from context....as if now there is no termination associated with Context */ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); - /* release context*/ - megaco_release_context(mg_ctxt); + /* TODO - remove terminations from context....as if now there is no termination associated with Context */ + + /* release context*/ + megaco_release_context(mg_ctxt); + } /*************************************************************************************************************************/ /* resp code -- begin */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index b207f2e75a..3d872898be 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -112,6 +112,15 @@ typedef enum { cmMemcpy((U8 *)(_tkn)->val, (CONSTANT U8 *)(_val), (_len)); \ } +#define MG_SET_TKNSTROSXL(_tkn, _len, _val, _mem)\ +{\ + (_tkn).pres = PRSNT_NODEF;\ + (_tkn).len = (_len);\ + cmGetMem((Ptr)_mem, (Size)((_len)*sizeof(U8)), (Ptr*)&((_tkn).val));\ + cmMemcpy((U8*)((_tkn).val), (U8*)(_val), _len);\ +} + +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term); void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* msg); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index cbdf144a6a..c2dddc1c6e 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -438,6 +438,9 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) memset(&out_ctxt,0,sizeof(out_ctxt)); + inc_context = &cmd->contextId; + memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); /* validate Transaction Id */ @@ -506,7 +509,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /* Validate Context - if context is specified then check if its present with us */ - inc_context = &cmd->contextId; MG_ZERO(&ctxtId, sizeof(MgMgcoContextId)); memcpy(&ctxtId, inc_context, sizeof(MgMgcoContextId)); @@ -535,7 +537,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) goto error1; } - memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); switch(cmd->cmdType.val) { @@ -557,7 +558,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ handle_mg_modify_cmd(mg_profile, cmd); - mg_send_modify_rsp(suId, cmd); + /*mg_send_modify_rsp(suId, cmd);*/ break; } case MGT_MOVE: @@ -619,9 +620,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) return; } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "cmd->cmdStatus.val[%d]\n",cmd->cmdStatus.val); /* END OF TXN received - means last command in txn to process. * Send response to peer */ - if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val){ + /*if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val)*/{ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } @@ -635,6 +637,9 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, &ctxtId, err_code, &errTxt)) { sng_mgco_send_err(suId, mgErr); } + if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val){ + mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); + } error1: mg_free_cmd(cmd); return; @@ -654,7 +659,7 @@ void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); /*dump information*/ - /*mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout);*/ + mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout); } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index e62f59bf09..1dded04d7b 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -42,7 +42,7 @@ typedef enum { MEGACO_CODEC_ILBC, /* Nothing below this line */ - MEGACO_CODEC_INVALID = 0xFFFFFFFF + MEGACO_CODEC_INVALID = 0xFFFFFF } megaco_codec_t; typedef struct mg_peer_profile_s{ @@ -90,6 +90,7 @@ typedef struct mg_termination_s { const char *uuid; /*!< UUID of the associated FS channel, or NULL if it's not activated */ mg_context_t *context; /*!< Context in which this termination is connected, or NULL */ megaco_profile_t *profile; /*!< Parent MG profile */ + MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ union { struct { From d7e4b509b6838654d920da649f29b3ff21653aa4 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 23 Jul 2012 15:24:43 -0400 Subject: [PATCH 319/493] integrating term/context alloc/delete api to megaco command handler code --- .../mod_media_gateway/media_gateway.c | 41 +- .../media_gateway_cmd_handler.c | 517 +++++++++++------- .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/media_gateway_utils.c | 7 + .../mod_media_gateway/mod_media_gateway.c | 2 +- .../mod_media_gateway/mod_media_gateway.h | 4 + 6 files changed, 377 insertions(+), 195 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index b0db09c6ab..6c0bfd4092 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -167,6 +167,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->pool = pool; term->type = termtype; term->active_events = NULL; + term->profile = profile; if (termtype == MG_TERM_RTP) { /* Fill in local address and reserve an rtp port */ @@ -212,6 +213,23 @@ void megaco_termination_destroy(mg_termination_t *term) switch_core_destroy_memory_pool(&term->pool); } +switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination_t *term) +{ + + switch_assert(ctx != NULL); + switch_assert(term != NULL); + + if (ctx->terminations[0] && (term == ctx->terminations[0])) { + return SWITCH_STATUS_SUCCESS; + } + + if (ctx->terminations[1] && (term == ctx->terminations[1])) { + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; +} + switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term) { @@ -247,6 +265,21 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination } +switch_status_t megaco_context_sub_all_termination(mg_context_t *ctx) +{ + switch_assert(ctx != NULL); + + /* Channels will automatically go to park once the bridge ends */ + if (ctx->terminations[0]) { + megaco_termination_destroy(ctx->terminations[0]); + ctx->terminations[0] = NULL; + } else if (ctx->terminations[1]) { + megaco_termination_destroy(ctx->terminations[1]); + } + + return SWITCH_STATUS_SUCCESS; +} + switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination_t *term) { switch_assert(ctx != NULL); @@ -315,7 +348,8 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile) { mg_context_t *ctx; - int i = 0x0;; + int i = 0x0; + int j = 0x0; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ @@ -332,7 +366,10 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) ctx = malloc(sizeof *ctx); ctx->context_id = profile->next_context_id; ctx->profile = profile; - + for(j = 0; j< MG_CONTEXT_MAX_TERMS; j++){ + ctx->terminations[j] = NULL; + } + if (!profile->contexts[i]) { profile->contexts[i] = ctx; } else { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index b544f853f7..bee845a8c1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -319,26 +319,16 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MgMgcoTermIdLst* termLst; int err_code; int is_rtp = 0x00; - char rtp_term_name[32]; MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; U32 txn_id = inc_cmd->transId.val; mg_termination_t* term = NULL; MgMgcoMediaDesc* inc_med_desc; MgMgcoAudRetParm *desc; mg_context_t* mg_ctxt; - MgMgcoStreamDesc *stream; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc* remote; - CmSdpInfoSet *psdp; - CmSdpInfoSet *prsdp; - char* ipAddress = "192.168.1.1"; /* TODO - Kapil dummy line , will need to add with proper code */ inc_med_desc = &cmd->dl.descs[0]->u.media; - memset(&rtp_term_name[0], 0, 32); - - /********************************************************************/ ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); @@ -367,6 +357,12 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_choose_context(mg_profile); + if(NULL == mg_ctxt){ + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); /* fill Trillium Context structure with allocated context */ @@ -383,15 +379,34 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i if ((NOTPRSNT != termId->type.pres) && (MGT_TERMID_CHOOSE == termId->type.val)){ + term = megaco_choose_termination(mg_profile, "RTP"); /* TODO - RTP string has be configured one */ + + if(NULL == term){ + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + is_rtp = 0x01; - strcpy(rtp_term_name,"rtp/1"); /* TODO - Matt */ /* allocate rtp term and associated the same to context */ /********************************************************************/ }else{ /* Physical termination */ - /* TODO - Matt - associate physical termination to context */ + + /* get physical termination */ } + /********************************************************************/ + /* associate physical termination to context */ + + if(SWITCH_STATUS_FALSE == megaco_context_add_termination(mg_ctxt, term)){ + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } + /********************************************************************/ ret = mg_prc_descriptors(mg_profile, inc_cmd, term); @@ -458,7 +473,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[rsp.u.mgCmdRsp[0]->u.add.termIdLst.num.val-1]; - mg_fill_mgco_termid(out_termId, (char*)rtp_term_name, strlen((char*)rtp_term_name), &rsp.u.mgCmdRsp[0]->memCp); + mg_fill_mgco_termid(out_termId, (char*)term->name, strlen((char*)term->name), &rsp.u.mgCmdRsp[0]->memCp); } /* Whatever Media descriptor we have received, we can copy that and then @@ -480,168 +495,179 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i desc->type.val = MGT_MEDIADESC; mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); +#if 0 + { - /* Most probably we need to add local descriptor */ + MgMgcoStreamDesc *stream; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc* remote; + CmSdpInfoSet *psdp; + CmSdpInfoSet *prsdp; + char* ipAddress = "192.168.1.1"; - /* TODO - considering only one descriptor*/ - stream = &desc->u.media.parms[0]->u.stream; - stream->pres.pres = PRSNT_NODEF; - stream->sl.pres.pres = PRSNT_NODEF; - local = &stream->sl.local; - remote = &stream->sl.remote; + /* Most probably we need to add local descriptor */ - if(!local->pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); - - /* allocating mem for local descriptor */ - if (mgUtlGrowList((void ***)&desc->u.media.parms, sizeof(MgMgcoMediaPar), - &desc->u.media.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - desc->u.media.parms[desc->u.media.num.val-1]->type.pres = PRSNT_NODEF; - desc->u.media.parms[desc->u.media.num.val-1]->type.val = MGT_MEDIAPAR_STRPAR; - - - stream = &desc->u.media.parms[desc->u.media.num.val-1]->u.stream; + /* TODO - considering only one descriptor*/ + stream = &desc->u.media.parms[0]->u.stream; stream->pres.pres = PRSNT_NODEF; - stream->pres.val = 0x01; stream->sl.pres.pres = PRSNT_NODEF; - stream->sl.pres.val = 0x01; local = &stream->sl.local; remote = &stream->sl.remote; - memcpy(&stream->streamId, &desc->u.media.parms[0]->u.stream.streamId, sizeof(MgMgcoStreamId)); + if(!local->pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); - local->pres.pres = PRSNT_NODEF; - psdp = &(local->sdp); - prsdp = &(remote->sdp); - - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - psdp->info[0]->pres.pres = PRSNT_NODEF; - - /* fill version */ - /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ - MG_INIT_TOKEN_VALUE(&(psdp->info[0]->ver),1); - - /* fill orig */ - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.usrName, 1, "-", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessId, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessVer, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.netType.type), - CM_SDP_NET_TYPE_IN); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.addrType), - CM_SDP_ADDR_TYPE_IPV4); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), - ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), - ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), - ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), - ipAddress[3]); - - /* fill session name */ - /*memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL));*/ - MG_SET_TKNSTROSXL(psdp->info[0]->sessName, 1, "-",&rsp.u.mgCmdRsp[0]->memCp); - - - /* fill info */ - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); - - /* Fill the SDP Connection Info */ - /* "c=" line - ipaddress */ - /*memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn));*/ - - /* fill media descriptors */ - { - CmSdpMediaDescSet* med = &psdp->info[0]->mediaDescSet; - CmSdpMediaDesc* media; - - if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), - &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&desc->u.media.parms, sizeof(MgMgcoMediaPar), + &desc->u.media.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } - media = med->mediaDesc[0]; - - MG_INIT_TOKEN_VALUE(&(media->pres),1); - - /* Fill CmSdpMediaField */ - MG_INIT_TOKEN_VALUE(&(media->field.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - - MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), - CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); + desc->u.media.parms[desc->u.media.num.val-1]->type.pres = PRSNT_NODEF; + desc->u.media.parms[desc->u.media.num.val-1]->type.val = MGT_MEDIAPAR_STRPAR; - MG_INIT_TOKEN_VALUE(&(media->field.par.numProtFmts),1); - MG_GETMEM((media->field.par.pflst),1*sizeof(CmSdpMedProtoFmts*),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_GETMEM((media->field.par.pflst[0]),sizeof(CmSdpMedProtoFmts),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.type), - CM_SDP_MEDIA_PROTO_RTP) - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.u.subtype.type), - CM_SDP_PROTO_RTP_AVP); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->protType), - CM_SDP_MEDIA_PROTO_RTP); + stream = &desc->u.media.parms[desc->u.media.num.val-1]->u.stream; + stream->pres.pres = PRSNT_NODEF; + stream->pres.val = 0x01; + stream->sl.pres.pres = PRSNT_NODEF; + stream->sl.pres.val = 0x01; + local = &stream->sl.local; + remote = &stream->sl.remote; + memcpy(&stream->streamId, &desc->u.media.parms[0]->u.stream.streamId, sizeof(MgMgcoStreamId)); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.num),1); + local->pres.pres = PRSNT_NODEF; + psdp = &(local->sdp); + prsdp = &(remote->sdp); - MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts), - 1*sizeof(CmSdpU8OrNil *), &rsp.u.mgCmdRsp[0]->memCp, ret); - - MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts[0]), - sizeof(CmSdpU8OrNil), &rsp.u.mgCmdRsp[0]->memCp, ret); - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->type), - CM_SDP_SPEC); - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->val), - 4); - - /* Fill attribute if reqd */ + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { - MG_INIT_TOKEN_VALUE(&(media->attrSet.numComp),1); - MG_GETMEM((media->attrSet.attr),sizeof(CmSdpAttr*),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_GETMEM((media->attrSet.attr[0]),sizeof(CmSdpAttr),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); - media->attrSet.attr[0]->u.ptime.pres = PRSNT_NODEF; - media->attrSet.attr[0]->u.ptime.val = 30; + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; } + psdp->info[0]->pres.pres = PRSNT_NODEF; + + /* fill version */ + /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ + MG_INIT_TOKEN_VALUE(&(psdp->info[0]->ver),1); + + /* fill orig */ + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.usrName, 1, "-", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessId, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessVer, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + ipAddress[3]); + + /* fill session name */ + /*memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL));*/ + MG_SET_TKNSTROSXL(psdp->info[0]->sessName, 1, "-",&rsp.u.mgCmdRsp[0]->memCp); + + + /* fill info */ + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); + + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + /*memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn));*/ + + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->info[0]->mediaDescSet; + CmSdpMediaDesc* media; + + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + media = med->mediaDesc[0]; + + MG_INIT_TOKEN_VALUE(&(media->pres),1); + + /* Fill CmSdpMediaField */ + MG_INIT_TOKEN_VALUE(&(media->field.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); + + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), + CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); + + + MG_INIT_TOKEN_VALUE(&(media->field.par.numProtFmts),1); + MG_GETMEM((media->field.par.pflst),1*sizeof(CmSdpMedProtoFmts*),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_GETMEM((media->field.par.pflst[0]),sizeof(CmSdpMedProtoFmts),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.type), + CM_SDP_MEDIA_PROTO_RTP) + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.u.subtype.type), + CM_SDP_PROTO_RTP_AVP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->protType), + CM_SDP_MEDIA_PROTO_RTP); + + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.num),1); + + MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts), + 1*sizeof(CmSdpU8OrNil *), &rsp.u.mgCmdRsp[0]->memCp, ret); + + MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts[0]), + sizeof(CmSdpU8OrNil), &rsp.u.mgCmdRsp[0]->memCp, ret); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->type), + CM_SDP_SPEC); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->val), + 4); + + /* Fill attribute if reqd */ + { + MG_INIT_TOKEN_VALUE(&(media->attrSet.numComp),1); + MG_GETMEM((media->attrSet.attr),sizeof(CmSdpAttr*),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_GETMEM((media->attrSet.attr[0]),sizeof(CmSdpAttr),&rsp.u.mgCmdRsp[0]->memCp, ret); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); + media->attrSet.attr[0]->u.ptime.pres = PRSNT_NODEF; + media->attrSet.attr[0]->u.ptime.val = 30; + } + + } + + printf("ret[%d]\n",ret); + + } + else { + printf("!local->pres.pres false \n"); } - - printf("ret[%d]\n",ret); - - } - else { - printf("!local->pres.pres false \n"); } +#endif @@ -667,7 +693,7 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(cmd); + mg_free_cmd(inc_cmd); return SWITCH_STATUS_FALSE; } @@ -683,6 +709,7 @@ error: */ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) { + mg_context_t* mg_ctxt = NULL; MgMgcoContextId *ctxtId; MgStr errTxt; MgMgcoInd *mgErr; @@ -691,7 +718,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand mg_termination_t* term = NULL; switch_status_t ret; int err_code; - MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod; + /*MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod;*/ U32 txn_id = inc_cmd->transId.val; /********************************************************************/ @@ -729,22 +756,71 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /********************************************************************/ /* context id presence check is already being done, we are here it means context-id requested in megaco message is present */ + /********************************************************************/ - /* Matt - to check if we have terminations in the context */ + /* MGT_TERMID_ROOT = If ROOT term then there will not be any conext */ - /* TODO - Matt */ - - /* Matt to indicate ERROR - If there is no terminations in requested context */ - - /* Kapil - If there is an error - send response back to MG stack with MGT_MGCO_RSP_CODE_NO_TERM_CTXT error code*/ + if(MGT_TERMID_ROOT == termId->type.val){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for ROOT termination \n"); + /* TODO */ /********************************************************************/ - - /* TODO - dummy code will replace with proper choose_termination api */ - term = malloc(sizeof(*term)); - term->active_events = NULL; + } else if(MGT_TERMID_OTHER == termId->type.val){ + /********************************************************************/ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for termination[%s] and context: type[%d], value[%d] \n", + termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); - ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + + if(NULL == term){ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; + goto error; + } + + /* termination specified...context should also be specified */ + + /* check if we have terminations in the context */ + + if (NOTPRSNT != ctxtId->type.pres) { + if(MGT_CXTID_OTHER == ctxtId->type.val) { + /*find context based on received context-id */ + mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); + if(NULL == mg_ctxt){ + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; + goto error; + } + + if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + /* ERROR - termination didnt bind with requested context */ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; + goto error; + } + + }else if(MGT_CXTID_NULL == ctxtId->type.val) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for NULL Context \n"); + /*TODO - NULL context...nothing to do now...jump to response to send +ve response */ + goto response; + }else if(MGT_CXTID_ALL == ctxtId->type.val) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for ALL Context \n"); + /*TODO - ALL context...nothing to do now...jump to response to send +ve response */ + goto response; + } + } + + /* Not sure if MODIFY can come with Context ALL with specified term */ + + /********************************************************************/ + + ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + + } /********************************************************************/ @@ -756,6 +832,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Kapil - to fill the response structure and call the response API to send Modify response */ +response: { /* send response */ MgMgcoCommand rsp; @@ -812,7 +889,7 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(cmd); + mg_free_cmd(inc_cmd); return SWITCH_STATUS_FALSE; } @@ -834,26 +911,40 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma MgMgcoTermId *termId; MgMgcoTermIdLst* termLst; int err_code; - MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add; + /*MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.add;*/ U32 txn_id = inc_cmd->transId.val; mg_context_t* mg_ctxt = NULL; + mg_termination_t* term = NULL; uint8_t wild = 0x00; wild = inc_cmd->u.mgCmdReq[0]->wild.pres; - /********************************************************************/ + /************************************************************************************************************************************************************/ ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; - /********************************************************************/ + /************************************************************************************************************************************************************/ /* Validating Subtract request *******************************************/ + if(NOTPRSNT == ctxtId->type.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Context Not Present\n"); + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } + + if(NOTPRSNT == termId->type.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Termination Not Present\n"); + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; + goto error; + } + /*-- NULL Context & CHOOSE Context not applicable for SUB request --*/ - if ((NOTPRSNT != ctxtId->type.pres) && - ((MGT_CXTID_CHOOSE == ctxtId->type.val) || - (MGT_CXTID_NULL == ctxtId->type.val))) { + if ((MGT_CXTID_CHOOSE == ctxtId->type.val) || + (MGT_CXTID_NULL == ctxtId->type.val)) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Context CHOOSE/NULL not allowed\n"); @@ -862,9 +953,8 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma goto error; } /* ROOT Termination & CHOOSE Termination not allowed */ - else if ((NOTPRSNT != termId->type.pres) && - ((MGT_TERMID_ROOT == termId->type.val) || - (MGT_TERMID_CHOOSE == termId->type.val))) { + else if ((MGT_TERMID_ROOT == termId->type.val) || + (MGT_TERMID_CHOOSE == termId->type.val)) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Termination ROOT/CHOOSE not allowed\n"); @@ -872,33 +962,76 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; goto error; } + /************************************************************************************************************************************************************/ - /********************************************************************/ - /* TODO - see if we receive wild card SUB for ALL context */ + if (MGT_CXTID_OTHER == ctxtId->type.val){ - /********************************************************************/ - /* Matt - TODO - check if we have terminations in the context */ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for Context[%d] \n", ctxtId->val.val); - /* Matt to indicate ERROR - If there is no terminations in requested context */ - - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received context_id[%d]\n", ctxtId->val.val); - -#if 0 - /*find context based on received context-id */ - mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); -#endif - - if(mg_ctxt){ + /*find context based on received context-id */ + mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); + if(NULL == mg_ctxt){ + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; + goto error; + } switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); - /* TODO - remove terminations from context....as if now there is no termination associated with Context */ + + if(MGT_TERMID_ALL == termId->type.val){ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for context[%d] with ALL termination \n", mg_ctxt->context_id); + + /* remove terminations from context */ + megaco_context_sub_all_termination(mg_ctxt); + + }else if(MGT_TERMID_OTHER == termId->type.val){ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for termination[%s] \n", (char*)termId->name.lcl.val); + + term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + + if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + /* ERROR - termination didnt bind with requested context */ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; + goto error; + } + + if(NULL == term){ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; + goto error; + } + + /* remove termination from context */ + megaco_context_sub_termination(mg_ctxt, term); + } /* release context*/ megaco_release_context(mg_ctxt); } - /*************************************************************************************************************************/ + /************************************************************************************************************************************************************/ + /* CONTEXT = ALL */ + + if (MGT_CXTID_ALL == ctxtId->type.val){ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for ALL context \n"); + + /* TODO */ + + /* As of now sending +ve response */ + goto response; + } + + + /************************************************************************************************************************************************************/ + + +response: + /************************************************************************************************************************************************************/ /* resp code -- begin */ { MgMgcoCommand rsp; @@ -951,7 +1084,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma } /* sample resp code -- end */ - /*************************************************************************************************************************/ + /************************************************************************************************************************************************************/ return SWITCH_STATUS_SUCCESS; @@ -960,7 +1093,7 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(cmd); + mg_free_cmd(inc_cmd); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 3d872898be..fc27386d9a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -132,6 +132,7 @@ void handle_mg_alarm(Pst *pst, MgMngmt *sta); void handle_tucl_alarm(Pst *pst, HiMngmt *sta); int mg_enable_logging(void); int mg_disable_logging(void); +void mg_util_set_err_string ( MgStr *errTxt, char* str); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index b4728a2bc0..73d467f8de 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -318,6 +318,13 @@ void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) } +/*****************************************************************************************************************************/ +void mg_util_set_err_string ( MgStr *errTxt, char* str) +{ + MG_ZERO((errTxt->val), sizeof(errTxt->val)); + errTxt->len = strlen(str); + strcpy((char*)&errTxt->val, str); +} /*****************************************************************************************************************************/ void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) { diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index c2dddc1c6e..03a61104ec 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -500,7 +500,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ if (MGT_TERMID_OTHER == termId->type.val){ - if(SWITCH_STATUS_FALSE != mg_stack_termination_is_in_service((char*)termId->name.lcl.val, termId->name.lcl.len)){ + if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service((char*)termId->name.lcl.val, termId->name.lcl.len)){ mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 1dded04d7b..f5f83c6dd6 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -210,6 +210,8 @@ void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id); mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id); mg_context_t *megaco_choose_context(megaco_profile_t *profile); void megaco_release_context(mg_context_t *ctx); +switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination_t *term); +switch_status_t megaco_context_sub_all_termination(mg_context_t *ctx); mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix); mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name); @@ -225,6 +227,8 @@ switch_status_t mg_config_cleanup(megaco_profile_t* profile); switch_status_t mg_peer_config_cleanup(mg_peer_profile_t* profile); switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile); switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream); +switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term); +switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination_t *term); #endif /* MOD_MEGACO_H */ From fc4b7bb8da58944dfe0986789bf35d921784b273 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 23 Jul 2012 16:57:33 -0400 Subject: [PATCH 320/493] stash fix --- .../endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index bee845a8c1..1974403cda 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -976,9 +976,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma goto error; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); - - + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); if(MGT_TERMID_ALL == termId->type.val){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for context[%d] with ALL termination \n", mg_ctxt->context_id); From 390dabb3518f170336eb2795ca3f5b8f5522b5a5 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 24 Jul 2012 11:46:50 -0400 Subject: [PATCH 321/493] Adding code to 1) build NOTIFY command and send to MGC 2) CLI command to send DTMF NOTIFY Megaco command to MGC --- .../mod_media_gateway/media_gateway.c | 5 + .../mod_media_gateway/media_gateway_cli.c | 71 +++++-- .../media_gateway_cmd_handler.c | 197 ++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 10 + .../mod_media_gateway/media_gateway_utils.c | 36 ++++ 5 files changed, 300 insertions(+), 19 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 6c0bfd4092..5d58674a0c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -208,6 +208,11 @@ void megaco_termination_destroy(mg_termination_t *term) if (term->type == MG_TERM_RTP && term->u.rtp.local_port != 0) { switch_rtp_release_port(term->u.rtp.local_addr, term->u.rtp.local_port); } + + if(term->active_events){ + free(term->active_events); + term->active_events = NULL; + } switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); switch_core_destroy_memory_pool(&term->pool); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 3e3b034df5..f249d012f4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -98,29 +98,61 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /**********************************************************************************/ }else if(!strcmp(argv[2], "send")) { /**********************************************************************************/ - /* mg profile send sc */ printf("count = %d \n",argc); - if(argc < 7){ - goto usage; - } - if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){ - goto usage; - } - if (profile) { - if(!zstr(argv[7]) && !strcasecmp(argv[7],"wild")){ - wild = 0x01; - } + if (profile) { - printf("Input to Send Service Change command : " - "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", - profile->name, argv[4], argv[5], argv[6]); + switch(argc) + { + case 7: + { + /* mg profile send sc */ + printf("ARGC = 7 \n"); + if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){ + goto usage; + } + + if(!zstr(argv[7]) && !strcasecmp(argv[7],"wild")){ + wild = 0x01; + } + + printf("Input to Send Service Change command : " + "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", + profile->name, argv[4], argv[5], argv[6]); + + megaco_profile_release(profile); + mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]),wild); + + break; + } + case 6: + { + /* mg profile send notify */ + if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5])){ + goto usage; + } + + if(strcasecmp(argv[3],"notify")){ + stream->write_function(stream, "-ERR wrong input \n"); + goto usage; + } + + printf("Sending DTMF digits[%s] NOTIFY for termination[%s]\n", argv[5], argv[4]); + + megaco_profile_release(profile); + mg_send_dtmf_notify(profile, argv[4], (char*)argv[5], (int)strlen(argv[5])); + + break; + } + default: + { + goto usage; + } + } + }else{ + stream->write_function(stream, "-ERR No such profile\n"); + } - megaco_profile_release(profile); - mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]),wild); - } else { - stream->write_function(stream, "-ERR No such profile\n"); - } /**********************************************************************************/ }else { /**********************************************************************************/ @@ -154,6 +186,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto done; usage: + megaco_profile_release(profile); stream->write_function(stream, "-ERR Usage: \n""\t"MEGACO_CLI_SYNTAX" \n \t"MEGACO_FUNCTION_SYNTAX"\n \t" MEGACO_LOGGING_CLI_SYNTAX "\n"); done: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index bee845a8c1..12174639ae 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2135,3 +2135,200 @@ err: return ret; } /*****************************************************************************************************************************/ +/* API to send DTMF Digits Notification */ + +switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits ) +{ + MgMgcoObsEvt *oevt; + MgMgcoEvtPar* param; + int ascii = 0x00; + int cnt = 0x00; + + switch_assert(term_name); + switch_assert(mg_profile); + switch_assert(digits); + + if(0 == num_of_collected_digits ){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"num_of_collected_digits cannt be ZERO \n"); + return SWITCH_STATUS_FALSE; + } + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_EXT_DTMF); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_REQEVT_EXT_DTMF_EXT_CE); + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[0]; + + MG_INIT_TOKEN_VALUE(&(param->type),(U8)MGT_EVTPAR_OTHER); + + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val),MGT_PKG_ENUM_OBSEVTOTHER_EXT_DTMF_EXT_CE_DGT_STR); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_OCTSTRXL); + + mg_stack_alloc_mem((Ptr*)¶m->u.other.val.u.eq.u.osxl.val, num_of_collected_digits+2); + + param->u.other.val.u.eq.u.osxl.pres = 0x01; + param->u.other.val.u.eq.u.osxl.len = num_of_collected_digits+2; + + param->u.other.val.u.eq.u.osxl.val[0] = '\"'; + + /* copy collected DTMF digits */ + if(ascii) + { + for(cnt = 1; cnt< num_of_collected_digits; cnt++){ + /* convert values to ascii */ + if(digits[cnt-1] <= 9){ + param->u.other.val.u.eq.u.osxl.val[cnt] = digits[cnt-1] + '0'; + }else{ + /* 10 for decimal equivalent of A */ + param->u.other.val.u.eq.u.osxl.val[cnt] = digits[cnt-1] + 'A' - 10; + } + } + } else { + /* If incoming digits are already in ascii format .. simply copy */ + for(cnt = 1; cnt< num_of_collected_digits; cnt++){ + param->u.other.val.u.eq.u.osxl.val[cnt] = digits[cnt-1]; + } + } + + + param->u.other.val.u.eq.u.osxl.val[num_of_collected_digits+1] = '\"'; + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[1]; + + + /* Set method */ + MG_INIT_TOKEN_VALUE(&(param->type),MGT_EVTPAR_OTHER); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val),MGT_PKG_ENUM_OBSEVTOTHER_EXT_DTMF_EXT_CE_TERM_METH); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHER_EXT_DTMF_EXT_CE_TERM_METHFM); + + return mg_send_notify(mg_profile, term_name, oevt); +} + +/*****************************************************************************************************************************/ + +/* Note : API to send NOTIFY Message */ +/* INPUT : +* mg_profile - MG profile structure pointer +* term_name - Termination Name(as specified for MEGACO ) +* oevt - Observed Event structure pointer +*/ +switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_name, MgMgcoObsEvt* oevt) +{ + switch_status_t ret; + MgMgcoCommand request; + MgMgcoTermId* termId; + mg_termination_t* term = NULL; + MgMgcoObsEvtDesc *obs_desc = NULL; + MgMgcoRequestId reqId; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Sending Notify Message for termination[%s] !\n", term_name); + + MG_ZERO(&request, sizeof(request)); + MG_ZERO(&reqId, sizeof(reqId)); + + term = megaco_find_termination(mg_profile, (char*)term_name); + + if(!term){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No termination configured for given name[%s] !\n", term_name); + return SWITCH_STATUS_FALSE; + } + + if(NULL == term->active_events){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Active events observed on given termination[%s] !\n", term_name); + /* return SWITCH_STATUS_FALSE; */ + /*TODO - ideally we should return ... + * as of now not returning .. if we dont have active signals then + * setting default request id and sending notification to MGC */ + MG_SET_DEF_REQID(&reqId); + }else{ + MG_MEM_COPY(&reqId, &term->active_events->reqId, sizeof(MgMgcoRequestId)); + } + + + if(SWITCH_STATUS_FALSE == (ret = mg_create_mgco_command(&request, CH_CMD_TYPE_REQ, MGT_NTFY))){ + return SWITCH_STATUS_FALSE; + } + + if (mgUtlGrowList((void ***)&request.u.mgCmdReq[0]->cmd.u.ntfy.obs.el.evts, sizeof(MgMgcoObsEvtLst), + &request.u.mgCmdReq[0]->cmd.u.ntfy.obs.el.num, &request.u.mgCmdReq[0]->memCp) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + obs_desc = &request.u.mgCmdReq[0]->cmd.u.ntfy.obs; + + MG_INIT_TOKEN_VALUE(&(obs_desc->pres), PRSNT_NODEF); + + /* copy request id */ + MG_MEM_COPY(&obs_desc->reqId, &reqId, sizeof(MgMgcoRequestId)); + + /* copy observe event */ + /*MG_MEM_COPY(obs_desc->el.evts[0], oevt, sizeof(MgMgcoObsEvt));*/ + + obs_desc->el.evts[0] = oevt; + + + /*fill txn id */ + request.transId.pres = PRSNT_NODEF; + request.transId.val = get_txn_id(); + + request.contextId.type.pres = PRSNT_NODEF; + request.contextId.type.val = MGT_CXTID_NULL; + + request.cmdStatus.pres = PRSNT_NODEF; + request.cmdStatus.val = CH_CMD_STATUS_END_OF_TXN; + + request.cmdType.pres = PRSNT_NODEF; + request.cmdType.val = CH_CMD_TYPE_REQ; + + /* fill termination */ + if (mgUtlGrowList((void ***)&request.u.mgCmdReq[0]->cmd.u.ntfy.termIdLst.terms, sizeof(MgMgcoTermIdLst), + &request.u.mgCmdReq[0]->cmd.u.ntfy.termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + +#ifdef GCP_VER_2_1 + termId = request.u.mgCmdReq[0]->cmd.u.ntfy.termIdLst.terms[0]; +#else + termId = &(request.u.mgCmdReq[0]->cmd.u.ntfy.termId); +#endif + + mg_fill_mgco_termid(termId, (char*)term_name ,strlen(term_name), &request.u.mgCmdReq[0]->memCp); + + sng_mgco_send_cmd(mg_profile->idx, &request); + + return SWITCH_STATUS_SUCCESS; +} +/*****************************************************************************************************************************/ + diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index fc27386d9a..f308496b1e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -120,6 +120,13 @@ typedef enum { cmMemcpy((U8*)((_tkn).val), (U8*)(_val), _len);\ } +#define MG_SET_DEF_REQID(_reqId) \ + (_reqId)->type.pres = PRSNT_NODEF; \ + (_reqId)->type.val = MGT_REQID_OTHER; \ + (_reqId)->id.pres = PRSNT_NODEF; \ + (_reqId)->id.val = 0xFFFFFFFF; + + switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term); void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); @@ -174,6 +181,9 @@ switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, ui switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); +switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_name, MgMgcoObsEvt* oevt); +switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); +switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequestId *request_id, MgMgcoObsEvtDesc **ptr_obs_desc); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 73d467f8de..b6751c6eea 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1353,3 +1353,39 @@ void mg_fill_null_context(MgMgcoContextId* ctxt) MG_SET_TKN_VAL_PRES(&ctxt->type, MGT_CXTID_NULL, PRSNT_NODEF); } /*****************************************************************************************************************************/ +switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequestId *request_id, MgMgcoObsEvtDesc **ptr_obs_desc) +{ + MgMgcoObsEvtDesc *obs_desc = NULL; + + /* Check for valid request Id, if not then fill default value */ + if (NOTPRSNT == request_id->type.pres) + { + MG_SET_DEF_REQID(request_id); + } + + mg_stack_alloc_mem((Ptr*)&obs_desc, sizeof(MgMgcoObsEvtDesc)); + if (NULL == obs_desc) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvtDesc!\n"); + return SWITCH_STATUS_FALSE; + } + + obs_desc->pres.pres = PRSNT_NODEF; + MG_MEM_COPY(&obs_desc->reqId, request_id, sizeof(MgMgcoRequestId)); + obs_desc->el.num.pres = PRSNT_NODEF; + obs_desc->el.num.val = 1; + + mg_stack_alloc_mem((Ptr*)&obs_desc->el.evts, sizeof(MgMgcoObsEvt*)); + if (NULL == obs_desc->el.evts) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvt!\n"); + return SWITCH_STATUS_FALSE; + } + + MG_MEM_COPY(obs_desc->el.evts[0], obs_event, sizeof(obs_event)); + + *ptr_obs_desc = obs_desc; + + return SWITCH_STATUS_SUCCESS; +} +/*****************************************************************************************************************************/ From 12e8e481b5789c73b60202e193967274a067f9e7 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 24 Jul 2012 13:34:02 -0400 Subject: [PATCH 322/493] adding API to send "In-Activity" timer expiry NOTIFY to MGC for IT/ITO package --- .../mod_media_gateway/media_gateway_cli.c | 19 ++++++ .../media_gateway_cmd_handler.c | 62 +++++++++++++++---- .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/media_gateway_utils.c | 36 ++++++----- .../mod_media_gateway/mod_media_gateway.c | 4 +- 5 files changed, 93 insertions(+), 29 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index f249d012f4..9b575c5384 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -142,6 +142,25 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre megaco_profile_release(profile); mg_send_dtmf_notify(profile, argv[4], (char*)argv[5], (int)strlen(argv[5])); + break; + } + case 5: + { + /* mg profile send ito notify */ + if(zstr(argv[3])){ + goto usage; + } + + if(strcasecmp(argv[3],"ito")){ + stream->write_function(stream, "-ERR wrong input \n"); + goto usage; + } + + printf("Sending In-Activity NOTIFY \n"); + + megaco_profile_release(profile); + mg_send_ito_notify(profile); + break; } default: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 12174639ae..290b21efe8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2134,6 +2134,36 @@ err: mgUtlDelMgMgcoSvcChgPar(&srvPar); return ret; } + +/*****************************************************************************************************************************/ +/* API to send In-Activity Timeout NOTIFY to MGC */ +switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile ) +{ + MgMgcoObsEvt *oevt; + + switch_assert(mg_profile); + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_INACTTIMER); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_REQEVT_INACTTIMER_INACT_TIMOUT); + + oevt->pl.num.pres = PRSNT_NODEF; + oevt->pl.num.val = 0x00; + + return mg_send_notify(mg_profile, "ROOT", oevt); +} /*****************************************************************************************************************************/ /* API to send DTMF Digits Notification */ @@ -2255,23 +2285,29 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n MG_ZERO(&request, sizeof(request)); MG_ZERO(&reqId, sizeof(reqId)); - term = megaco_find_termination(mg_profile, (char*)term_name); + if(strcmp(term_name, "ROOT")){ + /* Not ROOT term then --- */ + term = megaco_find_termination(mg_profile, (char*)term_name); - if(!term){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No termination configured for given name[%s] !\n", term_name); - return SWITCH_STATUS_FALSE; - } + if(!term){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No termination configured for given name[%s] !\n", term_name); + return SWITCH_STATUS_FALSE; + } - if(NULL == term->active_events){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Active events observed on given termination[%s] !\n", term_name); - /* return SWITCH_STATUS_FALSE; */ - /*TODO - ideally we should return ... - * as of now not returning .. if we dont have active signals then - * setting default request id and sending notification to MGC */ - MG_SET_DEF_REQID(&reqId); + if(NULL == term->active_events){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Active events observed on given termination[%s] !\n", term_name); + /* return SWITCH_STATUS_FALSE; */ + /*TODO - ideally we should return ... + * as of now not returning .. if we dont have active signals then + * setting default request id and sending notification to MGC */ + MG_SET_DEF_REQID(&reqId); + }else{ + MG_MEM_COPY(&reqId, &term->active_events->reqId, sizeof(MgMgcoRequestId)); + } }else{ - MG_MEM_COPY(&reqId, &term->active_events->reqId, sizeof(MgMgcoRequestId)); + MG_SET_DEF_REQID(&reqId); } + if(SWITCH_STATUS_FALSE == (ret = mg_create_mgco_command(&request, CH_CMD_TYPE_REQ, MGT_NTFY))){ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index f308496b1e..d5b82a5b54 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -183,6 +183,7 @@ switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const c switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_name, MgMgcoObsEvt* oevt); switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); +switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile); switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequestId *request_id, MgMgcoObsEvtDesc **ptr_obs_desc); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index b6751c6eea..d521823005 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -96,27 +96,33 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C S16 ret = ROK; termId->type.pres = PRSNT_NODEF; - termId->type.val = MGT_TERMID_OTHER; - termId->name.dom.pres = NOTPRSNT; - termId->name.dom.len = 0x00; + if(!strcmp(term_str,"ROOT")){ + /* ROOT Termination */ + termId->type.val = MGT_TERMID_ROOT; + } else { + termId->type.val = MGT_TERMID_OTHER; - termId->name.pres.pres = PRSNT_NODEF; - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = term_len; - /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ - ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); + termId->name.dom.pres = NOTPRSNT; + termId->name.dom.len = 0x00; - printf("termId->name.lcl.val[%p]\n",termId->name.lcl.val); + termId->name.pres.pres = PRSNT_NODEF; + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = term_len; + /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ + ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); - if( ret != ROK) - RETVALUE(ret); + printf("termId->name.lcl.val[%p]\n",termId->name.lcl.val); - /*cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)term_str,termId->name.lcl.len);*/ - strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); - termId->name.lcl.val[termId->name.lcl.len] = '\0'; + if( ret != ROK) + RETVALUE(ret); - printf("mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + /*cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)term_str,termId->name.lcl.len);*/ + strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); + termId->name.lcl.val[termId->name.lcl.len] = '\0'; + + printf("mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + } #ifdef GCP_ASN diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 03a61104ec..4394a86184 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -613,6 +613,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } case CH_CMD_TYPE_CFM: { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%d] Response/Confirmation \n",txn_id); break; } default: @@ -623,7 +624,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "cmd->cmdStatus.val[%d]\n",cmd->cmdStatus.val); /* END OF TXN received - means last command in txn to process. * Send response to peer */ - /*if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val)*/{ + if(CH_CMD_TYPE_IND == cmd->cmdType.val){ + /*if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val)*/ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } From e5821eeb7961ffdb693b9475f2949dae523715fc Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 24 Jul 2012 16:57:09 -0400 Subject: [PATCH 323/493] adding code to fill dummy local descriptor sdp to add response --- .../media_gateway_cmd_handler.c | 280 +++++++++--------- 1 file changed, 145 insertions(+), 135 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 290b21efe8..55da9a3757 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -323,6 +323,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i U32 txn_id = inc_cmd->transId.val; mg_termination_t* term = NULL; MgMgcoMediaDesc* inc_med_desc; + /*MgMgcoStreamDesc* inc_strm_desc;*/ MgMgcoAudRetParm *desc; mg_context_t* mg_ctxt; @@ -495,180 +496,189 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i desc->type.val = MGT_MEDIADESC; mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); -#if 0 { - - MgMgcoStreamDesc *stream; + /* build local descriptors */ + /*MgMgcoStreamDesc *stream;*/ MgMgcoLocalDesc *local; - MgMgcoRemoteDesc* remote; CmSdpInfoSet *psdp; - CmSdpInfoSet *prsdp; char* ipAddress = "192.168.1.1"; + MgMgcoMediaDesc* media = &desc->u.media; /* Most probably we need to add local descriptor */ - /* TODO - considering only one descriptor*/ - stream = &desc->u.media.parms[0]->u.stream; + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), + &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + +#if 0 + /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ + + printf("media->num.val[%d]\n",media->num.val); + + stream = &media->parms[media->num.val-1]->u.stream; stream->pres.pres = PRSNT_NODEF; + stream->pres.val = 0x01; +#if 0 + if(inc_med_desc->num.pres && inc_med_desc->num.val){ + /* TODO - check stream descriptor type for all medias */ + inc_strm_desc = &inc_med_desc->parms[0]->u.stream; + memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); + } +#endif + + MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); + + stream->sl.pres.pres = PRSNT_NODEF; + stream->sl.pres.val = 0x01; + local = &stream->sl.local; - remote = &stream->sl.remote; +#endif + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; - if(!local->pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " Local stream media not present adding it \n"); + local = &media->parms[media->num.val-1]->u.local; - /* allocating mem for local descriptor */ - if (mgUtlGrowList((void ***)&desc->u.media.parms, sizeof(MgMgcoMediaPar), - &desc->u.media.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + local->pres.pres = PRSNT_NODEF; + + psdp = &(local->sdp); + + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; + + /* fill version */ + /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); + + /* fill orig */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); + + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + ipAddress[3]); + + /* fill session name */ + /* TODO - need to fill proper session name or skip it..*/ + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->sessName, 8, "SANGOMA",&rsp.u.mgCmdRsp[0]->memCp); + + + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); + + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); + + /* t= line */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); +#if 0 + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.sdpOpTimeSet.numComp),0); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.zoneAdjSet.numComp),0); +#endif + + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; + CmSdpMediaDesc* media; + + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } - desc->u.media.parms[desc->u.media.num.val-1]->type.pres = PRSNT_NODEF; - desc->u.media.parms[desc->u.media.num.val-1]->type.val = MGT_MEDIAPAR_STRPAR; + media = med->mediaDesc[med->numComp.val-1]; + MG_INIT_TOKEN_VALUE(&(media->pres),1); - stream = &desc->u.media.parms[desc->u.media.num.val-1]->u.stream; - stream->pres.pres = PRSNT_NODEF; - stream->pres.val = 0x01; - stream->sl.pres.pres = PRSNT_NODEF; - stream->sl.pres.val = 0x01; - local = &stream->sl.local; - remote = &stream->sl.remote; + /* Fill CmSdpMediaField */ + MG_INIT_TOKEN_VALUE(&(media->field.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - memcpy(&stream->streamId, &desc->u.media.parms[0]->u.stream.streamId, sizeof(MgMgcoStreamId)); + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); - local->pres.pres = PRSNT_NODEF; - psdp = &(local->sdp); - prsdp = &(remote->sdp); - - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), + &media->field.par.numProtFmts, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } - psdp->info[0]->pres.pres = PRSNT_NODEF; - - /* fill version */ - /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ - MG_INIT_TOKEN_VALUE(&(psdp->info[0]->ver),1); - - /* fill orig */ - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.usrName, 1, "-", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessId, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[0]->orig.orig.sessVer, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.netType.type), - CM_SDP_NET_TYPE_IN); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.addrType), - CM_SDP_ADDR_TYPE_IPV4); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), - ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), - ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), - ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), - ipAddress[3]); - - /* fill session name */ - /*memcpy(&psdp->info[0]->sessName, &prsdp->info[0]->sessName, sizeof(TknStrOSXL));*/ - MG_SET_TKNSTROSXL(psdp->info[0]->sessName, 1, "-",&rsp.u.mgCmdRsp[0]->memCp); + /* CmSdpMedProtoFmts */ + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.type), CM_SDP_MEDIA_PROTO_RTP) + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.u.subtype.type), CM_SDP_PROTO_RTP_AVP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->protType), CM_SDP_MEDIA_PROTO_RTP); - /* fill info */ - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[0]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); - - /* Fill the SDP Connection Info */ - /* "c=" line - ipaddress */ - /*memcpy(&psdp->info[0]->conn, &prsdp->info[0]->conn, sizeof(CmSdpConn));*/ - - /* fill media descriptors */ + if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), + &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { - CmSdpMediaDescSet* med = &psdp->info[0]->mediaDescSet; - CmSdpMediaDesc* media; + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), - &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->type), CM_SDP_SPEC); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 4); + + /* Fill attribute if reqd */ + { + if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), + &media->attrSet.numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } - media = med->mediaDesc[0]; - - MG_INIT_TOKEN_VALUE(&(media->pres),1); - - /* Fill CmSdpMediaField */ - MG_INIT_TOKEN_VALUE(&(media->field.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - - MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), - CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); - - - MG_INIT_TOKEN_VALUE(&(media->field.par.numProtFmts),1); - MG_GETMEM((media->field.par.pflst),1*sizeof(CmSdpMedProtoFmts*),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_GETMEM((media->field.par.pflst[0]),sizeof(CmSdpMedProtoFmts),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.type), - CM_SDP_MEDIA_PROTO_RTP) - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->prot.u.subtype.type), - CM_SDP_PROTO_RTP_AVP); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->protType), - CM_SDP_MEDIA_PROTO_RTP); - - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.num),1); - - MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts), - 1*sizeof(CmSdpU8OrNil *), &rsp.u.mgCmdRsp[0]->memCp, ret); - - MG_GETMEM((media->field.par.pflst[0]->u.rtp.fmts[0]), - sizeof(CmSdpU8OrNil), &rsp.u.mgCmdRsp[0]->memCp, ret); - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->type), - CM_SDP_SPEC); - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[0]->u.rtp.fmts[0]->val), - 4); - - /* Fill attribute if reqd */ - { - MG_INIT_TOKEN_VALUE(&(media->attrSet.numComp),1); - MG_GETMEM((media->attrSet.attr),sizeof(CmSdpAttr*),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_GETMEM((media->attrSet.attr[0]),sizeof(CmSdpAttr),&rsp.u.mgCmdRsp[0]->memCp, ret); - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); - media->attrSet.attr[0]->u.ptime.pres = PRSNT_NODEF; - media->attrSet.attr[0]->u.ptime.val = 30; - } - + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->u.ptime),30); } - printf("ret[%d]\n",ret); + } - } - else { - printf("!local->pres.pres false \n"); - } } -#endif - /* We will always send one command at a time..*/ From dd0b5147410de6915ecfc108d8b694dbc39dfcc0 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Jul 2012 10:53:07 -0400 Subject: [PATCH 324/493] fixing 32bit specific print warnings --- .../mod_media_gateway/media_gateway_cmd_handler.c | 10 ++++++++++ .../mod_media_gateway/media_gateway_utils.c | 10 ++++++++++ .../mod_media_gateway/mod_media_gateway.c | 14 +++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 55da9a3757..37effcbe95 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -778,9 +778,15 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /********************************************************************/ } else if(MGT_TERMID_OTHER == termId->type.val){ /********************************************************************/ +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Modify request is for termination[%s] and context: type[%d], value[%d] \n", termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for termination[%s] and context: type[%d], value[%ld] \n", + termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); +#endif term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); @@ -976,7 +982,11 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma if (MGT_CXTID_OTHER == ctxtId->type.val){ +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for Context[%d] \n", ctxtId->val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for Context[%ld] \n", ctxtId->val.val); +#endif /*find context based on received context-id */ mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index d521823005..e8788ea6f2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -456,8 +456,13 @@ void mgco_print_sdp_attr_set(CmSdpAttrSet *s) } case CM_SDP_ATTR_PTIME: { +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %d \n", (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %ld \n", + (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); +#endif break; } case CM_SDP_ATTR_RECVONLY: @@ -537,8 +542,13 @@ void mgco_print_sdp_attr_set(CmSdpAttrSet *s) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Name name = %s \n", (NOTPRSNT != r->enc.name.pres)?(char*)r->enc.name.val:"Not Present"); +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Clock Rate = %d \n", (NOTPRSNT != r->clk.pres)?r->clk.val:-1); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Clock Rate = %ld \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); +#endif switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Parameters = %s \n", (NOTPRSNT != r->parms.pres)?(char*)r->parms.val:"Not Present"); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 4394a86184..2cd68716be 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -518,7 +518,11 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) }else if(MGT_CXTID_OTHER == inc_context->type.pres){ if(NOTPRSNT != inc_context->val.pres){ +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Context specific request for contextId[%d]\n",inc_context->val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Context specific request for contextId[%ld]\n",inc_context->val.val); +#endif /* check if context present with us */ if(NULL == megaco_find_context_by_suid(suId, inc_context->val.val)){ goto ctxt_error; @@ -613,11 +617,19 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } case CH_CMD_TYPE_CFM: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%d] Response/Confirmation \n",txn_id); +#ifdef BIT_64 + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%d] Response/Confirmation \n",txn_id); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%ld] Response/Confirmation \n",txn_id); +#endif break; } default: +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid command type[%d]\n",cmd->cmdType.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid command type[%d]\n",cmd->cmdType.val); +#endif return; } From 4585dbffbbdd210cbe5c56a1f90a5236cc50a042 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 25 Jul 2012 11:27:01 -0400 Subject: [PATCH 325/493] Fixed conflict from previous merge --- conf/vanilla/autoload_configs/modules.conf.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index ef40fd1992..f88bb7b7c0 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -82,11 +82,7 @@ -<<<<<<< HEAD - -======= ->>>>>>> eb0404d0256dee4696b3ae1b62c4b1cef9327a0d From 2d9ed21007cc309380fb0af99bc15d20e957fcac Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 25 Jul 2012 12:57:42 -0400 Subject: [PATCH 326/493] adding code to 1) parse incoming MODIFY request for ITO package , 2) starting timer based on MGC requested time 3) on expiry generate Inactivity Notify to MGC --- .../media_gateway_cmd_handler.c | 157 ++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 5 + .../mod_media_gateway/media_gateway_utils.c | 8 + .../mod_media_gateway/mod_media_gateway.h | 2 + 4 files changed, 172 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 37effcbe95..ec760398e7 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -19,6 +19,159 @@ const char *mg_service_change_reason[] = { 0 }; + +/*****************************************************************************************************************************/ +switch_status_t mg_activate_ito_timer(megaco_profile_t* profile) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); + mg_print_time(); + + switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); + return SWITCH_STATUS_SUCCESS; +} + +/*****************************************************************************************************************************/ +static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) +{ + megaco_profile_t* profile = (megaco_profile_t*) task->cmd_arg; + /* TODO */ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," mg_inactivity_timer_exp for profile[%s]\n", profile->name); + mg_print_time(); + + mg_send_ito_notify(profile); + + /*task->runtime = switch_epoch_time_now(NULL)+100; */ /* interval in seconds */ +} + +/*****************************************************************************************************************************/ +switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *cmd) +{ + int descId = 0x00; + MgMgcoAmmReq* desc = NULL; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); + + if(CH_CMD_TYPE_IND != cmd->cmdType.val) + return SWITCH_STATUS_FALSE; + + if(MGT_MODIFY != cmd->u.mgCmdInd[0]->cmd.type.val) + return SWITCH_STATUS_FALSE; + + desc = &cmd->u.mgCmdInd[0]->cmd.u.mod; + + if(NULL == desc){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); + return SWITCH_STATUS_FALSE; + } + + if(NOTPRSNT == desc->dl.num.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); + return SWITCH_STATUS_SUCCESS; + } + + + for (descId = 0; descId < desc->dl.num.val; descId++) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + switch (desc->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Media descriptor on ROOT termination..Not Supporting now\n"); + break; + } + + case MGT_REQEVTDESC: + { + MgMgcoReqEvtDesc* evts = &desc->dl.descs[descId]->u.evts; + MgMgcoEvtPar *reqEvtPar; + MgMgcoReqEvt *evt; + int numEvts = 0; + int i; + + /* As of now only handling ito package */ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Event descriptor\n"); + + if (evts->el.num.pres) + numEvts = evts->el.num.val; + + for (i = 0; i < numEvts; i++) + { + evt = evts->el.revts[i]; + if (evt->pl.num.pres) + { + /* Check for the package */ + if((MGT_PKG_KNOWN == evt->pkg.valType.val) && + (MGT_PKG_INACTTIMER != evt->pkg.u.val.val)) + { + continue; + } + else + { + if((MGT_GEN_TYPE_KNOWN == evt->name.type.val) && + (MGT_PKG_ENUM_REQEVT_INACTTIMER_INACT_TIMOUT == + evt->name.u.val.val)){ + + if((evt->pl.num.pres != NOTPRSNT) && + (evt->pl.num.val != 0)) { + + reqEvtPar = evt->pl.parms[0]; + + if((NULL != reqEvtPar) && + (reqEvtPar->type.val == MGT_EVTPAR_OTHER) && + (reqEvtPar->u.other.name.type.pres == PRSNT_NODEF) && + (reqEvtPar->u.other.name.type.val == MGT_GEN_TYPE_KNOWN) && + (reqEvtPar->u.other.name.u.val.pres == PRSNT_NODEF) && + (reqEvtPar->u.other.name.u.val.val == + MGT_PKG_ENUM_REQEVTOTHER_INACTTIMER_INACT_TIMOUT_MAX_IATIME)&& + (reqEvtPar->u.other.val.type.pres == PRSNT_NODEF) && + (reqEvtPar->u.other.val.type.val == MGT_VALUE_EQUAL) && + (reqEvtPar->u.other.val.u.eq.type.pres == PRSNT_NODEF) && + (reqEvtPar->u.other.val.u.eq.type.val == MGT_VALTYPE_UINT32)) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%d]\n", + reqEvtPar->u.other.val.u.eq.u.decInt.val); + + mg_profile->inact_tmr = reqEvtPar->u.other.val.u.eq.u.decInt.val/MG_INACTIVITY_TMR_RESOLUTION; + + if(0 == mg_profile->inact_tmr){ + /* value ZERO means MGC wantes to disable ito timer */ + + /* TODO - check and stop currently running ito timer */ + } else { + mg_activate_ito_timer(mg_profile); + } + break; + } + } + } + } + } + } + + break; + } + case MGT_SIGNALSDESC: + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Signal descriptor on ROOT termination..Not Supporting now\n"); + break; + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_EVBUFDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + + } + } + + return SWITCH_STATUS_SUCCESS; +} + + /*****************************************************************************************************************************/ /* @@ -773,6 +926,10 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand if(MGT_TERMID_ROOT == termId->type.val){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Modify request is for ROOT termination \n"); + + /* check if we have ito packg request */ + mg_is_ito_pkg_req(mg_profile, inc_cmd); + /* TODO */ /********************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index d5b82a5b54..37c1c321eb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -13,6 +13,8 @@ #define MAX_MID_LEN 30 +#define MG_INACTIVITY_TMR_RESOLUTION 100 /* mit in ito package is experessed in 10ms steps */ + typedef enum{ SNG_MG_TPT_NONE, SNG_MG_TPT_UDP, @@ -147,6 +149,7 @@ switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, mg_peer_profile_t* mg_peer); +switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); void mgco_print_sdp(CmSdpInfoSet *sdp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); @@ -185,6 +188,8 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile); switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequestId *request_id, MgMgcoObsEvtDesc **ptr_obs_desc); +void mg_print_time(); +switch_status_t mg_activate_ito_timer(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index e8788ea6f2..4e4d34b736 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1405,3 +1405,11 @@ switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequ return SWITCH_STATUS_SUCCESS; } /*****************************************************************************************************************************/ +void mg_print_time() +{ + time_t now; + time(&now); + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Current Time = %s", ctime(&now)); +} +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index f5f83c6dd6..050ffcbad3 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -15,6 +15,7 @@ #define MG_MAX_PEERS 5 + #define MG_CONTEXT_MAX_TERMS 3 #define MEGACO_CLI_SYNTAX "profile|logging" @@ -149,6 +150,7 @@ struct megaco_profile_s { char* rtp_termination_id_prefix; int rtp_termination_id_len; char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ + int inact_tmr; /* inactivity timer value */ switch_thread_rwlock_t *contexts_rwlock; uint32_t next_context_id; From 061e082b62bb92b6dc2acfedf122daa57def5bfb Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 25 Jul 2012 13:05:54 -0400 Subject: [PATCH 327/493] adding "MGC_FAIL" alarm --- .../media_gateway_cmd_handler.c | 22 +++++++++---------- .../media_gateway_stack_alarms.c | 10 +++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index ec760398e7..9a15871ff8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -20,17 +20,6 @@ const char *mg_service_change_reason[] = { }; -/*****************************************************************************************************************************/ -switch_status_t mg_activate_ito_timer(megaco_profile_t* profile) -{ - - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); - mg_print_time(); - - switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); - return SWITCH_STATUS_SUCCESS; -} - /*****************************************************************************************************************************/ static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) { @@ -45,6 +34,17 @@ static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) /*task->runtime = switch_epoch_time_now(NULL)+100; */ /* interval in seconds */ } +/*****************************************************************************************************************************/ +switch_status_t mg_activate_ito_timer(megaco_profile_t* profile) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); + mg_print_time(); + + switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); + return SWITCH_STATUS_SUCCESS; +} + /*****************************************************************************************************************************/ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *cmd) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index 5281a7942a..4564468e96 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -74,6 +74,16 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) len = len + sprintf(prBuf+len, " Event ( "); switch (usta->t.usta.alarm.event) { + case LMG_EVENT_ALL_MGC_FAILED: + { + len = len + sprintf(prBuf+len, "ALL MGC Failed "); + break; + } + case LMG_EVENT_MGC_FAILED: + { + len = len + sprintf(prBuf+len, "MGC Failed "); + break; + } case LMG_EVENT_TSAP_RECVRY_SUCCESS: { len = len + sprintf(prBuf+len, "TSAP recovery success"); From 245dfc1fd81926c15d7080de40691dcb658c2984 Mon Sep 17 00:00:00 2001 From: Kapil Date: Wed, 25 Jul 2012 15:02:00 -0400 Subject: [PATCH 328/493] adding code to print the Notify/Service-Change response --- .../mod_media_gateway/media_gateway.c | 2 + .../mod_media_gateway/media_gateway_cli.c | 3 +- .../media_gateway_cmd_handler.c | 23 ++- .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/mod_media_gateway.c | 176 ++++++++++++++---- .../mod_media_gateway/mod_media_gateway.h | 1 + 6 files changed, 165 insertions(+), 41 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 5d58674a0c..cc4351799b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -456,6 +456,8 @@ switch_status_t megaco_profile_start(const char *profilename) profile->pool = pool; profile->name = switch_core_strdup(pool, profilename); profile->next_context_id++; + profile->inact_tmr = 0x00; + profile->inact_tmr_task_id = 0x00; switch_thread_rwlock_create(&profile->rwlock, pool); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 9b575c5384..e8cb79097b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -205,7 +205,8 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto done; usage: - megaco_profile_release(profile); + if(profile) + megaco_profile_release(profile); stream->write_function(stream, "-ERR Usage: \n""\t"MEGACO_CLI_SYNTAX" \n \t"MEGACO_FUNCTION_SYNTAX"\n \t" MEGACO_LOGGING_CLI_SYNTAX "\n"); done: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 9a15871ff8..b801e3fa67 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -20,28 +20,40 @@ const char *mg_service_change_reason[] = { }; +/*****************************************************************************************************************************/ +void mg_restart_inactivity_timer(megaco_profile_t* profile) +{ + /* NOTE - For Restart - we are deleting existing task and adding it again */ + if(profile->inact_tmr_task_id) + switch_scheduler_del_task_id(profile->inact_tmr_task_id); + + if(profile->inact_tmr) { + mg_activate_ito_timer(profile); + } +} + /*****************************************************************************************************************************/ static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) { megaco_profile_t* profile = (megaco_profile_t*) task->cmd_arg; - /* TODO */ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," mg_inactivity_timer_exp for profile[%s]\n", profile->name); mg_print_time(); mg_send_ito_notify(profile); - /*task->runtime = switch_epoch_time_now(NULL)+100; */ /* interval in seconds */ + /* resetting task_id */ + profile->inact_tmr_task_id = 0x00; } /*****************************************************************************************************************************/ switch_status_t mg_activate_ito_timer(megaco_profile_t* profile) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); mg_print_time(); - switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); + profile->inact_tmr_task_id = switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); + return SWITCH_STATUS_SUCCESS; } @@ -137,8 +149,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c if(0 == mg_profile->inact_tmr){ /* value ZERO means MGC wantes to disable ito timer */ - - /* TODO - check and stop currently running ito timer */ + switch_scheduler_del_task_id(mg_profile->inact_tmr_task_id) ; } else { mg_activate_ito_timer(mg_profile); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 37c1c321eb..8c429ef620 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -191,6 +191,7 @@ switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequ void mg_print_time(); switch_status_t mg_activate_ito_timer(megaco_profile_t* profile); +void mg_restart_inactivity_timer(megaco_profile_t* profile); /****************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 2cd68716be..1533ca7d15 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -102,35 +102,40 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) { - void *val = NULL; - const void *key = NULL; - switch_ssize_t keylen; - switch_hash_index_t *hi = NULL; - megaco_profile_t* profile = NULL; - mg_peer_profile_t* peer_profile = NULL; + void *val = NULL; + const void *key = NULL; + switch_ssize_t keylen; + switch_hash_index_t *hi = NULL; + megaco_profile_t* profile = NULL; + mg_peer_profile_t* peer_profile = NULL; - /* destroy all the mg profiles */ - while ((hi = switch_hash_first(NULL, megaco_globals.profile_hash))) { - switch_hash_this(hi, &key, &keylen, &val); - profile = (megaco_profile_t *) val; - megaco_profile_destroy(&profile); - profile = NULL; - } + /* destroy all the mg profiles */ + while ((hi = switch_hash_first(NULL, megaco_globals.profile_hash))) { + switch_hash_this(hi, &key, &keylen, &val); + profile = (megaco_profile_t *) val; + if(profile->inact_tmr_task_id){ + switch_scheduler_del_task_id(profile->inact_tmr_task_id); + profile->inact_tmr_task_id = 0x00; + } + megaco_profile_destroy(&profile); + profile = NULL; + } - hi = NULL; - key = NULL; - val = NULL; - /* destroy all the mg peer profiles */ - while ((hi = switch_hash_first(NULL, megaco_globals.peer_profile_hash))) { - switch_hash_this(hi, &key, &keylen, &val); - peer_profile = (mg_peer_profile_t *) val; - megaco_peer_profile_destroy(&peer_profile); - peer_profile = NULL; - } + hi = NULL; + key = NULL; + val = NULL; + /* destroy all the mg peer profiles */ + while ((hi = switch_hash_first(NULL, megaco_globals.peer_profile_hash))) { + switch_hash_this(hi, &key, &keylen, &val); + peer_profile = (mg_peer_profile_t *) val; + megaco_peer_profile_destroy(&peer_profile); + peer_profile = NULL; + } - sng_mgco_stack_shutdown(); + sng_mgco_stack_shutdown(); - return SWITCH_STATUS_SUCCESS; + + return SWITCH_STATUS_SUCCESS; } /*****************************************************************************************************************************/ @@ -443,6 +448,14 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); + /*get mg profile associated with SuId */ + if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ + goto error1; + } + + /* first thing - restart ito timer */ + mg_restart_inactivity_timer(mg_profile); + /* validate Transaction Id */ if (NOTPRSNT != cmd->transId.pres){ txn_id = cmd->transId.val; @@ -536,12 +549,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*mgAccEvntPrntMgMgcoCommand(cmd, stdout);*/ - /*get mg profile associated with SuId */ - if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ - goto error1; - } - - + switch(cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -618,11 +626,111 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case CH_CMD_TYPE_CFM: { #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%d] Response/Confirmation \n",txn_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command[%s] txn[%d] Response/Confirmation \n", + PRNT_MG_CMD(cmd->u.mgCmdCfm[0]->type.val), txn_id); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command txn[%ld] Response/Confirmation \n",txn_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command[%s] txn[%ld] Response/Confirmation \n", + PRNT_MG_CMD(cmd->u.mgCmdCfm[0]->type.val), txn_id); #endif - break; + switch(cmd->u.mgCmdCfm[0]->type.val) + { + case MGT_NTFY: + { + MgMgcoNtfyReply* ntfy = &cmd->u.mgCmdCfm[0]->u.ntfy; + MgMgcoTermId* term = NULL; + char term_name[32]; + memset(&term_name[0], 32, 0x00); + + strcpy(&term_name[0], "Invalid"); + +#ifdef GCP_VER_2_1 + if((NOTPRSNT != ntfy->termIdLst.num.pres) && + (0 != ntfy->termIdLst.num.val)){ + term = ntfy->termIdLst.terms[0]; + } +#else + term = &ntfy->termId; + +#endif + if(NOTPRSNT != term->type.pres){ + if(MGT_TERMID_ROOT == term->type.val){ + strcpy(&term_name[0],"ROOT"); + } + else if(MGT_TERMID_OTHER == term->type.val){ + strcpy(&term_name[0], (char*)term->name.lcl.val); + }else if(MGT_TERMID_ALL == term->type.val){ + strcpy(&term_name[0],"ALL Termination"); + }else if(MGT_TERMID_CHOOSE == term->type.val){ + strcpy(&term_name[0],"CHOOSE Termination"); + } + } + + if(NOTPRSNT != ntfy->pres.pres){ + if((NOTPRSNT != ntfy->err.pres.pres) && + (NOTPRSNT != ntfy->err.code.pres)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + "Received NOTIFY command response with ErroCode[%d] for Termination[%s] \n", + ntfy->err.code.val, &term_name[0]); + } + else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + "Received Successful NOTIFY command response for Termination[%s] \n", &term_name[0]); + } + } + + break; + } + case MGT_SVCCHG: + { + MgMgcoSvcChgReply* svc = &cmd->u.mgCmdCfm[0]->u.svc; + MgMgcoTermId* term = NULL; + char term_name[32]; + memset(&term_name[0], 32, 0x00); + + strcpy(&term_name[0], "Invalid"); + +#ifdef GCP_VER_2_1 + if((NOTPRSNT != svc->termIdLst.num.pres) && + (0 != svc->termIdLst.num.val)){ + term = svc->termIdLst.terms[0]; + } +#else + term = &svc->termId; + +#endif + if(NOTPRSNT != term->type.pres){ + if(MGT_TERMID_ROOT == term->type.val){ + strcpy(&term_name[0],"ROOT"); + } + else if(MGT_TERMID_OTHER == term->type.val){ + strcpy(&term_name[0], (char*)term->name.lcl.val); + }else if(MGT_TERMID_ALL == term->type.val){ + strcpy(&term_name[0],"ALL Termination"); + }else if(MGT_TERMID_CHOOSE == term->type.val){ + strcpy(&term_name[0],"CHOOSE Termination"); + } + } + + if(NOTPRSNT != svc->pres.pres){ + + if((NOTPRSNT != svc->res.type.pres) && + (MGT_ERRDESC == svc->res.type.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + "Received Service-Change command response with ErroCode[%d] for Termination[%s] \n", + svc->res.u.err.code.val, &term_name[0]); + } + else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + "Received Successful Service-Change command response for Termination[%s] \n", &term_name[0]); + } + } + + break; + } + default: + break; + } + break; } default: #ifdef BIT_64 diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 050ffcbad3..03f03b5c2d 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -151,6 +151,7 @@ struct megaco_profile_s { int rtp_termination_id_len; char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ int inact_tmr; /* inactivity timer value */ + uint32_t inact_tmr_task_id; /* FS timer scheduler task-id */ switch_thread_rwlock_t *contexts_rwlock; uint32_t next_context_id; From bc4c2d9fab831f19086f1958149ce7c53eb22fa2 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 15:10:47 -0400 Subject: [PATCH 329/493] map physical terms --- .../mod_media_gateway/media_gateway.c | 34 ++++------- .../mod_media_gateway/media_gateway_xml.c | 60 ++++++++++++++++++- .../mod_media_gateway/mod_media_gateway.h | 9 ++- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 5d58674a0c..7670478644 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -158,8 +158,8 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term_id = mg_rtp_request_id(profile); switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id); } else { - /* TODO Math: look through TDM channels */ - return NULL; + + return term; } switch_core_new_memory_pool(&pool); @@ -176,8 +176,6 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->u.rtp.codec = megaco_codec_str(profile->default_codec); term->u.rtp.term_id = term_id; term->name = switch_core_strdup(term->pool, name); - } else if (termtype == MG_TERM_TDM) { - /* XXX initialize tdm-specific fields */ } switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); @@ -214,8 +212,10 @@ void megaco_termination_destroy(mg_termination_t *term) term->active_events = NULL; } - switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); - switch_core_destroy_memory_pool(&term->pool); + if (term->type == MG_TERM_RTP) { + switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); + switch_core_destroy_memory_pool(&term->pool); + } } switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination_t *term) @@ -276,10 +276,11 @@ switch_status_t megaco_context_sub_all_termination(mg_context_t *ctx) /* Channels will automatically go to park once the bridge ends */ if (ctx->terminations[0]) { - megaco_termination_destroy(ctx->terminations[0]); - ctx->terminations[0] = NULL; - } else if (ctx->terminations[1]) { - megaco_termination_destroy(ctx->terminations[1]); + megaco_context_sub_termination(ctx, ctx->terminations[0]); + } + + if (ctx->terminations[1]) { + megaco_context_sub_termination(ctx, ctx->terminations[1]); } return SWITCH_STATUS_SUCCESS; @@ -316,11 +317,6 @@ mg_context_t *megaco_find_context_by_suid(SuId suId, uint32_t context_id) if(NULL == (profile = megaco_get_profile_by_suId(suId))){ return NULL; } - - - if (context_id > MG_MAX_CONTEXTS) { - return NULL; - } return megaco_get_context(profile, context_id); } @@ -353,8 +349,6 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile) { mg_context_t *ctx; - int i = 0x0; - int j = 0x0; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ @@ -366,14 +360,12 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) for (; profile->next_context_id < MG_MAX_CONTEXTS; profile->next_context_id++) { if ((profile->contexts_bitmap[profile->next_context_id % 8] & (1 << (profile->next_context_id / 8))) == 0) { /* Found! */ + int i = profile->next_context_id % MG_CONTEXT_MODULO; profile->contexts_bitmap[profile->next_context_id % 8] |= 1 << (profile->next_context_id / 8); - i = profile->next_context_id % MG_CONTEXT_MODULO; ctx = malloc(sizeof *ctx); + memset(ctx, 0, sizeof *ctx); ctx->context_id = profile->next_context_id; ctx->profile = profile; - for(j = 0; j< MG_CONTEXT_MAX_TERMS; j++){ - ctx->terminations[j] = NULL; - } if (!profile->contexts[i]) { profile->contexts[i] = ctx; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index fe588df34a..ca2e20d10d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -17,7 +17,7 @@ static switch_status_t modify_mid(char** pmid); /****************************************************************************************************************************/ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) { - switch_xml_t cfg, xml, param, mg_interfaces, mg_interface, mg_peers, mg_peer, peer_interfaces ; + switch_xml_t cfg, xml, param, mg_interfaces, mg_interface, mg_peers, mg_peer, mg_phys_terms, mg_term, peer_interfaces ; switch_status_t status = SWITCH_STATUS_FALSE; switch_event_t *event = NULL; const char *file = "media_gateway.conf"; @@ -101,7 +101,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) goto done; } - if(SWITCH_STATUS_FALSE == (status = modify_mid(&peer_profile->mid))){ + if (SWITCH_STATUS_FALSE == (status = modify_mid(&peer_profile->mid))) { goto done; } @@ -112,6 +112,62 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) } } } + + + if ((mg_phys_terms = switch_xml_child(cfg, "physical_terminations"))) { + + for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { + switch_memory_pool_t *pool; + mg_termination_t *term; + // + const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); + const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); + const char *tech = switch_xml_attr(mg_term, "tech"); + const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); + const char *channel_map = switch_xml_attr(mg_term, "channel-map"); + const char *szspan_id = switch_xml_attr(mg_term, "span-id"); + const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; + + int term_id = 1; + int chan_id = 1; + + + if (!zstr(channel_map)) { + /* Split channel-map */ + char *channel_map_dup = strdup(channel_map); + char *chanmap[24]; + int chanmap_count, i; + chanmap_count = switch_split(channel_map_dup, ' ', chanmap); + for (i = 0; i < chanmap_count; i++) { + char *p = strchr(chanmap[i], '-'); + if (p) { + int startchan, endchan, j; + *p++ = '\0'; + startchan = atoi(chanmap[i]); + endchan = atoi(p); + + for (j = startchan; j < endchan; j++) { + switch_core_new_memory_pool(&pool); + term = switch_core_alloc(profile->pool, sizeof *term); + term->pool = pool; + term->type = MG_TERM_TDM; + term->profile = profile; + term->name = switch_core_sprintf(pool, "%s%d", prefix, j); + term->u.tdm.span = span_id; + term->u.tdm.channel = j; + + switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %d chan: %d\n", term->name, term->u.tdm.span, term->u.tdm.channel); + } + } + } + + free(channel_map_dup); + } + + } + } /* configure the MEGACO stack */ status = sng_mgco_cfg(profile); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index f5f83c6dd6..f2ecbe002b 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -83,7 +83,10 @@ typedef struct mg_context_s mg_context_t; #define kSPAN_ID "span" #define kCHAN_ID "chan" -typedef struct mg_termination_s { + +typedef struct mg_termination_s mg_termination_t; + +struct mg_termination_s { switch_memory_pool_t *pool; mg_termination_type_t type; const char *name; /*!< Megaco Name */ @@ -91,6 +94,7 @@ typedef struct mg_termination_s { mg_context_t *context; /*!< Context in which this termination is connected, or NULL */ megaco_profile_t *profile; /*!< Parent MG profile */ MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ + mg_termination_t *next; /*!< List for physical terminations */ union { struct { @@ -115,7 +119,7 @@ typedef struct mg_termination_s { int channel; } tdm; } u; -} mg_termination_t; +}; struct mg_context_s { @@ -149,6 +153,7 @@ struct megaco_profile_s { char* rtp_termination_id_prefix; int rtp_termination_id_len; char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ + char* codec_prefs; switch_thread_rwlock_t *contexts_rwlock; uint32_t next_context_id; From 0a000613e203e3ef1053e1ab563be16622802873 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 15:13:04 -0400 Subject: [PATCH 330/493] fix warnings --- src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 2 +- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 6a6ef5c4d9..4307a8e91b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -143,7 +143,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c (reqEvtPar->u.other.val.u.eq.type.val == MGT_VALTYPE_UINT32)) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%d]\n", - reqEvtPar->u.other.val.u.eq.u.decInt.val); + (int)reqEvtPar->u.other.val.u.eq.u.decInt.val); mg_profile->inact_tmr = reqEvtPar->u.other.val.u.eq.u.decInt.val/MG_INACTIVITY_TMR_RESOLUTION; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index b52d4da0f1..0d6390a173 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -123,7 +123,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); //const char *tech = switch_xml_attr(mg_term, "tech"); - const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); + //const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); const char *channel_map = switch_xml_attr(mg_term, "channel-map"); const char *szspan_id = switch_xml_attr(mg_term, "span-id"); const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; From 457f98686c11fd4264b9fc234a42f0783e840f5e Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 15:22:01 -0400 Subject: [PATCH 331/493] fix warnings --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index ca2e20d10d..b52d4da0f1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -121,16 +121,13 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) mg_termination_t *term; // const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); - const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); - const char *tech = switch_xml_attr(mg_term, "tech"); + //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); + //const char *tech = switch_xml_attr(mg_term, "tech"); const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); const char *channel_map = switch_xml_attr(mg_term, "channel-map"); const char *szspan_id = switch_xml_attr(mg_term, "span-id"); const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; - int term_id = 1; - int chan_id = 1; - if (!zstr(channel_map)) { /* Split channel-map */ From 828a13733b812a6138427aba7d75b3994f48dacc Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 15:45:20 -0400 Subject: [PATCH 332/493] oops --- .../mod_media_gateway/media_gateway_xml.c | 105 +++++++++--------- 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index b52d4da0f1..68d546985d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -65,6 +65,58 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->idx = ++mg_sap_id; + + + if ((mg_phys_terms = switch_xml_child(mg_interface, "physical_terminations"))) { + for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { + switch_memory_pool_t *pool; + mg_termination_t *term; + // + const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); + //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); + //const char *tech = switch_xml_attr(mg_term, "tech"); + const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); + const char *channel_map = switch_xml_attr(mg_term, "channel-map"); + const char *szspan_id = switch_xml_attr(mg_term, "span-id"); + const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; + + + if (!zstr(channel_map)) { + /* Split channel-map */ + char *channel_map_dup = strdup(channel_map); + char *chanmap[24]; + int chanmap_count, i; + chanmap_count = switch_split(channel_map_dup, ' ', chanmap); + for (i = 0; i < chanmap_count; i++) { + char *p = strchr(chanmap[i], '-'); + if (p) { + int startchan, endchan, j; + *p++ = '\0'; + startchan = atoi(chanmap[i]); + endchan = atoi(p); + + for (j = startchan; j < endchan; j++) { + switch_core_new_memory_pool(&pool); + term = switch_core_alloc(profile->pool, sizeof *term); + term->pool = pool; + term->type = MG_TERM_TDM; + term->profile = profile; + term->name = switch_core_sprintf(pool, "%s%d", prefix, j); + term->u.tdm.span = span_id; + term->u.tdm.channel = j; + + switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %d chan: %d\n", term->name, term->u.tdm.span, term->u.tdm.channel); + } + } + } + + free(channel_map_dup); + } + } + } + /* we should break from here , profile name should be unique */ break; @@ -113,59 +165,6 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) } } - - if ((mg_phys_terms = switch_xml_child(cfg, "physical_terminations"))) { - - for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { - switch_memory_pool_t *pool; - mg_termination_t *term; - // - const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); - //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); - //const char *tech = switch_xml_attr(mg_term, "tech"); - const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); - const char *channel_map = switch_xml_attr(mg_term, "channel-map"); - const char *szspan_id = switch_xml_attr(mg_term, "span-id"); - const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; - - - if (!zstr(channel_map)) { - /* Split channel-map */ - char *channel_map_dup = strdup(channel_map); - char *chanmap[24]; - int chanmap_count, i; - chanmap_count = switch_split(channel_map_dup, ' ', chanmap); - for (i = 0; i < chanmap_count; i++) { - char *p = strchr(chanmap[i], '-'); - if (p) { - int startchan, endchan, j; - *p++ = '\0'; - startchan = atoi(chanmap[i]); - endchan = atoi(p); - - for (j = startchan; j < endchan; j++) { - switch_core_new_memory_pool(&pool); - term = switch_core_alloc(profile->pool, sizeof *term); - term->pool = pool; - term->type = MG_TERM_TDM; - term->profile = profile; - term->name = switch_core_sprintf(pool, "%s%d", prefix, j); - term->u.tdm.span = span_id; - term->u.tdm.channel = j; - - switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %d chan: %d\n", term->name, term->u.tdm.span, term->u.tdm.channel); - } - } - } - - free(channel_map_dup); - } - - } - } - /* configure the MEGACO stack */ status = sng_mgco_cfg(profile); From 6cf298a74631ef0baa37fd4601df3d0fad922d14 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 17:18:18 -0400 Subject: [PATCH 333/493] use span name instead of id. implement termination choose for tdm. --- libs/freetdm/mod_freetdm/tdm.c | 14 ++++++++++++-- .../endpoints/mod_media_gateway/media_gateway.c | 17 +++++++++++++++-- .../mod_media_gateway/media_gateway_xml.c | 8 ++++---- .../mod_media_gateway/mod_media_gateway.h | 13 ++++++++++++- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index a3369f1f7b..53ee192cf0 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -38,6 +38,7 @@ void ctdm_init(switch_loadable_module_interface_t *module_interface); #define kSPAN_ID "span" #define kCHAN_ID "chan" +#define kSPAN_NAME "span_name" static struct { switch_memory_pool_t *pool; @@ -97,7 +98,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) { const char *szspanid = switch_event_get_header(var_event, kSPAN_ID), - *szchanid = switch_event_get_header(var_event, kCHAN_ID); + *szchanid = switch_event_get_header(var_event, kCHAN_ID), + *span_name = switch_event_get_header(var_event, kSPAN_NAME); int chan_id; int span_id; @@ -111,14 +113,22 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ctdm_private_t *tech_pvt = NULL; - if (zstr(szchanid) || zstr(szspanid)) { + if (zstr(szchanid) || (zstr(szspanid) && zstr(span_name))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both ["kSPAN_ID"] and ["kCHAN_ID"] have to be set.\n"); goto fail; } chan_id = atoi(szchanid); span_id = atoi(szspanid); + + if (!span_id) { + if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) { + span_id = ftdm_span_get_id(span); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n"); + } + } if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8580844172..8fbd08abf5 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -120,7 +120,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); - switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kSPAN_ID, "%d", term->u.tdm.span); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kSPAN_NAME, term->u.tdm.span_name); switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kCHAN_ID, "%d", term->u.tdm.channel); } @@ -135,6 +135,8 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + switch_set_flag(term, MGT_ACTIVE); + done: if (session) { switch_core_session_rwunlock(session); @@ -151,6 +153,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha mg_termination_t *term = NULL; char name[100]; int term_id; + size_t prefixlen = strlen(prefix); /* Check the termination type by prefix */ if (strncasecmp(prefix, profile->rtp_termination_id_prefix, strlen(profile->rtp_termination_id_prefix)) == 0) { @@ -158,8 +161,14 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term_id = mg_rtp_request_id(profile); switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id); } else { + for (term = profile->physical_terminations; term; term = term->next) { + if (!strncasecmp(prefix, term->name, prefixlen) && !switch_test_flag(term, MGT_ALLOCATED)) { + switch_set_flag(term, MGT_ALLOCATED); + return term; + } + } - return term; + return NULL; } switch_core_new_memory_pool(&pool); @@ -168,6 +177,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->type = termtype; term->active_events = NULL; term->profile = profile; + switch_set_flag(term, MGT_ALLOCATED); if (termtype == MG_TERM_RTP) { /* Fill in local address and reserve an rtp port */ @@ -212,6 +222,9 @@ void megaco_termination_destroy(mg_termination_t *term) term->active_events = NULL; } + switch_clear_flag(term, MGT_ALLOCATED); + switch_clear_flag(term, MGT_ACTIVE); + if (term->type == MG_TERM_RTP) { switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); switch_core_destroy_memory_pool(&term->pool); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 68d546985d..f30c1d955d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -77,8 +77,6 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) //const char *tech = switch_xml_attr(mg_term, "tech"); const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); const char *channel_map = switch_xml_attr(mg_term, "channel-map"); - const char *szspan_id = switch_xml_attr(mg_term, "span-id"); - const int span_id = !zstr(szspan_id) ? atoi(szspan_id) : 0; if (!zstr(channel_map)) { @@ -102,12 +100,14 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) term->type = MG_TERM_TDM; term->profile = profile; term->name = switch_core_sprintf(pool, "%s%d", prefix, j); - term->u.tdm.span = span_id; term->u.tdm.channel = j; + term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); + term->next = profile->physical_terminations; + profile->physical_terminations = term; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %d chan: %d\n", term->name, term->u.tdm.span, term->u.tdm.channel); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %s chan: %d\n", term->name, term->u.tdm.span_name, term->u.tdm.channel); } } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index d74fb31d1e..c1960877bd 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -83,10 +83,17 @@ typedef struct mg_context_s mg_context_t; /* TDM parameters understood by the controllable channel */ #define kSPAN_ID "span" #define kCHAN_ID "chan" +#define kSPAN_NAME "span_name" typedef struct mg_termination_s mg_termination_t; +enum { + MGT_ALLOCATED = (1 << 0), + MGT_ACTIVE = (1 << 1), + +} mg_termination_flags; + struct mg_termination_s { switch_memory_pool_t *pool; mg_termination_type_t type; @@ -96,6 +103,7 @@ struct mg_termination_s { megaco_profile_t *profile; /*!< Parent MG profile */ MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ mg_termination_t *next; /*!< List for physical terminations */ + uint32_t flags; union { struct { @@ -116,8 +124,8 @@ struct mg_termination_s { } rtp; struct { - int span; int channel; + const char *span_name; } tdm; } u; }; @@ -165,6 +173,9 @@ struct megaco_profile_s { uint8_t rtpid_bitmap[MG_MAX_CONTEXTS/8]; uint32_t rtpid_next; + + mg_termination_t *physical_terminations; + switch_hash_t *terminations; switch_thread_rwlock_t *terminations_rwlock; }; From f223b9a0bb76ec5580ff84b6dc62e40fad189aa8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Jul 2012 17:28:56 -0400 Subject: [PATCH 334/493] adding add rsp sdp code --- .../media_gateway_cmd_handler.c | 294 +++++++++--------- 1 file changed, 152 insertions(+), 142 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 6a6ef5c4d9..5f756ac249 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -142,8 +142,13 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c (reqEvtPar->u.other.val.u.eq.type.pres == PRSNT_NODEF) && (reqEvtPar->u.other.val.u.eq.type.val == MGT_VALTYPE_UINT32)) { +#ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%d]\n", reqEvtPar->u.other.val.u.eq.u.decInt.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%ld]\n", + reqEvtPar->u.other.val.u.eq.u.decInt.val); +#endif mg_profile->inact_tmr = reqEvtPar->u.other.val.u.eq.u.decInt.val/MG_INACTIVITY_TMR_RESOLUTION; @@ -544,7 +549,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i if ((NOTPRSNT != termId->type.pres) && (MGT_TERMID_CHOOSE == termId->type.val)){ - term = megaco_choose_termination(mg_profile, "RTP"); /* TODO - RTP string has be configured one */ + term = megaco_choose_termination(mg_profile, mg_profile->rtp_termination_id_prefix); if(NULL == term){ mg_util_set_err_string(&errTxt, " Resource Failure "); @@ -660,189 +665,194 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i desc->type.val = MGT_MEDIADESC; mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); - { - /* build local descriptors */ - /*MgMgcoStreamDesc *stream;*/ - MgMgcoLocalDesc *local; - CmSdpInfoSet *psdp; - char* ipAddress = "192.168.1.1"; - MgMgcoMediaDesc* media = &desc->u.media; + /* only for RTP */ + if(is_rtp){ + /* build local descriptors */ + /*MgMgcoStreamDesc *stream;*/ + MgMgcoLocalDesc *local; + CmSdpInfoSet *psdp; + char* ipAddress[4];// = "192.168.1.1"; + MgMgcoMediaDesc* media = &desc->u.media; - /* Most probably we need to add local descriptor */ + switch_split((char*)term->u.rtp.local_addr,'.',ipAddress); - /* allocating mem for local descriptor */ - if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), - &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + printf("ipAddress[0]=%s, ipAddress[1]=%s, ipAddress[2]=%s,ipAddress[3]=%s\n",ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]); + + /* Most probably we need to add local descriptor */ + + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), + &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } #if 0 - /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ + /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ - printf("media->num.val[%d]\n",media->num.val); + printf("media->num.val[%d]\n",media->num.val); - stream = &media->parms[media->num.val-1]->u.stream; - stream->pres.pres = PRSNT_NODEF; - stream->pres.val = 0x01; + stream = &media->parms[media->num.val-1]->u.stream; + stream->pres.pres = PRSNT_NODEF; + stream->pres.val = 0x01; #if 0 - if(inc_med_desc->num.pres && inc_med_desc->num.val){ - /* TODO - check stream descriptor type for all medias */ - inc_strm_desc = &inc_med_desc->parms[0]->u.stream; - memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); - } + if(inc_med_desc->num.pres && inc_med_desc->num.val){ + /* TODO - check stream descriptor type for all medias */ + inc_strm_desc = &inc_med_desc->parms[0]->u.stream; + memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); + } #endif - MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); + MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); - stream->sl.pres.pres = PRSNT_NODEF; - stream->sl.pres.val = 0x01; + stream->sl.pres.pres = PRSNT_NODEF; + stream->sl.pres.val = 0x01; - local = &stream->sl.local; + local = &stream->sl.local; #endif - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; - local = &media->parms[media->num.val-1]->u.local; + local = &media->parms[media->num.val-1]->u.local; - local->pres.pres = PRSNT_NODEF; + local->pres.pres = PRSNT_NODEF; - psdp = &(local->sdp); + psdp = &(local->sdp); - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; + psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; - /* fill version */ - /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); + /* fill version */ + /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); - /* fill orig */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); + /* fill orig */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), - CM_SDP_NET_TYPE_IN); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), - CM_SDP_ADDR_TYPE_IPV4); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), - ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), - ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), - ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), - ipAddress[3]); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", + &rsp.u.mgCmdRsp[0]->memCp); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + atoi(ipAddress[3])); - /* fill session name */ - /* TODO - need to fill proper session name or skip it..*/ - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->sessName, 8, "SANGOMA",&rsp.u.mgCmdRsp[0]->memCp); + /* fill session name */ + /* TODO - need to fill proper session name or skip it..*/ + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->sessName, 8, "SANGOMA",&rsp.u.mgCmdRsp[0]->memCp); - /* Fill the SDP Connection Info */ - /* "c=" line - ipaddress */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), ipAddress[0]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), ipAddress[1]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), ipAddress[2]); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), ipAddress[3]); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); - /* t= line */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); + + /* t= line */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); #if 0 - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.sdpOpTimeSet.numComp),0); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.zoneAdjSet.numComp),0); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.sdpOpTimeSet.numComp),0); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.zoneAdjSet.numComp),0); #endif - /* fill media descriptors */ - { - CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; - CmSdpMediaDesc* media; + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; + CmSdpMediaDesc* media; - if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), - &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - media = med->mediaDesc[med->numComp.val-1]; + media = med->mediaDesc[med->numComp.val-1]; - MG_INIT_TOKEN_VALUE(&(media->pres),1); + MG_INIT_TOKEN_VALUE(&(media->pres),1); - /* Fill CmSdpMediaField */ - MG_INIT_TOKEN_VALUE(&(media->field.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); + /* Fill CmSdpMediaField */ + MG_INIT_TOKEN_VALUE(&(media->field.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); + //MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); - if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), - &media->field.par.numProtFmts, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), + &media->field.par.numProtFmts, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - /* CmSdpMedProtoFmts */ - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.type), CM_SDP_MEDIA_PROTO_RTP) - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.u.subtype.type), CM_SDP_PROTO_RTP_AVP); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->protType), CM_SDP_MEDIA_PROTO_RTP); + /* CmSdpMedProtoFmts */ + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.type), CM_SDP_MEDIA_PROTO_RTP) + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.u.subtype.type), CM_SDP_PROTO_RTP_AVP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->protType), CM_SDP_MEDIA_PROTO_RTP); - if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), - &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), + &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 4); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 4); - /* Fill attribute if reqd */ - { - if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), - &media->attrSet.numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + /* Fill attribute if reqd */ + { + if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), + &media->attrSet.numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->u.ptime),30); - } - - } - - } + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->u.ptime), term->u.rtp.ptime); + } + } + } /* We will always send one command at a time..*/ From 898a183a0e59311211ee6ba86bca100ac5465d5c Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 18:57:32 -0400 Subject: [PATCH 335/493] missing crtp init in mod_freetdm.c -- start implementing media modify --- libs/freetdm/mod_freetdm/mod_freetdm.c | 3 ++ .../mod_media_gateway/media_gateway.c | 47 +++++++++++-------- src/mod/endpoints/mod_sofia/rtp.c | 38 +++++++++++++++ 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 16bdacdad7..34fb3f469a 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -178,6 +178,7 @@ static const char* channel_get_variable(switch_core_session_t *session, switch_e ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session_t **sp); void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream); void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream); +void ctdm_init(switch_loadable_module_interface_t *module_interface); static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel, int32_t id) { @@ -5359,6 +5360,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load) SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE); SWITCH_ADD_APP(app_interface, "enable_dtmf", "Enable DTMF Detection", "Enable DTMF Detection", enable_dtmf_function, "", SAF_NONE); + ctdm_init(*module_interface); + /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8fbd08abf5..fe2804d212 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -88,19 +88,6 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_status_t status = SWITCH_STATUS_SUCCESS; char dialstring[100]; switch_call_cause_t cause; - - if (!zstr(term->uuid)) { - /* A UUID is present, check if the channel still exists */ - switch_core_session_t *session; - if ((session = switch_core_session_locate(term->uuid))) { - switch_core_session_rwunlock(session); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel [%s] already exists for termination [%s]\n", term->uuid, term->name); - return SWITCH_STATUS_SUCCESS; - } - - /* The referenced channel doesn't exist anymore, clear it */ - term->uuid = NULL; - } switch_event_create(&var_event, SWITCH_EVENT_CLONE); @@ -126,14 +113,35 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) /* Set common variables on the channel */ switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true"); + + if (!zstr(term->uuid)) { + /* A UUID is present, check if the channel still exists */ + switch_core_session_t *session; + if ((session = switch_core_session_locate(term->uuid))) { + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "command", "media_modify"); + + switch_core_session_receive_event(session, &var_event); - if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); - status = SWITCH_STATUS_FALSE; - goto done; + switch_core_session_rwunlock(session); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent refresh to channel [%s], for termination [%s]\n", term->uuid, term->name); + + return SWITCH_STATUS_SUCCESS; + } + + /* The referenced channel doesn't exist anymore, clear it */ + term->uuid = NULL; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + if (!zstr(term->uuid)) { + if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); + status = SWITCH_STATUS_FALSE; + goto done; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + } switch_set_flag(term, MGT_ACTIVE); @@ -162,7 +170,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id); } else { for (term = profile->physical_terminations; term; term = term->next) { - if (!strncasecmp(prefix, term->name, prefixlen) && !switch_test_flag(term, MGT_ALLOCATED)) { + if (!switch_test_flag(term, MGT_ALLOCATED) && !strncasecmp(prefix, term->name, prefixlen)) { switch_set_flag(term, MGT_ALLOCATED); return term; } @@ -185,6 +193,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->u.rtp.local_port = switch_rtp_request_port(term->u.rtp.local_addr); term->u.rtp.codec = megaco_codec_str(profile->default_codec); term->u.rtp.term_id = term_id; + term->u.rtp.ptime = 20; term->name = switch_core_strdup(term->pool, name); } diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index a464beb1be..631c8e7711 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -93,6 +93,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id); static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf); +static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event); switch_state_handler_table_t crtp_state_handlers = { .on_init = channel_on_init, @@ -104,6 +105,7 @@ switch_io_routines_t crtp_io_routines = { .read_frame = channel_read_frame, .write_frame = channel_write_frame, .receive_message = channel_receive_message, + .receive_event = channel_receive_event, .send_dtmf = channel_send_dtmf }; @@ -395,6 +397,42 @@ static switch_status_t channel_send_dtmf(switch_core_session_t *session, const s return SWITCH_STATUS_SUCCESS; } +static switch_bool_t compare_var(switch_event_t *event, switch_channel_t *channel, const char *varname) +{ + const char *chan_val = switch_channel_get_variable_dup(channel, varname, SWITCH_FALSE, -1); + const char *event_val = switch_event_get_header(event, varname); + + return strcasecmp(chan_val, event_val); +} + +static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event) +{ + const char *command = switch_event_get_header(event, "command"); + switch_channel_t *channel = switch_core_session_get_channel(session); + + if (!zstr(command) && !strcasecmp(command, "media_modify")) { + /* Compare parameters */ + if (compare_var(event, channel, kREMOTEADDR) || + compare_var(event, channel, kREMOTEPORT) || + compare_var(event, channel, kLOCALADDR) || + compare_var(event, channel, kLOCALPORT)) { + /* We need to reset the rtp session */ + + } + + if (compare_var(event, channel, kCODEC) || + compare_var(event, channel, kPTIME) || + compare_var(event, channel, kPT) || + compare_var(event, channel, kRATE)) { + /* Reset codec */ + + } + + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); + } +} + static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) { crtp_private_t *tech_pvt = NULL; From 4f6f7eb4564128d7849c777348a10f623f9d4fa8 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 19:34:15 -0400 Subject: [PATCH 336/493] refactor error --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index fe2804d212..70d31e6f55 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -133,7 +133,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) term->uuid = NULL; } - if (!zstr(term->uuid)) { + if (zstr(term->uuid)) { if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); status = SWITCH_STATUS_FALSE; From 87569c0ba9dd35fbce307369aeaeed0b5c116c91 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 19:37:16 -0400 Subject: [PATCH 337/493] properly git rid of span_id --- libs/freetdm/mod_freetdm/tdm.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 53ee192cf0..405e4a9aad 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -97,8 +97,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_memory_pool_t **pool, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) { - const char *szspanid = switch_event_get_header(var_event, kSPAN_ID), - *szchanid = switch_event_get_header(var_event, kCHAN_ID), + const char *szchanid = switch_event_get_header(var_event, kCHAN_ID), *span_name = switch_event_get_header(var_event, kSPAN_NAME); int chan_id; int span_id; @@ -113,22 +112,20 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ctdm_private_t *tech_pvt = NULL; - if (zstr(szchanid) || (zstr(szspanid) && zstr(span_name))) { + if (zstr(szchanid) || zstr(span_name)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both ["kSPAN_ID"] and ["kCHAN_ID"] have to be set.\n"); goto fail; } chan_id = atoi(szchanid); - span_id = atoi(szspanid); - - if (!span_id) { - if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) { - span_id = ftdm_span_get_id(span); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n"); - } + + if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) { + span_id = ftdm_span_get_id(span); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n"); } + if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); From 4950c32dd542069e73ffac4d1eff1934af189b5a Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 19:37:47 -0400 Subject: [PATCH 338/493] properly git rid of span_id --- libs/freetdm/mod_freetdm/tdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 405e4a9aad..5c259e0cd1 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -123,7 +123,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) { span_id = ftdm_span_get_id(span); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name); } From 63b2654b54488c74b10de76a6a474ef79aa18bc5 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Jul 2012 19:47:41 -0400 Subject: [PATCH 339/493] commit -- fix stash pop err --- libs/freetdm/mod_freetdm/tdm.c | 1 - .../media_gateway_cmd_handler.c | 29 +++++++++++++++---- src/mod/endpoints/mod_sofia/rtp.c | 2 ++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 5c259e0cd1..de52934570 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -119,7 +119,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi chan_id = atoi(szchanid); - if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) { span_id = ftdm_span_get_id(span); } else { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5f756ac249..e040340e2c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -540,8 +540,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MG_SET_VAL_PRES(new_ctxtId->val, mg_ctxt->context_id); } else { - /* context already present */ - memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + /* context already present */ + memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + mg_ctxt = megaco_get_context(mg_profile, inc_cmd->contextId.val.val); + if(NULL == mg_ctxt){ + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } } /********************************************************************/ @@ -565,6 +571,17 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* allocate rtp term and associated the same to context */ /********************************************************************/ }else{ /* Physical termination */ + printf("termId->name.lcl.val[%s]\n",termId->name.lcl.val); + term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + + if(NULL == term){ + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + /* get physical termination */ } @@ -672,9 +689,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MgMgcoLocalDesc *local; CmSdpInfoSet *psdp; char* ipAddress[4];// = "192.168.1.1"; + char* dup = strdup((char*)term->u.rtp.local_addr); MgMgcoMediaDesc* media = &desc->u.media; - switch_split((char*)term->u.rtp.local_addr,'.',ipAddress); + switch_split(dup,'.',ipAddress); printf("ipAddress[0]=%s, ipAddress[1]=%s, ipAddress[2]=%s,ipAddress[3]=%s\n",ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]); @@ -812,8 +830,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); - //MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), 2904); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), &media->field.par.numProtFmts, &rsp.u.mgCmdRsp[0]->memCp) != ROK) @@ -852,6 +869,8 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->u.ptime), term->u.rtp.ptime); } } + + free(dup); } diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 631c8e7711..3ab784d74d 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -431,6 +431,8 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); } + + return SWITCH_STATUS_SUCCESS; } static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) From 5284f5d134e11372eff658bd9d5a9530c33b6be3 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 19:56:25 -0400 Subject: [PATCH 340/493] missing goto fail --- libs/freetdm/mod_freetdm/tdm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 5c259e0cd1..5b9f1486ec 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -124,6 +124,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi span_id = ftdm_span_get_id(span); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name); + goto fail; } From 706c662f4b94cfc225a8de0c92e200fa8d9361cd Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 20:04:35 -0400 Subject: [PATCH 341/493] fix crash on chan open failure --- libs/freetdm/mod_freetdm/tdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 5b9f1486ec..9ef95a7bfc 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -270,9 +270,9 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) if (tech_pvt->write_codec.implementation) { switch_core_codec_destroy(&tech_pvt->write_codec); } + + ftdm_channel_close(&tech_pvt->ftdm_channel); } - - ftdm_channel_close(&tech_pvt->ftdm_channel); return SWITCH_STATUS_SUCCESS; } From 3c382781340922e4d440afc3cf59280c4a2a761e Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 25 Jul 2012 20:41:01 -0400 Subject: [PATCH 342/493] Added new channel type clear-channel for channels that do not have a signalling module --- libs/freetdm/src/ftdm_io.c | 30 ++++++++++++++----- .../src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 3 +- libs/freetdm/src/include/freetdm.h | 3 +- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index ec623ad6e6..2a5f1cb6ee 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1470,13 +1470,23 @@ FT_DECLARE(ftdm_status_t) ftdm_group_channel_use_count(ftdm_group_t *group, uint static __inline__ int chan_is_avail(ftdm_channel_t *check) { - if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || - !ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) || - ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || - ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || - ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || - check->state != FTDM_CHANNEL_STATE_DOWN) { - return 0; + if (check->type == FTDM_CHAN_TYPE_CLEAR) { + if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || + ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || + ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || + ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || + check->state != FTDM_CHANNEL_STATE_DOWN) { + return 0; + } + } else { + if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || + !ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) || + ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || + ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || + ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || + check->state != FTDM_CHANNEL_STATE_DOWN) { + return 0; + } } return 1; } @@ -5129,6 +5139,12 @@ static ftdm_status_t load_config(void) } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } + } else if (!strcasecmp(var, "clear-channel")) { + unsigned chans_configured = 0; + chan_config.type = FTDM_CHAN_TYPE_CLEAR; + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else if (!strcasecmp(var, "b-channel")) { unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_B; diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c index 87ba7ed728..85ccba53bb 100755 --- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c +++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c @@ -306,7 +306,8 @@ static unsigned wp_open_range(ftdm_span_t *span, unsigned spanno, unsigned start if (type == FTDM_CHAN_TYPE_FXS || type == FTDM_CHAN_TYPE_FXO || type == FTDM_CHAN_TYPE_CAS - || type == FTDM_CHAN_TYPE_B) { + || type == FTDM_CHAN_TYPE_B + || type == FTDM_CHAN_TYPE_CLEAR) { int err; hwec_str = "unavailable"; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index f7de8519b7..a45fdfe661 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -181,9 +181,10 @@ typedef enum { FTDM_CHAN_TYPE_FXO, /*!< FXO analog channel */ FTDM_CHAN_TYPE_EM, /*!< E & M channel */ FTDM_CHAN_TYPE_CAS, /*!< CAS channel */ + FTDM_CHAN_TYPE_CLEAR, /* Clear channnel - no signalling module */ FTDM_CHAN_TYPE_COUNT /*!< Count of channel types */ } ftdm_chan_type_t; -#define CHAN_TYPE_STRINGS "B", "DQ921", "DQ931", "FXS", "FXO", "EM", "CAS", "INVALID" +#define CHAN_TYPE_STRINGS "B", "DQ921", "DQ931", "FXS", "FXO", "EM", "CAS", "CLEAR", "INVALID" /*! \brief transform from channel type to string and from string to channel type * ftdm_str2ftdm_chan_type transforms a channel string (ie: "FXO" to FTDM_CHAN_TYPE_FXO) * ftdm_chan_type2str transforms a channel type to string (ie: FTDM_CHAN_TYPE_B to "B") From ae84538819c9769fe2cd59472cbb6d4942514b13 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 20:49:33 -0400 Subject: [PATCH 343/493] mark tdm channel as answered immediately --- libs/freetdm/mod_freetdm/tdm.c | 2 ++ src/switch_rtp.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 9ef95a7bfc..a01ac153b2 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -228,6 +228,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } + switch_channel_mark_answered(channel); + return SWITCH_CAUSE_SUCCESS; fail: diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 3bad17ce17..3cc5255e8b 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -34,6 +34,8 @@ //#define RTP_DEBUG_WRITE_DELTA //#define DEBUG_MISSED_SEQ +typedef unsigned long u_long; + #include #include #include @@ -1451,7 +1453,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_crypto_key(switch_rtp_t *rtp_sess uint32_t index, switch_rtp_crypto_key_type_t type, unsigned char *key, switch_size_t keylen) { #ifndef ENABLE_SRTP - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "SRTP NOT SUPPORTED IN THIS BUILD!\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SRTP NOT SUPPORTED IN THIS BUILD!\n"); return SWITCH_STATUS_FALSE; #else switch_rtp_crypto_key_t *crypto_key; From c6fecc1ee814939dfefdbe80a84fff6d964cddc8 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 20:50:18 -0400 Subject: [PATCH 344/493] go in consume media right away --- libs/freetdm/mod_freetdm/tdm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index a01ac153b2..6076c193fe 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -256,6 +256,9 @@ fail: static switch_status_t channel_on_init(switch_core_session_t *session) { + switch_channel_t *channel = switch_core_session_get_channel(session); + + switch_channel_set_state(channel, CS_CONSUME_MEDIA); return SWITCH_STATUS_SUCCESS; } From 3bf9fef864ceb8854734003b51880b38bee1ed47 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 20:54:47 -0400 Subject: [PATCH 345/493] originate returns a status, not a cause --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 70d31e6f55..3ed79ab36a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -134,7 +134,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) } if (zstr(term->uuid)) { - if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) { + if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); status = SWITCH_STATUS_FALSE; goto done; From b1398aaccbd6cf7aa4bde189c6006ebc099b076e Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 20:59:09 -0400 Subject: [PATCH 346/493] Im feeling bold --- src/switch_rtp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 3cc5255e8b..16e473e30f 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -1834,6 +1834,7 @@ SWITCH_DECLARE(switch_rtp_t *) switch_rtp_new(const char *rx_host, goto end; } +#if 0 if (zstr(tx_host)) { *err = "Missing remote host"; goto end; @@ -1843,6 +1844,7 @@ SWITCH_DECLARE(switch_rtp_t *) switch_rtp_new(const char *rx_host, *err = "Missing remote port"; goto end; } +#endif if (switch_rtp_create(&rtp_session, payload, samples_per_interval, ms_per_packet, flags, timer_name, err, pool) != SWITCH_STATUS_SUCCESS) { goto end; @@ -1856,7 +1858,7 @@ SWITCH_DECLARE(switch_rtp_t *) switch_rtp_new(const char *rx_host, goto end; } - if (switch_rtp_set_remote_address(rtp_session, tx_host, tx_port, 0, SWITCH_TRUE, err) != SWITCH_STATUS_SUCCESS) { + if (!zstr(tx_host) && switch_rtp_set_remote_address(rtp_session, tx_host, tx_port, 0, SWITCH_TRUE, err) != SWITCH_STATUS_SUCCESS) { switch_mutex_unlock(rtp_session->flag_mutex); rtp_session = NULL; goto end; From 051692d268e9b180ec6e50b16af18d0f398af5a3 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:04:15 -0400 Subject: [PATCH 347/493] save the uuid --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3ed79ab36a..9805548b6f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -140,6 +140,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) goto done; } + term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); } From 0494df1ac4054e34ee6210442ba98bc50eec853d Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:06:47 -0400 Subject: [PATCH 348/493] give the tdm channels their caller profile so switch_ivr_uuid_bridge doesn't piss its pants off --- libs/freetdm/mod_freetdm/tdm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 6076c193fe..6398515b72 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -101,7 +101,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi *span_name = switch_event_get_header(var_event, kSPAN_NAME); int chan_id; int span_id; - + switch_caller_profile_t *caller_profile; ftdm_span_t *span; ftdm_channel_t *chan; switch_channel_t *channel; @@ -149,6 +149,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->session = *new_session; switch_core_session_set_private(*new_session, tech_pvt); + + caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); + switch_channel_set_caller_profile(channel, caller_profile); + snprintf(name, sizeof(name), "tdm/%d:%d", span_id, chan_id); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connect outbound channel %s\n", name); switch_channel_set_name(channel, name); From 4d3038c9e4e882116ca53e2fe25910caf91b7078 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:16:14 -0400 Subject: [PATCH 349/493] add logging before uuid_bridge, set frame->codec from tech_pvt->read_codec --- libs/freetdm/mod_freetdm/tdm.c | 1 + src/mod/endpoints/mod_media_gateway/media_gateway.c | 4 ++++ src/mod/endpoints/mod_sofia/rtp.c | 1 + 3 files changed, 6 insertions(+) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 6398515b72..89e0d3c464 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -337,6 +337,7 @@ top: *frame = &tech_pvt->read_frame; tech_pvt->read_frame.datalen = (uint32_t)len; tech_pvt->read_frame.samples = tech_pvt->read_frame.datalen; + tech_pvt->read_frame = &tech_pvt->read_codec; if (ftdm_channel_get_codec(tech_pvt->ftdm_channel) == FTDM_CODEC_SLIN) { tech_pvt->read_frame.samples /= 2; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 9805548b6f..3d10abf05c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -286,6 +286,10 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination megaco_activate_termination(ctx->terminations[1]); } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bridging: %s (%s) <> %s (%s)\n", + ctx->terminations[0]->name, ctx->terminations[0]->uuid, + ctx->terminations[1]->name, ctx->terminations[1]->uuid); + switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); } diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 631c8e7711..43e2725224 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -325,6 +325,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch } tech_pvt->read_frame.flags = SFF_NONE; + tech_pvt->read_frame.codec = &tech_pvt->read_codec; status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame, flags); if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { From f85347cf7221f6c0a5eee1a783a28f2ba71ef1d9 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:16:46 -0400 Subject: [PATCH 350/493] add logging before uuid_bridge, set frame->codec from tech_pvt->read_codec --- libs/freetdm/mod_freetdm/tdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 89e0d3c464..f22ded6cb1 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -337,7 +337,7 @@ top: *frame = &tech_pvt->read_frame; tech_pvt->read_frame.datalen = (uint32_t)len; tech_pvt->read_frame.samples = tech_pvt->read_frame.datalen; - tech_pvt->read_frame = &tech_pvt->read_codec; + tech_pvt->read_frame.codec = &tech_pvt->read_codec; if (ftdm_channel_get_codec(tech_pvt->ftdm_channel) == FTDM_CODEC_SLIN) { tech_pvt->read_frame.samples /= 2; From 039c18638c16c71b7165615b34437a8e871af961 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:26:53 -0400 Subject: [PATCH 351/493] allocate recv buffer for tdm --- libs/freetdm/mod_freetdm/tdm.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index f22ded6cb1..2e81c59c71 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -52,6 +52,8 @@ typedef struct { switch_core_session_t *session; switch_codec_t read_codec, write_codec; switch_frame_t read_frame; + + unsigned char databuf[SWITCH_RECOMMENDED_BUFFER_SIZE]; } ctdm_private_t; static switch_status_t channel_on_init(switch_core_session_t *session); @@ -147,6 +149,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->span_id = span_id; tech_pvt->ftdm_channel = chan; tech_pvt->session = *new_session; + tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf); + tech_pvt->read_frame.data = tech_pvt->databuf; switch_core_session_set_private(*new_session, tech_pvt); From c649c5b02355934e5394b3eba0d15be6a4906427 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:49:47 -0400 Subject: [PATCH 352/493] allow remote addr modification on rtp --- src/mod/endpoints/mod_sofia/rtp.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 43e2725224..215f545990 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -410,15 +410,25 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi { const char *command = switch_event_get_header(event, "command"); switch_channel_t *channel = switch_core_session_get_channel(session); + crtp_private_t *tech_pvt = switch_core_session_get_private(session); if (!zstr(command) && !strcasecmp(command, "media_modify")) { /* Compare parameters */ if (compare_var(event, channel, kREMOTEADDR) || - compare_var(event, channel, kREMOTEPORT) || - compare_var(event, channel, kLOCALADDR) || - compare_var(event, channel, kLOCALPORT)) { - /* We need to reset the rtp session */ + compare_var(event, channel, kREMOTEPORT)) { + char *remote_addr = switch_event_get_header(event, kREMOTEADDR); + char *szremote_port = switch_event_get_header(event, kREMOTEADDR); + switch_port_t remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; + switch_channel_set_variable(channel, kREMOTEADDR, remote_addr); + switch_channel_set_variable(channel, kREMOTEPORT, szremote_port); + const char *err; + + if (switch_rtp_set_remote_address(tech_pvt->rtp_session, remote_addr, remote_port, 0, SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error setting RTP remote address: %s\n", err); + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Set RTP remote: %s:%d\n", remote_addr, (int)remote_port); + } } if (compare_var(event, channel, kCODEC) || @@ -426,7 +436,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi compare_var(event, channel, kPT) || compare_var(event, channel, kRATE)) { /* Reset codec */ - + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec not yet implemented\n"); } } else { From 84796f84f1b2625bf85bb3d208da698ac9b87dae Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 21:58:03 -0400 Subject: [PATCH 353/493] allow remote addr modification on rtp --- src/mod/endpoints/mod_sofia/rtp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 215f545990..b24bb1653a 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -419,10 +419,11 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi char *remote_addr = switch_event_get_header(event, kREMOTEADDR); char *szremote_port = switch_event_get_header(event, kREMOTEADDR); switch_port_t remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; + const char *err; + switch_channel_set_variable(channel, kREMOTEADDR, remote_addr); switch_channel_set_variable(channel, kREMOTEPORT, szremote_port); - const char *err; if (switch_rtp_set_remote_address(tech_pvt->rtp_session, remote_addr, remote_port, 0, SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error setting RTP remote address: %s\n", err); @@ -438,7 +439,6 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi /* Reset codec */ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec not yet implemented\n"); } - } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); } From 43e39619ae76be00bedf2f15276b04cc0fbb6ec5 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 25 Jul 2012 22:24:12 -0400 Subject: [PATCH 354/493] prevent writes if we dont have a remote addr --- src/mod/endpoints/mod_sofia/rtp.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index b24bb1653a..a12b3c6e55 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -188,11 +188,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->dtmf_type = DTMF_2833; /* XXX */ if (zstr(local_addr) || local_port == 0) { - tech_pvt->mode = RTP_SENDONLY; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "The local address and port must be set\n"); + goto fail; } else if (zstr(remote_addr) || remote_port == 0) { - tech_pvt->mode = RTP_SENDRECV; + tech_pvt->mode = RTP_RECVONLY; } else { - + tech_pvt->mode = RTP_SENDRECV; } switch_core_session_set_private(*new_session, tech_pvt); @@ -314,7 +315,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch tech_pvt = switch_core_session_get_private(session); assert(tech_pvt != NULL); - if (!tech_pvt->rtp_session) { + if (!tech_pvt->rtp_session || tech_pvt->mode == RTP_RECVONLY) { goto cng; } @@ -429,6 +430,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error setting RTP remote address: %s\n", err); } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Set RTP remote: %s:%d\n", remote_addr, (int)remote_port); + tech_pvt->mode = RTP_SENDRECV; } } @@ -439,6 +441,15 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi /* Reset codec */ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec not yet implemented\n"); } + + if (compare_var(event, channel, kRFC2833PT)) { + const char *szpt = switch_channel_get_variable(channel, kRFC2833PT); + int pt = !zstr(szpt) ? atoi(szpt) : 0; + + switch_channel_set_variable(channel, kRFC2833PT, szpt); + switch_rtp_set_telephony_event(tech_pvt->rtp_session, pt); + } + } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); } From a4bb00023c6f785a96589e8611bd02493d92ad03 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 25 Jul 2012 23:16:32 -0400 Subject: [PATCH 355/493] Reverted back clear-channel, used existing FTDM_SIGTYPE instead --- libs/freetdm/src/ftdm_io.c | 8 +------- libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 3 +-- libs/freetdm/src/include/freetdm.h | 3 +-- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 2a5f1cb6ee..b8b9cff527 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1470,7 +1470,7 @@ FT_DECLARE(ftdm_status_t) ftdm_group_channel_use_count(ftdm_group_t *group, uint static __inline__ int chan_is_avail(ftdm_channel_t *check) { - if (check->type == FTDM_CHAN_TYPE_CLEAR) { + if (check->span->signal_type == FTDM_SIGTYPE_NONE) { if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || @@ -5139,12 +5139,6 @@ static ftdm_status_t load_config(void) } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } - } else if (!strcasecmp(var, "clear-channel")) { - unsigned chans_configured = 0; - chan_config.type = FTDM_CHAN_TYPE_CLEAR; - if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { - configured += chans_configured; - } } else if (!strcasecmp(var, "b-channel")) { unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_B; diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c index 85ccba53bb..87ba7ed728 100755 --- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c +++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c @@ -306,8 +306,7 @@ static unsigned wp_open_range(ftdm_span_t *span, unsigned spanno, unsigned start if (type == FTDM_CHAN_TYPE_FXS || type == FTDM_CHAN_TYPE_FXO || type == FTDM_CHAN_TYPE_CAS - || type == FTDM_CHAN_TYPE_B - || type == FTDM_CHAN_TYPE_CLEAR) { + || type == FTDM_CHAN_TYPE_B) { int err; hwec_str = "unavailable"; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index a45fdfe661..f7de8519b7 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -181,10 +181,9 @@ typedef enum { FTDM_CHAN_TYPE_FXO, /*!< FXO analog channel */ FTDM_CHAN_TYPE_EM, /*!< E & M channel */ FTDM_CHAN_TYPE_CAS, /*!< CAS channel */ - FTDM_CHAN_TYPE_CLEAR, /* Clear channnel - no signalling module */ FTDM_CHAN_TYPE_COUNT /*!< Count of channel types */ } ftdm_chan_type_t; -#define CHAN_TYPE_STRINGS "B", "DQ921", "DQ931", "FXS", "FXO", "EM", "CAS", "CLEAR", "INVALID" +#define CHAN_TYPE_STRINGS "B", "DQ921", "DQ931", "FXS", "FXO", "EM", "CAS", "INVALID" /*! \brief transform from channel type to string and from string to channel type * ftdm_str2ftdm_chan_type transforms a channel string (ie: "FXO" to FTDM_CHAN_TYPE_FXO) * ftdm_chan_type2str transforms a channel type to string (ie: FTDM_CHAN_TYPE_B to "B") From ee8047ebbf3314749712155a6775283c449fccda Mon Sep 17 00:00:00 2001 From: root Date: Thu, 26 Jul 2012 12:30:33 -0400 Subject: [PATCH 356/493] changes on test box --- .../media_gateway_cmd_handler.c | 24 +- .../mod_media_gateway/media_gateway_stack.h | 9 +- .../mod_media_gateway/media_gateway_utils.c | 489 +++++++++--------- .../mod_media_gateway/mod_media_gateway.c | 4 +- .../mod_media_gateway/mod_media_gateway.h | 1 + src/mod/endpoints/mod_sofia/rtp.c | 19 +- src/switch_channel.c | 4 +- src/switch_rtp.c | 2 +- 8 files changed, 296 insertions(+), 256 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index e040340e2c..27fe1a4a4b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -301,6 +301,8 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * } } + mgco_handle_sdp(&local->sdp, term, MG_SDP_LOCAL); + break; } @@ -311,6 +313,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * remote = &mediaPar->u.remote; sdp = remote->sdp.info[0]; /* for Matt - same like local descriptor */ + mgco_handle_sdp(&remote->sdp, term, MG_SDP_REMOTE); break; } @@ -403,12 +406,12 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * if (mgStream->sl.remote.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_print_sdp(&mgStream->sl.remote.sdp); + mgco_handle_sdp(&mgStream->sl.remote.sdp, term, MG_SDP_LOCAL); } if (mgStream->sl.local.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_print_sdp(&mgStream->sl.local.sdp); + mgco_handle_sdp(&mgStream->sl.local.sdp, term, MG_SDP_REMOTE); } break; @@ -567,11 +570,8 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i is_rtp = 0x01; - /* TODO - Matt */ - /* allocate rtp term and associated the same to context */ - /********************************************************************/ + /********************************************************************/ }else{ /* Physical termination */ - printf("termId->name.lcl.val[%s]\n",termId->name.lcl.val); term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); if(NULL == term){ @@ -581,9 +581,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); - - - /* get physical termination */ } /********************************************************************/ /* associate physical termination to context */ @@ -694,8 +691,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i switch_split(dup,'.',ipAddress); - printf("ipAddress[0]=%s, ipAddress[1]=%s, ipAddress[2]=%s,ipAddress[3]=%s\n",ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]); - /* Most probably we need to add local descriptor */ /* allocating mem for local descriptor */ @@ -918,8 +913,8 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand MgMgcoInd *mgErr; MgMgcoTermId *termId; MgMgcoTermIdLst* termLst; - mg_termination_t* term = NULL; - switch_status_t ret; + mg_termination_t* term = NULL; + switch_status_t ret; int err_code; /*MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod;*/ U32 txn_id = inc_cmd->transId.val; @@ -1033,6 +1028,9 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + /* SDP updated to termination */ + + megaco_activate_termination(term); } /********************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 8c429ef620..9401ce49ce 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -15,6 +15,13 @@ #define MG_INACTIVITY_TMR_RESOLUTION 100 /* mit in ito package is experessed in 10ms steps */ +typedef enum{ + MG_SDP_NONE, + MG_SDP_LOCAL, + MG_SDP_REMOTE, +}mgco_sdp_types_e; + + typedef enum{ SNG_MG_TPT_NONE, SNG_MG_TPT_UDP, @@ -151,7 +158,7 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, m switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); -void mgco_print_sdp(CmSdpInfoSet *sdp); +void mgco_handle_sdp(CmSdpInfoSet *sdp,mg_termination_t* term, mgco_sdp_types_e sdp_type); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId); switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 4e4d34b736..56a1ffdc3a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -740,8 +740,11 @@ void mgco_print_sdp_attr_set(CmSdpAttrSet *s) } -void mgco_print_sdp_c_line(CmSdpConn *s) +void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) { + char ipadd[12]; + memset(ipadd, 0, 12); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP connection line ****** \n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", @@ -760,7 +763,21 @@ void mgco_print_sdp_c_line(CmSdpConn *s) s->u.ip4.u.uniIp.b[1].val, s->u.ip4.u.uniIp.b[2].val, s->u.ip4.u.uniIp.b[3].val); - } + + if(MG_SDP_REMOTE == sdp_type) { + sprintf(ipadd,"%d.%d.%d.%d", + s->u.ip4.u.uniIp.b[0].val, + s->u.ip4.u.uniIp.b[1].val, + s->u.ip4.u.uniIp.b[2].val, + s->u.ip4.u.uniIp.b[3].val); + printf("Remote ip = %s \n", ipadd); + /* update remote ip */ + if(MG_TERM_RTP == term->type){ + term->u.rtp.remote_addr = strdup(ipadd); + printf("Update remote ip to [%s]\n", term->u.rtp.remote_addr); + } + } + } } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); } @@ -834,255 +851,263 @@ void mgco_print_sdp_media_param(CmSdpMedPar *s) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); } -void mgco_print_sdp(CmSdpInfoSet *sdp) +void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e sdp_type) { - int i; + int i; + + if (sdp->numComp.pres == NOTPRSNT) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " No %s SDP present \n", (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE"); + return; + } + + for (i = 0; i < sdp->numComp.val; i++) { + CmSdpInfo *s = sdp->info[i]; + int mediaId; + + /************************************************************************************************************************/ + /* info presence check */ + if(NOTPRSNT == s->pres.pres) continue; + + /************************************************************************************************************************/ + /* Version */ + if(NOTPRSNT != s->ver.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " SDP Version = %d \n", s->ver.val); + } + + /************************************************************************************************************************/ + /* Orig */ + if(NOTPRSNT != s->orig.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); + + if(NOTPRSNT != s->orig.orig.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t User Name = %s \n", + (NOTPRSNT != s->orig.orig.usrName.pres)?(char*)s->orig.orig.usrName.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Id = %s \n", + (NOTPRSNT != s->orig.orig.sessId.pres)?(char*)s->orig.orig.sessId.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Version = %s \n", + (NOTPRSNT != s->orig.orig.sessVer.pres)?(char*)s->orig.orig.sessVer.val:"Not Present"); + + /* sdpAddr */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", + (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)?s->orig.orig.sdpAddr.netType.type.val:-1); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", + (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres)?s->orig.orig.sdpAddr.addrType.val:-1); + + /* print IPV4 address */ + if (s->orig.orig.sdpAddr.addrType.pres && s->orig.orig.sdpAddr.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + s->orig.orig.sdpAddr.netType.type.val == CM_SDP_NET_TYPE_IN && + s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + + if (s->orig.orig.sdpAddr.u.ip4.addrType.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + s->orig.orig.sdpAddr.u.ip4.u.ip.b[0].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[1].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[2].val, + s->orig.orig.sdpAddr.u.ip4.u.ip.b[3].val); + } + + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** ****** \n"); + } + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + } + /************************************************************************************************************************/ + /* Session Name (s = line) */ + + if(NOTPRSNT != s->sessName.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Name = %s \n", s->sessName.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t s-line not present \n"); + } + + /************************************************************************************************************************/ + /* Session Info(i= line) */ + + if(NOTPRSNT != s->info.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Info = %s \n", s->info.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t i-line not present \n"); + } + + /************************************************************************************************************************/ + /* Session Uri */ + + if(NOTPRSNT != s->uri.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Uri = %s \n", s->uri.val); + } else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t uri not present \n"); + } + + /************************************************************************************************************************/ + /* E-Mail */ + /* TODO */ - if (sdp->numComp.pres == NOTPRSNT) { - return; - } - - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; - - /************************************************************************************************************************/ - /* info presence check */ - if(NOTPRSNT == s->pres.pres) continue; - - /************************************************************************************************************************/ - /* Version */ - if(NOTPRSNT != s->ver.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " SDP Version = %d \n", s->ver.val); - } - - /************************************************************************************************************************/ - /* Orig */ - if(NOTPRSNT != s->orig.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); - - if(NOTPRSNT != s->orig.orig.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t User Name = %s \n", - (NOTPRSNT != s->orig.orig.usrName.pres)?(char*)s->orig.orig.usrName.val:"Not Present"); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Id = %s \n", - (NOTPRSNT != s->orig.orig.sessId.pres)?(char*)s->orig.orig.sessId.val:"Not Present"); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Version = %s \n", - (NOTPRSNT != s->orig.orig.sessVer.pres)?(char*)s->orig.orig.sessVer.val:"Not Present"); - - /* sdpAddr */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", - (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)?s->orig.orig.sdpAddr.netType.type.val:-1); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", - (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres)?s->orig.orig.sdpAddr.addrType.val:-1); - - /* print IPV4 address */ - if (s->orig.orig.sdpAddr.addrType.pres && s->orig.orig.sdpAddr.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->orig.orig.sdpAddr.netType.type.val == CM_SDP_NET_TYPE_IN && - s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { - - if (s->orig.orig.sdpAddr.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", - s->orig.orig.sdpAddr.u.ip4.u.ip.b[0].val, - s->orig.orig.sdpAddr.u.ip4.u.ip.b[1].val, - s->orig.orig.sdpAddr.u.ip4.u.ip.b[2].val, - s->orig.orig.sdpAddr.u.ip4.u.ip.b[3].val); - } - - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** ****** \n"); - } - } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); - } - /************************************************************************************************************************/ - /* Session Name (s = line) */ - - if(NOTPRSNT != s->sessName.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Name = %s \n", s->sessName.val); - } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t s-line not present \n"); - } - - /************************************************************************************************************************/ - /* Session Info(i= line) */ - - if(NOTPRSNT != s->info.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Info = %s \n", s->info.val); - } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t i-line not present \n"); - } - - /************************************************************************************************************************/ - /* Session Uri */ - - if(NOTPRSNT != s->uri.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Uri = %s \n", s->uri.val); - } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t uri not present \n"); - } - - /************************************************************************************************************************/ - /* E-Mail */ - /* TODO */ + /************************************************************************************************************************/ + /* Phone */ + /* TODO */ - /************************************************************************************************************************/ - /* Phone */ - /* TODO */ + /************************************************************************************************************************/ + /* connection line */ + + mgco_handle_sdp_c_line(&s->conn, term, sdp_type); + /************************************************************************************************************************/ + /* Bandwidth */ + /* TODO */ + + /************************************************************************************************************************/ + /* SDP Time (t= line)*/ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "*** t-line **************** \n"); + if(NOTPRSNT != s->sdpTime.pres.pres) { + if(NOTPRSNT != s->sdpTime.sdpOpTimeSet.numComp.pres) { + int i = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); + for (i = 0;isdpTime.sdpOpTimeSet.numComp.val;i++){ + CmSdpOpTime* t = s->sdpTime.sdpOpTimeSet.sdpOpTime[i]; + if(NOTPRSNT == t->pres.pres) continue; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Start Time = %s \n", + (NOTPRSNT != t->startTime.pres)?(char*)t->startTime.val:"Not Present"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Stop Time = %s \n", + (NOTPRSNT != t->stopTime.pres)?(char*)t->stopTime.val:"Not Present"); + + /*repeat time repFieldSet */ + + if(NOTPRSNT != t->repFieldSet.numComp.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time present with total component[%d]\n", + t->repFieldSet.numComp.val); + + /*TODO - print repeat fields */ + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time not present \n"); + } + } /* sdpOpTimeSet.numComp for loop -- end */ + }else{/*sdpOpTimeSet.numComp.pres if -- end */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time not present \n"); + } + + /*TODO - zoneAdjSet */ + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "t-line not present \n"); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); - /************************************************************************************************************************/ - /* connection line */ + /************************************************************************************************************************/ + /* key type (k= line)*/ - mgco_print_sdp_c_line(&s->conn); - /************************************************************************************************************************/ - /* Bandwidth */ - /* TODO */ + if(NOTPRSNT != s->keyType.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Type = %d \n", + (NOTPRSNT != s->keyType.keyType.pres)?s->keyType.keyType.val:-1); - /************************************************************************************************************************/ - /* SDP Time (t= line)*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Data = %s \n", + (NOTPRSNT != s->keyType.key_data.pres)?(char*)s->keyType.key_data.val:"Not Present"); + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "k-line not present \n"); + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "*** t-line **************** \n"); - if(NOTPRSNT != s->sdpTime.pres.pres) { - if(NOTPRSNT != s->sdpTime.sdpOpTimeSet.numComp.pres) { - int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); - for (i = 0;isdpTime.sdpOpTimeSet.numComp.val;i++){ - CmSdpOpTime* t = s->sdpTime.sdpOpTimeSet.sdpOpTime[i]; - if(NOTPRSNT == t->pres.pres) continue; + /************************************************************************************************************************/ + /* Attribute Set */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Start Time = %s \n", - (NOTPRSNT != t->startTime.pres)?(char*)t->startTime.val:"Not Present"); + mgco_print_sdp_attr_set(&s->attrSet); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Stop Time = %s \n", - (NOTPRSNT != t->stopTime.pres)?(char*)t->stopTime.val:"Not Present"); + /************************************************************************************************************************/ + /* Media Descriptor Set */ - /*repeat time repFieldSet */ + if (s->mediaDescSet.numComp.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); + for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { + CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - if(NOTPRSNT != t->repFieldSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time present with total component[%d]\n", - t->repFieldSet.numComp.val); + if(NOTPRSNT == desc->pres.pres) continue; - /*TODO - print repeat fields */ - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time not present \n"); - } - } /* sdpOpTimeSet.numComp for loop -- end */ - }else{/*sdpOpTimeSet.numComp.pres if -- end */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time not present \n"); - } + /* Media Field */ + { + CmSdpMediaField* f = &desc->field; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media Type = %d \n",(NOTPRSNT == f->mediaType.pres)?f->mediaType.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media = %s \n",(NOTPRSNT == f->media.pres)?(char*)f->media.val:"Not Present"); + /* Channel ID */ + if(NOTPRSNT != f->id.type.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t VcId Type = %d \n", f->id.type.val); + switch(f->id.type.val){ + case CM_SDP_VCID_PORT: + { + CmSdpPort *p = &f->id.u.port; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "CM_SDP_VCID_PORT:\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t SDP port type = %d \n", (NOTPRSNT == p->type.pres)?p->type.val:-1); + switch(p->type.val) + { + case CM_SDP_PORT_INT: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + "\t CM_SDP_PORT_INT: SDP port = %d type = %d \n", + p->u.portInt.port.val.val, p->u.portInt.port.type.val); + if(MG_SDP_REMOTE == sdp_type) { + /* update remote information */ + if(MG_TERM_RTP == term->type){ + term->u.rtp.remote_port = p->u.portInt.port.val.val; + printf("Update remote port to [%d]\n", term->u.rtp.remote_port); + } + } + break; + } + case CM_SDP_PORT_VPCID: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_VPCID: \n"); + break; + } + default: + break; + } + break; + } + default: + break; + } + } + mgco_print_sdp_media_param(&f->par); + } - /*TODO - zoneAdjSet */ - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "t-line not present \n"); - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); + /*info */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Info = %s \n",(NOTPRSNT == desc->info.pres)?(char*)desc->info.val:"Not Present"); + + /*connection set */ + { + int cnt=0x00; + if(NOTPRSNT != desc->connSet.numComp.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Number of Connection component[%d]\n",desc->connSet.numComp.val); + for(cnt=0;cntconnSet.numComp.val;cnt++){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + mgco_handle_sdp_c_line(desc->connSet.connSet[cnt], term, sdp_type); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + } + } + } + + /* attribute set */ + mgco_print_sdp_attr_set(&desc->attrSet); - /************************************************************************************************************************/ - /* key type (k= line)*/ + if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && + desc->field.id.type.val == CM_SDP_VCID_PORT && + desc->field.id.u.port.type.val == CM_SDP_PORT_INT && + desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { + int port = desc->field.id.u.port.u.portInt.port.val.val; - if(NOTPRSNT != s->keyType.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Type = %d \n", - (NOTPRSNT != s->keyType.keyType.pres)?s->keyType.keyType.val:-1); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Data = %s \n", - (NOTPRSNT != s->keyType.key_data.pres)?(char*)s->keyType.key_data.val:"Not Present"); - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "k-line not present \n"); - } - - /************************************************************************************************************************/ - /* Attribute Set */ - - mgco_print_sdp_attr_set(&s->attrSet); - - /************************************************************************************************************************/ - /* Media Descriptor Set */ - - if (s->mediaDescSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - - if(NOTPRSNT == desc->pres.pres) continue; - - /* Media Field */ - { - CmSdpMediaField* f = &desc->field; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media Type = %d \n",(NOTPRSNT == f->mediaType.pres)?f->mediaType.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media = %s \n",(NOTPRSNT == f->media.pres)?(char*)f->media.val:"Not Present"); - /* Channel ID */ - if(NOTPRSNT != f->id.type.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t VcId Type = %d \n", f->id.type.val); - switch(f->id.type.val){ - case CM_SDP_VCID_PORT: - { - CmSdpPort *p = &f->id.u.port; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "CM_SDP_VCID_PORT:\n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t SDP port type = %d \n", (NOTPRSNT == p->type.pres)?p->type.val:-1); - switch(p->type.val) - { - case CM_SDP_PORT_INT: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_INT: SDP port = %d type = %d \n", p->u.portInt.port.val.val, p->u.portInt.port.type.val); - break; - } - case CM_SDP_PORT_VPCID: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_VPCID: \n"); - break; - } - default: - break; - } - break; - } - default: - break; - } - } - mgco_print_sdp_media_param(&f->par); - } - - /*info */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Info = %s \n",(NOTPRSNT == desc->info.pres)?(char*)desc->info.val:"Not Present"); - - /*connection set */ - { - int cnt=0x00; - if(NOTPRSNT != desc->connSet.numComp.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Number of Connection component[%d]\n",desc->connSet.numComp.val); - for(cnt=0;cntconnSet.numComp.val;cnt++){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); - mgco_print_sdp_c_line(desc->connSet.connSet[cnt]); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); - } - } - } - - /* attribute set */ - mgco_print_sdp_attr_set(&desc->attrSet); - - - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); - - } - } - } - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + } + } + } + } } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 1533ca7d15..de315d7ae9 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -639,7 +639,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) MgMgcoNtfyReply* ntfy = &cmd->u.mgCmdCfm[0]->u.ntfy; MgMgcoTermId* term = NULL; char term_name[32]; - memset(&term_name[0], 32, 0x00); + memset(&term_name[0], 0x00,32); strcpy(&term_name[0], "Invalid"); @@ -685,7 +685,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) MgMgcoSvcChgReply* svc = &cmd->u.mgCmdCfm[0]->u.svc; MgMgcoTermId* term = NULL; char term_name[32]; - memset(&term_name[0], 32, 0x00); + memset(&term_name[0], 0x00, 32); strcpy(&term_name[0], "Invalid"); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index c1960877bd..bf2fda7a05 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -231,6 +231,7 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile); void megaco_release_context(mg_context_t *ctx); switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination_t *term); switch_status_t megaco_context_sub_all_termination(mg_context_t *ctx); +switch_status_t megaco_activate_termination(mg_termination_t *term); mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix); mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index d56ca14a1f..04feb55a8a 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -315,7 +315,8 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch tech_pvt = switch_core_session_get_private(session); assert(tech_pvt != NULL); - if (!tech_pvt->rtp_session || tech_pvt->mode == RTP_RECVONLY) { + if (!tech_pvt->rtp_session || tech_pvt->mode == RTP_SENDONLY) { + switch_yield(20000); /* replace by local timer XXX */ goto cng; } @@ -338,6 +339,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch cng: *frame = &tech_pvt->read_frame; + tech_pvt->read_frame.codec = &tech_pvt->read_codec; tech_pvt->read_frame.flags |= SFF_CNG; tech_pvt->read_frame.datalen = 0; @@ -370,8 +372,11 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc tech_pvt->timestamp_send += samples; #endif - - switch_rtp_write_frame(tech_pvt->rtp_session, frame); + if (tech_pvt->mode == RTP_RECVONLY) { + return SWITCH_STATUS_SUCCESS; + } + + switch_rtp_write_frame(tech_pvt->rtp_session, frame); return SWITCH_STATUS_SUCCESS; } @@ -403,7 +408,11 @@ static switch_bool_t compare_var(switch_event_t *event, switch_channel_t *channe { const char *chan_val = switch_channel_get_variable_dup(channel, varname, SWITCH_FALSE, -1); const char *event_val = switch_event_get_header(event, varname); - + + if (zstr(chan_val) || zstr(event_val)) { + return 1; + } + return strcasecmp(chan_val, event_val); } @@ -418,7 +427,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi if (compare_var(event, channel, kREMOTEADDR) || compare_var(event, channel, kREMOTEPORT)) { char *remote_addr = switch_event_get_header(event, kREMOTEADDR); - char *szremote_port = switch_event_get_header(event, kREMOTEADDR); + char *szremote_port = switch_event_get_header(event, kREMOTEPORT); switch_port_t remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; const char *err; diff --git a/src/switch_channel.c b/src/switch_channel.c index 138123f3eb..a563a67b1a 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -4154,8 +4154,8 @@ SWITCH_DECLARE(const char *) switch_channel_get_partner_uuid(switch_channel_t *c { const char *uuid = NULL; - if (!(uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { - uuid = switch_channel_get_variable(channel, SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE); + if (!(uuid = switch_channel_get_variable_dup(channel, SWITCH_SIGNAL_BOND_VARIABLE, SWITCH_FALSE, -1))) { + uuid = switch_channel_get_variable_dup(channel, SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE, SWITCH_FALSE, -1); } return uuid; diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 16e473e30f..f3234a21b2 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2165,7 +2165,7 @@ SWITCH_DECLARE(uint8_t) switch_rtp_ready(switch_rtp_t *rtp_session) } switch_mutex_lock(rtp_session->flag_mutex); - ret = (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_IO) && rtp_session->sock_input && rtp_session->sock_output && rtp_session->remote_addr + ret = (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_IO) && rtp_session->sock_input /* && rtp_session->sock_output && rtp_session->remote_addr */ && rtp_session->ready == 2) ? 1 : 0; switch_mutex_unlock(rtp_session->flag_mutex); From 0e5ebbd984e2ca72e0badf3a357662e781c7fac0 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 26 Jul 2012 12:43:32 -0400 Subject: [PATCH 357/493] remove typedef added for code completion --- src/switch_rtp.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index f3234a21b2..341b005473 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -34,8 +34,6 @@ //#define RTP_DEBUG_WRITE_DELTA //#define DEBUG_MISSED_SEQ -typedef unsigned long u_long; - #include #include #include From a6b85b7de570399b8490ab5a6d3a14e0d6405f26 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 26 Jul 2012 13:50:43 -0400 Subject: [PATCH 358/493] fixing two add for same termination back-2-back scenario, 2nd add should reject as term already in context --- .../endpoints/mod_media_gateway/media_gateway.c | 3 +++ .../media_gateway_cmd_handler.c | 13 +++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 5 +++++ .../mod_media_gateway/media_gateway_utils.c | 10 ++++++++-- .../mod_media_gateway/media_gateway_xml.c | 2 ++ .../mod_media_gateway/mod_media_gateway.h | 17 ++++++++++------- 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3d10abf05c..e47055236a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -185,6 +185,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->pool = pool; term->type = termtype; term->active_events = NULL; + term->mg_ctxt = NULL; term->profile = profile; switch_set_flag(term, MGT_ALLOCATED); @@ -231,6 +232,8 @@ void megaco_termination_destroy(mg_termination_t *term) free(term->active_events); term->active_events = NULL; } + + term->mg_ctxt = NULL; switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 27fe1a4a4b..57c8843aee 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -566,6 +566,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } + if(!term->mg_ctxt){ + term->mg_ctxt = mg_ctxt; + } + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); is_rtp = 0x01; @@ -580,6 +584,15 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } + if(!term->mg_ctxt){ + term->mg_ctxt = mg_ctxt; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Termination[%s] already in context..rejecting ADD \n", term->name); + mg_util_set_err_string(&errTxt, " Term already is in call "); + err_code = MGT_MGCP_RSP_CODE_PROT_ERROR; + goto error; + } + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); } /********************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 9401ce49ce..e5c16df9c0 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -15,6 +15,11 @@ #define MG_INACTIVITY_TMR_RESOLUTION 100 /* mit in ito package is experessed in 10ms steps */ +/* rtp/avp profiles */ +#define MG_RTP_AVP_PROFILE_A_LAW 8 +#define MG_RTP_AVP_PROFILE_U_LAW 0 + + typedef enum{ MG_SDP_NONE, MG_SDP_LOCAL, diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 56a1ffdc3a..908b604118 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -789,7 +789,7 @@ void mgco_print_CmSdpU8OrNil(CmSdpU8OrNil* p) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Value = %d \n", (NOTPRSNT != p->val.pres)?p->val.val:-1); } -void mgco_print_sdp_media_param(CmSdpMedPar *s) +void mgco_print_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) { int i=0x00; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "***** Media Parameter *********** \n"); @@ -832,6 +832,12 @@ void mgco_print_sdp_media_param(CmSdpMedPar *s) for(i=0;inum.val;i++){ mgco_print_CmSdpU8OrNil(r->fmts[i]); + + if(MG_RTP_AVP_PROFILE_A_LAW == r->fmts[i]->val.val){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " MG_RTP_AVP_PROFILE_A_LAW: \n"); + }else if(MG_RTP_AVP_PROFILE_U_LAW == r->fmts[i]->val.val){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " MG_RTP_AVP_PROFILE_U_LAW: \n"); + } } } break; @@ -1074,7 +1080,7 @@ void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e break; } } - mgco_print_sdp_media_param(&f->par); + mgco_print_sdp_media_param(&f->par, term, sdp_type); } /*info */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index f30c1d955d..e3c3b8c3de 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -99,6 +99,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) term->pool = pool; term->type = MG_TERM_TDM; term->profile = profile; + term->mg_ctxt = NULL; + term->active_events = NULL; term->name = switch_core_sprintf(pool, "%s%d", prefix, j); term->u.tdm.channel = j; term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index bf2fda7a05..e0022d8ecd 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -94,6 +94,14 @@ enum { } mg_termination_flags; +struct mg_context_s { + uint32_t context_id; + mg_termination_t *terminations[MG_CONTEXT_MAX_TERMS]; + megaco_profile_t *profile; + mg_context_t *next; + switch_memory_pool_t *pool; +}; + struct mg_termination_s { switch_memory_pool_t *pool; mg_termination_type_t type; @@ -104,6 +112,7 @@ struct mg_termination_s { MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ mg_termination_t *next; /*!< List for physical terminations */ uint32_t flags; + mg_context_t* mg_ctxt; union { struct { @@ -131,13 +140,7 @@ struct mg_termination_s { }; -struct mg_context_s { - uint32_t context_id; - mg_termination_t *terminations[MG_CONTEXT_MAX_TERMS]; - megaco_profile_t *profile; - mg_context_t *next; - switch_memory_pool_t *pool; -}; + #define MG_CONTEXT_MODULO 16 #define MG_MAX_CONTEXTS 32768 From b1b2bee36268834ad0d7348ed098c6ad446b75fd Mon Sep 17 00:00:00 2001 From: root Date: Thu, 26 Jul 2012 15:02:25 -0400 Subject: [PATCH 359/493] fixing local sdp issue --- .../media_gateway_cmd_handler.c | 83 +++++++++++-------- .../mod_media_gateway/media_gateway_utils.c | 13 ++- .../mod_media_gateway/mod_media_gateway.h | 2 +- 3 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 57c8843aee..185f3fb5a9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -498,6 +498,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /*MgMgcoStreamDesc* inc_strm_desc;*/ MgMgcoAudRetParm *desc; mg_context_t* mg_ctxt; + int mediaId; + MgMgcoLocalDesc *local = NULL; + CmSdpInfoSet *psdp = NULL; + /* TODO - Kapil dummy line , will need to add with proper code */ inc_med_desc = &cmd->dl.descs[0]->u.media; @@ -686,18 +690,25 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } /* copy media descriptor */ - desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; desc->type.pres = PRSNT_NODEF; desc->type.val = MGT_MEDIADESC; mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); + /* see if we have received local descriptor */ + if((NOTPRSNT != desc->u.media.num.pres) && + (0 != desc->u.media.num.val)) + { + for(mediaId=0; mediaIdu.media.num.val; mediaId++) { + if(MGT_MEDIAPAR_LOCAL == desc->u.media.parms[mediaId]->type.val) { + local = &desc->u.media.parms[mediaId]->u.local; + } + } + } /* only for RTP */ if(is_rtp){ /* build local descriptors */ /*MgMgcoStreamDesc *stream;*/ - MgMgcoLocalDesc *local; - CmSdpInfoSet *psdp; char* ipAddress[4];// = "192.168.1.1"; char* dup = strdup((char*)term->u.rtp.local_addr); MgMgcoMediaDesc* media = &desc->u.media; @@ -705,45 +716,47 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i switch_split(dup,'.',ipAddress); /* Most probably we need to add local descriptor */ + if(!local){ - /* allocating mem for local descriptor */ - if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), - &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), + &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } #if 0 - /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ + /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ - printf("media->num.val[%d]\n",media->num.val); + printf("media->num.val[%d]\n",media->num.val); - stream = &media->parms[media->num.val-1]->u.stream; - stream->pres.pres = PRSNT_NODEF; - stream->pres.val = 0x01; + stream = &media->parms[media->num.val-1]->u.stream; + stream->pres.pres = PRSNT_NODEF; + stream->pres.val = 0x01; #if 0 - if(inc_med_desc->num.pres && inc_med_desc->num.val){ - /* TODO - check stream descriptor type for all medias */ - inc_strm_desc = &inc_med_desc->parms[0]->u.stream; - memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); + if(inc_med_desc->num.pres && inc_med_desc->num.val){ + /* TODO - check stream descriptor type for all medias */ + inc_strm_desc = &inc_med_desc->parms[0]->u.stream; + memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); + } +#endif + + MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); + + + stream->sl.pres.pres = PRSNT_NODEF; + stream->sl.pres.val = 0x01; + + local = &stream->sl.local; +#endif + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; + + local = &media->parms[media->num.val-1]->u.local; } -#endif - - MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); - - - stream->sl.pres.pres = PRSNT_NODEF; - stream->sl.pres.val = 0x01; - - local = &stream->sl.local; -#endif - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; - - local = &media->parms[media->num.val-1]->u.local; local->pres.pres = PRSNT_NODEF; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 908b604118..e5d08c1d84 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -112,8 +112,6 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); - printf("termId->name.lcl.val[%p]\n",termId->name.lcl.val); - if( ret != ROK) RETVALUE(ret); @@ -121,7 +119,7 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); termId->name.lcl.val[termId->name.lcl.len] = '\0'; - printf("mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); } @@ -742,8 +740,8 @@ void mgco_print_sdp_attr_set(CmSdpAttrSet *s) void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) { - char ipadd[12]; - memset(ipadd, 0, 12); + char ipadd[32]; + memset(ipadd, 0, sizeof(ipadd)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP connection line ****** \n"); @@ -770,11 +768,10 @@ void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types s->u.ip4.u.uniIp.b[1].val, s->u.ip4.u.uniIp.b[2].val, s->u.ip4.u.uniIp.b[3].val); - printf("Remote ip = %s \n", ipadd); /* update remote ip */ if(MG_TERM_RTP == term->type){ - term->u.rtp.remote_addr = strdup(ipadd); - printf("Update remote ip to [%s]\n", term->u.rtp.remote_addr); + term->u.rtp.remote_addr = switch_core_strdup(term->pool,ipadd); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Update remote ip to [%s]\n", term->u.rtp.remote_addr); } } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index e0022d8ecd..af53052fbb 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -111,8 +111,8 @@ struct mg_termination_s { megaco_profile_t *profile; /*!< Parent MG profile */ MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ mg_termination_t *next; /*!< List for physical terminations */ - uint32_t flags; mg_context_t* mg_ctxt; + uint32_t flags; union { struct { From 258900818a5fd7f3eb9fed91bf8ebd2659d5471a Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 26 Jul 2012 16:43:18 -0400 Subject: [PATCH 360/493] freetdm: Added thread to service events when there is no signalling module on a span --- libs/freetdm/src/ftdm_io.c | 48 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index b8b9cff527..758827c9ed 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -5618,16 +5618,61 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_signaling(ftdm_span_t *span, const return status; } +static void *ftdm_span_service_events(ftdm_thread_t *me, void *obj) +{ + int i; + unsigned waitms; + ftdm_event_t *event; + ftdm_status_t status = FTDM_SUCCESS; + ftdm_span_t *span = (ftdm_span_t*) obj; + short *poll_events = ftdm_malloc(sizeof(short) * span->chan_count); + + memset(poll_events, 0, sizeof(short) * span->chan_count); + + for(i = 1; i <= span->chan_count; i++) { + poll_events[i] |= FTDM_EVENTS; + } + + while (ftdm_running() && !(ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD))) { + waitms = 1000; + status = ftdm_span_poll_event(span, waitms, poll_events); + switch (status) { + case FTDM_FAIL: + ftdm_log(FTDM_LOG_CRIT, "%s:Failed to poll span for events\n", span->name); + break; + case FTDM_TIMEOUT: + break; + case FTDM_SUCCESS: + /* Check if there are any channels that have events available */ + while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS); + break; + default: + ftdm_log(FTDM_LOG_CRIT, "%s:Unhandled IO event\n", span->name); + } + } + return NULL; +} + FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span) { ftdm_status_t status = FTDM_FAIL; - ftdm_mutex_lock(span->mutex); if (ftdm_test_flag(span, FTDM_SPAN_STARTED)) { status = FTDM_EINVAL; goto done; } + if (span->signal_type == FTDM_SIGTYPE_NONE) { + /* If there is no signalling component, start a thread to poll events */ + status = ftdm_thread_create_detached(ftdm_span_service_events, span); + if (status != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_CRIT,"Failed to start span event monitor thread!\n"); + goto done; + } + + status = ftdm_report_initial_channels_alarms(span); + goto done; + } if (!span->start) { status = FTDM_ENOSYS; @@ -5643,7 +5688,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span) if (status == FTDM_SUCCESS) { ftdm_set_flag_locked(span, FTDM_SPAN_STARTED); } - done: ftdm_mutex_unlock(span->mutex); return status; From 3519ebc981eff76d7ab506f407558e93992e59b1 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 27 Jul 2012 10:59:37 -0400 Subject: [PATCH 361/493] add megaco_prepare_termination --- .../mod_media_gateway/media_gateway.c | 42 +++++++++++++++++++ .../mod_media_gateway/mod_media_gateway.h | 1 + 2 files changed, 43 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index e47055236a..ee5abe7d2f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -155,6 +155,48 @@ done: return SWITCH_STATUS_SUCCESS; } + +/* + * Originate a channel so the target technology gets to run initialization code + */ +switch_status_t megaco_prepare_termination(mg_termination_t *term) +{ + switch_event_t *var_event = NULL; + switch_core_session_t *session = NULL; + switch_status_t status = SWITCH_STATUS_SUCCESS; + char dialstring[100]; + switch_call_cause_t cause; + switch_channel_t *channel; + switch_event_create(&var_event, SWITCH_EVENT_CLONE); + + if (term->type == MG_TERM_RTP) { + } else if (term->type == MG_TERM_TDM) { + switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); + + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "ftdm_start_only", "true"); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kSPAN_NAME, term->u.tdm.span_name); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kCHAN_ID, "%d", term->u.tdm.channel); + } + + /* Set common variables on the channel */ + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true"); + if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { + status = SWITCH_STATUS_FALSE; + goto done; + } + channel = switch_core_session_get_channel(session); + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + +done: + if (session) { + switch_core_session_rwunlock(session); + } + switch_event_destroy(&var_event); + + return SWITCH_STATUS_SUCCESS; +} + + mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix) { mg_termination_type_t termtype; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index af53052fbb..4ffeaaa4e0 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -235,6 +235,7 @@ void megaco_release_context(mg_context_t *ctx); switch_status_t megaco_context_sub_termination(mg_context_t *ctx, mg_termination_t *term); switch_status_t megaco_context_sub_all_termination(mg_context_t *ctx); switch_status_t megaco_activate_termination(mg_termination_t *term); +switch_status_t megaco_prepare_termination(mg_termination_t *term); mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix); mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name); From a668b9ddf65c8f58f6d4cc734e6aa7095d4bb05f Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 27 Jul 2012 11:06:23 -0400 Subject: [PATCH 362/493] automatically fail new tdm channel if ftdm_start_only is true --- libs/freetdm/mod_freetdm/tdm.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index efdf4dce3e..b2d37d47ed 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -112,7 +112,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi ftdm_codec_t codec; uint32_t interval; ftdm_status_t fstatus; - + const char *ftdm_start_only = switch_event_get_header(var_event, "ftdm_start_only"); ctdm_private_t *tech_pvt = NULL; if (zstr(szchanid) || zstr(span_name)) { @@ -129,6 +129,15 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } + if ((fstatus = ftdm_span_start(span)) != FTDM_SUCCESS && fstatus != FTDM_EINVAL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start span %s.\n", span_name); + goto fail; + } + + if (!zstr(ftdm_start_only) && switch_true(ftdm_start_only)) { + goto fail; + } + if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); @@ -137,11 +146,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); - if ((fstatus = ftdm_span_start(span)) != FTDM_SUCCESS && fstatus != FTDM_EINVAL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start span %s.\n", span_name); - goto fail; - } - if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); goto fail; From 3350403d04e8dfcdb9e2548f4c9b0e4890f6a178 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 11:22:29 -0400 Subject: [PATCH 363/493] commit from testbox --- libs/freetdm/mod_freetdm/tdm.c | 6 + .../media_gateway_cmd_handler.c | 26 +- .../mod_media_gateway/media_gateway_stack.h | 6 + .../mod_media_gateway/media_gateway_utils.c | 500 ++++++++++++++++++ .../mod_media_gateway/media_gateway_xml.c | 6 +- .../mod_media_gateway/mod_media_gateway.h | 1 + 6 files changed, 535 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index c66fdbebd1..efdf4dce3e 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -111,6 +111,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *dname; ftdm_codec_t codec; uint32_t interval; + ftdm_status_t fstatus; ctdm_private_t *tech_pvt = NULL; @@ -136,6 +137,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); + if ((fstatus = ftdm_span_start(span)) != FTDM_SUCCESS && fstatus != FTDM_EINVAL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start span %s.\n", span_name); + goto fail; + } + if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); goto fail; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 185f3fb5a9..ca0d286ba2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -500,7 +500,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_context_t* mg_ctxt; int mediaId; MgMgcoLocalDesc *local = NULL; - CmSdpInfoSet *psdp = NULL; + /*CmSdpInfoSet *psdp = NULL;*/ /* TODO - Kapil dummy line , will need to add with proper code */ @@ -707,6 +707,11 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* only for RTP */ if(is_rtp){ + mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); + } +#if 0 + if(is_rtp){ + mg_build_sdp(desc, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); /* build local descriptors */ /*MgMgcoStreamDesc *stream;*/ char* ipAddress[4];// = "192.168.1.1"; @@ -762,11 +767,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i psdp = &(local->sdp); - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; + if((NOTPRSNT == local->sdp.numComp.pres) || (0 == local->sdp.numComp.val)){ + + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), + &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } } psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; @@ -875,7 +883,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 4); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 8); /* Fill attribute if reqd */ { @@ -893,6 +901,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i free(dup); } +#endif /* We will always send one command at a time..*/ @@ -1055,10 +1064,11 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand ret = mg_prc_descriptors(mg_profile, inc_cmd, term); /* SDP updated to termination */ - megaco_activate_termination(term); } + /* TODO - copy inc descriptor...not sure if we need to do this.. */ + /********************************************************************/ /* Matt - to provide the response SDP structure which needs to fill in Modify command response */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index e5c16df9c0..f84bfbd5e4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -155,6 +155,9 @@ int mg_enable_logging(void); int mg_disable_logging(void); void mg_util_set_err_string ( MgStr *errTxt, char* str); +switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); +switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); + switch_status_t sng_mgco_cfg(megaco_profile_t* profile); switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); @@ -193,6 +196,9 @@ switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, c void mg_fill_null_context(MgMgcoContextId* ctxt); switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild); switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); +switch_status_t mg_add_lcl_media(CmSdpMediaDescSet* med, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); +switch_status_t mg_add_supported_media_codec(CmSdpMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); +switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_termination_t* term, CmSdpMedFmtRtpList *fmtList, CmSdpAttrSet *attrSet, CmMemListCp *memCp); switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index e5d08c1d84..39a69f3921 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1441,3 +1441,503 @@ void mg_print_time() switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Current Time = %s", ctime(&now)); } /*****************************************************************************************************************************/ +switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term,CmMemListCp *memCp) +{ + char* ipAddress[4]; + MgMgcoLocalDesc *local; + CmSdpInfoSet *psdp = NULL; + char * dup = NULL; + switch_status_t ret = SWITCH_STATUS_SUCCESS; + CmSdpMediaDescSet* med = NULL; + + switch_assert(media); + switch_assert(mg_profile); + switch_assert(term); + + dup = strdup((char*)term->u.rtp.local_addr); + switch_split(dup,'.',ipAddress); + + /* allocating mem for local descriptor */ + if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), &media->num, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; + media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; + + local = &media->parms[media->num.val-1]->u.local; + + local->pres.pres = PRSNT_NODEF; + + psdp = &(local->sdp); + + if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), &psdp->numComp, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; + + /* fill version */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); + + /* fill orig */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); + + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", + memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", + memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", + memCp); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + atoi(ipAddress[3])); + + /* fill session name */ + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->sessName, 8, "SANGOMA", memCp); + + + /* Fill the SDP Connection Info */ + /* "c=" line - ipaddress */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); + + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); + + + /* t= line */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); +#if 0 + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.sdpOpTimeSet.numComp),0); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.zoneAdjSet.numComp),0); +#endif + + med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; + ret = mg_add_lcl_media(med, mg_profile, term, memCp); + + return ret; +} +/*****************************************************************************************************************************/ +switch_status_t mg_add_supported_media_codec(CmSdpMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp) +{ + const switch_codec_implementation_t *codecs[16]; + char *codec_prefs[16] = { 0 }; + char *szcodec_prefs; + int codec_count; + int i; + int fmt= 0x00; + + switch_assert(media); + switch_assert(mg_profile); + switch_assert(term); + switch_assert(memCp); + + szcodec_prefs = strdup(mg_profile->codec_prefs); + codec_count = switch_split(szcodec_prefs, ',', codec_prefs); + + /* Get the list of codecs, by preference */ + switch_loadable_module_get_codecs_sorted(codecs, switch_arraylen(codecs), codec_prefs, switch_arraylen(codec_prefs)); + for (i = 0; codecs[i] && i < codec_count; i++) { + int pt = codecs[i]->ianacode; + const char *name = codecs[i]->iananame; + + printf("Preference %d is %s/%d\n", i, name, pt); + + + if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), + &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + fmt = media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num.val-1; + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[fmt]->type), CM_SDP_SPEC); + + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[fmt]->val), pt); + + /* add associated attributes */ + { + if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), &media->attrSet.numComp, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->type),CM_SDP_ATTR_RTPMAP); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.pres), 1); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.pay.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.pay.val), pt); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.enc.val), CM_SDP_ENC_UNKNOWN); + MG_SET_TKNSTROSXL((media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.enc.name), strlen(name), name, memCp); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.rtpmap.clk), codecs[i]->samples_per_second); + /* encoding parameter not required to fill */ + } + + } + free(szcodec_prefs); + return SWITCH_STATUS_SUCCESS; +} +/*****************************************************************************************************************************/ +switch_status_t mg_add_lcl_media(CmSdpMediaDescSet* med, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp) +{ + CmSdpMediaDesc* media; + + switch_assert(med); + switch_assert(mg_profile); + switch_assert(term); + switch_assert(memCp); + + if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), + &med->numComp, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + media = med->mediaDesc[med->numComp.val-1]; + + MG_INIT_TOKEN_VALUE(&(media->pres),1); + + /* Fill CmSdpMediaField */ + MG_INIT_TOKEN_VALUE(&(media->field.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); + + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); + + if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), + &media->field.par.numProtFmts, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + /* CmSdpMedProtoFmts */ + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.type), CM_SDP_MEDIA_PROTO_RTP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.u.subtype.type), CM_SDP_PROTO_RTP_AVP); + MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->protType), CM_SDP_MEDIA_PROTO_RTP); + + + /***************************************************************************************************************************************************************/ + /* Fill ptime attribute */ + { + if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), &media->attrSet.numComp, memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->type),CM_SDP_ATTR_PTIME); + MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[media->attrSet.numComp.val-1]->u.ptime), term->u.rtp.ptime); + } + /***************************************************************************************************************************************************************/ + /* fill codec info */ + mg_add_supported_media_codec(media, mg_profile, term, memCp); + + return SWITCH_STATUS_SUCCESS; +} +/***************************************************************************************************************************************************************/ + +switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_termination_t* term, CmSdpMedFmtRtpList *fmtList, CmSdpAttrSet *attrSet, CmMemListCp *memCp) +{ + int i = 0x00; + int id = 0x00; + int j = 0x00; + int a = 0x00; + CmSdpU8OrNil *fmt = NULL; + int foundCodec = 0x00; + const switch_codec_implementation_t *codecs[16]; + char *codec_prefs[16] = { 0 }; + char *szcodec_prefs; + int codec_count; + CmSdpAttr *attr = NULL; + CmSdpAttrRtpMap *rtp = NULL; + + /* Check if code list is present */ + if (!fmtList || (NOTPRSNT == fmtList->num.pres)) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "codec List Not present\n"); + return SWITCH_STATUS_FALSE; + } + + szcodec_prefs = strdup(mg_profile->codec_prefs); + codec_count = switch_split(szcodec_prefs, ',', codec_prefs); + + /* Get the list of codecs, by preference */ + switch_loadable_module_get_codecs_sorted(codecs, switch_arraylen(codecs), codec_prefs, switch_arraylen(codec_prefs)); + + + /* codec type is specified one */ + + /* loop through coddec list and remove un-supported codec */ + for(i = 0; i < fmtList->num.val; i++) + { + fmt = fmtList->fmts[i]; + + if((NOTPRSNT == fmt->type.pres) || (NOTPRSNT == fmt->val.pres)) continue; + + if(CM_SDP_SPEC != fmt->type.val) continue; /* TODO - need to see for other cases like CM_SDP_NIL/CM_SDP_CHOICE etc not sure as of now */ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "codec[%d] number \n", fmt->val.val); + + /* see if received codec is present in our codec supported list */ + for (id = 0; codecs[id] && id < codec_count; id++) { + int pt = codecs[id]->ianacode; + //const char *name = codecs[id]->iananame; + if(pt == fmt->val.val){ + foundCodec = 0x01; + break; + } + } + + /* IF codec not found in list, remove it */ + if(!foundCodec) { + + for(j = i; j < fmtList->num.val - 1; j++) + { + fmtList->fmts[j] = fmtList->fmts[j +1]; + } + mgUtlShrinkList((Void ***)&fmtList->fmts, sizeof(CmSdpU8OrNil), &fmtList->num, memCp); + i-- ; + + /* remove associated a= , if present */ + if((NOTPRSNT != attrSet->numComp.pres) && (0 != attrSet->numComp.val)){ + for(a = 0; a < attrSet->numComp.val; a++) { + attr = attrSet->attr[a]; + + if(CM_SDP_ATTR_RTPMAP != attr->type.val) continue; /* as of now only checking RTPMAP */ + + rtp = &attr->u.rtpmap; + + if((NOTPRSNT != rtp->pres.pres) && (fmt->val.val == rtp->pay.val.val)) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "a line found against codec[%d]..Removing a line \n", fmt->val.val); + + /* mgUtlShrinkList API will delete last node from list, hence suffling list nodes */ + for(j = a; j < attrSet->numComp.val - 1; j++) + { + attrSet->attr[j] = attrSet->attr[j +1]; + } + mgUtlShrinkList((Void ***)&attrSet->attr, sizeof(CmSdpAttr), &attrSet->numComp, memCp); + } + } + } + } + } + + return SWITCH_STATUS_SUCCESS; +} + + + +/*****************************************************************************************************************************/ +switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp) +{ + CmSdpU8OrNil *fmt = NULL; + CmSdpInfoSet *psdp = NULL; + char* ipAddress[4]; + int i = 0x00; + int j = 0x00; + int choose_codec = 0x00; + int k = 0x00; + MgMgcoLocalDesc *local = NULL; + int fresh_sdp = 0x00; + char* dup = NULL; + CmSdpMedProtoFmts *format=NULL; + + + switch_assert(out); + switch_assert(inc); + switch_assert(mg_profile); + switch_assert(term); + + dup = strdup((char*)term->u.rtp.local_addr); + switch_split(dup,'.',ipAddress); + + + if((NOTPRSNT == inc->num.pres) || (0 == inc->num.val)){ + fresh_sdp = 0x01; + } + + /* if its fresh sdp then add only local descriptor */ + if(fresh_sdp) { + mg_add_local_descriptor(out, mg_profile, term, memCp); + } else { + /* incoming has sdp, so copy that sdp and overwrite only local sdp */ + mgUtlCpyMgMgcoMediaDesc(out, inc, memCp); + + /* now see if we have local descriptor, then pick up that and modify the fields */ + + if((NOTPRSNT != out->num.pres) && (0 != out->num.val)) + { + for(i=0; inum.val; i++) { + if(MGT_MEDIAPAR_LOCAL == out->parms[i]->type.val) { + local = &out->parms[i]->u.local; + } + } + } + } + + if(!local || (NOTPRSNT == local->sdp.numComp.pres) || (0 == local->sdp.numComp.val)){ + /* local sdp is not part of media descriptor, then add local sdp*/ + mg_add_local_descriptor(out, mg_profile, term, memCp); + }else{ + /* local sdp is present.. now go over the local descriptor and modify fields */ + psdp = &(local->sdp); + + for(i=0; i< psdp->numComp.val; i++) { +/**********************************************************************************************************************************/ + /* version - let it be same, if present else use version 1 */ + if(NOTPRSNT == psdp->info[psdp->numComp.val-1]->ver.pres) { + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); + } +/**********************************************************************************************************************************/ + /* orig (o- line) fill with our info */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); + + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", + NULL); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", + NULL); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", + NULL); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), + CM_SDP_NET_TYPE_IN); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), + CM_SDP_ADDR_TYPE_IPV4); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), + CM_SDP_IPV4_IP_UNI); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), + atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), + atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), + atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), + atoi(ipAddress[3])); + +/**********************************************************************************************************************************/ + /* session-name , let it be like this if present, else skip it */ +/**********************************************************************************************************************************/ + /* "c=" line - ipaddress */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); + + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); + MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); + +/**********************************************************************************************************************************/ + /* t= line */ + MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); +/**********************************************************************************************************************************/ + /* fill media descriptors */ + { + CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; + CmSdpMediaDesc* media; + + if((NOTPRSNT == med->numComp.pres) || (0 == med->numComp.val)){ + mg_add_lcl_media(med, mg_profile, term, memCp); + }else{ + for(j =0;j < med->numComp.val; j++){ + media = med->mediaDesc[j]; + /* check for choose port and fill the port */ + if(NOTPRSNT != media->field.id.type.pres){ + if(CM_SDP_VCID_CHOOSE == media->field.id.type.val){ + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); + + } + } + + /* check for codec */ + if((NOTPRSNT == media->field.par.numProtFmts.pres) || + (0 == media->field.par.numProtFmts.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No codec specified in incoming local descriptor \n"); + mg_add_supported_media_codec(media, mg_profile, term, memCp ); + }else{ + /* check for media format/codec */ + for(k =0;k < media->field.par.numProtFmts.val; k++){ + format = media->field.par.pflst[k]; + if ((NOTPRSNT != format->protType.pres) && + (CM_SDP_MEDIA_PROTO_RTP == format->protType.val)) + { + if((NOTPRSNT != format->u.rtp.num.pres) + &&(0 != format->u.rtp.num.val)) + { + /* If the codec type is CHOOSE then we need to fill our list */ + for(i = 0; i < format->u.rtp.num.val; i++) + { + fmt = format->u.rtp.fmts[i]; + + if((NOTPRSNT == fmt->type.pres) || (NOTPRSNT == fmt->val.pres)) continue; + + if(CM_SDP_CHOOSE == fmt->type.val){ + choose_codec = 0x1; + } + } + if(choose_codec){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "CHOOSE codec is requested fill out supported codecs \n"); + + /* delete existing rtp format list..TODO find better way */ + for(i = 0; i < format->u.rtp.num.val; i++) + { + mgUtlShrinkList((Void ***)&format->u.rtp.fmts, sizeof(CmSdpU8OrNil), &format->u.rtp.num, memCp); + } + /* If the codec type is CHOOSE then we need to fill our list */ + mg_add_supported_media_codec(media, mg_profile, term, memCp); + } + else if (!choose_codec && (SWITCH_STATUS_FALSE == mg_rem_unsupported_codecs(mg_profile, term , &format->u.rtp, &media->attrSet, memCp))) + { + return SWITCH_STATUS_FALSE; + } + } + } + } + } + } + } +/**********************************************************************************************************************************/ + } + + } + + } + return SWITCH_STATUS_SUCCESS; +} + diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index e3c3b8c3de..011c36ce56 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -74,7 +74,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) // const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); - //const char *tech = switch_xml_attr(mg_term, "tech"); + const char *tech = switch_xml_attr(mg_term, "tech"); const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); const char *channel_map = switch_xml_attr(mg_term, "channel-map"); @@ -100,7 +100,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) term->type = MG_TERM_TDM; term->profile = profile; term->mg_ctxt = NULL; - term->active_events = NULL; + term->tech = switch_core_strdup(pool, tech); + term->active_events = NULL; term->name = switch_core_sprintf(pool, "%s%d", prefix, j); term->u.tdm.channel = j; term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); @@ -260,6 +261,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), + SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index af53052fbb..fdecf761b9 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -113,6 +113,7 @@ struct mg_termination_s { mg_termination_t *next; /*!< List for physical terminations */ mg_context_t* mg_ctxt; uint32_t flags; + const char *tech; /* Endpoint controlling the TDM interface - only FreeTDM tested so far */ union { struct { From a4255e140b3b5de77b62213b6987a85b6dce7b1b Mon Sep 17 00:00:00 2001 From: James Zhang Date: Fri, 27 Jul 2012 11:53:00 -0400 Subject: [PATCH 364/493] freetdm: adding variables for ansi outgoing IAMs . added called party number INN variable ie. . added multiple variables to set User Service Information IE variables are : ss7_iam_usi_trans_cap ss7_iam_usi_code_standard ss7_iam_usi_trans_mode ss7_iam_usi_trans_rate_0 ss7_iam_usi_trans_rate_1 ss7_iam_usi_layer1_ident ss7_iam_usi_layer1_prot ss7_iam_usi_layer2_ident ss7_iam_usi_layer2_prot ss7_iam_usi_layer3_ident ss7_iam_usi_layer3_prot ss7_iam_usi_chan_struct ss7_iam_usi_config ss7_iam_usi_establish ss7_iam_usi_symmetry ss7_iam_usi_rate_multiplier . ss7_iam_usi_trans_cap is a string variable, the others are all integers . ss7_iam_usi_trans_cap has options of : - SPEECH - UNRESTRICTED - RESTRICTED - 31KHZ - 7KHZ - 15KHZ - VIDEO default value is SPEECH, if the parameter is wrong, set to SPEECH. If not set, this field is not present --- .../ftmod_sangoma_ss7_support.c | 229 +++++++++++++++--- 1 file changed, 199 insertions(+), 30 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 032ea8efd7..2e51ba8674 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -213,17 +213,17 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum) { - const char *cld_nadi = NULL; + char *val = NULL; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; cdPtyNum->eh.pres = PRSNT_NODEF; cdPtyNum->natAddrInd.pres = PRSNT_NODEF; - cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi"); - if (!ftdm_strlen_zero(cld_nadi)) { - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", cld_nadi); - cdPtyNum->natAddrInd.val = atoi(cld_nadi); + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi"); + if (!ftdm_strlen_zero(val)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", val); + cdPtyNum->natAddrInd.val = atoi(val); } else { cdPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi; ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for CLD, using \"%d\"\n", cdPtyNum->natAddrInd.val); @@ -233,7 +233,14 @@ ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPt cdPtyNum->numPlan.val = 0x01; cdPtyNum->innInd.pres = PRSNT_NODEF; - cdPtyNum->innInd.val = 0x01; + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_inn"); + if (!ftdm_strlen_zero(val)) { + cdPtyNum->innInd.val = atoi(val); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called INN value \"%s\"\n", val); + } else { + cdPtyNum->innInd.val = 0x01; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Called INN value, set to default value 0x01\n"); + } return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven); } @@ -1240,32 +1247,194 @@ ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMe ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA) { - usrServInfoA->eh.pres = PRSNT_NODEF; + int bProceed = 0; + const char *val = NULL; + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_cap"); + if (!ftdm_strlen_zero(val)) { + int itc_type = 0; + if (!strcasecmp(val, "SPEECH")) { + itc_type = ITC_SPEECH; + } else if (!strcasecmp(val, "UNRESTRICTED")) { + itc_type = ITC_UNRDIG; + } else if (!strcasecmp(val, "RESTRICTED")) { + itc_type = ITC_RESDIG; + } else if (!strcasecmp(val, "31KHZ")) { + itc_type = ITC_A31KHZ; + } else if (!strcasecmp(val, "7KHZ")) { + itc_type = ITC_A7KHZ; + } else if (!strcasecmp(val, "15KHZ")) { + itc_type = ITC_A15KHZ; + } else if (!strcasecmp(val, "VIDEO")) { + itc_type = ITC_VIDEO; + } else { + itc_type = ITC_SPEECH; + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transmission capability parameter is wrong : %s. Setting to default SPEECH. \n", val ); + } + + usrServInfoA->infoTranCap.pres = PRSNT_NODEF; + usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, itc_type); + bProceed = 1; + } else { + usrServInfoA->infoTranCap.pres = NOTPRSNT; + } - usrServInfoA->infoTranCap.pres = PRSNT_NODEF; + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_code_standard"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->cdeStand.pres = PRSNT_NODEF; + usrServInfoA->cdeStand.val = (int)atoi(val); /* default is 0x0 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI coding standard = %d\n", usrServInfoA->cdeStand.val ); + bProceed = 1; + } else { + usrServInfoA->cdeStand.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_mode"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->tranMode.pres = PRSNT_NODEF; + usrServInfoA->tranMode.val = (int)atoi(val); /* transfer mode, default is 0x0*/ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transfer mode = %d\n", usrServInfoA->tranMode.val ); + bProceed = 1; + } else { + usrServInfoA->tranMode.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_0"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->infoTranRate0.pres = PRSNT_NODEF; + usrServInfoA->infoTranRate0.val = (int)atoi(val); /* default is 0x10, 64kbps origination to destination*/ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 0 = %d\n", usrServInfoA->infoTranRate0.val ); + bProceed = 1; + } else { + usrServInfoA->infoTranRate0.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_1"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->infoTranRate1.pres = PRSNT_NODEF; + usrServInfoA->infoTranRate1.val = (int)atoi(val); /* 64kbps destination to origination, default is 0x10 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 1 = %d\n", usrServInfoA->infoTranRate1.val ); + bProceed = 1; + } else { + usrServInfoA->infoTranRate1.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_ident"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->lyr1Ident.pres = PRSNT_NODEF; + usrServInfoA->lyr1Ident.val = (int)atoi(val); /*default value is 0x01 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 indentification = %d\n", usrServInfoA->lyr1Ident.val ); + bProceed = 1; + } else { + usrServInfoA->lyr1Ident.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_prot"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->usrInfLyr1Prot.pres = PRSNT_NODEF; + usrServInfoA->usrInfLyr1Prot.val = (int)atoi(val); /*default value is 0x02 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 protocol = %d\n", usrServInfoA->usrInfLyr1Prot.val ); + bProceed = 1; + } else { + usrServInfoA->usrInfLyr1Prot.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_ident"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->lyr2Ident.pres = PRSNT_NODEF; + usrServInfoA->lyr2Ident.val = (int)atoi(val); /*default value is 0x01 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 indentification = %d\n", usrServInfoA->lyr2Ident.val ); + bProceed = 1; + } else { + usrServInfoA->lyr2Ident.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_prot"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->usrInfLyr2Prot.pres = PRSNT_NODEF; + usrServInfoA->usrInfLyr2Prot.val = (int)atoi(val); /*default value is 0x02 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 protocol = %d\n", usrServInfoA->usrInfLyr2Prot.val ); + bProceed = 1; + } else { + usrServInfoA->usrInfLyr2Prot.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_ident"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->lyr3Ident.pres = PRSNT_NODEF; + usrServInfoA->lyr3Ident.val = (int)atoi(val); /*default value is 0x01 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 indentification = %d\n", usrServInfoA->lyr3Ident.val ); + bProceed = 1; + } else { + usrServInfoA->lyr3Ident.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_prot"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->usrInfLyr3Prot.pres = PRSNT_NODEF; + usrServInfoA->usrInfLyr3Prot.val = (int)atoi(val); /*default value is 0x02 */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 protocol = %d\n", usrServInfoA->usrInfLyr3Prot.val ); + bProceed = 1; + } else { + usrServInfoA->usrInfLyr3Prot.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_chan_struct"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->chanStruct.pres = PRSNT_NODEF; + usrServInfoA->chanStruct.val = (int)atoi(val); /* default value is 0x1, 8kHz integrity */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI channel structure = %d\n", usrServInfoA->chanStruct.val ); + bProceed = 1; + } else { + usrServInfoA->chanStruct.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_config"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->config.pres = PRSNT_NODEF; + usrServInfoA->config.val = (int)atoi(val); /* default value is 0x0, point to point configuration */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI configuration = %d\n", usrServInfoA->config.val ); + bProceed = 1; + } else { + usrServInfoA->config.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_establish"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->establish.pres = PRSNT_NODEF; + usrServInfoA->establish.val = (int)atoi(val); /* default value is 0x0, on demand */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI establishment = %d\n", usrServInfoA->establish.val ); + bProceed = 1; + } else { + usrServInfoA->establish.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_symmetry"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->symmetry.pres = PRSNT_NODEF; + usrServInfoA->symmetry.val = (int)atoi(val); /* default value is 0x0, bi-directional symmetric */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI symmetry = %d\n", usrServInfoA->symmetry.val ); + bProceed = 1; + } else { + usrServInfoA->symmetry.pres = NOTPRSNT; + } + + val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_rate_multiplier"); + if (!ftdm_strlen_zero(val)) { + usrServInfoA->rateMultiplier.pres = PRSNT_NODEF; + usrServInfoA->rateMultiplier.val = (int)atoi(val); /* default value is 0x1, 1x rate multipler */ + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI rate multipier = %d\n", usrServInfoA->rateMultiplier.val ); + bProceed = 1; + } else { + usrServInfoA->rateMultiplier.pres = NOTPRSNT; + } + + if (bProceed) { + usrServInfoA->eh.pres = PRSNT_NODEF; + } else { + usrServInfoA->eh.pres = NOTPRSNT; + } - usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, ITC_SPEECH); - - usrServInfoA->cdeStand.pres = PRSNT_NODEF; - usrServInfoA->cdeStand.val = 0x0; /* ITU-T standardized coding */ - usrServInfoA->tranMode.pres = PRSNT_NODEF; - usrServInfoA->tranMode.val = 0x0; /* circuit mode */ - usrServInfoA->infoTranRate0.pres = PRSNT_NODEF; - usrServInfoA->infoTranRate0.val = 0x10; /* 64kbps origination to destination */ - usrServInfoA->infoTranRate1.pres = PRSNT_NODEF; - usrServInfoA->infoTranRate1.val = 0x10; /* 64kbps destination to origination */ - usrServInfoA->chanStruct.pres = PRSNT_NODEF; - usrServInfoA->chanStruct.val = 0x1; /* 8kHz integrity */ - usrServInfoA->config.pres = PRSNT_NODEF; - usrServInfoA->config.val = 0x0; /* point to point configuration */ - usrServInfoA->establish.pres = PRSNT_NODEF; - usrServInfoA->establish.val = 0x0; /* on demand */ - usrServInfoA->symmetry.pres = PRSNT_NODEF; - usrServInfoA->symmetry.val = 0x0; /* bi-directional symmetric */ - usrServInfoA->usrInfLyr1Prot.pres = PRSNT_NODEF; - usrServInfoA->usrInfLyr1Prot.val = 0x2; /* G.711 ulaw */ - usrServInfoA->rateMultiplier.pres = PRSNT_NODEF; - usrServInfoA->rateMultiplier.val = 0x1; /* 1x rate multipler */ return FTDM_SUCCESS; } From 6e54a5e9bca0eb8bbbf4f748519c0a33bc883619 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 12:08:15 -0400 Subject: [PATCH 365/493] local descriptor codec negotiation done --- .../media_gateway_cmd_handler.c | 8 +++++- .../mod_media_gateway/media_gateway_utils.c | 26 ++++++++++++++----- .../mod_media_gateway/mod_media_gateway.h | 3 ++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index ca0d286ba2..8940d36e66 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -707,7 +707,13 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* only for RTP */ if(is_rtp){ - mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); + if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + goto error; + } + } } #if 0 if(is_rtp){ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 39a69f3921..ae4ec24b04 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1699,17 +1699,18 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term /* loop through coddec list and remove un-supported codec */ for(i = 0; i < fmtList->num.val; i++) { + foundCodec = 0x00; fmt = fmtList->fmts[i]; if((NOTPRSNT == fmt->type.pres) || (NOTPRSNT == fmt->val.pres)) continue; if(CM_SDP_SPEC != fmt->type.val) continue; /* TODO - need to see for other cases like CM_SDP_NIL/CM_SDP_CHOICE etc not sure as of now */ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "codec[%d] number \n", fmt->val.val); /* see if received codec is present in our codec supported list */ for (id = 0; codecs[id] && id < codec_count; id++) { int pt = codecs[id]->ianacode; + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Matching recv codec[%d] with supported codec[%d] \n", fmt->val.val, pt); //const char *name = codecs[id]->iananame; if(pt == fmt->val.val){ foundCodec = 0x01; @@ -1751,6 +1752,14 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term } } + if(0 == fmtList->num.val) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Supported codec found in offer, Rejecting request \n"); + term->mg_error_code = switch_core_alloc(term->pool, sizeof(term->mg_error_code)); + *term->mg_error_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + + return SWITCH_STATUS_FALSE; + } + return SWITCH_STATUS_SUCCESS; } @@ -1799,6 +1808,12 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ for(i=0; inum.val; i++) { if(MGT_MEDIAPAR_LOCAL == out->parms[i]->type.val) { local = &out->parms[i]->u.local; + break; + } else if(MGT_MEDIAPAR_STRPAR == out->parms[i]->type.val){ + MgMgcoStreamDesc *stream = &out->parms[i]->u.stream; + if((NOTPRSNT != stream->sl.pres.pres) && (NOTPRSNT != stream->sl.local.pres.pres)){ + local = &stream->sl.local; + } } } } @@ -1823,12 +1838,9 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", - NULL); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", - NULL); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", - NULL); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", memCp); + MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", memCp); MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), CM_SDP_NET_TYPE_IN); MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index fdecf761b9..5c50ed9cfe 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -112,8 +112,9 @@ struct mg_termination_s { MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ mg_termination_t *next; /*!< List for physical terminations */ mg_context_t* mg_ctxt; + int *mg_error_code; /* MEGACO error code */ uint32_t flags; - const char *tech; /* Endpoint controlling the TDM interface - only FreeTDM tested so far */ + const char *tech; /* Endpoint controlling the TDM interface - only FreeTDM tested so far */ union { struct { From ad5297cab71287bb48e6efe004104da34d756ace Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 12:54:58 -0400 Subject: [PATCH 366/493] adding codec nogotiation code --- .../media_gateway_cmd_handler.c | 28 ++++++--- .../mod_media_gateway/media_gateway_stack.h | 4 +- .../mod_media_gateway/media_gateway_utils.c | 58 +++++++++++++++++-- 3 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 8940d36e66..18129ff975 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -198,7 +198,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c * * */ -switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *cmd, mg_termination_t* term) +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *cmd, mg_termination_t* term, CmMemListCp *memCp) { CmSdpMedProtoFmts *format; TknU8 *fmt; @@ -301,7 +301,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * } } - mgco_handle_sdp(&local->sdp, term, MG_SDP_LOCAL); + mgco_handle_incoming_sdp(&local->sdp, term, MG_SDP_LOCAL, mg_profile, memCp); break; } @@ -313,7 +313,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * remote = &mediaPar->u.remote; sdp = remote->sdp.info[0]; /* for Matt - same like local descriptor */ - mgco_handle_sdp(&remote->sdp, term, MG_SDP_REMOTE); + mgco_handle_incoming_sdp(&remote->sdp, term, MG_SDP_REMOTE, mg_profile, memCp); break; } @@ -406,12 +406,12 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * if (mgStream->sl.remote.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_handle_sdp(&mgStream->sl.remote.sdp, term, MG_SDP_LOCAL); + mgco_handle_incoming_sdp(&mgStream->sl.remote.sdp, term, MG_SDP_LOCAL, mg_profile, memCp); } if (mgStream->sl.local.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_handle_sdp(&mgStream->sl.local.sdp, term, MG_SDP_REMOTE); + mgco_handle_incoming_sdp(&mgStream->sl.local.sdp, term, MG_SDP_REMOTE, mg_profile, memCp); } break; @@ -610,7 +610,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /********************************************************************/ - ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); + + /* IF there is any error , return */ + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + goto error; + } /* TODO - locally assigned SDP must be the part of termination...which we can use to fill responses*/ @@ -1067,7 +1074,14 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /********************************************************************/ - ret = mg_prc_descriptors(mg_profile, inc_cmd, term); + ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); + + /* IF there is any error , return */ + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + goto error; + } /* SDP updated to termination */ megaco_activate_termination(term); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index f84bfbd5e4..20354b0ccb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -141,7 +141,7 @@ typedef enum { (_reqId)->id.val = 0xFFFFFFFF; -switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term); +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term, CmMemListCp *memCp); void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* msg); @@ -166,7 +166,7 @@ int sng_mgco_mg_get_status(int elemId, MgMngmt* cfm, megaco_profile_t* mg_cfg, m switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoContextId* ctxtId, TknU32* peerId); -void mgco_handle_sdp(CmSdpInfoSet *sdp,mg_termination_t* term, mgco_sdp_types_e sdp_type); +void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp,mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmMemListCp *memCp); void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId); switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId); switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index ae4ec24b04..019725208f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -421,7 +421,7 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) } /*****************************************************************************************************************************/ -void mgco_print_sdp_attr_set(CmSdpAttrSet *s) +void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) { int i=0x00; if (s->numComp.pres) { @@ -461,6 +461,9 @@ void mgco_print_sdp_attr_set(CmSdpAttrSet *s) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %ld \n", (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); #endif + if(MG_TERM_RTP == term->type){ + term->u.rtp.ptime = a->u.ptime.val; + } break; } case CM_SDP_ATTR_RECVONLY: @@ -786,7 +789,30 @@ void mgco_print_CmSdpU8OrNil(CmSdpU8OrNil* p) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Value = %d \n", (NOTPRSNT != p->val.pres)?p->val.val:-1); } -void mgco_print_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) +const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) +{ + int i = 0x00; + const switch_codec_implementation_t *codecs[16]; + char *codec_prefs[16] = { 0 }; + char *szcodec_prefs; + int codec_count; + + szcodec_prefs = strdup(mg_profile->codec_prefs); + codec_count = switch_split(szcodec_prefs, ',', codec_prefs); + + /* Get the list of codecs, by preference */ + switch_loadable_module_get_codecs_sorted(codecs, switch_arraylen(codecs), codec_prefs, switch_arraylen(codec_prefs)); + /* see if received codec is present in our codec supported list */ + for (i = 0; codecs[i] && i < codec_count; i++) { + if(iana_code == codecs[i]->ianacode){ + return codecs[i]->iananame; + } + } + + return NULL; +} + +void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmSdpAttrSet *attrSet, CmMemListCp *memCp) { int i=0x00; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "***** Media Parameter *********** \n"); @@ -837,6 +863,26 @@ void mgco_print_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp } } } + + /* Ideally remote descriptor should have supported codec..but just in case calling remove un-supported codecs api */ + mg_rem_unsupported_codecs(mg_profile, term , r, attrSet, memCp); + + + /* now whatever we have , that will be suported one */ + if((NOTPRSNT != r->num.pres) && (0 != r->num.val) && (NULL != r->fmts[0])){ + const char* name = mg_get_codec_name(mg_profile, r->fmts[0]->val.val); + if(name){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Updating codec to[%d], name[%s] \n", + r->fmts[0]->val.val, name); + if(MG_TERM_RTP == term->type){ + term->u.rtp.codec = name; + } + }else{ + /* ERROR */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " NO Codec Name found against iana[%d] \n", r->fmts[0]->val.val); + } + } + break; } @@ -854,7 +900,7 @@ void mgco_print_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); } -void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e sdp_type) +void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmMemListCp *memCp) { int i; @@ -1021,7 +1067,7 @@ void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e /************************************************************************************************************************/ /* Attribute Set */ - mgco_print_sdp_attr_set(&s->attrSet); + mgco_handle_sdp_attr_set(&s->attrSet, term); /************************************************************************************************************************/ /* Media Descriptor Set */ @@ -1077,7 +1123,7 @@ void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e break; } } - mgco_print_sdp_media_param(&f->par, term, sdp_type); + mgco_handle_sdp_media_param(&f->par, term, sdp_type, mg_profile, &desc->attrSet, memCp); } /*info */ @@ -1097,7 +1143,7 @@ void mgco_handle_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e } /* attribute set */ - mgco_print_sdp_attr_set(&desc->attrSet); + mgco_handle_sdp_attr_set(&desc->attrSet, term); if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && From ed5875b54b15a7bfb9312a3dfaeb548297f6f4f0 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 13:01:54 -0400 Subject: [PATCH 367/493] fixing issue --- src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 18129ff975..f9ae4fe90a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1080,6 +1080,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ mg_util_set_err_string(&errTxt, " Unsupported Codec "); err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + /* TODO delete RTP termination */ goto error; } From 6895e46983e625817d6f939f5c19c0719fbc5c55 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 27 Jul 2012 15:02:45 -0400 Subject: [PATCH 368/493] Fix compile warning --- libs/freetdm/src/ftdm_io.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 1c05797102..18e39a3da9 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -36,7 +36,6 @@ * David Yat Sin * */ - #define _GNU_SOURCE #include "private/ftdm_core.h" #include From 008bb4942be0a6e2d1b2f5db425c7cace04a6449 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 16:11:46 -0400 Subject: [PATCH 369/493] adding code for updating codec types --- libs/freetdm/mod_freetdm/tdm.c | 4 +- .../mod_media_gateway/media_gateway_utils.c | 1 + src/mod/endpoints/mod_sofia/rtp.c | 82 ++++++++++++++++--- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index b2d37d47ed..ab061a3812 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -111,7 +111,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *dname; ftdm_codec_t codec; uint32_t interval; - ftdm_status_t fstatus; + /*ftdm_status_t fstatus;*/ const char *ftdm_start_only = switch_event_get_header(var_event, "ftdm_start_only"); ctdm_private_t *tech_pvt = NULL; @@ -129,10 +129,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } +#if 0 if ((fstatus = ftdm_span_start(span)) != FTDM_SUCCESS && fstatus != FTDM_EINVAL) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start span %s.\n", span_name); goto fail; } +#endif if (!zstr(ftdm_start_only) && switch_true(ftdm_start_only)) { goto fail; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 019725208f..f7e9dde544 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -876,6 +876,7 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd r->fmts[0]->val.val, name); if(MG_TERM_RTP == term->type){ term->u.rtp.codec = name; + term->u.rtp.pt = r->fmts[0]->val.val; } }else{ /* ERROR */ diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 04feb55a8a..bf3e36ca19 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -421,17 +421,26 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi const char *command = switch_event_get_header(event, "command"); switch_channel_t *channel = switch_core_session_get_channel(session); crtp_private_t *tech_pvt = switch_core_session_get_private(session); - + char *codec = switch_event_get_header_nil(event, kCODEC); + char *szptime = switch_event_get_header_nil(event, kPTIME); + char *szrate = switch_event_get_header_nil(event, kRATE); + char *szpt = switch_event_get_header_nil(event, kPT); + + int ptime = !zstr(szptime) ? atoi(szptime) : 0, + rate = !zstr(szrate) ? atoi(szrate) : 8000, + pt = !zstr(szpt) ? atoi(szpt) : 0; + + if (!zstr(command) && !strcasecmp(command, "media_modify")) { /* Compare parameters */ if (compare_var(event, channel, kREMOTEADDR) || compare_var(event, channel, kREMOTEPORT)) { - char *remote_addr = switch_event_get_header(event, kREMOTEADDR); - char *szremote_port = switch_event_get_header(event, kREMOTEPORT); - switch_port_t remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; - const char *err; + char *remote_addr = switch_event_get_header(event, kREMOTEADDR); + char *szremote_port = switch_event_get_header(event, kREMOTEPORT); + switch_port_t remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; + const char *err; + - switch_channel_set_variable(channel, kREMOTEADDR, remote_addr); switch_channel_set_variable(channel, kREMOTEPORT, szremote_port); @@ -446,10 +455,47 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi if (compare_var(event, channel, kCODEC) || compare_var(event, channel, kPTIME) || compare_var(event, channel, kPT) || - compare_var(event, channel, kRATE)) { - /* Reset codec */ - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec not yet implemented\n"); - } + compare_var(event, channel, kRATE)) { + /* Reset codec */ + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec updating \n"); + + if (switch_core_codec_init(&tech_pvt->read_codec, + codec, + NULL, + rate, + ptime, + 1, + /*SWITCH_CODEC_FLAG_ENCODE |*/ SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + goto fail; + } else { + if (switch_core_codec_init(&tech_pvt->write_codec, + codec, + NULL, + rate, + ptime, + 1, + SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); + goto fail; + } + } + + if (switch_core_session_set_read_codec(session, &tech_pvt->read_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set read codec?\n"); + goto fail; + } + + if (switch_core_session_set_write_codec(session, &tech_pvt->write_codec) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n"); + goto fail; + } + + switch_rtp_set_default_payload(tech_pvt->rtp_session, pt); + switch_rtp_set_recv_pt(tech_pvt->rtp_session, pt); + } if (compare_var(event, channel, kRFC2833PT)) { const char *szpt = switch_channel_get_variable(channel, kRFC2833PT); @@ -464,6 +510,22 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } return SWITCH_STATUS_SUCCESS; +fail: + if (tech_pvt) { + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + } + + if (session) { + switch_core_session_destroy(&session); + } + return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; + } static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg) From 2dc5b322dd7cdd7a08c351805769a0a3862b9bbd Mon Sep 17 00:00:00 2001 From: root Date: Fri, 27 Jul 2012 21:31:24 -0400 Subject: [PATCH 370/493] Added event system for TDM termination alarms --- libs/freetdm/mod_freetdm/mod_freetdm.c | 6 +- libs/freetdm/mod_freetdm/tdm.c | 205 ++++++++++++++++-- libs/freetdm/src/ftdm_io.c | 15 +- libs/freetdm/src/include/freetdm.h | 12 +- .../mod_media_gateway/media_gateway.c | 61 +++--- .../mod_media_gateway/media_gateway_xml.c | 2 + .../mod_media_gateway/mod_media_gateway.c | 32 ++- .../mod_media_gateway/mod_media_gateway.h | 3 +- 8 files changed, 275 insertions(+), 61 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 34fb3f469a..a746c1877f 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -2097,7 +2097,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session static FIO_SIGNAL_CB_FUNCTION(on_common_signal) { uint32_t chanid, spanid; - switch_event_t *event = NULL; + switch_event_t *event = NULL; ftdm_alarm_flag_t alarmbits = FTDM_ALARM_NONE; chanid = ftdm_channel_get_id(sigmsg->channel); @@ -2200,9 +2200,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_common_signal) break; } - if (event) { - - + if (event) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", ftdm_channel_get_span_name(sigmsg->channel)); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-number", "%d", ftdm_channel_get_span_id(sigmsg->channel)); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(sigmsg->channel)); diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index ab061a3812..c5850e6f51 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -68,6 +68,9 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf); + +static ftdm_status_t ctdm_span_prepare(ftdm_span_t *span); + switch_state_handler_table_t ctdm_state_handlers = { .on_init = channel_on_init, .on_destroy = channel_on_destroy @@ -81,6 +84,115 @@ switch_io_routines_t ctdm_io_routines = { .receive_message = channel_receive_message }; +static void ctdm_report_alarms(ftdm_channel_t *channel) +{ + switch_event_t *event = NULL; + ftdm_alarm_flag_t alarmflag = 0; + + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "failed to create alarms events\n"); + return; + } + + if (ftdm_channel_get_alarms(channel, &alarmflag) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve alarms %s:%d\n", ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); + return; + } + + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", ftdm_channel_get_span_name(channel)); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-number", "%d", ftdm_channel_get_span_id(channel)); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(channel)); + + if (alarmflag) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear"); + } else { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap"); + } + + if (alarmflag & FTDM_ALARM_RED) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red"); + } + if (alarmflag & FTDM_ALARM_YELLOW) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow"); + } + if (alarmflag & FTDM_ALARM_RAI) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "rai"); + } + if (alarmflag & FTDM_ALARM_BLUE) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue"); + } + if (alarmflag & FTDM_ALARM_AIS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "ais"); + } + if (alarmflag & FTDM_ALARM_GENERAL) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general"); + } + + switch_event_fire(&event); + return; +} + + + +static void ctdm_event_handler(switch_event_t *event) +{ + ftdm_status_t status = FTDM_FAIL; + switch(event->event_id) { + case SWITCH_EVENT_TRAP: + { + ftdm_span_t *span = NULL; + ftdm_channel_t *channel = NULL; + const char *span_name = NULL; + const char *chan_number = NULL; + uint32_t chan_id = 0; + const char *cond = switch_event_get_header(event, "condition"); + + if (zstr(cond)) { + return; + } + + span_name = switch_event_get_header(event, "span-name"); + chan_number = switch_event_get_header(event, "chan-number"); + + if (ftdm_span_find_by_name(span_name, &span) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name); + return; + } + + if (!strcmp(cond, "mg-tdm-prepare")) { + status = ctdm_span_prepare(span); + if (status == FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Span %s prepared successfully\n", span_name); + } else if (status != FTDM_EINVAL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to prepare span %s.\n", span_name); + } + } else if (!strcmp(cond, "mg-tdm-check")) { + if (zstr(chan_number)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No channel number specified\n"); + return; + } + chan_id = atoi(chan_number); + if (!chan_id) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel number:%s\n", chan_number); + return; + } + + channel = ftdm_span_get_channel(span, chan_id); + if (!channel) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find channel\n"); + return; + } + + ctdm_report_alarms(channel); + } + } + break; + default: + break; + } + return; +} + void ctdm_init(switch_loadable_module_interface_t *module_interface) { switch_endpoint_interface_t *endpoint_interface; @@ -90,7 +202,82 @@ void ctdm_init(switch_loadable_module_interface_t *module_interface) endpoint_interface->io_routines = &ctdm_io_routines; endpoint_interface->state_handler = &ctdm_state_handlers; ctdm.endpoint_interface = endpoint_interface; - + + switch_event_bind("mod_freetdm", SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, ctdm_event_handler, NULL); +} + +static FIO_SIGNAL_CB_FUNCTION(on_signal_cb) +{ + uint32_t chanid, spanid; + switch_event_t *event = NULL; + ftdm_alarm_flag_t alarmbits = FTDM_ALARM_NONE; + + chanid = ftdm_channel_get_id(sigmsg->channel); + spanid = ftdm_channel_get_span_id(sigmsg->channel); + + switch(sigmsg->event_id) { + case FTDM_SIGEVENT_ALARM_CLEAR: + case FTDM_SIGEVENT_ALARM_TRAP: + { + if (ftdm_channel_get_alarms(sigmsg->channel, &alarmbits) != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "failed to retrieve alarms\n"); + return FTDM_FAIL; + } + + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "failed to create alarms events\n"); + return FTDM_FAIL; + } + if (sigmsg->event_id == FTDM_SIGEVENT_ALARM_CLEAR) { + ftdm_log(FTDM_LOG_NOTICE, "Alarm cleared on channel %d:%d\n", spanid, chanid); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear"); + } else { + ftdm_log(FTDM_LOG_NOTICE, "Alarm raised on channel %d:%d\n", spanid, chanid); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap"); + } + } + break; + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unhandled event %d\n", sigmsg->event_id); + break; + } + + if (event) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", ftdm_channel_get_span_name(sigmsg->channel)); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-number", "%d", ftdm_channel_get_span_id(sigmsg->channel)); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(sigmsg->channel)); + + if (alarmbits & FTDM_ALARM_RED) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red"); + } + if (alarmbits & FTDM_ALARM_YELLOW) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow"); + } + if (alarmbits & FTDM_ALARM_RAI) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "rai"); + } + if (alarmbits & FTDM_ALARM_BLUE) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue"); + } + if (alarmbits & FTDM_ALARM_AIS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "ais"); + } + if (alarmbits & FTDM_ALARM_GENERAL) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general"); + } + + switch_event_fire(&event); + } + return FTDM_SUCCESS; +} + +static ftdm_status_t ctdm_span_prepare(ftdm_span_t *span) +{ + if (ftdm_span_register_signal_cb(span, on_signal_cb) != FTDM_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register signal CB\n"); + return FTDM_FAIL; + } + return ftdm_span_start(span); } static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, @@ -111,10 +298,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi const char *dname; ftdm_codec_t codec; uint32_t interval; - /*ftdm_status_t fstatus;*/ - const char *ftdm_start_only = switch_event_get_header(var_event, "ftdm_start_only"); ctdm_private_t *tech_pvt = NULL; - + if (zstr(szchanid) || zstr(span_name)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both ["kSPAN_ID"] and ["kCHAN_ID"] have to be set.\n"); goto fail; @@ -129,18 +314,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi goto fail; } -#if 0 - if ((fstatus = ftdm_span_start(span)) != FTDM_SUCCESS && fstatus != FTDM_EINVAL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start span %s.\n", span_name); - goto fail; - } -#endif - - if (!zstr(ftdm_start_only) && switch_true(ftdm_start_only)) { - goto fail; - } - - if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n"); goto fail; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 758827c9ed..4e110df659 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -5653,6 +5653,12 @@ static void *ftdm_span_service_events(ftdm_thread_t *me, void *obj) return NULL; } +FT_DECLARE(ftdm_status_t) ftdm_span_register_signal_cb(ftdm_span_t *span, fio_signal_cb_t sig_cb) +{ + span->signal_cb = sig_cb; + return FTDM_SUCCESS; +} + FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span) { ftdm_status_t status = FTDM_FAIL; @@ -5670,7 +5676,8 @@ FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span) goto done; } - status = ftdm_report_initial_channels_alarms(span); + //ftdm_report_initial_channels_alarms(span); + ftdm_set_flag_locked(span, FTDM_SPAN_STARTED); goto done; } @@ -5872,8 +5879,10 @@ FT_DECLARE(ftdm_status_t) ftdm_group_create(ftdm_group_t **group, const char *na static ftdm_status_t ftdm_span_trigger_signal(const ftdm_span_t *span, ftdm_sigmsg_t *sigmsg) { - ftdm_status_t status = span->signal_cb(sigmsg); - return status; + if (!span->signal_cb) { + return FTDM_FAIL; + } + return span->signal_cb(sigmsg); } static ftdm_status_t ftdm_span_queue_signal(const ftdm_span_t *span, ftdm_sigmsg_t *sigmsg) diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index f7de8519b7..e041e1f0e7 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -1611,6 +1611,17 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span(ftdm_span_t *span, const char *typ */ FT_DECLARE(ftdm_status_t) ftdm_configure_span_signaling(ftdm_span_t *span, const char *type, fio_signal_cb_t sig_cb, ftdm_conf_parameter_t *parameters); +/*! + * \brief Register callback to listen for incoming events + * \note This function should only be used when there is no signalling module + * \param span The span to register to + * \param sig_cb The callback that the signaling stack will use to notify about events + * + * \retval FTDM_SUCCESS success + * \retval FTDM_FAIL failure + */ +FT_DECLARE(ftdm_status_t) ftdm_span_register_signal_cb(ftdm_span_t *span, fio_signal_cb_t sig_cb); + /*! * \brief Start the span signaling (must call ftdm_configure_span_signaling first) * @@ -1626,7 +1637,6 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_signaling(ftdm_span_t *span, const */ FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span); - /*! * \brief Stop the span signaling (must call ftdm_span_start first) * \note certain signalings (boost signaling) does not support granular span start/stop diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index ee5abe7d2f..9056ee1bdc 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -155,47 +155,38 @@ done: return SWITCH_STATUS_SUCCESS; } - -/* - * Originate a channel so the target technology gets to run initialization code - */ -switch_status_t megaco_prepare_termination(mg_termination_t *term) +switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term) { - switch_event_t *var_event = NULL; - switch_core_session_t *session = NULL; - switch_status_t status = SWITCH_STATUS_SUCCESS; - char dialstring[100]; - switch_call_cause_t cause; - switch_channel_t *channel; - switch_event_create(&var_event, SWITCH_EVENT_CLONE); - - if (term->type == MG_TERM_RTP) { - } else if (term->type == MG_TERM_TDM) { - switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); + switch_event_t *event = NULL; + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to create NOTIFY event\n"); + return SWITCH_STATUS_FALSE; + } - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "ftdm_start_only", "true"); - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kSPAN_NAME, term->u.tdm.span_name); - switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kCHAN_ID, "%d", term->u.tdm.channel); - } - - /* Set common variables on the channel */ - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true"); - if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { - status = SWITCH_STATUS_FALSE; - goto done; - } - channel = switch_core_session_get_channel(session); - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - -done: - if (session) { - switch_core_session_rwunlock(session); - } - switch_event_destroy(&var_event); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", term->u.tdm.span_name); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", term->u.tdm.channel); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "mg-tdm-prepare"); + switch_event_fire(&event); return SWITCH_STATUS_SUCCESS; } +/* @Kapil Call this function once H.248 link is up */ +switch_status_t megaco_check_tdm_termination(mg_termination_t *term) +{ + switch_event_t *event = NULL; + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to create NOTIFY event\n"); + return SWITCH_STATUS_FALSE; + } + + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", term->u.tdm.span_name); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", term->u.tdm.channel); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "mg-tdm-check"); + + switch_event_fire(&event); + return SWITCH_STATUS_SUCCESS; +} mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const char *prefix) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 011c36ce56..1b8173aa1e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -111,6 +111,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->physical_terminations = term; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %s chan: %d\n", term->name, term->u.tdm.span_name, term->u.tdm.channel); + + megaco_prepare_tdm_termination(term); } } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index de315d7ae9..00f5e9760f 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -56,6 +56,35 @@ static switch_status_t list_profiles(const char *line, const char *cursor, switc return status; } +static void mg_event_handler(switch_event_t *event) +{ + switch(event->event_id) { + case SWITCH_EVENT_TRAP: + { + const char *span_name = NULL; + const char *chan_number = NULL; + const char *cond = NULL; + + cond = switch_event_get_header(event, "condition"); + if (zstr(cond)) { + return; + } + + span_name = switch_event_get_header(event, "span-name"); + chan_number = switch_event_get_header(event, "chan-number"); + + if (!strcmp(cond, "ftdm-alarm-trap")) { + /* @KAPIL: TDM is in alarm, notify MGC */ + } else if (!strcmp(cond, "ftdm-alarm-clear")) { + /* @KAPIL: TDM alarm cleared, notify MGC */ + } + } + break; + default: + break; + } +} + SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) { switch_api_interface_t *api_interface; @@ -82,7 +111,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) switch_console_set_complete("add mg logging ::mg::list_profiles disable"); switch_console_add_complete_func("::mg::list_profiles", list_profiles); - /* Initialize MEGACO Stack */ sng_event.mg.sng_mgco_txn_ind = handle_mgco_txn_ind; sng_event.mg.sng_mgco_cmd_ind = handle_mgco_cmd_ind; @@ -96,6 +124,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) /* Log */ sng_event.sm.sng_log = handle_sng_log; + switch_event_bind("mod_media_gateway", SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, mg_event_handler, NULL); + /* initualize MEGACO stack */ return sng_mgco_init(&sng_event); } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 504f147d76..86acb28861 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -256,7 +256,8 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term); switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination_t *term); - +switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term); +switch_status_t megaco_check_tdm_termination(mg_termination_t *term); #endif /* MOD_MEGACO_H */ From a6503b49524e0cce8d20e5b4c31955eea24b4521 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Sat, 28 Jul 2012 09:59:47 -0400 Subject: [PATCH 371/493] Fixed compile warning --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2e51ba8674..4e59b6ae33 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -213,7 +213,7 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum) { - char *val = NULL; + const char *val = NULL; ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data; From 4bbb8c014a8dccab24439bf43905559927169f53 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Sat, 28 Jul 2012 10:41:55 -0400 Subject: [PATCH 372/493] Fixed compile error --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 2e51ba8674..105dda1f6b 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -239,7 +239,7 @@ ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPt ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called INN value \"%s\"\n", val); } else { cdPtyNum->innInd.val = 0x01; - ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Called INN value, set to default value 0x01\n"); + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Called INN value, set to default value 0x01\n"); } return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven); From da26b4de4122a2a6e4b6a0ca5d6ea63871b04a05 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 Jul 2012 10:17:13 -0400 Subject: [PATCH 373/493] adding termination service-change code --- libs/freetdm/mod_freetdm/tdm.c | 8 ++- .../mod_media_gateway/media_gateway.c | 69 +++++++++++++++++++ .../media_gateway_cmd_handler.c | 39 +++++++++++ .../mod_media_gateway/media_gateway_stack.h | 10 +++ .../media_gateway_stack_alarms.c | 9 ++- .../mod_media_gateway/media_gateway_xml.c | 2 +- .../mod_media_gateway/mod_media_gateway.c | 21 +++++- 7 files changed, 149 insertions(+), 9 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index c5850e6f51..790f7c17d3 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -84,7 +84,7 @@ switch_io_routines_t ctdm_io_routines = { .receive_message = channel_receive_message }; -static void ctdm_report_alarms(ftdm_channel_t *channel) +static void ctdm_report_alarms(ftdm_channel_t *channel, const char* mg_profile_name) { switch_event_t *event = NULL; ftdm_alarm_flag_t alarmflag = 0; @@ -109,6 +109,8 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap"); } + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "mg-profile-name", mg_profile_name); + if (alarmflag & FTDM_ALARM_RED) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red"); } @@ -128,6 +130,7 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general"); } + switch_event_fire(&event); return; } @@ -146,6 +149,7 @@ static void ctdm_event_handler(switch_event_t *event) const char *chan_number = NULL; uint32_t chan_id = 0; const char *cond = switch_event_get_header(event, "condition"); + const char *mg_profile_name = switch_event_get_header(event, "mg-profile-name"); if (zstr(cond)) { return; @@ -183,7 +187,7 @@ static void ctdm_event_handler(switch_event_t *event) return; } - ctdm_report_alarms(channel); + ctdm_report_alarms(channel, mg_profile_name); } } break; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 9056ee1bdc..7e13fbaebe 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -175,6 +175,9 @@ switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term) switch_status_t megaco_check_tdm_termination(mg_termination_t *term) { switch_event_t *event = NULL; + + if(!term || !term->profile) return SWITCH_STATUS_FALSE; + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to create NOTIFY event\n"); return SWITCH_STATUS_FALSE; @@ -183,6 +186,7 @@ switch_status_t megaco_check_tdm_termination(mg_termination_t *term) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", term->u.tdm.span_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", term->u.tdm.channel); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "mg-tdm-check"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "mg-profile-name", term->profile->name); switch_event_fire(&event); return SWITCH_STATUS_SUCCESS; @@ -237,6 +241,42 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha return term; } +mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile, char *span_name, char *chan_number) +{ + void *val = NULL; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + int found = 0x00; + const void *var; + + if(!span_name || !chan_number){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Invalid span_name/chan_number \n"); + return NULL; + } + + for (hi = switch_hash_first(NULL, profile->terminations); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + term = (mg_termination_t *) val; + if(!term) continue; + if(MG_TERM_TDM != term->type) continue; + + if ((!strcasecmp(span_name, term->u.tdm.span_name))&& (atoi(chan_number) == term->u.tdm.channel)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "Got term[%s] associated with span[%s], channel[%s]\n",term->name, span_name, chan_number); + found = 0x01; + break; + } + } + + if(!found){ + term = NULL; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + " Not able to find termination associated with span[%s], channel[%s]\n", span_name, chan_number); + } + + return term; +} + mg_termination_t *megaco_find_termination(megaco_profile_t *profile, const char *name) { mg_termination_t *term = switch_core_hash_find_rdlock(profile->terminations, name, profile->terminations_rwlock); @@ -568,6 +608,35 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) return SWITCH_STATUS_SUCCESS; } + +switch_status_t mgco_init_ins_service_change(SuId suId) +{ + megaco_profile_t* profile = NULL; + void *val = NULL; + const void *key = NULL; + switch_ssize_t keylen; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + + + if(NULL == (profile = megaco_get_profile_by_suId(suId))){ + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "mgco_init_ins_service_change : Initiating terminations service change for profile: %s\n", profile->name); + + /* loop through all termination and post get status Event */ + for (hi = switch_hash_first(NULL, profile->terminations); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &key, &keylen, &val); + term = (mg_termination_t *) val; + if(!term) continue; + megaco_check_tdm_termination(term); + } + + return SWITCH_STATUS_SUCCESS; +} + switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index f9ae4fe90a..ca2209b087 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2288,6 +2288,45 @@ U32 get_txn_id(){ return outgoing_txn_id; } /*****************************************************************************************************************************/ +switch_status_t mg_send_term_service_change(char* mg_profile_name,char *span_name, char *chan_number, mg_term_states_e term_state) +{ + mg_termination_t* term = NULL; + switch_status_t ret = SWITCH_STATUS_SUCCESS; + megaco_profile_t *profile = NULL; + + switch_assert(span_name); + switch_assert(chan_number); + + profile = megaco_profile_locate(mg_profile_name); + + term = megaco_find_termination_by_span_chan(profile, span_name, chan_number); + + if(!term || !term->profile){ + return SWITCH_STATUS_FALSE; + } + + switch(term_state) + { + case MG_TERM_SERVICE_STATE_IN_SERVICE: + { + ret = mg_send_ins_service_change(term->profile, term->name, 0x00 ); + break; + } + case MG_TERM_SERVICE_STATE_OUT_OF_SERVICE: + { + ret = mg_send_oos_service_change(term->profile, term->name, 0x00 ); + break; + } + default: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Invalid term_state[%d]\n", term_state); + return SWITCH_STATUS_FALSE; + } + } + + return ret; +} +/*****************************************************************************************************************************/ /* Note : API to send Service Change when termination is coming up(in-service) */ /* INPUT : MG Profile structure and termination name */ /* wild flag will tell if service change request needs to be in W-SC format as we can have W-SC=A01* or SC=A01* */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 20354b0ccb..3e2ec81bdb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -52,6 +52,13 @@ typedef enum{ SNG_MG_ENCODING_TEXT, }sng_mg_encoding_types_e; +typedef enum{ + MG_TERM_SERVICE_STATE_UNKNOWN, + MG_TERM_SERVICE_STATE_IN_SERVICE, + MG_TERM_SERVICE_STATE_OUT_OF_SERVICE, + MG_TERM_SERVICE_STATE_INVALID, +}mg_term_states_e; + #define PRNT_ENCODING_TYPE(_val)\ ((_val == SNG_MG_ENCODING_TEXT)?"SNG_MG_ENCODING_TEXT":\ (_val == SNG_MG_ENCODING_BINARY)?"SNG_MG_ENCODING_BINARY":\ @@ -157,6 +164,8 @@ void mg_util_set_err_string ( MgStr *errTxt, char* str); switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); +switch_status_t mg_send_term_service_change(char* mg_profile_name, char *span_name, char *chan_number, mg_term_states_e term_state); +mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile , char *span_name, char *chan_number); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); @@ -183,6 +192,7 @@ switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_stack_termination_is_in_service(char* term_str, int len); void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd); +switch_status_t mgco_init_ins_service_change(SuId suId); switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req); switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index 4564468e96..f392203db1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -25,8 +25,8 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) memset(&prBuf[0], 0, sizeof(prBuf)); - len = len + sprintf(prBuf+len,"MG Status Indication: received with Category = %d, Event = %d, Cause = %d \n", - usta->t.usta.alarm.category, usta->t.usta.alarm.event, + len = len + sprintf(prBuf+len,"MG Status Indication: received for sapId[%d] with Category = %d, Event = %d, Cause = %d \n", + usta->t.usta.alarmInfo.sapId, usta->t.usta.alarm.category, usta->t.usta.alarm.event, usta->t.usta.alarm.cause); len = len + sprintf(prBuf+len, "Category ( "); @@ -218,9 +218,8 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) case LMG_EVENT_PEER_ENABLED: { len = len + sprintf(prBuf+len, "gateway enabled"); - /* gateway enabled now we can send termination service change */ - /*TODO - probably we cannt immediate send Service change - we have to find proper place */ - /*mg_send_service_change(0x01, "A01", MGT_SVCCHGMETH_RESTART,MG_SVC_REASON_900_RESTORED );*/ + /* gateway enabled now we can send termination service change for all terminations */ + mgco_init_ins_service_change( usta->t.usta.alarmInfo.sapId ); break; } case LMG_EVENT_PEER_DISCOVERED: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 1b8173aa1e..6c87afa780 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -84,7 +84,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) char *channel_map_dup = strdup(channel_map); char *chanmap[24]; int chanmap_count, i; - chanmap_count = switch_split(channel_map_dup, ' ', chanmap); + chanmap_count = switch_split(channel_map_dup, ',', chanmap); for (i = 0; i < chanmap_count; i++) { char *p = strchr(chanmap[i], '-'); if (p) { diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 00f5e9760f..97158fdcea 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -64,9 +64,18 @@ static void mg_event_handler(switch_event_t *event) const char *span_name = NULL; const char *chan_number = NULL; const char *cond = NULL; + const char *mg_profile_name = NULL; + cond = switch_event_get_header(event, "condition"); if (zstr(cond)) { + printf("Condition NULL, returning \n"); + return; + } + + mg_profile_name = switch_event_get_header(event, "mg-profile-name"); + if (zstr(mg_profile_name)) { + printf("mg_profile_name NULL, returning \n"); return; } @@ -74,9 +83,19 @@ static void mg_event_handler(switch_event_t *event) chan_number = switch_event_get_header(event, "chan-number"); if (!strcmp(cond, "ftdm-alarm-trap")) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "ftdm-alarm-trap for span_name[%s] chan_number[%s] associated with MG profile[%s]\n", + span_name,chan_number, mg_profile_name); /* @KAPIL: TDM is in alarm, notify MGC */ + mg_send_term_service_change( + (char*)mg_profile_name, (char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_OUT_OF_SERVICE); } else if (!strcmp(cond, "ftdm-alarm-clear")) { - /* @KAPIL: TDM alarm cleared, notify MGC */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "ftdm-alarm-clear for span_name[%s] chan_number[%s] associated with MG profile[%s] \n", + span_name,chan_number, mg_profile_name); + /* TDM alarm cleared, notify MGC */ + mg_send_term_service_change( + (char*)mg_profile_name, (char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_IN_SERVICE); } } break; From a3b4f3ad4ddd307bd72e30888cafb71026ccfeec Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Sun, 29 Jul 2012 22:28:10 -0400 Subject: [PATCH 374/493] Added mod_opal --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 559b06e8ea..83986b996c 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -7,6 +7,7 @@ applications/mod_hash applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia +endpoints/mod_opal #endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr From 2899b4ae95051c8ce5f55ceed4ff8f0351f838bb Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 30 Jul 2012 11:07:01 -0400 Subject: [PATCH 375/493] Updated to latest code used on test machines --- src/mod/endpoints/mod_opal/mod_opal.cpp | 1318 +++++++++-------------- src/mod/endpoints/mod_opal/mod_opal.h | 330 +++--- 2 files changed, 713 insertions(+), 935 deletions(-) diff --git a/src/mod/endpoints/mod_opal/mod_opal.cpp b/src/mod/endpoints/mod_opal/mod_opal.cpp index 0760588019..8244737115 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.cpp +++ b/src/mod/endpoints/mod_opal/mod_opal.cpp @@ -4,6 +4,7 @@ * Version: MPL 1.1 * * Copyright (c) 2007 Tuyan Ozipek (tuyanozipek@gmail.com) + * Copyright (c) 2008-2012 Vox Lucida Pty. Ltd. (robertj@voxlucida.com.au) * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with @@ -28,29 +29,34 @@ #include #include -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, mod_opal_globals.codec_string); -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_context, mod_opal_globals.context); -SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, mod_opal_globals.dialplan); + +/* FreeSWITCH does not correctly handle an H.323 subtely, that is that a + MAXIMUM audio frames per packet is nototiated, and there is no + requirement for the remote to actually send that many. So, in say GSM, we + negotiate up to 3 frames or 60ms of data and the remote actually sends one + (20ms) frame per packet. Perfectly legal but blows up the media handling + in FS. + + Eventually we will get around to bundling the packets, but not yet. This + compile flag will just force one frame/packet for all audio codecs. + */ +#define IMPLEMENT_MULTI_FAME_AUDIO 0 -#define CF_NEED_FLUSH (1 << 1) - -struct mod_opal_globals mod_opal_globals = { 0 }; - - -static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event, - switch_caller_profile_t *outbound_profile, switch_core_session_t **new_session, - switch_memory_pool_t **pool, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause); +static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session, + switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, + switch_call_cause_t *cancel_cause); static FSProcess *opal_process = NULL; -static const char ModuleName[] = "opal"; - - -static switch_status_t on_hangup(switch_core_session_t *session); -static switch_status_t on_destroy(switch_core_session_t *session); +static PConstString const ModuleName("opal"); +static char const ConfigFile[] = "opal.conf"; static switch_io_routines_t opalfs_io_routines = { @@ -70,7 +76,7 @@ static switch_state_handler_table_t opalfs_event_handlers = { /*.on_init */ FSConnection::on_init, /*.on_routing */ FSConnection::on_routing, /*.on_execute */ FSConnection::on_execute, - /*.on_hangup */ on_hangup, + /*.on_hangup */ FSConnection::on_hangup, /*.on_exchange_media */ FSConnection::on_exchange_media, /*.on_soft_execute */ FSConnection::on_soft_execute, /*.on_consume_media*/ NULL, @@ -78,7 +84,7 @@ static switch_state_handler_table_t opalfs_event_handlers = { /*.on_reset*/ NULL, /*.on_park*/ NULL, /*.on_reporting*/ NULL, - /*.on_destroy*/ on_destroy + /*.on_destroy*/ FSConnection::on_destroy }; @@ -89,7 +95,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown); SWITCH_MODULE_DEFINITION(mod_opal, mod_opal_load, mod_opal_shutdown, NULL); -SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load) { +SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load) +{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Starting loading mod_opal\n"); /* Prevent the loading of OPAL codecs via "plug ins", this is a directory @@ -110,8 +117,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load) { if (opal_process->Initialise(*module_interface)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Opal manager initialized and running\n"); //unloading causes a seg in linux - return SWITCH_STATUS_NOUNLOAD; - //return SWITCH_STATUS_SUCCESS; + //return SWITCH_STATUS_UNLOAD; + return SWITCH_STATUS_SUCCESS; } delete opal_process; @@ -120,11 +127,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load) { } -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown) { - - switch_safe_free(mod_opal_globals.context); - switch_safe_free(mod_opal_globals.dialplan); - switch_safe_free(mod_opal_globals.codec_string); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown) +{ delete opal_process; opal_process = NULL; return SWITCH_STATUS_SUCCESS; @@ -133,161 +137,79 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown) { SWITCH_END_EXTERN_C /*******************************************************************************/ - - -static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session, - switch_event_t *var_event, - switch_caller_profile_t *outbound_profile, - switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) -{ - if (opal_process == NULL) { - return SWITCH_CAUSE_CRASH; - } - - PString token; - - FSManager & manager = opal_process->GetManager(); - if (!manager.SetUpCall("local:", outbound_profile->destination_number, token, outbound_profile)) { - return SWITCH_CAUSE_INVALID_NUMBER_FORMAT; - } - - PSafePtr < OpalCall > call = manager.FindCallWithLock(token); - - if (call == NULL) { - return SWITCH_CAUSE_PROTOCOL_ERROR; - } - - PSafePtr < FSConnection > connection = call->GetConnectionAs < FSConnection > (0); - - if (connection == NULL) { - return SWITCH_CAUSE_PROTOCOL_ERROR; - } - - *new_session = connection->GetSession(); - - return SWITCH_CAUSE_SUCCESS; -} - - /////////////////////////////////////////////////////////////////////// #if PTRACING -class FSTrace : public ostream { - public: - FSTrace() - : ostream(&buffer) - { - } +class FSTrace : public std::ostream +{ +private: + class Buffer : public std::stringbuf + { + virtual int sync() + { + std::string s = str(); + if (s.empty()) + return 0; - private: - class Buffer : public streambuf { - char buffer[250]; + //Due to explicit setting of flags we know exactly what we are getting + PStringArray fields(6); + static PRegularExpression logRE("^([0-9]+)\t *([^(]+)\\(([0-9]+)\\)\t(.*)", PRegularExpression::Extended); + if (!logRE.Execute(s.c_str(), fields)) { + fields[1] = "4"; + fields[2] = __FILE__; + fields[3] = __LINE__; + fields[4] = s; + } - public: - Buffer() - { - setg(buffer, buffer, &buffer[sizeof(buffer)-2]); - setp(buffer, &buffer[sizeof(buffer)-2]); - } + switch_log_level_t level; + switch (fields[1].AsUnsigned()) { + case 0 : + level = SWITCH_LOG_ALERT; + break; + case 1 : + level = SWITCH_LOG_ERROR; + break; + case 2 : + level = SWITCH_LOG_WARNING; + break; + case 3 : + level = SWITCH_LOG_INFO; + break; + default : + level = SWITCH_LOG_DEBUG; + break; + } - virtual int sync() - { - return overflow(EOF); - } + fields[4].Replace("\t", " ", true); + switch_log_printf(SWITCH_CHANNEL_ID_LOG, + fields[2], + "PTLib-OPAL", + fields[3].AsUnsigned(), + NULL, + level, + "%s", fields[4].GetPointer()); - virtual int underflow() - { - return EOF; - } + // Reset string + str(std::string()); + return 0; + } + } buffer; - virtual int overflow(int c) - { - const char *fmt = "%s"; - char *func = NULL; - - int bufSize = pptr() - pbase(); - - if (c != EOF) { - *pptr() = (char)c; - bufSize++; - } - - if (bufSize != 0) { - char *bufPtr = pbase(); - char *bufEndPtr = NULL; - setp(bufPtr, epptr()); - bufPtr[bufSize] = '\0'; - int line = 0; - char *p; - - char *file = NULL; - switch_log_level_t level; - - - switch (strtoul(bufPtr, &file, 10)) { - case 1 : - level = SWITCH_LOG_INFO; - break; - default : - level = SWITCH_LOG_DEBUG; - break; - } - - if (file) { - while (isspace(*file)) file++; - - if (file && (bufPtr = strchr(file, '(')) && (bufEndPtr = strchr(bufPtr, ')'))) { - char *e; - - for(p = bufPtr; p && *p; p++) { - if (*p == '\t') { - *p = ' '; - } - } - - *bufPtr++ = '\0'; - line = atoi(bufPtr); - while (bufEndPtr && isspace(*(++bufEndPtr))); - bufPtr = bufEndPtr; - if (bufPtr && ((e = strchr(bufPtr, ' ')) || (e = strchr(bufPtr, '\t')))) { - func = bufPtr; - bufPtr = e; - *bufPtr++ = '\0'; - } - } - } - - switch_text_channel_t tchannel = SWITCH_CHANNEL_ID_LOG; - - if (!bufPtr) { - bufPtr = pbase(); - level = SWITCH_LOG_DEBUG; - } - - if (bufPtr) { - if (end_of(bufPtr) != '\n') { - fmt = "%s\n"; - } - if (!(file && func && line)) tchannel = SWITCH_CHANNEL_ID_LOG_CLEAN; - - switch_log_printf(tchannel, file, func, line, NULL, level, fmt, bufPtr); - } - - } - - return 0; - } - } buffer; +public: + FSTrace() + : ostream(&buffer) + { + } }; -#endif +#endif // PTRACING /////////////////////////////////////////////////////////////////////// FSProcess::FSProcess() - : PLibraryProcess("Vox Lucida Pty. Ltd.", "mod_opal", 1, 0, AlphaCode, 1) + : PLibraryProcess("Vox Lucida Pty. Ltd.", MODNAME, 1, 1, BetaCode, 1) , m_manager(NULL) { } @@ -296,19 +218,24 @@ FSProcess::FSProcess() FSProcess::~FSProcess() { delete m_manager; +#if PTRACING + PTrace::SetStream(NULL); // This will delete the FSTrace object +#endif } bool FSProcess::Initialise(switch_loadable_module_interface_t *iface) { - m_manager = new FSManager(); - return m_manager != NULL && m_manager->Initialise(iface); + m_manager = new FSManager(); + return m_manager != NULL && m_manager->Initialise(iface); } /////////////////////////////////////////////////////////////////////// FSManager::FSManager() + : m_context("default") + , m_dialplan("XML") { // These are deleted by the OpalManager class, no need to have destructor m_h323ep = new H323EndPoint(*this); @@ -321,12 +248,6 @@ bool FSManager::Initialise(switch_loadable_module_interface_t *iface) { ReadConfig(false); -#if PTRACING - PTrace::SetLevel(mod_opal_globals.trace_level); //just for fun and eyecandy ;) - PTrace::SetOptions(PTrace::TraceLevel); - PTrace::SetStream(new FSTrace); -#endif - m_FreeSwitch = (switch_endpoint_interface_t *) switch_loadable_module_create_interface(iface, SWITCH_ENDPOINT_INTERFACE); m_FreeSwitch->interface_name = ModuleName; m_FreeSwitch->io_routines = &opalfs_io_routines; @@ -338,8 +259,8 @@ bool FSManager::Initialise(switch_loadable_module_interface_t *iface) m_h323ep->StartListener(""); } else { for (std::list < FSListener >::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) { - if (!m_h323ep->StartListener(it->listenAddress)) { - PTRACE(3, "mod_opal\tCannot start listener for " << it->name); + if (!m_h323ep->StartListener(OpalTransportAddress(it->m_address, it->m_port))) { + PTRACE(2, "mod_opal\tCannot start listener for " << it->m_name); } } } @@ -363,15 +284,16 @@ bool FSManager::Initialise(switch_loadable_module_interface_t *iface) GetOpalGSMAMR(); GetOpaliLBC(); - /* For compatibility with the algorithm in FSConnection::SetCodecs() we need - to set all audio media formats to be 1 frame per packet */ +#if !IMPLEMENT_MULTI_FAME_AUDIO OpalMediaFormatList allCodecs = OpalMediaFormat::GetAllRegisteredMediaFormats(); for (OpalMediaFormatList::iterator it = allCodecs.begin(); it != allCodecs.end(); ++it) { if (it->GetMediaType() == OpalMediaType::Audio()) { it->SetOptionInteger(OpalAudioFormat::RxFramesPerPacketOption(), 1); it->SetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption(), 1); + OpalMediaFormat::SetRegisteredMediaFormat(*it); } } +#endif // IMPLEMENT_MULTI_FAME_AUDIO if (!m_gkAddress.IsEmpty()) { if (m_h323ep->UseGatekeeper(m_gkAddress, m_gkIdentifer, m_gkInterface)) @@ -391,61 +313,53 @@ bool FSManager::Initialise(switch_loadable_module_interface_t *iface) switch_status_t FSManager::ReadConfig(int reload) { - const char *cf = "opal.conf"; - switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_event_t *request_params = NULL; + switch_event_create(&request_params, SWITCH_EVENT_REQUEST_PARAMS); + switch_assert(request_params); + switch_event_add_header_string(request_params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil("")); - switch_memory_pool_t *pool = NULL; - if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); - return status; - } - - set_global_context("default"); - set_global_dialplan("XML"); - - switch_event_t *params = NULL; - switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS); - switch_assert(params); - switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", switch_str_nil("")); switch_xml_t cfg; - switch_xml_t xml = switch_xml_open_cfg(cf, &cfg, params); + switch_xml_t xml = switch_xml_open_cfg(ConfigFile, &cfg, request_params); if (xml == NULL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", ConfigFile); return SWITCH_STATUS_FALSE; } switch_xml_t xmlSettings = switch_xml_child(cfg, "settings"); if (xmlSettings) { for (switch_xml_t xmlParam = switch_xml_child(xmlSettings, "param"); xmlParam != NULL; xmlParam = xmlParam->next) { - const char *var = switch_xml_attr_soft(xmlParam, "name"); - const char *val = switch_xml_attr_soft(xmlParam, "value"); + PConstCaselessString const var(switch_xml_attr_soft(xmlParam, "name")); + PConstString const val(switch_xml_attr_soft(xmlParam, "value")); - if (!strcasecmp(var, "trace-level")) { - int level = atoi(val); - if (level > 0) { - mod_opal_globals.trace_level = level; - } - } else if (!strcasecmp(var, "context")) { - set_global_context(val); - } else if (!strcasecmp(var, "dialplan")) { - set_global_dialplan(val); - } else if (!strcasecmp(var, "codec-prefs")) { - set_global_codec_string(val); - } else if (!strcasecmp(var, "jitter-size")) { - char * next; - unsigned minJitter = strtoul(val, &next, 10); - if (minJitter >= 10) { - unsigned maxJitter = minJitter; - if (*next == ',') - maxJitter = atoi(next+1); - SetAudioJitterDelay(minJitter, maxJitter); // In milliseconds - } - } else if (!strcasecmp(var, "gk-address")) { + if (var == "context") { + m_context = val; + } else if (var == "dialplan") { + m_dialplan = val; + } else if (var == "codec-prefs") { + m_codecPrefs = val; + } else if (var == "jitter-size") { + SetAudioJitterDelay(val.AsUnsigned(), val.Mid(val.Find(',')+1).AsUnsigned()); // In milliseconds + } else if (var == "gk-address") { m_gkAddress = val; - } else if (!strcasecmp(var, "gk-identifer")) { + } else if (var == "gk-identifer") { m_gkIdentifer = val; - } else if (!strcasecmp(var, "gk-interface")) { + } else if (var == "gk-interface") { m_gkInterface = val; +#if PTRACING + } else if (var == "trace-level") { + unsigned level = val.AsUnsigned(); + if (level > 0) { + PTrace::SetLevel(level); + PTrace::ClearOptions(0xffffffff); // Everything off + PTrace::SetOptions( // Except these + PTrace::TraceLevel|PTrace::FileAndLine +#if PTLIB_CHECK_VERSION(2,11,1) + |PTrace::ContextIdentifier +#endif + ); + PTrace::SetStream(new FSTrace); + } +#endif } } } @@ -457,196 +371,205 @@ switch_status_t FSManager::ReadConfig(int reload) m_listeners.push_back(FSListener()); FSListener & listener = m_listeners.back(); - listener.name = switch_xml_attr_soft(xmlListener, "name"); - if (listener.name.IsEmpty()) - listener.name = "unnamed"; - - PIPSocket::Address ip; - WORD port = 1720; + listener.m_name = switch_xml_attr_soft(xmlListener, "name"); + if (listener.m_name.IsEmpty()) + listener.m_name = "unnamed"; for (switch_xml_t xmlParam = switch_xml_child(xmlListener, "param"); xmlParam != NULL; xmlParam = xmlParam->next) { - const char *var = switch_xml_attr_soft(xmlParam, "name"); - const char *val = switch_xml_attr_soft(xmlParam, "value"); - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Var - '%s' and Val - '%s' \n", var, val); - if (!strcasecmp(var, "h323-ip")) - ip = val; - else if (!strcasecmp(var, "h323-port")) - port = (WORD) atoi(val); + PConstCaselessString const var(switch_xml_attr_soft(xmlParam, "name")); + PConstString const val(switch_xml_attr_soft(xmlParam, "value")); + if (var == "h323-ip") + listener.m_address = val; + else if (var == "h323-port") + listener.m_port = (uint16_t)val.AsUnsigned(); } - listener.listenAddress = OpalTransportAddress(ip, port); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created Listener '%s'\n", (const char *) listener.name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created Listener '%s'\n", (const char *) listener.m_name); } } - switch_event_destroy(¶ms); + switch_event_destroy(&request_params); if (xml) switch_xml_free(xml); - return status; + return SWITCH_STATUS_SUCCESS; } -OpalCall * FSManager::CreateCall(void * /*userData*/) +static switch_call_cause_t create_outgoing_channel(switch_core_session_t *session, + switch_event_t *var_event, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, + switch_memory_pool_t **pool, + switch_originate_flag_t flags, + switch_call_cause_t *cancel_cause) { - return new FSCall(*this); + if (opal_process == NULL) + return SWITCH_CAUSE_CRASH; + + FSConnection::outgoing_params params; + params.var_event = var_event; + params.outbound_profile = outbound_profile; + params.new_session = new_session; + params.pool = pool; + params.flags = flags; + params.cancel_cause = cancel_cause; + params.fail_cause = SWITCH_CAUSE_INVALID_NUMBER_FORMAT; + + if (opal_process->GetManager().SetUpCall("local:", outbound_profile->destination_number, ¶ms) != NULL) + return SWITCH_CAUSE_SUCCESS; + + if (*new_session != NULL) + switch_core_session_destroy(new_session); + return params.fail_cause; } /////////////////////////////////////////////////////////////////////// FSEndPoint::FSEndPoint(FSManager & manager) -: OpalLocalEndPoint(manager) + : OpalLocalEndPoint(manager) + , m_manager(manager) { - PTRACE(3, "mod_opal\t FSEndPoint Created!"); -} - - -bool FSEndPoint::OnIncomingCall(OpalLocalConnection & connection) -{ - return ((FSConnection &) connection).OnIncoming(); + PTRACE(4, "mod_opal\tFSEndPoint created."); } OpalLocalConnection *FSEndPoint::CreateConnection(OpalCall & call, void *userData, unsigned options, OpalConnection::StringOptions* stringOptions) { - FSManager & mgr = (FSManager &) GetManager(); - switch_core_session_t *fsSession = switch_core_session_request(mgr.GetSwitchInterface(), - (switch_caller_profile_t *)userData ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND, SOF_NONE, NULL); - if (fsSession == NULL) - return NULL; - - switch_channel_t *fsChannel = switch_core_session_get_channel(fsSession); - - if (fsChannel == NULL) { - switch_core_session_destroy(&fsSession); - return NULL; - } - - return new FSConnection(call, *this, userData, options, stringOptions, (switch_caller_profile_t *)userData, fsSession, fsChannel); + return new FSConnection(call, *this, options, stringOptions, (FSConnection::outgoing_params *)userData); } /////////////////////////////////////////////////////////////////////// -FSCall::FSCall(OpalManager & manager) - : OpalCall(manager) -{ -} - - -PBoolean FSCall::OnSetUp(OpalConnection & connection) -{ - // Transfer FS caller_id_number & caller_id_name from the FSConnection - // to the protocol connectionm (e.g. H.323) so gets sent correctly - // in outgoing packets - PSafePtr local = GetConnectionAs(); - if (local != NULL) { - PSafePtr proto = local->GetOtherPartyConnection(); - if (proto != NULL) { - proto->SetLocalPartyName(local->GetLocalPartyName()); - proto->SetDisplayName(local->GetDisplayName()); - } - } - - return OpalCall::OnSetUp(connection); -} - - -/////////////////////////////////////////////////////////////////////// - - -FSConnection::FSConnection(OpalCall & call, FSEndPoint & endpoint, void* userData, unsigned options, OpalConnection::StringOptions* stringOptions, switch_caller_profile_t *outbound_profile, switch_core_session_t *fsSession, switch_channel_t *fsChannel) - : OpalLocalConnection(call, endpoint, userData, options, stringOptions) +FSConnection::FSConnection(OpalCall & call, + FSEndPoint & endpoint, + unsigned options, + OpalConnection::StringOptions* stringOptions, + outgoing_params * params) + : OpalLocalConnection(call, endpoint, NULL, options, stringOptions) , m_endpoint(endpoint) - , m_fsSession(fsSession) - , m_fsChannel(fsChannel) + , m_fsSession(NULL) + , m_fsChannel(NULL) + , m_flushAudio(false) { - opal_private_t *tech_pvt; + memset(&m_read_timer, 0, sizeof(m_read_timer)); + memset(&m_read_codec, 0, sizeof(m_read_codec)); + memset(&m_write_codec, 0, sizeof(m_write_codec)); + memset(&m_vid_read_timer, 0, sizeof(m_vid_read_timer)); + memset(&m_vid_read_codec, 0, sizeof(m_vid_read_codec)); + memset(&m_vid_write_codec, 0, sizeof(m_vid_write_codec)); - tech_pvt = (opal_private_t *) switch_core_session_alloc(m_fsSession, sizeof(*tech_pvt)); - tech_pvt->me = this; - switch_core_session_set_private(m_fsSession, tech_pvt); + if (params != NULL) { + // If we fail, this is the cause + params->fail_cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; - if (outbound_profile != NULL) { - SetLocalPartyName(outbound_profile->caller_id_number); - SetDisplayName(outbound_profile->caller_id_name); - - switch_caller_profile_t *caller_profile = switch_caller_profile_clone(m_fsSession, outbound_profile); - switch_channel_set_caller_profile(m_fsChannel, caller_profile); - - PString name = "opal/"; - name += outbound_profile->destination_number; - switch_channel_set_name(m_fsChannel, name); - - switch_channel_set_state(m_fsChannel, CS_INIT); + if ((m_fsSession = switch_core_session_request(endpoint.GetManager().GetSwitchInterface(), + SWITCH_CALL_DIRECTION_INBOUND, params->flags, params->pool)) == NULL) { + PTRACE(1, "mod_opal\tCannot create session for outgoing call."); + return; + } } + else { + if ((m_fsSession = switch_core_session_request(endpoint.GetManager().GetSwitchInterface(), + SWITCH_CALL_DIRECTION_INBOUND, SOF_NONE, NULL)) == NULL) { + PTRACE(1, "mod_opal\tCannot create session for incoming call."); + return; + } + } + + if ((m_fsChannel = switch_core_session_get_channel(m_fsSession)) == NULL) { + switch_core_session_destroy(&m_fsSession); + return; + } + + switch_core_session_set_private(m_fsSession, this); + SafeReference(); // Make sure cannot be deleted until on_destroy() + + if (params != NULL) { + switch_caller_profile_t *caller_profile = switch_caller_profile_clone(m_fsSession, params->outbound_profile); + switch_channel_set_caller_profile(m_fsChannel, caller_profile); + SetLocalPartyName(caller_profile->caller_id_number); + SetDisplayName(caller_profile->caller_id_name); + *params->new_session = m_fsSession; + } + + switch_channel_set_state(m_fsChannel, CS_INIT); +} + + +bool FSConnection::OnOutgoingSetUp() +{ + if (m_fsSession == NULL || m_fsChannel == NULL) { + PTRACE(1, "mod_opal\tSession request failed."); + return false; + } + + // Transfer FS caller_id_number & caller_id_name from the FSConnection + // to the protocol connection (e.g. H.323) so gets sent correctly + // in outgoing packets + PSafePtr proto = GetOtherPartyConnection(); + if (proto == NULL) { + PTRACE(1, "mod_opal\tNo protocol connection in call."); + return false; + } + + proto->SetLocalPartyName(GetLocalPartyName()); + proto->SetDisplayName(GetDisplayName()); + + switch_channel_set_name(m_fsChannel, ModuleName + '/' + GetRemotePartyURL()); + return true; } bool FSConnection::OnIncoming() { - if (m_fsSession == NULL) { + if (m_fsSession == NULL || m_fsChannel == NULL) { PTRACE(1, "mod_opal\tSession request failed."); return false; } switch_core_session_add_stream(m_fsSession, NULL); - switch_channel_t *channel = switch_core_session_get_channel(m_fsSession); - if (channel == NULL) { - PTRACE(1, "mod_opal\tSession does not have a channel"); - return false; - } - PURL url = GetRemotePartyURL(); - switch_caller_profile_t *caller_profile = switch_caller_profile_new(switch_core_session_get_pool(m_fsSession), - url.GetUserName(), - /** username */ - mod_opal_globals.dialplan, - /** dial plan */ - GetRemotePartyName(), - /** caller_id_name */ - GetRemotePartyNumber(), - /** caller_id_number */ - url.GetHostName(), - /** network addr */ - NULL, - /** ANI */ - NULL, - /** ANI II */ - NULL, - /** RDNIS */ - ModuleName, - /** source */ - mod_opal_globals.context, - /** set context */ - GetCalledPartyNumber() - /** destination_number */ - ); + switch_caller_profile_t *caller_profile = switch_caller_profile_new( + switch_core_session_get_pool(m_fsSession), + url.GetUserName(), /** username */ + m_endpoint.GetManager().GetDialPlan(), /** dial plan */ + GetRemotePartyName(), /** caller_id_name */ + GetRemotePartyNumber(), /** caller_id_number */ + url.GetHostName(), /** network addr */ + NULL, /** ANI */ + NULL, /** ANI II */ + NULL, /** RDNIS */ + ModuleName, /** source */ + m_endpoint.GetManager().GetContext(), /** set context */ + GetCalledPartyNumber() /** destination_number */ + ); if (caller_profile == NULL) { PTRACE(1, "mod_opal\tCould not create caller profile"); return false; } PTRACE(4, "mod_opal\tCreated switch caller profile:\n" - " username = " << caller_profile->username << "\n" - " dialplan = " << caller_profile->dialplan << "\n" - " caller_id_name = " << caller_profile->caller_id_name << "\n" - " caller_id_number = " << caller_profile->caller_id_number << "\n" - " network_addr = " << caller_profile->network_addr << "\n" - " source = " << caller_profile->source << "\n" - " context = " << caller_profile->context << "\n" " destination_number= " << caller_profile->destination_number); - switch_channel_set_caller_profile(channel, caller_profile); + " username = " << caller_profile->username << "\n" + " dialplan = " << caller_profile->dialplan << "\n" + " caller_id_name = " << caller_profile->caller_id_name << "\n" + " caller_id_number = " << caller_profile->caller_id_number << "\n" + " network_addr = " << caller_profile->network_addr << "\n" + " source = " << caller_profile->source << "\n" + " context = " << caller_profile->context << "\n" + " destination_number= " << caller_profile->destination_number); + switch_channel_set_caller_profile(m_fsChannel, caller_profile); - char name[256] = "opal/in:"; - switch_copy_string(name + 8, caller_profile->destination_number, sizeof(name)-8); - switch_channel_set_name(channel, name); - switch_channel_set_state(channel, CS_INIT); + switch_channel_set_name(m_fsChannel, ModuleName + '/' + url.GetScheme() + ':' + caller_profile->destination_number); if (switch_core_session_thread_launch(m_fsSession) != SWITCH_STATUS_SUCCESS) { PTRACE(1, "mod_opal\tCould not launch session thread"); + switch_core_session_destroy(&m_fsSession); + m_fsChannel = NULL; return false; } @@ -656,57 +579,44 @@ bool FSConnection::OnIncoming() void FSConnection::OnReleased() { - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(m_fsSession); - - /* so FS on_hangup will not try to deref a landmine */ - tech_pvt->me = NULL; - m_rxAudioOpened.Signal(); // Just in case m_txAudioOpened.Signal(); - H225_ReleaseCompleteReason dummy; - switch_channel_hangup(switch_core_session_get_channel(m_fsSession), - (switch_call_cause_t)H323TranslateFromCallEndReason(GetCallEndReason(), dummy)); + + if (m_fsChannel == NULL) { + PTRACE(3, "mod_opal\tHanging up FS side"); + switch_channel_hangup(m_fsChannel, (switch_call_cause_t)callEndReason.q931); + } + OpalLocalConnection::OnReleased(); } -void FSConnection::OnAlerting() -{ - switch_channel_mark_ring_ready(m_fsChannel); - return OpalLocalConnection::OnAlerting(); -} - PBoolean FSConnection::SetAlerting(const PString & calleeName, PBoolean withMedia) { + if (PAssertNULL(m_fsChannel) == NULL) + return false; + + switch_channel_mark_ring_ready(m_fsChannel); return OpalLocalConnection::SetAlerting(calleeName, withMedia); } -void FSConnection::OnEstablished() -{ - OpalLocalConnection::OnEstablished(); -} - - PBoolean FSConnection::SendUserInputTone(char tone, unsigned duration) { + if (PAssertNULL(m_fsChannel) == NULL) + return false; + switch_dtmf_t dtmf = { tone, duration }; return switch_channel_queue_dtmf(m_fsChannel, &dtmf) == SWITCH_STATUS_SUCCESS; } -PBoolean FSConnection::SendUserInputString(const PString & value) -{ - return OpalConnection::SendUserInputString(value); -} - - OpalMediaFormatList FSConnection::GetMediaFormats() const { if (m_switchMediaFormats.IsEmpty()) { const_cast(this)->SetCodecs(); } - + return m_switchMediaFormats; } @@ -714,39 +624,29 @@ OpalMediaFormatList FSConnection::GetMediaFormats() const void FSConnection::SetCodecs() { int numCodecs = 0; - const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS]; - const char *codec_string = NULL, *abs, *ocodec; - char *tmp_codec_string = NULL; - char *codec_order[SWITCH_MAX_CODECS]; - int codec_order_last; + const switch_codec_implementation_t *codecs[SWITCH_MAX_CODECS]; - - if ((abs = switch_channel_get_variable(m_fsChannel, "absolute_codec_string"))) { - codec_string = abs; - } else { - if ((abs = switch_channel_get_variable(m_fsChannel, "codec_string"))) { - codec_string = abs; - } - - if ((ocodec = switch_channel_get_variable(m_fsChannel, SWITCH_ORIGINATOR_CODEC_VARIABLE))) { - codec_string = switch_core_session_sprintf(m_fsSession, "%s,%s", ocodec, codec_string); + PString codec_string = switch_channel_get_variable(m_fsChannel, "absolute_codec_string"); + if (codec_string.IsEmpty()) { + codec_string = switch_channel_get_variable(m_fsChannel, "codec_string"); + const char *orig_codec = switch_channel_get_variable(m_fsChannel, SWITCH_ORIGINATOR_CODEC_VARIABLE); + if (orig_codec) { + codec_string.Splice(orig_codec, 0); } } - - if (!codec_string) { - codec_string = mod_opal_globals.codec_string; + + if (codec_string.IsEmpty()) { + codec_string = m_endpoint.GetManager().GetCodecPrefs(); } - if (codec_string) { - if ((tmp_codec_string = strdup(codec_string))) { - codec_order_last = switch_separate_string(tmp_codec_string, ',', codec_order, SWITCH_MAX_CODECS); - numCodecs = switch_loadable_module_get_codecs_sorted(codecs, SWITCH_MAX_CODECS, codec_order, codec_order_last); - - } - } else { + if (codec_string.IsEmpty()) { numCodecs = switch_loadable_module_get_codecs(codecs, sizeof(codecs) / sizeof(codecs[0])); + } else { + char *codec_order[SWITCH_MAX_CODECS]; + int codec_order_last = switch_separate_string((char *)codec_string.GetPointer(), ',', codec_order, SWITCH_MAX_CODECS); + numCodecs = switch_loadable_module_get_codecs_sorted(codecs, SWITCH_MAX_CODECS, codec_order, codec_order_last); } - + for (int i = 0; i < numCodecs; i++) { const switch_codec_implementation_t *codec = codecs[i]; @@ -762,12 +662,12 @@ void FSConnection::SetCodecs() continue; } } - // Did we match or create a new media format? if (switchFormat.IsValid() && codec->codec_type == SWITCH_CODEC_TYPE_AUDIO) { - PTRACE(2, "mod_opal\tMatched FS codec " << codec->iananame << " to OPAL media format " << switchFormat); + PTRACE(3, "mod_opal\tMatched FS codec " << codec->iananame << " to OPAL media format " << switchFormat); +#if IMPLEMENT_MULTI_FAME_AUDIO // Calculate frames per packet, do not use codec->codec_frames_per_packet as that field // has slightly different semantics when used in streamed codecs such as G.711 int fpp = codec->samples_per_packet/switchFormat.GetFrameTime(); @@ -778,7 +678,7 @@ void FSConnection::SetCodecs() could end up with 60ms and the codec cannot be created. The "holes" are unlikely in all but streamed codecs such as G.711, where it is theoretically possible for OPAL to come up with 32ms and there is only 30ms and 40ms in the FS table. We deem these - scenarios succifiently rare that we can safely ignore them ... for now. */ + scenarios sufficiently rare that we can safely ignore them ... for now. */ if (fpp > switchFormat.GetOptionInteger(OpalAudioFormat::RxFramesPerPacketOption())) { switchFormat.SetOptionInteger(OpalAudioFormat::RxFramesPerPacketOption(), fpp); @@ -787,12 +687,11 @@ void FSConnection::SetCodecs() if (fpp > switchFormat.GetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption())) { switchFormat.SetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption(), fpp); } +#endif // IMPLEMENT_MULTI_FAME_AUDIO } m_switchMediaFormats += switchFormat; } - - switch_safe_free(tmp_codec_string); } @@ -802,110 +701,91 @@ OpalMediaStream *FSConnection::CreateMediaStream(const OpalMediaFormat & mediaFo } -PBoolean FSConnection::OnOpenMediaStream(OpalMediaStream & stream) +void FSConnection::OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch) { - if (!OpalConnection::OnOpenMediaStream(stream)) { - return false; - } + OpalConnection::OnPatchMediaStream(isSource, patch); - if (stream.GetMediaFormat().GetMediaType() != OpalMediaType::Audio()) { - return true; - } + if (PAssertNULL(m_fsChannel) == NULL) + return; - if (stream.IsSource()) { - m_rxAudioOpened.Signal(); - } else { - m_txAudioOpened.Signal(); - } + if (patch.GetSource().GetMediaFormat().GetMediaType() != OpalMediaType::Audio()) + return; - if (GetMediaStream(stream.GetSessionID(), stream.IsSink()) != NULL) { + if (switch_channel_direction(m_fsChannel) == SWITCH_CALL_DIRECTION_INBOUND) { + if (isSource) + m_rxAudioOpened.Signal(); + else + m_txAudioOpened.Signal(); + } + else if (GetMediaStream(OpalMediaType::Audio(), !isSource) != NULL) { // Have open media in both directions. - if (GetPhase() == AlertingPhase) { - switch_channel_mark_pre_answered(m_fsChannel); - } else if (GetPhase() < ReleasingPhase) { + if (IsEstablished()) switch_channel_mark_answered(m_fsChannel); - } + else if (!IsReleased()) + switch_channel_mark_pre_answered(m_fsChannel); } - - return true; } switch_status_t FSConnection::on_init() { - switch_channel_t *channel = switch_core_session_get_channel(m_fsSession); - if (channel == NULL) { + if (PAssertNULL(m_fsChannel) == NULL) return SWITCH_STATUS_FALSE; - } - PTRACE(3, "mod_opal\tStarted routing for connection " << *this); - switch_channel_set_state(channel, CS_ROUTING); + PTRACE(4, "mod_opal\tStarted routing for connection " << *this); + switch_channel_set_state(m_fsChannel, CS_ROUTING); return SWITCH_STATUS_SUCCESS; } switch_status_t FSConnection::on_routing() { - PTRACE(3, "mod_opal\tRouting connection " << *this); + if (PAssertNULL(m_fsChannel) == NULL) + return SWITCH_STATUS_FALSE; + + PTRACE(4, "mod_opal\tRouting connection " << *this); return SWITCH_STATUS_SUCCESS; } switch_status_t FSConnection::on_execute() { - PTRACE(3, "mod_opal\tExecuting connection " << *this); + if (PAssertNULL(m_fsChannel) == NULL) + return SWITCH_STATUS_FALSE; + + PTRACE(4, "mod_opal\tExecuting connection " << *this); return SWITCH_STATUS_SUCCESS; } -static switch_status_t on_destroy(switch_core_session_t *session) + +switch_status_t FSConnection::on_destroy() { - //switch_channel_t *channel = switch_core_session_get_channel(session); - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(session); - - if (tech_pvt) { - if (tech_pvt->read_codec.implementation) { - switch_core_codec_destroy(&tech_pvt->read_codec); - } + PTRACE(3, "mod_opal\tFS on_destroy for connection " << *this); - if (tech_pvt->write_codec.implementation) { - switch_core_codec_destroy(&tech_pvt->write_codec); - } + m_fsChannel = NULL; // Will be destoyed by FS, so don't use it any more. - if (tech_pvt->vid_read_codec.implementation) { - switch_core_codec_destroy(&tech_pvt->vid_read_codec); - } + switch_core_codec_destroy(&m_read_codec); + switch_core_codec_destroy(&m_write_codec); + switch_core_codec_destroy(&m_vid_read_codec); + switch_core_codec_destroy(&m_vid_write_codec); + switch_core_timer_destroy(&m_read_timer); + switch_core_timer_destroy(&m_vid_read_timer); - if (tech_pvt->vid_write_codec.implementation) { - switch_core_codec_destroy(&tech_pvt->vid_write_codec); - } - - if (tech_pvt->read_timer.timer_interface) { - switch_core_timer_destroy(&tech_pvt->read_timer); - } - - if (tech_pvt->vid_read_timer.timer_interface) { - switch_core_timer_destroy(&tech_pvt->vid_read_timer); - } - } + switch_core_session_set_private(m_fsSession, NULL); + SafeDereference(); return SWITCH_STATUS_SUCCESS; } -/* this function has to be called with the original session beause the FSConnection might already be destroyed and we - will can't have it be a method of a dead object - */ -static switch_status_t on_hangup(switch_core_session_t *session) + +switch_status_t FSConnection::on_hangup() { - switch_channel_t *channel = switch_core_session_get_channel(session); - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(session); - + if (PAssertNULL(m_fsChannel) == NULL) + return SWITCH_STATUS_FALSE; + /* if this is still here it was our idea to hangup not opal's */ - if (tech_pvt->me) { - Q931::CauseValues cause = (Q931::CauseValues)switch_channel_get_cause_q850(channel); - tech_pvt->me->SetQ931Cause(cause); - tech_pvt->me->ClearCallSynchronous(NULL, H323TranslateToCallEndReason(cause, UINT_MAX)); - tech_pvt->me = NULL; - } + ClearCallSynchronous(NULL, H323TranslateToCallEndReason( + (Q931::CauseValues)switch_channel_get_cause_q850(m_fsChannel), UINT_MAX)); return SWITCH_STATUS_SUCCESS; } @@ -913,30 +793,30 @@ static switch_status_t on_hangup(switch_core_session_t *session) switch_status_t FSConnection::on_exchange_media() { - PTRACE(3, "mod_opal\tLoopback on connection " << *this); + PTRACE(4, "mod_opal\tExchanging media on connection " << *this); return SWITCH_STATUS_SUCCESS; } switch_status_t FSConnection::on_soft_execute() { - PTRACE(3, "mod_opal\tTransmit on connection " << *this); + PTRACE(4, "mod_opal\tTransmit on connection " << *this); return SWITCH_STATUS_SUCCESS; } switch_status_t FSConnection::kill_channel(int sig) { - PTRACE(3, "mod_opal\tKill " << sig << " on connection " << *this); - switch (sig) { - case SWITCH_SIG_BREAK: - break; case SWITCH_SIG_KILL: m_rxAudioOpened.Signal(); m_txAudioOpened.Signal(); + PTRACE(4, "mod_opal\tSignal channel KILL on connection " << *this); break; + case SWITCH_SIG_XFER: + case SWITCH_SIG_BREAK: default: + PTRACE(4, "mod_opal\tSignal channel " << sig << " on connection " << *this); break; } @@ -953,41 +833,16 @@ switch_status_t FSConnection::send_dtmf(const switch_dtmf_t *dtmf) switch_status_t FSConnection::receive_message(switch_core_session_message_t *msg) { - switch_channel_t *channel = switch_core_session_get_channel(m_fsSession); + if (PAssertNULL(m_fsChannel) == NULL) + return SWITCH_STATUS_FALSE; - - /* - SWITCH_MESSAGE_INDICATE_PROGRESS: establish early media now and return SWITCH_STATUS_FALSE if you can't - SWITCH_MESSAGE_INDICATE_ANSWER: answer and set up media now if it's not already and return SWITCH_STATUS_FALSE if you can't - - Neither message means anything on an outbound call.... - - It would only happen if someone called switch_channel_answer() instead of switch_channel_mark_answered() on an outbound call. - it should not do anything if someone does it by accident somewhere hense this in both cases: - - if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { - return SWITCH_STATUS_FALSE; - } - - - When we get these messages the core will trust that you have triggered FSMediaStream::Open and are ready for media if we do not - have media we MUST return SWITCH_STATUS_FALSE or it will cause a CRASH. - - - - */ switch (msg->message_id) { - case SWITCH_MESSAGE_INDICATE_BRIDGE: - case SWITCH_MESSAGE_INDICATE_UNBRIDGE: - case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC: - switch_channel_set_private_flag(channel, CF_NEED_FLUSH); - break; - case SWITCH_MESSAGE_INDICATE_RINGING: case SWITCH_MESSAGE_INDICATE_PROGRESS: case SWITCH_MESSAGE_INDICATE_ANSWER: - { - switch_caller_profile_t * profile = switch_channel_get_caller_profile(channel); + case SWITCH_MESSAGE_INDICATE_DEFLECT: + if (switch_channel_direction(m_fsChannel) == SWITCH_CALL_DIRECTION_INBOUND) { + switch_caller_profile_t * profile = switch_channel_get_caller_profile(m_fsChannel); if (profile != NULL && profile->caller_extension != NULL) { PSafePtr other = GetOtherPartyConnection(); @@ -999,6 +854,9 @@ switch_status_t FSConnection::receive_message(switch_core_session_message_t *msg SetDisplayName(profile->caller_extension->extension_name); } } + else { + return SWITCH_STATUS_FALSE; + } break; default: @@ -1006,89 +864,78 @@ switch_status_t FSConnection::receive_message(switch_core_session_message_t *msg } switch (msg->message_id) { - case SWITCH_MESSAGE_INDICATE_RINGING: - SetPhase(OpalConnection::AlertingPhase); - OnAlerting(); + case SWITCH_MESSAGE_INDICATE_BRIDGE: + case SWITCH_MESSAGE_INDICATE_UNBRIDGE: + case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC: + m_flushAudio = true; break; - case SWITCH_MESSAGE_INDICATE_DEFLECT: - { - PSafePtr other = GetOtherPartyConnection(); - if (other != NULL) - other->TransferConnection(msg->string_arg); + case SWITCH_MESSAGE_INDICATE_RINGING: + AlertingIncoming(); break; - } case SWITCH_MESSAGE_INDICATE_PROGRESS: - case SWITCH_MESSAGE_INDICATE_ANSWER: - { - int fixed = 0; - - if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { - return SWITCH_STATUS_FALSE; - } + AutoStartMediaStreams(); + AlertingIncoming(); - if (msg->message_id == SWITCH_MESSAGE_INDICATE_PROGRESS) { - if (fixed) { - /* this should send alerting + media and wait for it to be established and return SUCCESS or FAIL - depending on if media was able to be established. Need code to tell the other side we want early media here. - */ - GetCall().OpenSourceMediaStreams(*this, OpalMediaType::Audio()); - SetPhase(OpalConnection::AlertingPhase); - /* how do i say please establish early media ? */ - OnAlerting(); - } else { - /* hack to avoid getting stuck, pre_answer will imply answer */ - OnConnectedInternal(); - } - } else { - OnConnectedInternal(); - } - - // Wait for media - PTRACE(2, "mod_opal\tAwaiting media start on connection " << *this); - m_rxAudioOpened.Wait(); - m_txAudioOpened.Wait(); - - if (GetPhase() >= ReleasingPhase) { - // Call got aborted - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(m_fsSession), SWITCH_LOG_ERROR, "Call abandoned!\n"); - return SWITCH_STATUS_FALSE; - } - - PTRACE(4, "mod_opal\tMedia started on connection " << *this); - - if (msg->message_id == SWITCH_MESSAGE_INDICATE_PROGRESS) { - if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { - switch_channel_mark_pre_answered(m_fsChannel); - } - } else { - if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { - switch_channel_mark_answered(m_fsChannel); - } - } + if (!WaitForMedia()) + return SWITCH_STATUS_FALSE; + if (!switch_channel_test_flag(m_fsChannel, CF_EARLY_MEDIA)) { + switch_channel_mark_pre_answered(m_fsChannel); } break; + case SWITCH_MESSAGE_INDICATE_ANSWER: + AcceptIncoming(); + + if (!WaitForMedia()) + return SWITCH_STATUS_FALSE; + + if (!switch_channel_test_flag(m_fsChannel, CF_ANSWERED)) { + switch_channel_mark_answered(m_fsChannel); + } + break; + + case SWITCH_MESSAGE_INDICATE_DEFLECT: + ownerCall.Transfer(msg->string_arg, GetOtherPartyConnection()); + break; + default: - PTRACE(3, "mod_opal\tReceived message " << msg->message_id << " on connection " << *this); + PTRACE(3, "mod_opal\tReceived unhandled message " << msg->message_id << " on connection " << *this); } return SWITCH_STATUS_SUCCESS; } +bool FSConnection::WaitForMedia() +{ + PTRACE(4, "mod_opal\tAwaiting media start on connection " << *this); + m_rxAudioOpened.Wait(); + m_txAudioOpened.Wait(); + + if (IsReleased()) { + // Call got aborted + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(m_fsSession), SWITCH_LOG_ERROR, "Call abandoned!\n"); + return false; + } + + PTRACE(3, "mod_opal\tMedia started on connection " << *this); + return true; +} + + switch_status_t FSConnection::receive_event(switch_event_t *event) { - PTRACE(3, "mod_opal\tReceived event " << event->event_id << " on connection " << *this); + PTRACE(4, "mod_opal\tReceived event " << event->event_id << " on connection " << *this); return SWITCH_STATUS_SUCCESS; } switch_status_t FSConnection::state_change() { - PTRACE(3, "mod_opal\tState changed on connection " << *this); + PTRACE(4, "mod_opal\tState changed on connection " << *this); return SWITCH_STATUS_SUCCESS; } @@ -1119,14 +966,14 @@ switch_status_t FSConnection::write_video_frame(switch_frame_t *frame, switch_io switch_status_t FSConnection::read_frame(const OpalMediaType & mediaType, switch_frame_t **frame, switch_io_flag_t flags) { - PSafePtr < FSMediaStream > stream = PSafePtrCast < OpalMediaStream, FSMediaStream > (GetMediaStream(mediaType, false)); + PSafePtr stream = PSafePtrCast (GetMediaStream(mediaType, false)); return stream != NULL ? stream->read_frame(frame, flags) : SWITCH_STATUS_FALSE; } switch_status_t FSConnection::write_frame(const OpalMediaType & mediaType, const switch_frame_t *frame, switch_io_flag_t flags) { - PSafePtr < FSMediaStream > stream = PSafePtrCast < OpalMediaStream, FSMediaStream > (GetMediaStream(mediaType, true)); + PSafePtr stream = PSafePtrCast(GetMediaStream(mediaType, true)); return stream != NULL ? stream->write_frame(frame, flags) : SWITCH_STATUS_FALSE; } @@ -1135,24 +982,24 @@ switch_status_t FSConnection::write_frame(const OpalMediaType & mediaType, const FSMediaStream::FSMediaStream(FSConnection & conn, const OpalMediaFormat & mediaFormat, unsigned sessionID, bool isSource) : OpalMediaStream(conn, mediaFormat, sessionID, isSource) - , m_fsSession(conn.GetSession()) - , m_readRTP(0, 512) - , m_callOnStart(true) + , m_connection(conn) + , m_readRTP(0, SWITCH_RECOMMENDED_BUFFER_SIZE) { memset(&m_readFrame, 0, sizeof(m_readFrame)); - m_readFrame.codec = m_switchCodec; - m_readFrame.flags = SFF_RAW_RTP; } PBoolean FSMediaStream::Open() { - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(m_fsSession); - if (IsOpen()) { return true; } + switch_core_session_t *fsSession = m_connection.GetSession(); + switch_channel_t *fsChannel = m_connection.GetChannel(); + if (PAssertNULL(fsSession) == NULL || PAssertNULL(fsChannel) == NULL) + return false; + bool isAudio; if (mediaFormat.GetMediaType() == OpalMediaType::Audio()) { isAudio = true; @@ -1162,86 +1009,76 @@ PBoolean FSMediaStream::Open() return OpalMediaStream::Open(); } - m_fsChannel = switch_core_session_get_channel(m_fsSession); - int ptime = mediaFormat.GetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption()) * mediaFormat.GetFrameTime() / mediaFormat.GetTimeUnits(); - if (IsSink()) { - m_switchCodec = isAudio ? &tech_pvt->read_codec : &tech_pvt->vid_read_codec; - m_switchTimer = isAudio ? &tech_pvt->read_timer : &tech_pvt->vid_read_timer; + m_switchCodec = isAudio ? &m_connection.m_read_codec : &m_connection.m_vid_read_codec; + m_switchTimer = isAudio ? &m_connection.m_read_timer : &m_connection.m_vid_read_timer; + m_readFrame.codec = m_switchCodec; + m_readFrame.rate = mediaFormat.GetClockRate(); } else { - m_switchCodec = isAudio ? &tech_pvt->write_codec : &tech_pvt->vid_write_codec; + m_switchCodec = isAudio ? &m_connection.m_write_codec : &m_connection.m_vid_write_codec; } // The following is performed on two different instances of this object. if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, // FMTP mediaFormat.GetClockRate(), ptime, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings - switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { + switch_core_session_get_pool(fsSession)) != SWITCH_STATUS_SUCCESS) { // Could not select a codecs using negotiated frames/packet, so try using default. if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, // FMTP mediaFormat.GetClockRate(), 0, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings - switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { - PTRACE(1, "mod_opal " << switch_channel_get_name(m_fsChannel)<< " Cannot initialise " << (IsSink()? "read" : "write") << ' ' + switch_core_session_get_pool(fsSession)) != SWITCH_STATUS_SUCCESS) { + PTRACE(1, "mod_opal\t" << switch_channel_get_name(fsChannel) + << " cannot initialise " << (IsSink()? "read" : "write") << ' ' << mediaFormat.GetMediaType() << " codec " << mediaFormat << " for connection " << *this); - switch_channel_hangup(m_fsChannel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); + switch_channel_hangup(fsChannel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); return false; } - PTRACE(2, "mod_opal " << switch_channel_get_name(m_fsChannel)<< " Unsupported ptime of " << ptime << " on " << (IsSink()? "read" : "write") << ' ' + PTRACE(2, "mod_opal\t" << switch_channel_get_name(fsChannel) + << " unsupported ptime of " << ptime << " on " << (IsSink()? "read" : "write") << ' ' << mediaFormat.GetMediaType() << " codec " << mediaFormat << " for connection " << *this); } - PTRACE(1, "mod_opal " << switch_channel_get_name(m_fsChannel)<< " initialise " << - switch_channel_get_name(m_fsChannel) << (IsSink()? "read" : "write") << ' ' - << mediaFormat.GetMediaType() << " codec " << mediaFormat << " for connection " << *this); - if (IsSink()) { - m_readFrame.rate = mediaFormat.GetClockRate(); - if (isAudio) { - switch_core_session_set_read_codec(m_fsSession, m_switchCodec); + switch_core_session_set_read_codec(fsSession, m_switchCodec); if (switch_core_timer_init(m_switchTimer, "soft", m_switchCodec->implementation->microseconds_per_packet / 1000, m_switchCodec->implementation->samples_per_packet, - switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { + switch_core_session_get_pool(fsSession)) != SWITCH_STATUS_SUCCESS) { + PTRACE(1, "mod_opal\t" << switch_channel_get_name(fsChannel) + << " timer init failed on " << (IsSink()? "read" : "write") << ' ' + << mediaFormat.GetMediaType() << " codec " << mediaFormat << " for connection " << *this); switch_core_codec_destroy(m_switchCodec); m_switchCodec = NULL; return false; } } else { - switch_core_session_set_video_read_codec(m_fsSession, m_switchCodec); - switch_channel_set_flag(m_fsChannel, CF_VIDEO); + switch_core_session_set_video_read_codec(fsSession, m_switchCodec); + switch_channel_set_flag(fsChannel, CF_VIDEO); } } else { if (isAudio) { - switch_core_session_set_write_codec(m_fsSession, m_switchCodec); + switch_core_session_set_write_codec(fsSession, m_switchCodec); } else { - switch_core_session_set_video_write_codec(m_fsSession, m_switchCodec); - switch_channel_set_flag(m_fsChannel, CF_VIDEO); + switch_core_session_set_video_write_codec(fsSession, m_switchCodec); + switch_channel_set_flag(fsChannel, CF_VIDEO); } } - PTRACE(3, "mod_opal\tSet " << (IsSink()? "read" : "write") << ' ' - << mediaFormat.GetMediaType() << " codec to << " << mediaFormat << " for connection " << *this); + PTRACE(3, "mod_opal\t" << switch_channel_get_name(fsChannel) + << " initialised " << (IsSink()? "read" : "write") << ' ' + << mediaFormat.GetMediaType() << " codec " << mediaFormat << " for connection " << *this); return OpalMediaStream::Open(); } -PBoolean FSMediaStream::Close() +void FSMediaStream::InternalClose() { - if (!IsOpen()) - return false; - - /* forget these FS will properly destroy them for us */ - - m_switchTimer = NULL; - m_switchCodec = NULL; - - return OpalMediaStream::Close(); } @@ -1256,149 +1093,88 @@ PBoolean FSMediaStream::RequiresPatchThread(OpalMediaStream *) const return false; } -bool FSMediaStream::CheckPatchAndLock() -{ - if (GetConnection().GetPhase() >= GetConnection().ReleasingPhase || !IsOpen()) - return false; - if (LockReadWrite()) { - if (!GetPatch() || !IsOpen()) { - UnlockReadWrite(); - return false; - } - return true; - } else { - return false; +int FSMediaStream::StartReadWrite(PatchPtr & mediaPatch) const +{ + if (!IsOpen()) { + PTRACE(2, "mod_opal\tNot open!"); + return -1; } + + if (!m_switchCodec) { + PTRACE(2, "mod_opal\tNo codec!"); + return -1; + } + + if (!m_connection.IsChannelReady()) { + PTRACE(2, "mod_opal\tChannel not ready!"); + return -1; + } + + // We make referenced copy of pointer so can't be deleted out from under us + mediaPatch = m_mediaPatch; + if (mediaPatch == NULL) { + /*There is a race here... sometimes we make it here and m_mediaPatch is NULL + if we wait it shows up in 1ms, maybe there is a better way to wait. */ + PTRACE(3, "mod_opal\tPatch not ready!"); + return 1; + } + + return 0; } + switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag_t flags) { - - if (!m_switchCodec) { + PatchPtr mediaPatch; + switch (StartReadWrite(mediaPatch)) { + case -1 : return SWITCH_STATUS_FALSE; + case 1 : + return SWITCH_STATUS_SUCCESS; } - if (m_callOnStart) { - /* - There is a race here... sometimes we make it here and GetPatch() is NULL - if we wait it shows up in 1ms, maybe there is a better way to wait. - - */ - while(!GetPatch()) { - if (!m_fsChannel || !switch_channel_up(m_fsChannel)) { - return SWITCH_STATUS_FALSE; - } - switch_cond_next(); - } - if (CheckPatchAndLock()) { - GetPatch()->OnStartMediaPatch(); - m_callOnStart = false; - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - } - - m_readFrame.flags = 0; - - /* - while (switch_channel_ready(m_fsChannel)) { - if (CheckPatchAndLock()) { - if (!GetPatch()->GetSource().ReadPacket(m_readRTP)) { - UnlockReadWrite(); - return SWITCH_STATUS_FALSE; - } - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - - if ((m_readFrame.datalen = m_readRTP.GetPayloadSize()) || switch_core_timer_check(&m_switchTimer, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) { - if (m_readFrame.datalen) { - } else { - m_readFrame.flags = SFF_CNG; - } - break; - } - - switch_yield(1000); - } - */ - - if (switch_channel_test_private_flag(m_fsChannel, CF_NEED_FLUSH)) { - switch_channel_clear_private_flag(m_fsChannel, CF_NEED_FLUSH); - for(;;) { - if (CheckPatchAndLock()) { - if (!GetPatch()->GetSource().ReadPacket(m_readRTP)) { - UnlockReadWrite(); - return SWITCH_STATUS_FALSE; - } - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - - if (!m_readRTP.GetPayloadSize()) { - m_readFrame.flags = SFF_CNG; - break; - } - } + if (m_connection.NeedFlushAudio()) { + mediaPatch->GetSource().EnableJitterBuffer(); // This flushes data and resets jitter buffer + m_readRTP.SetPayloadSize(0); } else { + m_readRTP.SetTimestamp(m_readFrame.timestamp + m_switchCodec->implementation->samples_per_packet); - if (CheckPatchAndLock()) { - if (!m_switchTimer || !GetPatch()->GetSource().ReadPacket(m_readRTP)) { - UnlockReadWrite(); - return SWITCH_STATUS_FALSE; - } - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - - switch_core_timer_next(m_switchTimer); - - if (!(m_readFrame.datalen = m_readRTP.GetPayloadSize())) { - m_readFrame.flags = SFF_CNG; + if (!mediaPatch->GetSource().ReadPacket(m_readRTP)) { + return SWITCH_STATUS_FALSE; } } - if (!switch_channel_ready(m_fsChannel)) { + if (!m_switchTimer) { + PTRACE(2, "mod_opal\tread_frame: no timer!"); return SWITCH_STATUS_FALSE; } + switch_core_timer_next(m_switchTimer); if (!switch_core_codec_ready(m_switchCodec)) { + PTRACE(2, "mod_opal\tread_frame: codec not ready!"); return SWITCH_STATUS_FALSE; } - //switch_core_timer_step(&m_switchTimer); +#if IMPLEMENT_MULTI_FAME_AUDIO + // Repackage frames in incoming packet to agree with what FS expects. + // Not implmented yet!!!!!!!!! + // Cheating and only supporting one frame per packet +#endif - if (m_readFrame.payload == RTP_DataFrame::CN || m_readFrame.payload == RTP_DataFrame::Cisco_CN) { - m_readFrame.flags = SFF_CNG; - } - - if (m_readFrame.flags & SFF_CNG) { - m_readFrame.buflen = sizeof(m_buf); - m_readFrame.data = m_buf; - m_readFrame.packet = NULL; - m_readFrame.packetlen = 0; - m_readFrame.timestamp = 0; - m_readFrame.m = SWITCH_FALSE; - m_readFrame.seq = 0; - m_readFrame.ssrc = 0; - m_readFrame.codec = m_switchCodec; - } else { - m_readFrame.buflen = m_readRTP.GetSize(); - m_readFrame.data = m_readRTP.GetPayloadPtr(); - m_readFrame.packet = m_readRTP.GetPointer(); - m_readFrame.packetlen = m_readRTP.GetHeaderSize() + m_readFrame.datalen; - m_readFrame.payload = (switch_payload_t) m_readRTP.GetPayloadType(); - m_readFrame.timestamp = m_readRTP.GetTimestamp(); - m_readFrame.m = (switch_bool_t) m_readRTP.GetMarker(); - m_readFrame.seq = m_readRTP.GetSequenceNumber(); - m_readFrame.ssrc = m_readRTP.GetSyncSource(); - m_readFrame.codec = m_switchCodec; - } + m_readFrame.buflen = m_readRTP.GetSize(); + m_readFrame.data = m_readRTP.GetPayloadPtr(); + m_readFrame.datalen = m_readRTP.GetPayloadSize(); + m_readFrame.packet = m_readRTP.GetPointer(); + m_readFrame.packetlen = m_readRTP.GetHeaderSize() + m_readFrame.datalen; + m_readFrame.timestamp = m_readRTP.GetTimestamp(); + m_readFrame.seq = m_readRTP.GetSequenceNumber(); + m_readFrame.ssrc = m_readRTP.GetSyncSource(); + m_readFrame.m = m_readRTP.GetMarker() ? SWITCH_TRUE : SWITCH_FALSE; + m_readFrame.payload = (switch_payload_t)m_readRTP.GetPayloadType(); + m_readFrame.flags = m_readFrame.datalen == 0 || + m_readFrame.payload == RTP_DataFrame::CN || + m_readFrame.payload == RTP_DataFrame::Cisco_CN ? SFF_CNG : 0; *frame = &m_readFrame; @@ -1408,69 +1184,35 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag switch_status_t FSMediaStream::write_frame(const switch_frame_t *frame, switch_io_flag_t flags) { - if (!switch_channel_ready(m_fsChannel)) { + PatchPtr mediaPatch; + switch (StartReadWrite(mediaPatch)) { + case -1 : return SWITCH_STATUS_FALSE; - } - - if (m_callOnStart) { - if (CheckPatchAndLock()) { - GetPatch()->OnStartMediaPatch(); - m_callOnStart = false; - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - } - - if ((frame->flags & SFF_CNG)) { + case 1 : return SWITCH_STATUS_SUCCESS; } if ((frame->flags & SFF_RAW_RTP) != 0) { - RTP_DataFrame rtp((const BYTE *) frame->packet, frame->packetlen, false); - - if (CheckPatchAndLock()) { - if (GetPatch()->PushFrame(rtp)) { - UnlockReadWrite(); - return SWITCH_STATUS_SUCCESS; - } - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; - } - } - - /* If we reach this code it means a call to an ivr or something else that does not generate timestamps - Its possible that frame->timestamp is set but not guarenteed and is best ignored for the time being. - We are probably relying on the rtp stack to generate the timestamp and ssrc for us at this point. - As a quick hack I am going to keep a sample counter and increment it by frame->samples but it would be - better if we could engage whatever it is in opal that makes it generate the timestamp. - */ - - RTP_DataFrame rtp(frame->datalen); - rtp.SetPayloadType(mediaFormat.GetPayloadType()); - - m_timeStamp += frame->samples; - rtp.SetTimestamp(m_timeStamp); - - //rtp.SetTimestamp(frame->timestamp); - //rtp.SetSyncSource(frame->ssrc); - //rtp.SetMarker(frame->m); - - memcpy(rtp.GetPayloadPtr(), frame->data, frame->datalen); - - if (CheckPatchAndLock()) { - if (GetPatch()->PushFrame(rtp)) { - UnlockReadWrite(); - return SWITCH_STATUS_SUCCESS; - } - UnlockReadWrite(); - } else { - return SWITCH_STATUS_FALSE; + RTP_DataFrame rtp((const BYTE *)frame->packet, frame->packetlen, false); + return mediaPatch->PushFrame(rtp) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } + RTP_DataFrame rtp(frame->datalen); + memcpy(rtp.GetPayloadPtr(), frame->data, frame->datalen); - return SWITCH_STATUS_FALSE; + rtp.SetPayloadType(mediaFormat.GetPayloadType()); + + /* Not sure what FS is going to give us! + Suspect it depends on the mod on the other side sending it. */ + if (frame->timestamp != 0) + timestamp = frame->timestamp; + else if (frame->samples != 0) + timestamp += frame->samples; + else + timestamp += m_switchCodec->implementation->samples_per_packet; + rtp.SetTimestamp(timestamp); + + return mediaPatch->PushFrame(rtp) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_opal/mod_opal.h b/src/mod/endpoints/mod_opal/mod_opal.h index 1915d54b90..07ba28a1f3 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.h +++ b/src/mod/endpoints/mod_opal/mod_opal.h @@ -4,6 +4,7 @@ * Version: MPL 1.1 * * Copyright (c) 2007 Tuyan Ozipek (tuyanozipek@gmail.com) + * Copyright (c) 2008-2012 Vox Lucida Pty. Ltd. (robertj@voxlucida.com.au) * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with @@ -46,6 +47,8 @@ #define HAVE_APR #include #include + + #define MODNAME "mod_opal" @@ -53,206 +56,239 @@ class FSEndPoint; class FSManager; -struct mod_opal_globals { - int trace_level; - char *codec_string; - char *context; - char *dialplan; +class FSProcess : public PLibraryProcess +{ + PCLASSINFO(FSProcess, PLibraryProcess); + public: + FSProcess(); + ~FSProcess(); + + bool Initialise(switch_loadable_module_interface_t *iface); + + FSManager & GetManager() const + { + return *m_manager; + } + + protected: + FSManager * m_manager; }; -extern struct mod_opal_globals mod_opal_globals; + +struct FSListener +{ + FSListener() : m_port(H323EndPoint::DefaultTcpSignalPort) { } + + PString m_name; + PIPSocket::Address m_address; + uint16_t m_port; +}; -class FSProcess:public PLibraryProcess { - PCLASSINFO(FSProcess, PLibraryProcess); +class FSManager : public OpalManager +{ + PCLASSINFO(FSManager, OpalManager); public: - FSProcess(); - ~FSProcess(); + FSManager(); - bool Initialise(switch_loadable_module_interface_t *iface); + bool Initialise(switch_loadable_module_interface_t *iface); - FSManager & GetManager() const { - return *m_manager; - } protected: - FSManager * m_manager; -}; + switch_status_t ReadConfig(int reload); - -struct FSListener { - FSListener() { - } PString name; - OpalTransportAddress listenAddress; - PString localUserName; - PString gatekeeper; -}; - - -class FSCall:public OpalCall { - PCLASSINFO(FSCall, OpalCall); - public: - FSCall(OpalManager & manager); - virtual PBoolean OnSetUp(OpalConnection & connection); -}; - - -class FSManager:public OpalManager { - PCLASSINFO(FSManager, OpalManager); - - public: - FSManager(); - - bool Initialise(switch_loadable_module_interface_t *iface); - - switch_status_t ReadConfig(int reload); - - switch_endpoint_interface_t *GetSwitchInterface() const { - return m_FreeSwitch; - } virtual OpalCall *CreateCall(void *userData); + switch_endpoint_interface_t *GetSwitchInterface() const { return m_FreeSwitch; } + const PString & GetContext() const { return m_context; } + const PString & GetDialPlan() const { return m_dialplan; } + const PString & GetCodecPrefs() const { return m_codecPrefs; } private: - switch_endpoint_interface_t *m_FreeSwitch; + switch_endpoint_interface_t *m_FreeSwitch; - H323EndPoint *m_h323ep; - IAX2EndPoint *m_iaxep; - FSEndPoint *m_fsep; + H323EndPoint *m_h323ep; + IAX2EndPoint *m_iaxep; + FSEndPoint *m_fsep; - PString m_gkAddress; - PString m_gkIdentifer; - PString m_gkInterface; + PString m_context; + PString m_dialplan; + PString m_codecPrefs; + PString m_gkAddress; + PString m_gkIdentifer; + PString m_gkInterface; - list < FSListener > m_listeners; + list m_listeners; +}; + + +class FSEndPoint : public OpalLocalEndPoint +{ + PCLASSINFO(FSEndPoint, OpalLocalEndPoint); + public: + FSEndPoint(FSManager & manager); + + virtual OpalLocalConnection *CreateConnection(OpalCall & call, void *userData, unsigned options, OpalConnection::StringOptions * stringOptions); + + FSManager & GetManager() const { return m_manager; } + + protected: + FSManager & m_manager; }; class FSConnection; -typedef struct { - switch_timer_t read_timer; - switch_codec_t read_codec; - switch_codec_t write_codec; - - switch_timer_t vid_read_timer; - switch_codec_t vid_read_codec; - switch_codec_t vid_write_codec; - FSConnection *me; -} opal_private_t; -class FSEndPoint:public OpalLocalEndPoint { - PCLASSINFO(FSEndPoint, OpalLocalEndPoint); +class FSMediaStream : public OpalMediaStream +{ + PCLASSINFO(FSMediaStream, OpalMediaStream); public: - FSEndPoint(FSManager & manager); + FSMediaStream( + FSConnection & conn, + const OpalMediaFormat & mediaFormat, ///< Media format for stream + unsigned sessionID, ///< Session number for stream + bool isSource ///< Is a source stream + ); - virtual bool OnIncomingCall(OpalLocalConnection &); - virtual OpalLocalConnection *CreateConnection(OpalCall & call, void *userData, unsigned options, OpalConnection::StringOptions * stringOptions); + virtual PBoolean Open(); + virtual PBoolean IsSynchronous() const; + virtual PBoolean RequiresPatchThread(OpalMediaStream *) const; + + switch_status_t read_frame(switch_frame_t **frame, switch_io_flag_t flags); + switch_status_t write_frame(const switch_frame_t *frame, switch_io_flag_t flags); + + protected: + virtual void InternalClose(); + int StartReadWrite(PatchPtr & mediaPatch) const; + + private: + bool CheckPatchAndLock(); + + FSConnection &m_connection; + switch_timer_t *m_switchTimer; + switch_codec_t *m_switchCodec; + switch_frame_t m_readFrame; + RTP_DataFrame m_readRTP; }; #define DECLARE_CALLBACK0(name) \ static switch_status_t name(switch_core_session_t *session) { \ - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(session); \ - return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name() : SWITCH_STATUS_FALSE; } \ -switch_status_t name() + FSConnection *tech_pvt = (FSConnection *) switch_core_session_get_private(session); \ + return tech_pvt != NULL ? tech_pvt->name() : SWITCH_STATUS_FALSE; } \ + switch_status_t name() #define DECLARE_CALLBACK1(name, type1, name1) \ static switch_status_t name(switch_core_session_t *session, type1 name1) { \ - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(session); \ - return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name(name1) : SWITCH_STATUS_FALSE; } \ -switch_status_t name(type1 name1) + FSConnection *tech_pvt = (FSConnection *) switch_core_session_get_private(session); \ + return tech_pvt != NULL ? tech_pvt->name(name1) : SWITCH_STATUS_FALSE; } \ + switch_status_t name(type1 name1) #define DECLARE_CALLBACK3(name, type1, name1, type2, name2, type3, name3) \ static switch_status_t name(switch_core_session_t *session, type1 name1, type2 name2, type3 name3) { \ - opal_private_t *tech_pvt = (opal_private_t *) switch_core_session_get_private(session); \ - return tech_pvt && tech_pvt->me != NULL ? tech_pvt->me->name(name1, name2, name3) : SWITCH_STATUS_FALSE; } \ -switch_status_t name(type1 name1, type2 name2, type3 name3) + FSConnection *tech_pvt = (FSConnection *) switch_core_session_get_private(session); \ + return tech_pvt != NULL ? tech_pvt->name(name1, name2, name3) : SWITCH_STATUS_FALSE; } \ + switch_status_t name(type1 name1, type2 name2, type3 name3) -class FSConnection:public OpalLocalConnection { - PCLASSINFO(FSConnection, OpalLocalConnection) +class FSConnection : public OpalLocalConnection +{ + PCLASSINFO(FSConnection, OpalLocalConnection) public: - FSConnection(OpalCall & call, - FSEndPoint & endpoint, - void *userData, - unsigned options, - OpalConnection::StringOptions * stringOptions, - switch_caller_profile_t *outbound_profile, switch_core_session_t *fsSession, switch_channel_t *fsChannel); + struct outgoing_params { + switch_event_t *var_event; + switch_caller_profile_t *outbound_profile; + switch_core_session_t **new_session; + switch_memory_pool_t **pool; + switch_originate_flag_t flags; + switch_call_cause_t *cancel_cause; + switch_call_cause_t fail_cause; + }; - virtual bool OnIncoming(); - virtual void OnReleased(); - virtual PBoolean SetAlerting(const PString & calleeName, PBoolean withMedia); - virtual void OnAlerting(); - virtual void OnEstablished(); - virtual OpalMediaStream *CreateMediaStream(const OpalMediaFormat &, unsigned, PBoolean); - virtual PBoolean OnOpenMediaStream(OpalMediaStream & stream); - virtual OpalMediaFormatList GetMediaFormats() const; - virtual PBoolean SendUserInputTone(char tone, unsigned duration); - virtual PBoolean SendUserInputString(const PString & value); + FSConnection(OpalCall & call, + FSEndPoint & endpoint, + unsigned options, + OpalConnection::StringOptions * stringOptions, + outgoing_params * params); - void SetCodecs(); + virtual bool OnOutgoingSetUp(); + virtual bool OnIncoming(); + virtual void OnReleased(); + virtual PBoolean SetAlerting(const PString & calleeName, PBoolean withMedia); + virtual OpalMediaStream *CreateMediaStream(const OpalMediaFormat &, unsigned, PBoolean); + virtual void OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch); + virtual OpalMediaFormatList GetMediaFormats() const; + virtual PBoolean SendUserInputTone(char tone, unsigned duration); - DECLARE_CALLBACK0(on_init); - DECLARE_CALLBACK0(on_routing); - DECLARE_CALLBACK0(on_execute); + void SetCodecs(); + bool WaitForMedia(); - DECLARE_CALLBACK0(on_exchange_media); - DECLARE_CALLBACK0(on_soft_execute); + DECLARE_CALLBACK0(on_init); + DECLARE_CALLBACK0(on_destroy); + DECLARE_CALLBACK0(on_routing); + DECLARE_CALLBACK0(on_execute); + DECLARE_CALLBACK0(on_hangup); - DECLARE_CALLBACK1(kill_channel, int, sig); - DECLARE_CALLBACK1(send_dtmf, const switch_dtmf_t *, dtmf); - DECLARE_CALLBACK1(receive_message, switch_core_session_message_t *, msg); - DECLARE_CALLBACK1(receive_event, switch_event_t *, event); - DECLARE_CALLBACK0(state_change); - DECLARE_CALLBACK3(read_audio_frame, switch_frame_t **, frame, switch_io_flag_t, flags, int, stream_id); - DECLARE_CALLBACK3(write_audio_frame, switch_frame_t *, frame, switch_io_flag_t, flags, int, stream_id); - DECLARE_CALLBACK3(read_video_frame, switch_frame_t **, frame, switch_io_flag_t, flag, int, stream_id); - DECLARE_CALLBACK3(write_video_frame, switch_frame_t *, frame, switch_io_flag_t, flag, int, stream_id); + DECLARE_CALLBACK0(on_exchange_media); + DECLARE_CALLBACK0(on_soft_execute); - switch_status_t read_frame(const OpalMediaType & mediaType, switch_frame_t **frame, switch_io_flag_t flags); - switch_status_t write_frame(const OpalMediaType & mediaType, const switch_frame_t *frame, switch_io_flag_t flags); + DECLARE_CALLBACK1(kill_channel, int, sig); + DECLARE_CALLBACK1(send_dtmf, const switch_dtmf_t *, dtmf); + DECLARE_CALLBACK1(receive_message, switch_core_session_message_t *, msg); + DECLARE_CALLBACK1(receive_event, switch_event_t *, event); + DECLARE_CALLBACK0(state_change); + DECLARE_CALLBACK3(read_audio_frame, switch_frame_t **, frame, switch_io_flag_t, flags, int, stream_id); + DECLARE_CALLBACK3(write_audio_frame, switch_frame_t *, frame, switch_io_flag_t, flags, int, stream_id); + DECLARE_CALLBACK3(read_video_frame, switch_frame_t **, frame, switch_io_flag_t, flag, int, stream_id); + DECLARE_CALLBACK3(write_video_frame, switch_frame_t *, frame, switch_io_flag_t, flag, int, stream_id); - switch_core_session_t *GetSession() const { - return m_fsSession; - } private: - FSEndPoint & m_endpoint; - switch_core_session_t *m_fsSession; - switch_channel_t *m_fsChannel; - PSyncPoint m_rxAudioOpened; - PSyncPoint m_txAudioOpened; - OpalMediaFormatList m_switchMediaFormats; -}; + switch_status_t read_frame(const OpalMediaType & mediaType, switch_frame_t **frame, switch_io_flag_t flags); + switch_status_t write_frame(const OpalMediaType & mediaType, const switch_frame_t *frame, switch_io_flag_t flags); + __inline switch_core_session_t *GetSession() const + { + return m_fsSession; + } -class FSMediaStream:public OpalMediaStream { - PCLASSINFO(FSMediaStream, OpalMediaStream); - public: - FSMediaStream(FSConnection & conn, const OpalMediaFormat & mediaFormat, ///< Media format for stream - unsigned sessionID, ///< Session number for stream - bool isSource ///< Is a source stream - ); + __inline switch_channel_t *GetChannel() const + { + return m_fsChannel; + } - virtual PBoolean Open(); - virtual PBoolean Close(); - virtual PBoolean IsSynchronous() const; - virtual PBoolean RequiresPatchThread(OpalMediaStream *) const; + bool IsChannelReady() const + { + return m_fsChannel != NULL && switch_channel_ready(m_fsChannel); + } - switch_status_t read_frame(switch_frame_t **frame, switch_io_flag_t flags); - switch_status_t write_frame(const switch_frame_t *frame, switch_io_flag_t flags); + bool NeedFlushAudio() + { + if (!m_flushAudio) + return false; + m_flushAudio = false; + return true; + } private: - switch_core_session_t *m_fsSession; - switch_channel_t *m_fsChannel; - switch_timer_t *m_switchTimer; - switch_codec_t *m_switchCodec; - switch_frame_t m_readFrame; - unsigned char m_buf[SWITCH_RECOMMENDED_BUFFER_SIZE]; - RTP_DataFrame m_readRTP; - bool m_callOnStart; - uint32_t m_timeStamp; + FSEndPoint &m_endpoint; + switch_core_session_t *m_fsSession; + switch_channel_t *m_fsChannel; + PSyncPoint m_rxAudioOpened; + PSyncPoint m_txAudioOpened; + OpalMediaFormatList m_switchMediaFormats; - bool CheckPatchAndLock(); + // If FS ever supports more than one audio and one video, this needs to change + switch_timer_t m_read_timer; + switch_codec_t m_read_codec; + switch_codec_t m_write_codec; + + switch_timer_t m_vid_read_timer; + switch_codec_t m_vid_read_codec; + switch_codec_t m_vid_write_codec; + + bool m_flushAudio; + + friend PBoolean FSMediaStream::Open(); }; From 22bc29b5e0b4be2f342d0f1ec34da89adf2bbd1d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 30 Jul 2012 12:32:46 -0400 Subject: [PATCH 376/493] sending termination in-service/out-of-service service change for termination whenever there is alarm indication from freetdm --- libs/freetdm/mod_freetdm/tdm.c | 7 +- .../mod_media_gateway/media_gateway.c | 39 ++++- .../media_gateway_cmd_handler.c | 13 +- .../mod_media_gateway/media_gateway_stack.h | 6 +- .../mod_media_gateway/media_gateway_utils.c | 12 +- .../mod_media_gateway/media_gateway_xml.c | 154 +++++++++++------- .../mod_media_gateway/mod_media_gateway.c | 30 +--- .../mod_media_gateway/mod_media_gateway.h | 8 +- 8 files changed, 167 insertions(+), 102 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 790f7c17d3..0cc02a85c7 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -84,7 +84,7 @@ switch_io_routines_t ctdm_io_routines = { .receive_message = channel_receive_message }; -static void ctdm_report_alarms(ftdm_channel_t *channel, const char* mg_profile_name) +static void ctdm_report_alarms(ftdm_channel_t *channel) { switch_event_t *event = NULL; ftdm_alarm_flag_t alarmflag = 0; @@ -109,8 +109,6 @@ static void ctdm_report_alarms(ftdm_channel_t *channel, const char* mg_profile_n switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap"); } - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "mg-profile-name", mg_profile_name); - if (alarmflag & FTDM_ALARM_RED) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red"); } @@ -149,7 +147,6 @@ static void ctdm_event_handler(switch_event_t *event) const char *chan_number = NULL; uint32_t chan_id = 0; const char *cond = switch_event_get_header(event, "condition"); - const char *mg_profile_name = switch_event_get_header(event, "mg-profile-name"); if (zstr(cond)) { return; @@ -187,7 +184,7 @@ static void ctdm_event_handler(switch_event_t *event) return; } - ctdm_report_alarms(channel, mg_profile_name); + ctdm_report_alarms(channel); } } break; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 7e13fbaebe..8beeedc3ca 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -22,6 +22,8 @@ megaco_profile_t *megaco_profile_locate(const char *name) return profile; } + + mg_peer_profile_t *megaco_peer_profile_locate(const char *name) { mg_peer_profile_t *profile = switch_core_hash_find_rdlock(megaco_globals.peer_profile_hash, name, megaco_globals.peer_profile_rwlock); @@ -171,7 +173,6 @@ switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term) return SWITCH_STATUS_SUCCESS; } -/* @Kapil Call this function once H.248 link is up */ switch_status_t megaco_check_tdm_termination(mg_termination_t *term) { switch_event_t *event = NULL; @@ -186,7 +187,6 @@ switch_status_t megaco_check_tdm_termination(mg_termination_t *term) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", term->u.tdm.span_name); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", term->u.tdm.channel); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "mg-tdm-check"); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "mg-profile-name", term->profile->name); switch_event_fire(&event); return SWITCH_STATUS_SUCCESS; @@ -241,7 +241,34 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha return term; } -mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile, char *span_name, char *chan_number) +mg_termination_t *megaco_term_locate_by_span_chan_id(const char *span_name, const char *chan_number) +{ + void *val = NULL; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + megaco_profile_t *profile = NULL; + const void *var; + + switch_assert(span_name); + switch_assert(chan_number); + + /* span + chan will be unique across all the mg_profiles * + * loop through all profiles and then all terminations to * + * get the mg termination associated with input span+chan */ + + switch_thread_rwlock_rdlock(megaco_globals.profile_rwlock); + for (hi = switch_hash_first(NULL, megaco_globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + profile = (megaco_profile_t *) val; + + if(NULL != (term = megaco_find_termination_by_span_chan(profile, span_name, chan_number))) break; + } + switch_thread_rwlock_unlock(megaco_globals.profile_rwlock); + + return term; +} + +mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile, const char *span_name, const char *chan_number) { void *val = NULL; switch_hash_index_t *hi = NULL; @@ -262,7 +289,8 @@ mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile if ((!strcasecmp(span_name, term->u.tdm.span_name))&& (atoi(chan_number) == term->u.tdm.channel)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - "Got term[%s] associated with span[%s], channel[%s]\n",term->name, span_name, chan_number); + "Got term[%s] associated with span[%s], channel[%s] in MG profile[%s]\n", + term->name, span_name, chan_number, profile->name); found = 0x01; break; } @@ -271,7 +299,8 @@ mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile if(!found){ term = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - " Not able to find termination associated with span[%s], channel[%s]\n", span_name, chan_number); + " MG profile[%s] does not have termination associated with span[%s], channel[%s]\n", + profile->name, span_name, chan_number); } return term; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index ca2209b087..f392612cbb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2288,18 +2288,15 @@ U32 get_txn_id(){ return outgoing_txn_id; } /*****************************************************************************************************************************/ -switch_status_t mg_send_term_service_change(char* mg_profile_name,char *span_name, char *chan_number, mg_term_states_e term_state) +switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, mg_term_states_e term_state) { mg_termination_t* term = NULL; switch_status_t ret = SWITCH_STATUS_SUCCESS; - megaco_profile_t *profile = NULL; switch_assert(span_name); switch_assert(chan_number); - profile = megaco_profile_locate(mg_profile_name); - - term = megaco_find_termination_by_span_chan(profile, span_name, chan_number); + term = megaco_term_locate_by_span_chan_id(span_name, chan_number); if(!term || !term->profile){ return SWITCH_STATUS_FALSE; @@ -2309,11 +2306,17 @@ switch_status_t mg_send_term_service_change(char* mg_profile_name,char *span_nam { case MG_TERM_SERVICE_STATE_IN_SERVICE: { + /* set INS flag...clear oos flag */ + switch_clear_flag(term, MG_OUT_OF_SERVICE); + switch_set_flag(term, MG_IN_SERVICE); ret = mg_send_ins_service_change(term->profile, term->name, 0x00 ); break; } case MG_TERM_SERVICE_STATE_OUT_OF_SERVICE: { + /* set OOS flag...clear ins flag */ + switch_clear_flag(term, MG_IN_SERVICE); + switch_set_flag(term, MG_OUT_OF_SERVICE); ret = mg_send_oos_service_change(term->profile, term->name, 0x00 ); break; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 3e2ec81bdb..994b1a573a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -164,8 +164,7 @@ void mg_util_set_err_string ( MgStr *errTxt, char* str); switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp); -switch_status_t mg_send_term_service_change(char* mg_profile_name, char *span_name, char *chan_number, mg_term_states_e term_state); -mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile , char *span_name, char *chan_number); +switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, mg_term_states_e term_state); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); @@ -190,7 +189,8 @@ void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); -switch_status_t mg_stack_termination_is_in_service(char* term_str, int len); +switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, char* term_str, int len); +void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int j); void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd); switch_status_t mgco_init_ins_service_change(SuId suId); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index f7e9dde544..c565da7e6b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -80,10 +80,16 @@ switch_status_t mg_stack_free_mem(void* msg) /*****************************************************************************************************************************/ -/* TODO - Matt - to see if term is in service or not */ -switch_status_t mg_stack_termination_is_in_service(char* term_str,int len) +/* To see if term is in service or not */ +switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, char* term_str,int len) { - return SWITCH_STATUS_SUCCESS; + mg_termination_t* term = NULL; + term = megaco_find_termination(mg_profile, term_str); + if(switch_test_flag(term, MG_IN_SERVICE)){ + return SWITCH_STATUS_SUCCESS; + } else { + return SWITCH_STATUS_FALSE; + } } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 6c87afa780..9890f152c3 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -65,62 +65,74 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->idx = ++mg_sap_id; - - - if ((mg_phys_terms = switch_xml_child(mg_interface, "physical_terminations"))) { - for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { - switch_memory_pool_t *pool; - mg_termination_t *term; - // - const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); - //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); - const char *tech = switch_xml_attr(mg_term, "tech"); - const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); - const char *channel_map = switch_xml_attr(mg_term, "channel-map"); - - - if (!zstr(channel_map)) { - /* Split channel-map */ - char *channel_map_dup = strdup(channel_map); - char *chanmap[24]; - int chanmap_count, i; - chanmap_count = switch_split(channel_map_dup, ',', chanmap); - for (i = 0; i < chanmap_count; i++) { - char *p = strchr(chanmap[i], '-'); - if (p) { - int startchan, endchan, j; - *p++ = '\0'; - startchan = atoi(chanmap[i]); - endchan = atoi(p); - - for (j = startchan; j < endchan; j++) { - switch_core_new_memory_pool(&pool); - term = switch_core_alloc(profile->pool, sizeof *term); - term->pool = pool; - term->type = MG_TERM_TDM; - term->profile = profile; - term->mg_ctxt = NULL; - term->tech = switch_core_strdup(pool, tech); - term->active_events = NULL; - term->name = switch_core_sprintf(pool, "%s%d", prefix, j); - term->u.tdm.channel = j; - term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); - - switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); - term->next = profile->physical_terminations; - profile->physical_terminations = term; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mapped termination [%s] to freetdm span: %s chan: %d\n", term->name, term->u.tdm.span_name, term->u.tdm.channel); - megaco_prepare_tdm_termination(term); - } - } - } - - free(channel_map_dup); - } - } - } + + if ((mg_phys_terms = switch_xml_child(mg_interface, "physical_terminations"))) { + for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { + // + const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); + //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); + const char *tech = switch_xml_attr(mg_term, "tech"); + const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); + const char *channel_map = switch_xml_attr(mg_term, "channel-map"); + char *p = NULL; + + if (!zstr(channel_map)) { + /* Split channel-map */ + char *channel_map_dup = strdup(channel_map); + char *chanmap[24] = {0}; + int chanmap_count = 0; + int i = 0; + int startchan, endchan, j; + + /* we can have following combinations * + * i) only one channel i.e. channel-map="1" + * ii) only one chanel range i.e channel-map="1-15" + * iii) full channel range i.e. channel-map="1-15,17-31" + */ + + + chanmap_count = switch_split(channel_map_dup, ',', chanmap); + + if(1 == chanmap_count) { + p = strchr(channel_map_dup, '-'); + if(NULL != p){ + /* case (ii) */ + i = switch_split(channel_map_dup, '-', chanmap); + if(i && chanmap[0] && chanmap[1]) { + startchan = atoi(chanmap[0]); + endchan = atoi(chanmap[1]); + for (j = startchan; j < endchan; j++) { + mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); + } + } + }else{ + /* case (i) */ + p = channel_map_dup; + startchan = endchan = atoi(p); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, startchan); + } + }else + { + /* case (iii) */ + for (i = 0; i < chanmap_count; i++) { + p = strchr(chanmap[i], '-'); + if (p) { + *p++ = '\0'; + startchan = atoi(chanmap[i]); + endchan = atoi(p); + + for (j = startchan; j < endchan; j++) { + mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); + } + } + } + } + + free(channel_map_dup); + } + } + } /* we should break from here , profile name should be unique */ @@ -129,7 +141,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) if (!mg_interface) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error profile %s not found\n", profile->name); - return SWITCH_STATUS_FALSE; + return SWITCH_STATUS_FALSE; } /* go through the peer configuration and get the mg profile associated peers only */ @@ -169,7 +181,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) } } } - + /* configure the MEGACO stack */ status = sng_mgco_cfg(profile); @@ -184,6 +196,34 @@ done: return status; } +/****************************************************************************************************************************/ +void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int chan_num) +{ + mg_termination_t *term; + switch_memory_pool_t *pool; + + switch_core_new_memory_pool(&pool); + term = switch_core_alloc(profile->pool, sizeof *term); + term->pool = pool; + term->type = MG_TERM_TDM; + term->profile = profile; + term->mg_ctxt = NULL; + term->tech = switch_core_strdup(pool, tech); + term->active_events = NULL; + term->name = switch_core_sprintf(pool, "%s%d", prefix, chan_num); + term->u.tdm.channel = chan_num; + term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); + + switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); + term->next = profile->physical_terminations; + profile->physical_terminations = term; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, + "Mapped termination [%s] to freetdm span: %s chan: %d\n", + term->name, term->u.tdm.span_name, term->u.tdm.channel); + megaco_prepare_tdm_termination(term); + +} /****************************************************************************************************************************/ switch_status_t mg_config_cleanup(megaco_profile_t* profile) { diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 97158fdcea..22c07275a8 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -64,38 +64,23 @@ static void mg_event_handler(switch_event_t *event) const char *span_name = NULL; const char *chan_number = NULL; const char *cond = NULL; - const char *mg_profile_name = NULL; - cond = switch_event_get_header(event, "condition"); if (zstr(cond)) { - printf("Condition NULL, returning \n"); return; } - mg_profile_name = switch_event_get_header(event, "mg-profile-name"); - if (zstr(mg_profile_name)) { - printf("mg_profile_name NULL, returning \n"); - return; - } - - span_name = switch_event_get_header(event, "span-name"); + span_name = switch_event_get_header(event, "span-name"); chan_number = switch_event_get_header(event, "chan-number"); if (!strcmp(cond, "ftdm-alarm-trap")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - "ftdm-alarm-trap for span_name[%s] chan_number[%s] associated with MG profile[%s]\n", - span_name,chan_number, mg_profile_name); - /* @KAPIL: TDM is in alarm, notify MGC */ - mg_send_term_service_change( - (char*)mg_profile_name, (char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_OUT_OF_SERVICE); + "ftdm-alarm-trap for span_name[%s] chan_number[%s]\n", span_name,chan_number); + mg_send_term_service_change((char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_OUT_OF_SERVICE); } else if (!strcmp(cond, "ftdm-alarm-clear")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - "ftdm-alarm-clear for span_name[%s] chan_number[%s] associated with MG profile[%s] \n", - span_name,chan_number, mg_profile_name); - /* TDM alarm cleared, notify MGC */ - mg_send_term_service_change( - (char*)mg_profile_name, (char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_IN_SERVICE); + "ftdm-alarm-clear for span_name[%s] chan_number[%s] \n", span_name,chan_number); + mg_send_term_service_change( (char*)span_name, (char*)chan_number, MG_TERM_SERVICE_STATE_IN_SERVICE); } } break; @@ -561,8 +546,9 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ - if (MGT_TERMID_OTHER == termId->type.val){ - if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service((char*)termId->name.lcl.val, termId->name.lcl.len)){ + if ((CH_CMD_TYPE_IND == cmd->cmdType.val) && + (MGT_TERMID_OTHER == termId->type.val)){ + if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 86acb28861..06cbffca11 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -89,8 +89,10 @@ typedef struct mg_context_s mg_context_t; typedef struct mg_termination_s mg_termination_t; enum { - MGT_ALLOCATED = (1 << 0), - MGT_ACTIVE = (1 << 1), + MGT_ALLOCATED = (1 << 0), + MGT_ACTIVE = (1 << 1), + MG_IN_SERVICE = (1 << 2), + MG_OUT_OF_SERVICE = (1 << 3), } mg_termination_flags; @@ -222,8 +224,10 @@ static inline megaco_codec_t megaco_codec_parse(const char *codec) { megaco_profile_t *megaco_profile_locate(const char *name); +mg_termination_t *megaco_term_locate_by_span_chan_id(const char *span_name, const char *chan_number); mg_peer_profile_t *megaco_peer_profile_locate(const char *name); void megaco_profile_release(megaco_profile_t *profile); +mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile, const char *span_name, const char *chan_number); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); From 0c87442dd78fd3492aa4006b8a46fdb3bea2dfb0 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 30 Jul 2012 13:17:39 -0400 Subject: [PATCH 377/493] adding termination service states(in-service/out-of-service) flags and reject incoming megaco request if requested termination is not in service --- libs/freetdm/mod_freetdm/tdm.c | 5 +++++ .../mod_media_gateway/media_gateway.c | 3 ++- .../media_gateway_cmd_handler.c | 20 +++++++++++-------- .../mod_media_gateway/media_gateway_xml.c | 2 +- .../mod_media_gateway/mod_media_gateway.c | 1 + 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 0cc02a85c7..22ffb5463e 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -128,6 +128,8 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general"); } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Reporting [%s] alarms for %s:%d\n", + (alarmflag?"ftdm-alarm-clear":"ftdm-alarm-trap"), ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); switch_event_fire(&event); return; @@ -184,6 +186,9 @@ static void ctdm_event_handler(switch_event_t *event) return; } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Requesting alarm status for %s:%d\n", + ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); + ctdm_report_alarms(channel); } } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8beeedc3ca..dc789c3511 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -578,8 +578,9 @@ switch_status_t megaco_profile_start(const char *profilename) switch_core_new_memory_pool(&pool); profile = switch_core_alloc(pool, sizeof(*profile)); profile->pool = pool; + profile->physical_terminations = NULL; profile->name = switch_core_strdup(pool, profilename); - profile->next_context_id++; + profile->next_context_id++; profile->inact_tmr = 0x00; profile->inact_tmr_task_id = 0x00; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index f392612cbb..5fa9d45663 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2306,18 +2306,22 @@ switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, { case MG_TERM_SERVICE_STATE_IN_SERVICE: { - /* set INS flag...clear oos flag */ - switch_clear_flag(term, MG_OUT_OF_SERVICE); - switch_set_flag(term, MG_IN_SERVICE); - ret = mg_send_ins_service_change(term->profile, term->name, 0x00 ); + if(switch_test_flag(term, MG_OUT_OF_SERVICE)){ + /* set INS flag...clear oos flag */ + switch_clear_flag(term, MG_OUT_OF_SERVICE); + switch_set_flag(term, MG_IN_SERVICE); + ret = mg_send_ins_service_change(term->profile, term->name, 0x00 ); + } break; } case MG_TERM_SERVICE_STATE_OUT_OF_SERVICE: { - /* set OOS flag...clear ins flag */ - switch_clear_flag(term, MG_IN_SERVICE); - switch_set_flag(term, MG_OUT_OF_SERVICE); - ret = mg_send_oos_service_change(term->profile, term->name, 0x00 ); + if(switch_test_flag(term, MG_IN_SERVICE)){ + /* set OOS flag...clear ins flag */ + switch_clear_flag(term, MG_IN_SERVICE); + switch_set_flag(term, MG_OUT_OF_SERVICE); + ret = mg_send_oos_service_change(term->profile, term->name, 0x00 ); + } break; } default: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 9890f152c3..98b46a9302 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -213,6 +213,7 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->name = switch_core_sprintf(pool, "%s%d", prefix, chan_num); term->u.tdm.channel = chan_num; term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); + switch_set_flag(term, MG_OUT_OF_SERVICE); switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); term->next = profile->physical_terminations; @@ -222,7 +223,6 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char "Mapped termination [%s] to freetdm span: %s chan: %d\n", term->name, term->u.tdm.span_name, term->u.tdm.channel); megaco_prepare_tdm_termination(term); - } /****************************************************************************************************************************/ switch_status_t mg_config_cleanup(megaco_profile_t* profile) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 22c07275a8..95f9d3b2cb 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -549,6 +549,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if ((CH_CMD_TYPE_IND == cmd->cmdType.val) && (MGT_TERMID_OTHER == termId->type.val)){ if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n", (char*)termId->name.lcl.val); mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; From 3c8d14a2263e86be4d902547adb5a5a31dab8008 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Mon, 30 Jul 2012 13:36:36 -0400 Subject: [PATCH 378/493] Adding mod_media_gateway --- build/modules.conf.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/modules.conf.in b/build/modules.conf.in index 83986b996c..34ffb2121b 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -8,7 +8,7 @@ applications/mod_spandsp dialplans/mod_dialplan_xml endpoints/mod_sofia endpoints/mod_opal -#endpoints/mod_media_gateway +endpoints/mod_media_gateway ../../libs/freetdm/mod_freetdm xml_int/mod_xml_cdr event_handlers/mod_event_socket From 4fd24d6172f2c8a6c9ff5773ac59ba2e0e1074cf Mon Sep 17 00:00:00 2001 From: root Date: Mon, 30 Jul 2012 13:44:40 -0400 Subject: [PATCH 379/493] adding code to return Audit of termination state based on termination's state(in-service/oos) --- .../media_gateway_cmd_handler.c | 12 ++++++------ .../mod_media_gateway/media_gateway_stack.h | 4 ++-- .../mod_media_gateway/media_gateway_utils.c | 18 +++++++++++++++--- .../mod_media_gateway/mod_media_gateway.c | 6 ++++-- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5fa9d45663..a1fd12b3df 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1526,7 +1526,7 @@ switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgM /*****************************************************************************************************************************/ -switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) +switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand *auditReq) { MgMgcoContextId *ctxtId; MgMgcoTermIdLst *term_list; @@ -1562,7 +1562,7 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); - return mg_send_heartbeat_audit_rsp(suId, auditReq); + return mg_send_heartbeat_audit_rsp(mg_profile->idx, auditReq); } /* dump AUDIT message information */ @@ -1682,7 +1682,7 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_MEDIADESC; - media = get_default_media_desc(); + media = get_default_media_desc(mg_profile, termId); if(!media){ return SWITCH_STATUS_FALSE; } @@ -1780,7 +1780,7 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) /* send command reply */ - sng_mgco_send_cmd(suId, &reply); + sng_mgco_send_cmd(mg_profile->idx, &reply); /* send indication to stack , so he can send response back to peer */ memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); @@ -1788,14 +1788,14 @@ switch_status_t handle_mg_audit_cmd( SuId suId, MgMgcoCommand *auditReq) memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); ctxt.cmdStatus.pres = PRSNT_NODEF; ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - sng_mgco_send_axn_req(suId, &ctxt); + sng_mgco_send_axn_req(mg_profile->idx, &ctxt); /***********************************************************************************************************************************/ return SWITCH_STATUS_SUCCESS; error: if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, auditReq->transId.val, ctxtId, err_code, &errTxt)) { - sng_mgco_send_err(suId, mgErr); + sng_mgco_send_err(mg_profile->idx, mgErr); } /* deallocate the msg */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 994b1a573a..4d79a96078 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -181,14 +181,14 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); -MgMgcoMediaDesc* get_default_media_desc(void); +MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId); switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp); void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId); switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgMgcoContextId *ctxt_id, U32 err, MgStr *errTxt); switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); -switch_status_t handle_mg_audit_cmd(SuId suId, MgMgcoCommand *auditReq); +switch_status_t handle_mg_audit_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *auditReq); switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, char* term_str, int len); void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int j); void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index c565da7e6b..b4b3663fa4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1214,7 +1214,7 @@ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ -MgMgcoMediaDesc* get_default_media_desc() +MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId) { MgMgcoMediaDesc *media = NULL; MgMgcoMediaPar *mediaPar = NULL; @@ -1268,8 +1268,20 @@ MgMgcoMediaDesc* get_default_media_desc() trmStPar->type.pres = PRSNT_NODEF; trmStPar->type.val = MGT_TERMST_SVCST; trmStPar->u.svcState.pres = PRSNT_NODEF; - /*TODO - ADD CHECK if term is in svc or not */ - trmStPar->u.svcState.val = MGT_SVCST_INSVC; + + if ((NOTPRSNT != termId->type.pres) && + (MGT_TERMID_ROOT == termId->type.val)){ + trmStPar->u.svcState.val = MGT_SVCST_INSVC; + }else{ + /*not root termination */ + mg_termination_t* term = NULL; + term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + if(term && switch_test_flag(term, MG_OUT_OF_SERVICE)){ + trmStPar->u.svcState.val = MGT_SVCST_OUTOFSVC; + }else{ + trmStPar->u.svcState.val = MGT_SVCST_INSVC; + } + } mediaPar->u.tstate.trmStPar[0] = trmStPar; media->parms[0] = mediaPar; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 95f9d3b2cb..d650ef7637 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -546,8 +546,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ + /* check is only if command is not AUDIT */ if ((CH_CMD_TYPE_IND == cmd->cmdType.val) && - (MGT_TERMID_OTHER == termId->type.val)){ + (MGT_TERMID_OTHER == termId->type.val) && + (MGT_AUDITVAL != cmd->u.mgCmdInd[0]->cmd.type.val)){ if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n", (char*)termId->name.lcl.val); mg_util_set_term_string(&errTxt, termId); @@ -643,7 +645,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_AUDITVAL: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); - handle_mg_audit_cmd(suId, cmd); + handle_mg_audit_cmd(mg_profile, cmd); break; } break; From 39b6233abb9260520adcc2dc4f85e54661322316 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 30 Jul 2012 16:00:15 -0400 Subject: [PATCH 380/493] adding T.38 required packages --- .../mod_media_gateway/media_gateway_packages.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c index 0c6f17b0df..7d40a64b19 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c @@ -123,6 +123,21 @@ MgPackage_t mg_pkg_list [] = 1, /* Version 1 */ "analog", /* Package name */ }, + { /* INDEX : 22 */ + MGT_PKG_FAX_TONE_DET, + 1, /* Version 1 */ + "ftmd", /* Package name */ + }, + { /* INDEX : 24 */ + MGT_PKG_CALL_TYP_DISCR, + 1, /* Version 1 */ + "ctype", /* Package name */ + }, + { /* INDEX : 25 */ + MGT_PKG_IP_FAX, + 1, /* Version 1 */ + "ipfax", /* Package name */ + }, /* Add more packages */ }; From 4423077a4e6406bac3d28a933ffdb606a5a1e862 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 30 Jul 2012 16:48:53 -0400 Subject: [PATCH 381/493] adding API to send T.38 CNG tone notify to MGC --- .../mod_media_gateway/media_gateway_cli.c | 30 +++++++++--- .../media_gateway_cmd_handler.c | 47 +++++++++++++++++++ .../mod_media_gateway/media_gateway_stack.h | 3 ++ 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index e8cb79097b..080ca4b709 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -146,23 +146,39 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } case 5: { - /* mg profile send ito notify */ if(zstr(argv[3])){ goto usage; } - if(strcasecmp(argv[3],"ito")){ + /*************************************************************************/ + if(!strcasecmp(argv[3],"ito")){ + /* mg profile send ito notify */ + + printf("Sending In-Activity NOTIFY \n"); + + megaco_profile_release(profile); + mg_send_ito_notify(profile); + /*************************************************************************/ + }else if(!strcasecmp(argv[3],"cng")){ + /*************************************************************************/ + /* mg profile send cng */ + + if(zstr(argv[4])){ + goto usage; + } + megaco_profile_release(profile); + mg_send_t38_cng_notify(profile, argv[4]); + + /*************************************************************************/ + }else { stream->write_function(stream, "-ERR wrong input \n"); goto usage; } - - printf("Sending In-Activity NOTIFY \n"); - - megaco_profile_release(profile); - mg_send_ito_notify(profile); + /*************************************************************************/ break; } + default: { goto usage; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index a1fd12b3df..5a7786839b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2480,6 +2480,53 @@ switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile ) return mg_send_notify(mg_profile, "ROOT", oevt); } + +/*****************************************************************************************************************************/ +/* API to send T.38 CNG tone Notification */ + +switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char* term_name) +{ + MgMgcoObsEvt *oevt; + MgMgcoEvtPar* param; + + switch_assert(term_name); + switch_assert(mg_profile); + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_CALL_TYP_DISCR); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[0]; + + MG_INIT_TOKEN_VALUE(&(param->type),(U8)MGT_EVTPAR_OTHER); + + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val), MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYP); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + + + return mg_send_notify(mg_profile, term_name, oevt); +} /*****************************************************************************************************************************/ /* API to send DTMF Digits Notification */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 4d79a96078..28ff0c2c03 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -167,6 +167,9 @@ switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, mg_term_states_e term_state); +switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char* term_name); + + switch_status_t sng_mgco_cfg(megaco_profile_t* profile); switch_status_t sng_mgco_init(sng_mg_event_interface_t* event); switch_status_t sng_mgco_stack_shutdown(void); From 7421bcfb3431ebe3c60b5e08e7482a598230b5c3 Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 31 Jul 2012 09:26:46 -0400 Subject: [PATCH 382/493] adding safe check for term ptr --- src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index b4b3663fa4..1f883a6740 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -85,7 +85,7 @@ switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, { mg_termination_t* term = NULL; term = megaco_find_termination(mg_profile, term_str); - if(switch_test_flag(term, MG_IN_SERVICE)){ + if(term && switch_test_flag(term, MG_IN_SERVICE)){ return SWITCH_STATUS_SUCCESS; } else { return SWITCH_STATUS_FALSE; From b9db9e44ff7469b89744e38f7f7740da27fdb8da Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Jul 2012 13:45:08 -0400 Subject: [PATCH 383/493] fixing warnings --- src/mod/endpoints/mod_media_gateway/Makefile | 1 + src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/Makefile b/src/mod/endpoints/mod_media_gateway/Makefile index 66ad05c428..30b36a1b20 100644 --- a/src/mod/endpoints/mod_media_gateway/Makefile +++ b/src/mod/endpoints/mod_media_gateway/Makefile @@ -8,5 +8,6 @@ endif BASE=../../../.. LOCAL_OBJS=media_gateway.o media_gateway_stack.o media_gateway_xml.o media_gateway_cli.o media_gateway_stack_alarms.o media_gateway_cmd_handler.o media_gateway_utils.o media_gateway_packages.o +LOCAL_CFLAGS=-fno-strict-aliasing LOCAL_LDFLAGS=-lsng_mg include $(BASE)/build/modmake.rules diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index dc789c3511..10e4b1bd5a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -480,7 +480,7 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) /* Returns a fresh new context */ mg_context_t *megaco_choose_context(megaco_profile_t *profile) { - mg_context_t *ctx; + mg_context_t *ctx=NULL; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ From 85bb06ba5640e81fbca1ff5e440e196b9d85f81a Mon Sep 17 00:00:00 2001 From: Kapil Date: Tue, 31 Jul 2012 15:07:44 -0400 Subject: [PATCH 384/493] adding code to parse signal descriptor for detecting T.38 CED/ANS signal request from MGC --- .../media_gateway_cmd_handler.c | 97 ++++++++++++++++++- .../mod_media_gateway/media_gateway_utils.c | 2 +- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5a7786839b..c6ec61e430 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -187,6 +187,58 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c return SWITCH_STATUS_SUCCESS; } +/*****************************************************************************************************************************/ +switch_status_t mg_prc_sig_desc(MgMgcoSignalsReq* req, megaco_profile_t* mg_profile, mg_termination_t* term) +{ + MgMgcoSigPar *p = NULL; + MgMgcoSigOther* o = NULL; + int sig = 0x00; + + switch_assert(req); + switch_assert(mg_profile); + switch_assert(term); + + + /* As of now only checking T.38 CED tone */ + + /* Modify message will have following signal descriptor * + * Signals{ctyp/ANS{anstype=ans}} * + */ + + /* check for T.38 CED tone package i.e. MGT_PKG_CALL_TYP_DISCR */ + if((MGT_PKG_KNOWN == req->pkg.valType.val) && + (NOTPRSNT != req->pkg.u.val.pres) && + (MGT_PKG_CALL_TYP_DISCR == req->pkg.u.val.val) && + (NOTPRSNT != req->name.type.pres) && + (MGT_GEN_TYPE_KNOWN == req->name.type.val)) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Received Signal Descriptor : T.38 ctyp package\n"); + + if((NOTPRSNT != req->pl.num.pres) && (NOTPRSNT != req->pl.num.val)){ + for(sig = 0x00; sig < req->pl.num.val; sig++){ + p = req->pl.parms[sig]; + + if(NOTPRSNT == p->type.pres) continue; + + if((MGT_SIGPAR_OTHER == p->type.val) && + (NULL != (o = &p->u.other)) && + (NOTPRSNT != o->name.type.pres) && + (MGT_GEN_TYPE_KNOWN == o->name.type.val) && + (MGT_PKG_ENUM_SIGOTHERCALLTYPDISCRANSSIGANSTYP == o->name.u.val.val) && + (MGT_VALUE_EQUAL == o->val.type.val) && + (NOTPRSNT != o->val.u.eq.type.pres) && + (MGT_VALTYPE_ENUM == o->val.u.eq.type.val) && + (MGT_PKG_ENUM_SIGOTHERCALLTYPDISCRANSSIGANSTYPANS == o->val.u.eq.u.enume.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Signal Descriptor : T.38 CED/ANS TONE \n"); + /* apply CED/ANS tone to specify channel */ + } + } + } + } + + + return SWITCH_STATUS_SUCCESS; +} /*****************************************************************************************************************************/ @@ -313,7 +365,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * remote = &mediaPar->u.remote; sdp = remote->sdp.info[0]; /* for Matt - same like local descriptor */ - mgco_handle_incoming_sdp(&remote->sdp, term, MG_SDP_REMOTE, mg_profile, memCp); + mgco_handle_incoming_sdp(&remote->sdp, term, MG_SDP_REMOTE, mg_profile, memCp); break; } @@ -453,7 +505,50 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * } case MGT_SIGNALSDESC: { + MgMgcoSignalsDesc* sig = &desc->dl.descs[descId]->u.sig; + MgMgcoSignalsParm* param = NULL; + int i = 0x00; switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Signal descriptor\n"); + + if((NOTPRSNT != sig->pres.pres) && (NOTPRSNT != sig->num.pres) && (0 != sig->num.val)){ + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Total number of Signal descriptors[%d]\n", sig->num.val); + + for(i=0; i< sig->num.val; i++){ + param = sig->parms[i]; + + if(NOTPRSNT == param->type.pres) continue; + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Signal Descriptor[%d] type[%s]\n", + i, ((MGT_SIGSPAR_LST == param->type.val)?"MGT_SIGSPAR_LST":"MGT_SIGSPAR_REQ")); + + switch(param->type.val) + { + case MGT_SIGSPAR_LST: + { + MgMgcoSignalsLst* lst = ¶m->u.lst; + int sigId = 0x00; + + if((NOTPRSNT == lst->pl.num.pres) || (0 == lst->pl.num.val)) break; + + for(sigId = 0; sigId < lst->pl.num.val; sigId++){ + mg_prc_sig_desc(lst->pl.reqs[sigId], mg_profile, term); + } + + break; + } + case MGT_SIGSPAR_REQ: + { + MgMgcoSignalsReq* req = ¶m->u.req; + mg_prc_sig_desc(req, mg_profile, term); + break; + } + default: + break; + } + } + } + break; } case MGT_MODEMDESC: diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 1f883a6740..cb57668e04 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -2017,4 +2017,4 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ } return SWITCH_STATUS_SUCCESS; } - +/*****************************************************************************************************************************/ From b4b7be7a8363355e4fbfc0aa75dedc0e9de54e73 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 1 Aug 2012 12:14:52 -0400 Subject: [PATCH 385/493] fix leak --- src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index cb57668e04..8063c68289 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -802,6 +802,7 @@ const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) char *codec_prefs[16] = { 0 }; char *szcodec_prefs; int codec_count; + const char *name = NULL; szcodec_prefs = strdup(mg_profile->codec_prefs); codec_count = switch_split(szcodec_prefs, ',', codec_prefs); @@ -811,11 +812,12 @@ const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) /* see if received codec is present in our codec supported list */ for (i = 0; codecs[i] && i < codec_count; i++) { if(iana_code == codecs[i]->ianacode){ - return codecs[i]->iananame; + name = codecs[i]->iananame; + break; } } - return NULL; + return name; } void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmSdpAttrSet *attrSet, CmMemListCp *memCp) From d96687a35224213082fcd05e425794b804c44017 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 1 Aug 2012 13:18:37 -0400 Subject: [PATCH 386/493] Fix for TDM termination alarms --- libs/freetdm/mod_freetdm/tdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 22ffb5463e..7b04d9f67f 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -104,9 +104,9 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(channel)); if (alarmflag) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear"); - } else { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap"); + } else { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear"); } if (alarmflag & FTDM_ALARM_RED) { From 61f0237670474be05c5b8d97fbe874b09cf77721 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Aug 2012 13:21:47 -0400 Subject: [PATCH 387/493] print modification --- libs/freetdm/mod_freetdm/tdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 7b04d9f67f..af39c655f0 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -129,7 +129,7 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Reporting [%s] alarms for %s:%d\n", - (alarmflag?"ftdm-alarm-clear":"ftdm-alarm-trap"), ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); + (alarmflag?"ftdm-alarm-trap":"ftdm-alarm-clear"), ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); switch_event_fire(&event); return; From e718b3a8faf1ca95d7fec73c0f12a940db442bf8 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 3 Aug 2012 05:27:21 -0400 Subject: [PATCH 388/493] fixing issue - shouldnt check rtp termination service state --- src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 8063c68289..2431e01fa3 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -85,7 +85,8 @@ switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, { mg_termination_t* term = NULL; term = megaco_find_termination(mg_profile, term_str); - if(term && switch_test_flag(term, MG_IN_SERVICE)){ + if(term && (MG_TERM_TDM == term->type) && + switch_test_flag(term, MG_IN_SERVICE)){ return SWITCH_STATUS_SUCCESS; } else { return SWITCH_STATUS_FALSE; From 34000bf18837707b2cdc4347f42cd585a636682a Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 3 Aug 2012 12:07:02 -0400 Subject: [PATCH 389/493] adding "interface-identifier" field to configuration --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c | 2 +- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h | 1 + .../ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c index 5b173bfc8b..810c5a2902 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c @@ -1039,7 +1039,7 @@ static int ftmod_m2ua_dlsap_config(int id) cfg.t.cfg.s.dlSapCfg.lnkNmb = id; /* SapId */ cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT; - cfg.t.cfg.s.dlSapCfg.intfId.id.intId = id; + cfg.t.cfg.s.dlSapCfg.intfId.id.intId = m2ua->iid; cfg.t.cfg.s.dlSapCfg.swtch = LMW_SAP_ITU; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h index c7ce2e74eb..8bb564d284 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.h @@ -59,6 +59,7 @@ typedef struct sng_m2ua_cfg{ char name[MAX_NAME_LEN]; uint32_t flags; uint32_t id; /* ID */ + uint32_t iid; /* ID */ uint8_t nodeType; /*Node Type SG/ASP */ uint8_t end_point_opened; /* flag to check is end-point already opened */ uint16_t clusterId; /* idx to m2ua_cluster profile */ diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c index b9ae986402..bb011c364e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c @@ -242,6 +242,12 @@ static int ftmod_ss7_parse_m2ua_interface(ftdm_conf_node_t *m2ua_interface) SS7_DEBUG("Found an m2ua cluster_id = %d\n", sng_m2ua.clusterId); /**********************************************************************/ + } else if (!strcasecmp(parm->var, "interface-identifier")) { + /**********************************************************************/ + sng_m2ua.iid=atoi(parm->val); + + SS7_DEBUG("Found an m2ua interface-identifier = %d\n", sng_m2ua.iid); + /**********************************************************************/ } else { /**********************************************************************/ SS7_ERROR("Found an invalid parameter %s!\n", parm->var); @@ -271,6 +277,7 @@ static int ftmod_ss7_fill_in_m2ua_interface(sng_m2ua_cfg_t *m2ua_iface) g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].id = m2ua_iface->id; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].nodeType = m2ua_iface->nodeType; g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].clusterId = m2ua_iface->clusterId; + g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[i].iid = m2ua_iface->iid; sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_PRESENT); return 0; From f92b66eae081835252d729d33542ba6692fc58b4 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 3 Aug 2012 12:48:54 -0400 Subject: [PATCH 390/493] added mod_distributor --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 1d27aaad1b..1284bb8bc1 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -5,6 +5,7 @@ applications/mod_dptools applications/mod_commands applications/mod_hash applications/mod_spandsp +applications/mod_distributor dialplans/mod_dialplan_xml endpoints/mod_sofia ../../libs/freetdm/mod_freetdm From 2c6245b0f7b8b8c781e16c52f1805b4498d16e93 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Sat, 4 Aug 2012 10:37:25 -0400 Subject: [PATCH 391/493] debug prints modification --- .../mod_media_gateway/media_gateway_cmd_handler.c | 10 ++++------ .../endpoints/mod_media_gateway/mod_media_gateway.c | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index c6ec61e430..42a77aba67 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -688,7 +688,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } else { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Termination[%s] already in context..rejecting ADD \n", term->name); mg_util_set_err_string(&errTxt, " Term already is in call "); - err_code = MGT_MGCP_RSP_CODE_PROT_ERROR; + err_code = MGT_MGCO_RSP_CODE_DUP_TERM_CTXT; goto error; } @@ -1545,11 +1545,11 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%d], peerId[%d], context[type = %s, value = %d]\n", transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%lu], peerId[%lu], context[type = %s, value = %lu]\n", transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); @@ -1646,8 +1646,6 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; wild = auditReq->u.mgCmdReq[0]->wild.pres; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"%s :: wild card request = %s \n",__FUNCTION__,(1==wild)?"TRUE":"FALSE"); - if(NOTPRSNT == audit->pres.pres){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); return SWITCH_STATUS_FALSE; @@ -1656,7 +1654,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand audit_desc = &audit->audit; if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); + //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); return mg_send_heartbeat_audit_rsp(mg_profile->idx, auditReq); } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index d650ef7637..1cecbda181 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -523,7 +523,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) termId = termLst->terms[0]; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); /* Not sure - IF Stack fills term type properly..but adding code just to be sure ...*/ if ((PRSNT_NODEF == termId->type.pres) && From 7b7256b55f76c16184a60d8179d6b29254d78926 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 6 Aug 2012 10:20:02 -0400 Subject: [PATCH 392/493] fixing issues --- libs/freetdm/mod_freetdm/tdm.c | 2 +- libs/freetdm/src/ftdm_io.c | 135 ++++++++++++++++++ libs/freetdm/src/include/freetdm.h | 2 + .../media_gateway_cmd_handler.c | 6 +- .../mod_media_gateway/media_gateway_xml.c | 4 +- 5 files changed, 144 insertions(+), 5 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index af39c655f0..7f44b640a9 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -327,7 +327,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); - if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { + if (ftdm_raw_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); goto fail; } diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 4e110df659..6bc5471e5a 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1892,6 +1892,130 @@ done: return status; } +static ftdm_status_t _ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) +{ + ftdm_channel_t *check = NULL; + ftdm_span_t *span = NULL; + ftdm_channel_t *best_rated = NULL; + ftdm_status_t status = FTDM_FAIL; + int best_rate = 0; + + *ftdmchan = NULL; + + ftdm_mutex_lock(globals.mutex); + + ftdm_span_find(span_id, &span); + + if (!span) { + ftdm_log(FTDM_LOG_CRIT, "Could not find span!\n"); + goto done; + } + + if (!ftdm_test_flag(span, FTDM_SPAN_CONFIGURED)) { + ftdm_log(FTDM_LOG_CRIT, "Span %d is not configured\n", span_id); + goto done; + } + + if (span->channel_request) { + ftdm_log(FTDM_LOG_ERROR, "Individual channel selection not implemented on this span.\n"); + goto done; + } + + if (chan_id < 1 || chan_id > span->chan_count) { + ftdm_log(FTDM_LOG_ERROR, "Invalid channel %d to open in span %d\n", chan_id, span_id); + goto done; + } + + if (!(check = span->channels[chan_id])) { + ftdm_log(FTDM_LOG_CRIT, "Wow, no channel %d in span %d\n", chan_id, span_id); + goto done; + } + + ftdm_channel_lock(check); + + if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) { + /* let them know is already open, but return the channel anyway */ + status = FTDM_EBUSY; + *ftdmchan = check; + goto unlockchan; + } + + /* The following if's and gotos replace a big if (this || this || this || this) else { nothing; } */ + + /* if it is not a voice channel, nothing else to check to open it */ + if (!FTDM_IS_VOICE_CHANNEL(check)) { + goto openchan; + } + + /* if it's an FXS device with a call active and has callwaiting enabled, we allow to open it twice */ + if (check->type == FTDM_CHAN_TYPE_FXS + && check->token_count == 1 + && ftdm_channel_test_feature(check, FTDM_CHANNEL_FEATURE_CALLWAITING)) { + goto openchan; + } + + /* chan_is_avail API without signaling check */ + if (check->span->signal_type == FTDM_SIGTYPE_NONE) { + if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || + ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || + ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || + ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || + check->state != FTDM_CHANNEL_STATE_DOWN) { + + ftdm_log(FTDM_LOG_ERROR, "channel %d not available to open in span %d\n", chan_id, span_id); + goto done; + } + } else if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || + ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || + ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || + ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || + check->state != FTDM_CHANNEL_STATE_DOWN) { + ftdm_log(FTDM_LOG_ERROR, "channel %d not available to open in span %d\n", chan_id, span_id); + goto done; + }else { + /* channel is ready to open */ + ftdm_log(FTDM_LOG_INFO, "channel %d available to open in span %d\n", chan_id, span_id); + goto openchan; + } + + + /* not available, but still might be available ... */ + calculate_best_rate(check, &best_rated, &best_rate); + if (best_rated) { + goto openchan; + } + + /* channel is unavailable, do not open the channel */ + goto unlockchan; + +openchan: + if (!ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) { + status = check->fio->open(check); + if (status == FTDM_SUCCESS) { + ftdm_set_flag(check, FTDM_CHANNEL_OPEN); + } + } else { + status = FTDM_SUCCESS; + } + ftdm_set_flag(check, FTDM_CHANNEL_INUSE); + ftdm_set_flag(check, FTDM_CHANNEL_OUTBOUND); + *ftdmchan = check; + + /* we've got the channel, do not unlock it */ + goto done; + +unlockchan: + ftdm_channel_unlock(check); + +done: + ftdm_mutex_unlock(globals.mutex); + if (status != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "Failed to open channel %d:%d\n", span_id, chan_id); + } + + return status; +} + static ftdm_status_t _ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) { ftdm_channel_t *check = NULL; @@ -2007,6 +2131,17 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, return status; } +FT_DECLARE(ftdm_status_t) ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) +{ + ftdm_status_t status; + status = _ftdm_raw_channel_open(span_id, chan_id, ftdmchan); + if (status == FTDM_SUCCESS) { + ftdm_channel_t *fchan = *ftdmchan; + ftdm_channel_unlock(fchan); + } + return status; +} + FT_DECLARE(uint32_t) ftdm_channel_get_id(const ftdm_channel_t *ftdmchan) { return ftdmchan->chan_id; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index e041e1f0e7..b875388ad8 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -1374,6 +1374,8 @@ FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group); */ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); +FT_DECLARE(ftdm_status_t) ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); + /*! * \brief Hunts and opens a channel specifying the span id only * diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 42a77aba67..5d087298ea 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1374,8 +1374,10 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma megaco_context_sub_termination(mg_ctxt, term); } - /* release context*/ - megaco_release_context(mg_ctxt); + if ((NULL == mg_ctxt->terminations[0]) && (NULL == mg_ctxt->terminations[1])) { + /* release context*/ + megaco_release_context(mg_ctxt); + } } /************************************************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 98b46a9302..44c716152a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -102,7 +102,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) if(i && chanmap[0] && chanmap[1]) { startchan = atoi(chanmap[0]); endchan = atoi(chanmap[1]); - for (j = startchan; j < endchan; j++) { + for (j = startchan; j <= endchan; j++) { mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); } } @@ -122,7 +122,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) startchan = atoi(chanmap[i]); endchan = atoi(p); - for (j = startchan; j < endchan; j++) { + for (j = startchan; j <= endchan; j++) { mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); } } From 57ca2bbe8d890711066aabeb3207dec7d02e5c15 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 6 Aug 2012 10:44:34 -0400 Subject: [PATCH 393/493] fixing term state issue --- src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 2431e01fa3..297fe72c69 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -85,7 +85,10 @@ switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, { mg_termination_t* term = NULL; term = megaco_find_termination(mg_profile, term_str); - if(term && (MG_TERM_TDM == term->type) && + + if(term && MG_TERM_RTP == term->type) { + return SWITCH_STATUS_SUCCESS; + }else if(term && (MG_TERM_TDM == term->type) && switch_test_flag(term, MG_IN_SERVICE)){ return SWITCH_STATUS_SUCCESS; } else { From 80b9a587db5464243df11baeee45cc8ee6d5e773 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 6 Aug 2012 12:19:34 -0400 Subject: [PATCH 394/493] adding code to start mg profile during load itself. --- .../mod_media_gateway/media_gateway.c | 2 +- .../media_gateway_cmd_handler.c | 17 ++ .../mod_media_gateway/media_gateway_utils.c | 197 +++++++++--------- .../mod_media_gateway/mod_media_gateway.c | 109 +++++++--- .../mod_media_gateway/mod_media_gateway.h | 1 + 5 files changed, 200 insertions(+), 126 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 10e4b1bd5a..20e72d1c18 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -63,7 +63,7 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) switch_hash_this(hi, &var, NULL, &val); profile = (megaco_profile_t *) val; if (profile->idx == suId) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got profile[%s] associated with suId[%d]\n",profile->name, suId); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Got profile[%s] associated with suId[%d]\n",profile->name, suId); found = 0x01; break; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5d087298ea..61896ce9b9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1179,6 +1179,23 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand goto error; } + if(MG_TERM_RTP == term->type){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" + " local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " + " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", + ((NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:NULL), + term->u.rtp.local_port, + ((NULL != term->u.rtp.remote_addr)?term->u.rtp.remote_addr:NULL), + term->u.rtp.remote_port, + term->u.rtp.ptime, + term->u.rtp.pt, + term->u.rtp.rfc2833_pt, + term->u.rtp.rate, + ((NULL != term->u.rtp.codec)?term->u.rtp.codec:NULL), + term->u.rtp.term_id); + } + + /* SDP updated to termination */ megaco_activate_termination(term); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 297fe72c69..e622038ee6 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -129,7 +129,7 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); termId->name.lcl.val[termId->name.lcl.len] = '\0'; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); } @@ -242,7 +242,7 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); break; } break; @@ -295,12 +295,12 @@ MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd) break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: failed, Unsupported Command[%s]\n", __PRETTY_FUNCTION__, PRNT_MG_CMD(cmd_type)); } /* switch command type for reply */ break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: failed, Unsupported api_type[%s]!\n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(api_type)); break; } /* switch -api_type */ @@ -327,7 +327,7 @@ void mg_util_set_txn_string(MgStr *errTxt, U32 *txnId) errTxt->val[errTxt->len] = '\"'; errTxt->len += 1; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s:" "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } @@ -376,7 +376,7 @@ void mg_util_set_ctxt_string ( MgStr *errTxt, MgMgcoContextId *ctxtId) errTxt->val[errTxt->len] = '\"'; errTxt->len += 1; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s:" "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } @@ -422,7 +422,7 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) break; default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Not expected command Type[%d]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: Not expected command Type[%d]\n", __PRETTY_FUNCTION__,cmd->u.mgCmdInd[0]->cmd.type.val); break; @@ -441,7 +441,7 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) if(NOTPRSNT == a->type.pres) continue; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Attribute Type[%d]\n",a->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Attribute Type[%d]\n",a->type.val); switch(a->type.val) { @@ -465,30 +465,31 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) case CM_SDP_ATTR_PTIME: { #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %d \n", (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t PTIME = %ld \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %ld \n", (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); #endif if(MG_TERM_RTP == term->type){ term->u.rtp.ptime = a->u.ptime.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating ptime to [%d]\n", term->u.rtp.ptime); } break; } case CM_SDP_ATTR_RECVONLY: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_RECVONLY: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RECVONLY: \n"); break; } case CM_SDP_ATTR_SENDRECV: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_SENDRECV: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDRECV: \n"); break; } case CM_SDP_ATTR_SENDONLY: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_SENDONLY: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDONLY: \n"); break; } case CM_SDP_ATTR_ORIENT: @@ -497,7 +498,7 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) } case CM_SDP_ATTR_TYPE: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_TYPE: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_TYPE: \n"); break; } case CM_SDP_ATTR_CHARSET: @@ -525,50 +526,50 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) case CM_SDP_ATTR_FMTP: { CmSdpAttrFmtp* f = &a->u.fmtp; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_FMTP: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_FMTP: \n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Format Type = %d \n",(NOTPRSNT == f->type.pres)?f->type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Format Type = %d \n",(NOTPRSNT == f->type.pres)?f->type.val:-1); break; } case CM_SDP_ATTR_RTPMAP: { CmSdpAttrRtpMap* r = &a->u.rtpmap; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_RTPMAP: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RTPMAP: \n"); if(NOTPRSNT != r->pres.pres){ /* payload type */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Payload Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Payload Type = %d \n", (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); /* payload value */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Payload Value = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Payload Value = %d \n", (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); /* encoding name */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Name value = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Name value = %d \n", (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Name name = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Name name = %s \n", (NOTPRSNT != r->enc.name.pres)?(char*)r->enc.name.val:"Not Present"); #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Clock Rate = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Clock Rate = %d \n", (NOTPRSNT != r->clk.pres)?r->clk.val:-1); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Clock Rate = %ld \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Clock Rate = %ld \n", (NOTPRSNT != r->clk.pres)?r->clk.val:-1); #endif - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Encoding Parameters = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Parameters = %s \n", (NOTPRSNT != r->parms.pres)?(char*)r->parms.val:"Not Present"); } break; } case CM_SDP_ATTR_INACTIVE: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_ATTR_INACTIVE: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_INACTIVE: \n"); break; } case CM_SDP_ATTR_CONTROL: @@ -740,12 +741,12 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) break; } default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Not supported Type[%d]\n",a->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not supported Type[%d]\n",a->type.val); break; } } }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "a-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "a-line not present \n"); } @@ -756,12 +757,12 @@ void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types char ipadd[32]; memset(ipadd, 0, sizeof(ipadd)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP connection line ****** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "********** SDP connection line ****** \n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Net Type = %d \n", (NOTPRSNT != s->netType.type.pres)?s->netType.type.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Address Type = %d \n", (NOTPRSNT != s->addrType.pres)?s->addrType.val:-1); if (s->addrType.pres && s->addrType.val == CM_SDP_ADDR_TYPE_IPV4 && @@ -769,7 +770,7 @@ void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types s->u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { if (s->u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Address: %d.%d.%d.%d\n", s->u.ip4.u.uniIp.b[0].val, s->u.ip4.u.uniIp.b[1].val, s->u.ip4.u.uniIp.b[2].val, @@ -784,19 +785,19 @@ void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types /* update remote ip */ if(MG_TERM_RTP == term->type){ term->u.rtp.remote_addr = switch_core_strdup(term->pool,ipadd); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Update remote ip to [%s]\n", term->u.rtp.remote_addr); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Update remote ip to [%s]\n", term->u.rtp.remote_addr); } } } } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "**************** \n"); } void mgco_print_CmSdpU8OrNil(CmSdpU8OrNil* p) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Type = %d \n", (NOTPRSNT != p->type.pres)?p->type.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"CmSdpU8OrNil: Value = %d \n", (NOTPRSNT != p->val.pres)?p->val.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"CmSdpU8OrNil: Type = %d \n", (NOTPRSNT != p->type.pres)?p->type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"CmSdpU8OrNil: Value = %d \n", (NOTPRSNT != p->val.pres)?p->val.val:-1); } const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) @@ -827,32 +828,32 @@ const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmSdpAttrSet *attrSet, CmMemListCp *memCp) { int i=0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "***** Media Parameter *********** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "***** Media Parameter *********** \n"); if (s->numProtFmts.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media Formats = %d \n", s->numProtFmts.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Media Formats = %d \n", s->numProtFmts.val); for (i = 0; i < s->numProtFmts.val; i++) { CmSdpMedProtoFmts *a = s->pflst[i]; /*Prot*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type = %d \n", (NOTPRSNT != a->prot.type.pres)?a->prot.type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Proto Type = %d \n", (NOTPRSNT != a->prot.type.pres)?a->prot.type.val:-1); switch(a->prot.type.val) { case CM_SDP_MEDIA_PROTO_UNKNOWN: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type Unknown , name = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Proto Type Unknown , name = %s \n", (NOTPRSNT != a->prot.u.name.pres)?(char*)a->prot.u.name.val:"Not Present "); break; } case CM_SDP_MEDIA_PROTO_RTP: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type RTP , subtype = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Proto Type RTP , subtype = %d \n", (NOTPRSNT != a->prot.u.subtype.type.pres)?a->prot.u.subtype.type.val: -1); break; } } /*repeated from "prot" field */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Proto Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Proto Type = %d \n", (NOTPRSNT != a->protType.pres)?a->protType.val: -1); switch(a->protType.val) @@ -861,17 +862,17 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd { CmSdpMedFmtRtpList* r = &a->u.rtp; int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " CM_SDP_MEDIA_PROTO_RTP: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_MEDIA_PROTO_RTP: \n"); if(NOTPRSNT != r->num.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Number of Formats[%d] \n", r->num.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Number of Formats[%d] \n", r->num.val); for(i=0;inum.val;i++){ mgco_print_CmSdpU8OrNil(r->fmts[i]); if(MG_RTP_AVP_PROFILE_A_LAW == r->fmts[i]->val.val){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " MG_RTP_AVP_PROFILE_A_LAW: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " MG_RTP_AVP_PROFILE_A_LAW: \n"); }else if(MG_RTP_AVP_PROFILE_U_LAW == r->fmts[i]->val.val){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " MG_RTP_AVP_PROFILE_U_LAW: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " MG_RTP_AVP_PROFILE_U_LAW: \n"); } } } @@ -884,11 +885,13 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd if((NOTPRSNT != r->num.pres) && (0 != r->num.val) && (NULL != r->fmts[0])){ const char* name = mg_get_codec_name(mg_profile, r->fmts[0]->val.val); if(name){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " Updating codec to[%d], name[%s] \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Updating codec to[%d], name[%s] \n", r->fmts[0]->val.val, name); if(MG_TERM_RTP == term->type){ term->u.rtp.codec = name; term->u.rtp.pt = r->fmts[0]->val.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating pt to [%d]\n", + term->u.rtp.pt); } }else{ /* ERROR */ @@ -902,7 +905,7 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd case CM_SDP_UDPTL_FMT_T38: { /*CmSdpMedFmtUdptlList* t = &a->u.t38;*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " CM_SDP_UDPTL_FMT_T38: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_UDPTL_FMT_T38: \n"); break; } default: @@ -910,15 +913,20 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd } } } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "**************** \n"); } void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmMemListCp *memCp) { int i; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Parsing %s SDP for Term[%s] \n", + (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE", + (MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); if (sdp->numComp.pres == NOTPRSNT) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " No %s SDP present \n", (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " No %s SDP present \n", (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE"); return; } @@ -933,29 +941,29 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /************************************************************************************************************************/ /* Version */ if(NOTPRSNT != s->ver.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, " SDP Version = %d \n", s->ver.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " SDP Version = %d \n", s->ver.val); } /************************************************************************************************************************/ /* Orig */ if(NOTPRSNT != s->orig.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); if(NOTPRSNT != s->orig.orig.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t User Name = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t User Name = %s \n", (NOTPRSNT != s->orig.orig.usrName.pres)?(char*)s->orig.orig.usrName.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Id = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Id = %s \n", (NOTPRSNT != s->orig.orig.sessId.pres)?(char*)s->orig.orig.sessId.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Version = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Version = %s \n", (NOTPRSNT != s->orig.orig.sessVer.pres)?(char*)s->orig.orig.sessVer.val:"Not Present"); /* sdpAddr */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Net Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Net Type = %d \n", (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)?s->orig.orig.sdpAddr.netType.type.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Address Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Address Type = %d \n", (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres)?s->orig.orig.sdpAddr.addrType.val:-1); /* print IPV4 address */ @@ -964,7 +972,7 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { if (s->orig.orig.sdpAddr.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Address: %d.%d.%d.%d\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Address: %d.%d.%d.%d\n", s->orig.orig.sdpAddr.u.ip4.u.ip.b[0].val, s->orig.orig.sdpAddr.u.ip4.u.ip.b[1].val, s->orig.orig.sdpAddr.u.ip4.u.ip.b[2].val, @@ -972,38 +980,38 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd } }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t O-line not present \n"); } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "********** ****** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "********** ****** \n"); } } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t O-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t O-line not present \n"); } /************************************************************************************************************************/ /* Session Name (s = line) */ if(NOTPRSNT != s->sessName.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Name = %s \n", s->sessName.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Name = %s \n", s->sessName.val); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t s-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t s-line not present \n"); } /************************************************************************************************************************/ /* Session Info(i= line) */ if(NOTPRSNT != s->info.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Info = %s \n", s->info.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Info = %s \n", s->info.val); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t i-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t i-line not present \n"); } /************************************************************************************************************************/ /* Session Uri */ if(NOTPRSNT != s->uri.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Session Uri = %s \n", s->uri.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Uri = %s \n", s->uri.val); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t uri not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t uri not present \n"); } /************************************************************************************************************************/ @@ -1027,54 +1035,54 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /************************************************************************************************************************/ /* SDP Time (t= line)*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "*** t-line **************** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "*** t-line **************** \n"); if(NOTPRSNT != s->sdpTime.pres.pres) { if(NOTPRSNT != s->sdpTime.sdpOpTimeSet.numComp.pres) { int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); for (i = 0;isdpTime.sdpOpTimeSet.numComp.val;i++){ CmSdpOpTime* t = s->sdpTime.sdpOpTimeSet.sdpOpTime[i]; if(NOTPRSNT == t->pres.pres) continue; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Start Time = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Start Time = %s \n", (NOTPRSNT != t->startTime.pres)?(char*)t->startTime.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Stop Time = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Stop Time = %s \n", (NOTPRSNT != t->stopTime.pres)?(char*)t->stopTime.val:"Not Present"); /*repeat time repFieldSet */ if(NOTPRSNT != t->repFieldSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time present with total component[%d]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP repeat time present with total component[%d]\n", t->repFieldSet.numComp.val); /*TODO - print repeat fields */ }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP repeat time not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP repeat time not present \n"); } } /* sdpOpTimeSet.numComp for loop -- end */ }else{/*sdpOpTimeSet.numComp.pres if -- end */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SDP op time not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP op time not present \n"); } /*TODO - zoneAdjSet */ }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "t-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "t-line not present \n"); } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "**************** \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "**************** \n"); /************************************************************************************************************************/ /* key type (k= line)*/ if(NOTPRSNT != s->keyType.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Type = %d \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Key Type = %d \n", (NOTPRSNT != s->keyType.keyType.pres)?s->keyType.keyType.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Key Data = %s \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Key Data = %s \n", (NOTPRSNT != s->keyType.key_data.pres)?(char*)s->keyType.key_data.val:"Not Present"); }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "k-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "k-line not present \n"); } /************************************************************************************************************************/ @@ -1086,7 +1094,7 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /* Media Descriptor Set */ if (s->mediaDescSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; @@ -1095,36 +1103,37 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /* Media Field */ { CmSdpMediaField* f = &desc->field; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media Type = %d \n",(NOTPRSNT == f->mediaType.pres)?f->mediaType.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Media = %s \n",(NOTPRSNT == f->media.pres)?(char*)f->media.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Media Type = %d \n",(NOTPRSNT != f->mediaType.pres)?f->mediaType.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Media = %s \n",(NOTPRSNT != f->media.pres)?(char*)f->media.val:"Not Present"); /* Channel ID */ if(NOTPRSNT != f->id.type.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t VcId Type = %d \n", f->id.type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t VcId Type = %d \n", f->id.type.val); switch(f->id.type.val){ case CM_SDP_VCID_PORT: { CmSdpPort *p = &f->id.u.port; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "CM_SDP_VCID_PORT:\n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t SDP port type = %d \n", (NOTPRSNT == p->type.pres)?p->type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CM_SDP_VCID_PORT:\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t SDP port type = %d \n", (NOTPRSNT != p->type.pres)?p->type.val:-1); switch(p->type.val) { case CM_SDP_PORT_INT: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_PORT_INT: SDP port = %d type = %d \n", p->u.portInt.port.val.val, p->u.portInt.port.type.val); if(MG_SDP_REMOTE == sdp_type) { /* update remote information */ if(MG_TERM_RTP == term->type){ - term->u.rtp.remote_port = p->u.portInt.port.val.val; - printf("Update remote port to [%d]\n", term->u.rtp.remote_port); + term->u.rtp.remote_port + = p->u.portInt.port.val.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating remote port to [%d]\n", term->u.rtp.remote_port); } } break; } case CM_SDP_PORT_VPCID: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t CM_SDP_PORT_VPCID: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_PORT_VPCID: \n"); break; } default: @@ -1140,17 +1149,17 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd } /*info */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Info = %s \n",(NOTPRSNT == desc->info.pres)?(char*)desc->info.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Info = %s \n",(NOTPRSNT != desc->info.pres)?(char*)desc->info.val:"Not Present"); /*connection set */ { int cnt=0x00; if(NOTPRSNT != desc->connSet.numComp.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\t Number of Connection component[%d]\n",desc->connSet.numComp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Number of Connection component[%d]\n",desc->connSet.numComp.val); for(cnt=0;cntconnSet.numComp.val;cnt++){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "************************\n"); mgco_handle_sdp_c_line(desc->connSet.connSet[cnt], term, sdp_type); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "************************\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "************************\n"); } } } @@ -1165,7 +1174,7 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { int port = desc->field.id.u.port.u.portInt.port.val.val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Port: %d\n", port); } } } @@ -1216,7 +1225,7 @@ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) errTxt->len += 1; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s:" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s:" "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 1cecbda181..698efc0798 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -92,20 +92,20 @@ static void mg_event_handler(switch_event_t *event) SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) { switch_api_interface_t *api_interface; - + memset(&megaco_globals, 0, sizeof(megaco_globals)); megaco_globals.pool = pool; - + *module_interface = switch_loadable_module_create_module_interface(pool, modname); - + switch_core_hash_init(&megaco_globals.profile_hash, pool); switch_thread_rwlock_create(&megaco_globals.profile_rwlock, pool); switch_core_hash_init(&megaco_globals.peer_profile_hash, pool); switch_thread_rwlock_create(&megaco_globals.peer_profile_rwlock, pool); - + SWITCH_ADD_API(api_interface, "mg", "media_gateway", megaco_function, MEGACO_FUNCTION_SYNTAX); - + switch_console_set_complete("add mg profile ::mg::list_profiles start"); switch_console_set_complete("add mg profile ::mg::list_profiles stop"); switch_console_set_complete("add mg profile ::mg::list_profiles status"); @@ -131,7 +131,15 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) switch_event_bind("mod_media_gateway", SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, mg_event_handler, NULL); /* initualize MEGACO stack */ - return sng_mgco_init(&sng_event); + if(SWITCH_STATUS_FALSE == sng_mgco_init(&sng_event)){ + return SWITCH_STATUS_FALSE; + } + + if(SWITCH_STATUS_FALSE == megaco_start_all_profiles()){ + return SWITCH_STATUS_FALSE; + } + + return SWITCH_STATUS_SUCCESS; } SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) @@ -172,6 +180,44 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) return SWITCH_STATUS_SUCCESS; } +/*****************************************************************************************************************************/ +switch_status_t megaco_start_all_profiles() +{ + switch_xml_t cfg, xml, mg_interfaces, mg_interface ; + switch_status_t status = SWITCH_STATUS_FALSE; + const char *file = "media_gateway.conf"; + + if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); + status = SWITCH_STATUS_FALSE; + goto done; + } + + if (!(mg_interfaces = switch_xml_child(cfg, "mg_profiles"))) { + status = SWITCH_STATUS_FALSE; + goto done; + } + + for (mg_interface = switch_xml_child(mg_interfaces, "mg_profile"); mg_interface; mg_interface = mg_interface->next) { + const char *name = switch_xml_attr_soft(mg_interface, "name"); + + if(SWITCH_STATUS_FALSE == megaco_profile_start(name)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error starting MEGACO profile %s\n", name); + status = SWITCH_STATUS_FALSE; + goto done; + } + } + + status = SWITCH_STATUS_SUCCESS; + +done: + if (xml) { + switch_xml_free(xml); + } + + return status; +} + /*****************************************************************************************************************************/ void handle_sng_log(uint8_t level, char *fmt, ...) { @@ -230,7 +276,7 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Local address: %d.%d.%d.%d\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Local address: %d.%d.%d.%d\n", s->conn.u.ip4.u.uniIp.b[0].val, s->conn.u.ip4.u.uniIp.b[1].val, s->conn.u.ip4.u.uniIp.b[2].val, @@ -244,7 +290,7 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet CmSdpAttr *a = s->attrSet.attr[mediaId]; local_sdp->info[i]->attrSet.attr[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpAttr)); *(local_sdp->info[i]->attrSet.attr[mediaId]) = *a; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Media %p\n", (void*)a); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Media %p\n", (void*)a); } } @@ -260,7 +306,7 @@ static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { int port = desc->field.id.u.port.u.portInt.port.val.val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Port: %d\n", port); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Port: %d\n", port); } } @@ -363,23 +409,23 @@ void handle_mgco_txn_ind(Pst *pst, SuId suId, MgMgcoMsg* msg) switch (mediaPar->type.val) { case MGT_MEDIAPAR_LOCAL: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "MGT_MEDIAPAR_LOCAL"); break; } case MGT_MEDIAPAR_REMOTE: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "MGT_MEDIAPAR_REMOTE"); break; } case MGT_MEDIAPAR_LOCCTL: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "MGT_MEDIAPAR_LOCCTL"); break; } case MGT_MEDIAPAR_TERMST: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "MGT_MEDIAPAR_TERMST"); break; } case MGT_MEDIAPAR_STRPAR: @@ -480,7 +526,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) inc_context = &cmd->contextId; memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); /*get mg profile associated with SuId */ if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ @@ -494,7 +541,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if (NOTPRSNT != cmd->transId.pres){ txn_id = cmd->transId.val; } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Transaction Id not present, rejecting\n", __PRETTY_FUNCTION__); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s: Transaction Id not present, rejecting\n", __PRETTY_FUNCTION__); /*-- Send Error to MG Stack --*/ MG_ZERO(&ctxtId, sizeof(MgMgcoContextId)); @@ -523,7 +570,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) termId = termLst->terms[0]; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); /* Not sure - IF Stack fills term type properly..but adding code just to be sure ...*/ if ((PRSNT_NODEF == termId->type.pres) && @@ -545,6 +591,9 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); + /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ /* check is only if command is not AUDIT */ if ((CH_CMD_TYPE_IND == cmd->cmdType.val) && @@ -592,7 +641,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) { case CH_CMD_TYPE_IND: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s: Received Command indication for command[%s]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: Received Command indication for command[%s]\n", __PRETTY_FUNCTION__,PRNT_MG_CMD(cmd->u.mgCmdInd[0]->cmd.type.val)); switch(cmd->u.mgCmdInd[0]->cmd.type.val) @@ -644,7 +693,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } case MGT_AUDITVAL: { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received Audit-Value Method \n"); handle_mg_audit_cmd(mg_profile, cmd); break; } @@ -664,10 +712,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case CH_CMD_TYPE_CFM: { #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command[%s] txn[%d] Response/Confirmation \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received Command[%s] txn[%d] Response/Confirmation \n", PRNT_MG_CMD(cmd->u.mgCmdCfm[0]->type.val), txn_id); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Received Command[%s] txn[%ld] Response/Confirmation \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received Command[%s] txn[%ld] Response/Confirmation \n", PRNT_MG_CMD(cmd->u.mgCmdCfm[0]->type.val), txn_id); #endif switch(cmd->u.mgCmdCfm[0]->type.val) @@ -706,12 +754,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if(NOTPRSNT != ntfy->pres.pres){ if((NOTPRSNT != ntfy->err.pres.pres) && (NOTPRSNT != ntfy->err.code.pres)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received NOTIFY command response with ErroCode[%d] for Termination[%s] \n", ntfy->err.code.val, &term_name[0]); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received Successful NOTIFY command response for Termination[%s] \n", &term_name[0]); } } @@ -753,12 +801,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if((NOTPRSNT != svc->res.type.pres) && (MGT_ERRDESC == svc->res.type.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received Service-Change command response with ErroCode[%d] for Termination[%s] \n", svc->res.u.err.code.val, &term_name[0]); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Received Successful Service-Change command response for Termination[%s] \n", &term_name[0]); } } @@ -772,14 +820,13 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } default: #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid command type[%d]\n",cmd->cmdType.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Invalid command type[%d]\n",cmd->cmdType.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid command type[%d]\n",cmd->cmdType.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Invalid command type[%d]\n",cmd->cmdType.val); #endif return; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "cmd->cmdStatus.val[%d]\n",cmd->cmdStatus.val); /* END OF TXN received - means last command in txn to process. * Send response to peer */ if(CH_CMD_TYPE_IND == cmd->cmdType.val){ @@ -808,7 +855,7 @@ error1: /*****************************************************************************************************************************/ void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* sta) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); /*TODO*/ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s\n", __PRETTY_FUNCTION__); /*TODO*/ } /*****************************************************************************************************************************/ @@ -816,7 +863,7 @@ void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* sta) void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) { /*TODO*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s\n", __PRETTY_FUNCTION__); /*dump information*/ mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout); @@ -826,14 +873,14 @@ void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) void handle_mgco_cntrl_cfm(Pst *pst, SuId suId, MgMgtCntrl* cntrl, Reason reason) { /*TODO*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s\n", __PRETTY_FUNCTION__); } /*****************************************************************************************************************************/ void handle_mgco_audit_cfm(Pst *pst, SuId suId, MgMgtAudit* audit, Reason reason) { /*TODO*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s\n", __PRETTY_FUNCTION__); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s\n", __PRETTY_FUNCTION__); } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 06cbffca11..36bcf5146f 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -229,6 +229,7 @@ mg_peer_profile_t *megaco_peer_profile_locate(const char *name); void megaco_profile_release(megaco_profile_t *profile); mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile, const char *span_name, const char *chan_number); +switch_status_t megaco_start_all_profiles(void); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); From f7ca7ebb71c28870d71e153c22b6d81933912858 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 7 Aug 2012 05:49:07 -0400 Subject: [PATCH 395/493] adding CLI command to dump termination status --- .../mod_media_gateway/media_gateway_cli.c | 244 ++++++++++++------ 1 file changed, 170 insertions(+), 74 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 080ca4b709..a714c6bd15 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -15,7 +15,9 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); +switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); +void megaco_cli_print_usage(switch_stream_handle_t *stream); /******************************************************************************/ @@ -68,6 +70,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } else { stream->write_function(stream, "-ERR No such profile\n"); } + /**********************************************************************************/ }else if(!strcmp(argv[2], "status")) { /**********************************************************************************/ @@ -98,95 +101,105 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /**********************************************************************************/ }else if(!strcmp(argv[2], "send")) { /**********************************************************************************/ - printf("count = %d \n",argc); + if (profile) { + switch(argc) + { + case 7: + { + /* mg profile send sc */ + if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){ + goto usage; + } - if (profile) { + if(!zstr(argv[7]) && !strcasecmp(argv[7],"wild")){ + wild = 0x01; + } - switch(argc) - { - case 7: - { - /* mg profile send sc */ - printf("ARGC = 7 \n"); - if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5]) || zstr(argv[6])){ - goto usage; - } + printf("Input to Send Service Change command : " + "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", + profile->name, argv[4], argv[5], argv[6]); - if(!zstr(argv[7]) && !strcasecmp(argv[7],"wild")){ - wild = 0x01; - } + megaco_profile_release(profile); + mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]),wild); - printf("Input to Send Service Change command : " - "Profile Name[%s], term-id[%s] method[%s] reason[%s] \n", - profile->name, argv[4], argv[5], argv[6]); + break; + } + case 6: + { + /* mg profile send notify */ + if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5])){ + goto usage; + } - megaco_profile_release(profile); - mg_send_service_change(profile->idx, argv[4], atoi(argv[5]), atoi(argv[6]),wild); + if(strcasecmp(argv[3],"notify")){ + stream->write_function(stream, "-ERR wrong input \n"); + goto usage; + } - break; - } - case 6: - { - /* mg profile send notify */ - if(zstr(argv[3]) || zstr(argv[4]) || zstr(argv[5])){ - goto usage; - } + printf("Sending DTMF digits[%s] NOTIFY for termination[%s]\n", argv[5], argv[4]); - if(strcasecmp(argv[3],"notify")){ - stream->write_function(stream, "-ERR wrong input \n"); - goto usage; - } + megaco_profile_release(profile); + mg_send_dtmf_notify(profile, argv[4], (char*)argv[5], (int)strlen(argv[5])); - printf("Sending DTMF digits[%s] NOTIFY for termination[%s]\n", argv[5], argv[4]); + break; + } + case 5: + { + if(zstr(argv[3])){ + goto usage; + } - megaco_profile_release(profile); - mg_send_dtmf_notify(profile, argv[4], (char*)argv[5], (int)strlen(argv[5])); + /*************************************************************************/ + if(!strcasecmp(argv[3],"ito")){ + /* mg profile send ito notify */ - break; - } - case 5: - { - if(zstr(argv[3])){ - goto usage; - } + printf("Sending In-Activity NOTIFY \n"); - /*************************************************************************/ - if(!strcasecmp(argv[3],"ito")){ - /* mg profile send ito notify */ + megaco_profile_release(profile); + mg_send_ito_notify(profile); + /*************************************************************************/ + }else if(!strcasecmp(argv[3],"cng")){ + /*************************************************************************/ + /* mg profile send cng */ - printf("Sending In-Activity NOTIFY \n"); + if(zstr(argv[4])){ + goto usage; + } + megaco_profile_release(profile); + mg_send_t38_cng_notify(profile, argv[4]); - megaco_profile_release(profile); - mg_send_ito_notify(profile); - /*************************************************************************/ - }else if(!strcasecmp(argv[3],"cng")){ - /*************************************************************************/ - /* mg profile send cng */ + /*************************************************************************/ + }else { + stream->write_function(stream, "-ERR wrong input \n"); + goto usage; + } + /*************************************************************************/ - if(zstr(argv[4])){ - goto usage; - } - megaco_profile_release(profile); - mg_send_t38_cng_notify(profile, argv[4]); - - /*************************************************************************/ - }else { - stream->write_function(stream, "-ERR wrong input \n"); - goto usage; - } - /*************************************************************************/ + break; + } + + default: + { + goto usage; + } + } + }else{ + stream->write_function(stream, "-ERR No such profile\n"); + } + +/**********************************************************************************/ + }else if (!strcmp(argv[2], "termstatus")) { +/**********************************************************************************/ + /* mg termstatus */ + + if (zstr(argv[3])) { + goto usage; + } + + megaco_profile_release(profile); + handle_term_status_cli_cmd(stream, profile, argv[3]); - break; - } - default: - { - goto usage; - } - } - }else{ - stream->write_function(stream, "-ERR No such profile\n"); - } /**********************************************************************************/ }else { @@ -212,6 +225,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } /**********************************************************************************/ + }else { /**********************************************************************************/ goto usage; @@ -223,13 +237,35 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre usage: if(profile) megaco_profile_release(profile); - stream->write_function(stream, "-ERR Usage: \n""\t"MEGACO_CLI_SYNTAX" \n \t"MEGACO_FUNCTION_SYNTAX"\n \t" MEGACO_LOGGING_CLI_SYNTAX "\n"); + megaco_cli_print_usage(stream); done: switch_safe_free(dup); return SWITCH_STATUS_SUCCESS; } +/******************************************************************************/ +void megaco_cli_print_usage(switch_stream_handle_t *stream) +{ + + stream->write_function(stream, "Usage: Profile Specific\n"); + stream->write_function(stream, "mg profile start \n"); + stream->write_function(stream, "mg profile stop \n"); + stream->write_function(stream, "mg profile termstatus \n"); + stream->write_function(stream, "mg profile status \n"); + stream->write_function(stream, "mg profile xmlstatus \n"); + stream->write_function(stream, "mg profile peerxmlstatus \n"); + stream->write_function(stream, "mg profile send sc \n"); + stream->write_function(stream, "mg profile send notify \n"); + stream->write_function(stream, "mg profile send ito notify \n"); + stream->write_function(stream, "mg profile send cng \n"); + + stream->write_function(stream, "Usage: Logging \n"); + stream->write_function(stream, "mg logging enable \n"); + stream->write_function(stream, "mg logging disable \n"); + +} + /******************************************************************************/ switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { @@ -642,3 +678,63 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) } /******************************************************************************/ +switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id) +{ + mg_termination_t* term = NULL; + + if(!mg_profile || !term_id){ + stream->write_function(stream, "-ERR NULL profile/term pointer \n"); + return SWITCH_STATUS_FALSE; + } + + term = megaco_find_termination(mg_profile, term_id); + + if(!term || !term->profile){ + stream->write_function(stream, "-ERR No such termination\n"); + return SWITCH_STATUS_FALSE; + } + + stream->write_function(stream, "Associated MG Profile Name [%s] \n",term->profile->name); + stream->write_function(stream, "MEGACO Termination Name[%s] \n",(NULL != term->name)?term->name:"NULL"); + stream->write_function(stream, "MEGACO Termination Type[%s] \n",(MG_TERM_RTP != term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); + stream->write_function(stream, "Termination UUID[%s] \n",(NULL != term->uuid)?term->uuid:"Term Not Activated"); + if(term->context){ + stream->write_function(stream, "Associated Context-Id[%d] \n",term->context->context_id); + if(term->context->terminations[0] && term->context->terminations[1]){ + if(term == term->context->terminations[0]){ + stream->write_function(stream, "Associated Termination Name[%s] \n", + (NULL != term->context->terminations[1]->name)?term->context->terminations[1]->name:"NULL"); + }else { + stream->write_function(stream, "Associated Termination Name[%s] \n", + (NULL != term->context->terminations[0]->name)?term->context->terminations[0]->name:"NULL"); + } + } + } + + + if(MG_TERM_RTP == term->type){ + stream->write_function(stream, "RTP Termination ID [%d] \n",term->u.rtp.term_id); + stream->write_function(stream, "RTP Termination Local Address[%s] \n", + (NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:"NULL"); + stream->write_function(stream, "RTP Termination Local Port[%d] \n",term->u.rtp.local_port); + stream->write_function(stream, "RTP Termination Remote Address[%s] \n", + (NULL != term->u.rtp.remote_addr)?term->u.rtp.remote_addr:"NULL"); + stream->write_function(stream, "RTP Termination Remote Port[%d] \n",term->u.rtp.remote_port); + stream->write_function(stream, "RTP Termination PTIME [%d] \n",term->u.rtp.ptime); + stream->write_function(stream, "RTP Termination PT [%d] \n",term->u.rtp.pt); + stream->write_function(stream, "RTP Termination rfc2833_pt [%d] \n",term->u.rtp.rfc2833_pt); + stream->write_function(stream, "RTP Termination Sampling Rate [%d] \n",term->u.rtp.rate); + stream->write_function(stream, "RTP Termination Codec [%s] \n", + (NULL != term->u.rtp.codec)?term->u.rtp.codec:"NULL"); + }else{ + stream->write_function(stream, "TDM Termination Service-State [%s] \n", + (switch_test_flag(term, MG_IN_SERVICE))?"IN-SERVICE":"OUT-OF-SERVICE"); + stream->write_function(stream, "TDM Termination channel [%d] \n",term->u.tdm.channel); + stream->write_function(stream, "TDM Termination span name [%s] \n", + (NULL != term->u.tdm.span_name)?term->u.tdm.span_name:"NULL"); + } + + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ + From 4200a427c861ee8dad0f7766f6c91c470270a681 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 7 Aug 2012 05:56:09 -0400 Subject: [PATCH 396/493] adding default values of sampling rate based on codec type --- .../mod_media_gateway/media_gateway_utils.c | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index e622038ee6..3801ade93b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -885,17 +885,59 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd if((NOTPRSNT != r->num.pres) && (0 != r->num.val) && (NULL != r->fmts[0])){ const char* name = mg_get_codec_name(mg_profile, r->fmts[0]->val.val); if(name){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Updating codec to[%d], name[%s] \n", - r->fmts[0]->val.val, name); if(MG_TERM_RTP == term->type){ term->u.rtp.codec = name; term->u.rtp.pt = r->fmts[0]->val.val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating pt to [%d]\n", - term->u.rtp.pt); + /* Set default value of sampling rate depends on codec */ + switch(megaco_codec_parse(name)) + { + case MEGACO_CODEC_PCMA: + { + term->u.rtp.rate = 8000; + break; + } + case MEGACO_CODEC_PCMU: + { + /* TODO - proper values */ + term->u.rtp.rate = 8000; + break; + } + case MEGACO_CODEC_G729: + { + /* TODO - proper values */ + term->u.rtp.rate = 8000; + break; + } + case MEGACO_CODEC_G723_1: + { + /* TODO - proper values */ + term->u.rtp.rate = 8000; + break; + } + case MEGACO_CODEC_ILBC: + { + /* TODO - proper values */ + term->u.rtp.rate = 8000; + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + " not updating sampling rate \n"); + break; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Updating codec to[%d], name[%s] \n", + r->fmts[0]->val.val, name); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Updating pt to [%d], rate to[%d]\n", + term->u.rtp.pt, term->u.rtp.rate); } }else{ /* ERROR */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " NO Codec Name found against iana[%d] \n", r->fmts[0]->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + " NO Codec Name found against iana[%d] \n", r->fmts[0]->val.val); } } From e7c2e18f7915c4483b1258187e6342921a7ac120 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Aug 2012 06:02:58 -0400 Subject: [PATCH 397/493] fixing cli issue --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index a714c6bd15..4fe1876277 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -696,7 +696,7 @@ switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megac stream->write_function(stream, "Associated MG Profile Name [%s] \n",term->profile->name); stream->write_function(stream, "MEGACO Termination Name[%s] \n",(NULL != term->name)?term->name:"NULL"); - stream->write_function(stream, "MEGACO Termination Type[%s] \n",(MG_TERM_RTP != term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); + stream->write_function(stream, "MEGACO Termination Type[%s] \n",(MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); stream->write_function(stream, "Termination UUID[%s] \n",(NULL != term->uuid)?term->uuid:"Term Not Activated"); if(term->context){ stream->write_function(stream, "Associated Context-Id[%d] \n",term->context->context_id); From feb3bd78acc978c5209b0663afae2a30526d25b9 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 7 Aug 2012 06:30:05 -0400 Subject: [PATCH 398/493] cli issue fix --- .../endpoints/mod_media_gateway/media_gateway_cli.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 4fe1876277..e131747f5b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -196,10 +196,12 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } - megaco_profile_release(profile); - handle_term_status_cli_cmd(stream, profile, argv[3]); - - + if(profile){ + megaco_profile_release(profile); + handle_term_status_cli_cmd(stream, profile, argv[3]); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } /**********************************************************************************/ }else { @@ -237,6 +239,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre usage: if(profile) megaco_profile_release(profile); + megaco_cli_print_usage(stream); done: From 3b0290b61635e71c67eb2a1440f1a9391e17e22a Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 7 Aug 2012 09:54:02 -0400 Subject: [PATCH 399/493] adding cli command to dump "activecalls" at present --- .../mod_media_gateway/media_gateway_cli.c | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index e131747f5b..a93bd0467c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -18,6 +18,7 @@ switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, me switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); void megaco_cli_print_usage(switch_stream_handle_t *stream); +switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); /******************************************************************************/ @@ -202,6 +203,22 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } else { stream->write_function(stream, "-ERR No such profile\n"); } +/**********************************************************************************/ + }else if (!strcmp(argv[2], "show")) { +/**********************************************************************************/ + /* mg show activecalls*/ + if(zstr(argv[3])) { + goto usage; + } + + if(profile){ + megaco_profile_release(profile); + if(!strcasecmp(argv[3], "activecalls")){ + handle_show_activecalls_cli_cmd(stream, profile); + } + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } /**********************************************************************************/ }else { @@ -262,6 +279,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile send notify \n"); stream->write_function(stream, "mg profile send ito notify \n"); stream->write_function(stream, "mg profile send cng \n"); + stream->write_function(stream, "mg profile show activecalls \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); @@ -740,4 +758,46 @@ switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megac return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ +switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile) +{ + void *val = NULL; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + const void *var; + int found = 0x00; + + if(!mg_profile || !mg_profile->terminations){ + stream->write_function(stream, "-ERR NULL profile/term pointer \n"); + return SWITCH_STATUS_FALSE; + } + + stream->write_function(stream, "\n ------- Active Calls Terminations ------- \n"); + for (hi = switch_hash_first(NULL, mg_profile->terminations); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + term = (mg_termination_t *) val; + if(!term) continue; + if(NULL == term->uuid) continue; + + found = 0x01; + stream->write_function(stream, "\n ********************************* \n"); + stream->write_function(stream, "MEGACO Termination Name[%s] \n",(NULL != term->name)?term->name:"NULL"); + stream->write_function(stream, "MEGACO Termination Type[%s] \n",(MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); + stream->write_function(stream, "Termination UUID[%s] \n",(NULL != term->uuid)?term->uuid:"Term Not Activated"); + if(MG_TERM_RTP == term->type){ + stream->write_function(stream, "RTP Termination ID [%d] \n",term->u.rtp.term_id); + }else{ + stream->write_function(stream, "TDM Termination channel [%d] \n",term->u.tdm.channel); + stream->write_function(stream, "TDM Termination span name [%s] \n", + (NULL != term->u.tdm.span_name)?term->u.tdm.span_name:"NULL"); + } + stream->write_function(stream, "\n ********************************* \n"); + } + + + if(!found) + stream->write_function(stream, "\n ------- NO Active Calls FOUND ------- \n"); + + + return SWITCH_STATUS_SUCCESS; +} From 6046698b290864abd89553ec36c2ecd8894f5496 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Aug 2012 09:57:51 -0400 Subject: [PATCH 400/493] fixing channel mapping issue and removing unwanted prints --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- .../mod_media_gateway/media_gateway_cmd_handler.c | 2 ++ .../mod_media_gateway/media_gateway_stack.h | 2 +- .../endpoints/mod_media_gateway/media_gateway_xml.c | 13 ++++++++----- .../endpoints/mod_media_gateway/mod_media_gateway.c | 8 ++++---- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 20e72d1c18..52081dbc12 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -63,7 +63,7 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) switch_hash_this(hi, &var, NULL, &val); profile = (megaco_profile_t *) val; if (profile->idx == suId) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Got profile[%s] associated with suId[%d]\n",profile->name, suId); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Got profile[%s] associated with suId[%d]\n",profile->name, suId); found = 0x01; break; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 61896ce9b9..b3661f75e8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1563,6 +1563,7 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont ctxt.cmdStatus.pres = PRSNT_NODEF; ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; +#if 0 #ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%d], peerId[%d], context[type = %s, value = %d]\n", @@ -1572,6 +1573,7 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont "mg_send_end_of_axn: Sending END_OF_AXN for transId[%lu], peerId[%lu], context[type = %s, value = %lu]\n", transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); +#endif #endif ret = sng_mgco_send_axn_req(suId, &ctxt); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 28ff0c2c03..1c7e8c614c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -193,7 +193,7 @@ switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgM switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req); switch_status_t handle_mg_audit_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *auditReq); switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, char* term_str, int len); -void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int j); +void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int j, int k); void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd); switch_status_t mgco_init_ins_service_change(SuId suId); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 44c716152a..4b242a6b9b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -103,14 +103,14 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) startchan = atoi(chanmap[0]); endchan = atoi(chanmap[1]); for (j = startchan; j <= endchan; j++) { - mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j); } } }else{ /* case (i) */ p = channel_map_dup; startchan = endchan = atoi(p); - mg_create_tdm_term(profile, tech, channel_prefix, prefix, startchan); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, startchan, startchan); } }else { @@ -123,7 +123,10 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) endchan = atoi(p); for (j = startchan; j <= endchan; j++) { - mg_create_tdm_term(profile, tech, channel_prefix, prefix, j); +if (0 == i) + mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j); +else + mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j-1); } } } @@ -197,7 +200,7 @@ done: } /****************************************************************************************************************************/ -void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int chan_num) +void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char *channel_prefix, const char *prefix, int chan_num, int tdm_chan_num) { mg_termination_t *term; switch_memory_pool_t *pool; @@ -211,7 +214,7 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->tech = switch_core_strdup(pool, tech); term->active_events = NULL; term->name = switch_core_sprintf(pool, "%s%d", prefix, chan_num); - term->u.tdm.channel = chan_num; + term->u.tdm.channel = tdm_chan_num; term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); switch_set_flag(term, MG_OUT_OF_SERVICE); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 698efc0798..771732d680 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -526,8 +526,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) inc_context = &cmd->contextId; memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val)); + /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "%s: Received Command Type[%s] \n", __PRETTY_FUNCTION__, PRNT_MG_CMD_TYPE(cmd->cmdType.val));*/ /*get mg profile associated with SuId */ if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ @@ -591,8 +591,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val); + /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Termination-Id received..value[%s] type[%d] \n", termId->name.lcl.val, termId->type.val);*/ /*If term type is other then check if that term is configured with us..for term type CHOOSE/ALL , no need to check */ /* check is only if command is not AUDIT */ From 16692837c168ac22eb8c52a099286ce05750adc4 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 8 Aug 2012 09:58:41 -0400 Subject: [PATCH 401/493] freetdm: Process OOB events even in M2UA mode --- .../ftmod_sangoma_ss7_main.c | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index 90202d3989..ab74a9830a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -338,14 +338,38 @@ static void handle_hw_alarm(ftdm_event_t *e) } } + +static void check_span_oob_events(ftdm_span_t *ftdmspan) +{ + ftdm_event_t *event = NULL; + /* Poll for events, e.g HW DTMF */ + switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) { + /**********************************************************************/ + case FTDM_SUCCESS: + while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS) { + if (event->e_type == FTDM_EVENT_OOB) { + handle_hw_alarm(event); + } + } + break; + /**********************************************************************/ + case FTDM_TIMEOUT: + /* No events pending */ + break; + /**********************************************************************/ + default: + SS7_ERROR("%s:Failed to poll span event\n", ftdmspan->name); + /**********************************************************************/ + } +} + /* MONITIOR THREADS ***********************************************************/ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) { ftdm_interrupt_t *ftdm_sangoma_ss7_int[2]; ftdm_span_t *ftdmspan = (ftdm_span_t *) obj; ftdm_channel_t *ftdmchan = NULL; - ftdm_event_t *event = NULL; - sngss7_event_data_t *sngss7_event = NULL; + sngss7_event_data_t *sngss7_event = NULL; sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data; int b_alarm_test = 1; @@ -398,8 +422,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) break; /**********************************************************************/ } - - + check_span_oob_events(ftdmspan); } goto ftdm_sangoma_ss7_stop; } @@ -514,25 +537,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /* check each channel on the span to see if it needs to be reconfigured */ check_for_reconfig_flag(ftdmspan); - /* Poll for events, e.g HW DTMF */ - switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) { - /**********************************************************************/ - case FTDM_SUCCESS: - while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS) { - if (event->e_type == FTDM_EVENT_OOB) { - handle_hw_alarm(event); - } - } - break; - /**********************************************************************/ - case FTDM_TIMEOUT: - /* No events pending */ - break; - /**********************************************************************/ - default: - SS7_ERROR("%s:Failed to poll span event\n", ftdmspan->name); - /**********************************************************************/ - } + check_span_oob_events(ftdmspan); } ftdm_sangoma_ss7_stop: From 99e04bf1d86b6b184a926e88f8be551623550369 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 8 Aug 2012 10:17:42 -0400 Subject: [PATCH 402/493] debug prints modification --- .../mod_media_gateway/media_gateway.c | 3 -- .../media_gateway_cmd_handler.c | 54 +++++++++++-------- .../mod_media_gateway/media_gateway_xml.c | 1 - .../mod_media_gateway/mod_media_gateway.h | 1 - 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 52081dbc12..a9bcd85fe2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -222,7 +222,6 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha term->pool = pool; term->type = termtype; term->active_events = NULL; - term->mg_ctxt = NULL; term->profile = profile; switch_set_flag(term, MGT_ALLOCATED); @@ -335,8 +334,6 @@ void megaco_termination_destroy(mg_termination_t *term) term->active_events = NULL; } - term->mg_ctxt = NULL; - switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index b3661f75e8..13f8107665 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -347,7 +347,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ fmt = &fmt_list->fmts[i]->val; if(fmt->pres == NOTPRSNT) continue; - printf("Format [%d]\n", fmt->val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Format [%d]\n", fmt->val); } } } @@ -381,30 +381,30 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * case MGT_LCLCTL_MODE: { /* Mode Property */ - printf("MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); break; } case MGT_LCLCTL_RESVAL: { /* Reserve Value */ - printf("MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); break; } case MGT_LCLCTL_RESGRP: { /* Reserve group */ - printf("MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); break; } case MGT_LCLCTL_PROPPARM: { /* Properties (of a termination) */ /* Matt - See how we can apply this to a termination */ - printf("MGT_LCLCTL_PROPPARM: \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); break; } default: - printf("Invalid local control descriptor type[%d]\n",lclParm->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid local control descriptor type[%d]\n",lclParm->type.val); break; } } @@ -429,23 +429,23 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * { /* Matt to see how to apply properties to a termination */ /* Properties of a termination */ - printf("MGT_TERMST_PROPLST:\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_TERMST_PROPLST:\n"); break; } case MGT_TERMST_EVTBUFCTL: { /* Event /buffer Control Properties */ - printf(" MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); break; } case MGT_TERMST_SVCST: { /* Service State Properties */ - printf(" MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); break; } default: - printf("Invalid termination state descriptor type[%d]\n",tsp->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid termination state descriptor type[%d]\n",tsp->type.val); break; } } @@ -630,6 +630,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_choose_context(mg_profile); if(NULL == mg_ctxt){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -646,6 +647,13 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i memcpy(new_ctxtId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); mg_ctxt = megaco_get_context(mg_profile, inc_cmd->contextId.val.val); if(NULL == mg_ctxt){ +#ifdef BIT_64 + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + " megaco_get_context failed for context-id[%d]\n", inc_cmd->contextId.val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + " megaco_get_context failed for context-id[%ld]\n", inc_cmd->contextId.val.val); +#endif mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -660,15 +668,12 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i term = megaco_choose_termination(mg_profile, mg_profile->rtp_termination_id_prefix); if(NULL == term){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," megaco_choose_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; } - if(!term->mg_ctxt){ - term->mg_ctxt = mg_ctxt; - } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); is_rtp = 0x01; @@ -678,26 +683,33 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); if(NULL == term){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + " megaco_find_termination failed for term-id[%s] \n",(char*)termId->name.lcl.val); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; } - if(!term->mg_ctxt){ - term->mg_ctxt = mg_ctxt; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Termination[%s] already in context..rejecting ADD \n", term->name); + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + } + + /********************************************************************/ + /* check if termination already is in call */ + + if(term->context){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Termination[%p : %s] " + "already in context[%p -%d]..rejecting ADD \n", + (void*)term, term->name, (void*)term->context,term->context->context_id); mg_util_set_err_string(&errTxt, " Term already is in call "); err_code = MGT_MGCO_RSP_CODE_DUP_TERM_CTXT; goto error; } - - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); - } /********************************************************************/ /* associate physical termination to context */ if(SWITCH_STATUS_FALSE == megaco_context_add_termination(mg_ctxt, term)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"megaco_context_add_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 4b242a6b9b..08044bc9f7 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -210,7 +210,6 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->pool = pool; term->type = MG_TERM_TDM; term->profile = profile; - term->mg_ctxt = NULL; term->tech = switch_core_strdup(pool, tech); term->active_events = NULL; term->name = switch_core_sprintf(pool, "%s%d", prefix, chan_num); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 36bcf5146f..46f850ff16 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -113,7 +113,6 @@ struct mg_termination_s { megaco_profile_t *profile; /*!< Parent MG profile */ MgMgcoReqEvtDesc *active_events; /* !< active megaco events */ mg_termination_t *next; /*!< List for physical terminations */ - mg_context_t* mg_ctxt; int *mg_error_code; /* MEGACO error code */ uint32_t flags; const char *tech; /* Endpoint controlling the TDM interface - only FreeTDM tested so far */ From e5d140d1e6934fc266d1ddc606ed2d099044e860 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 8 Aug 2012 13:34:42 -0400 Subject: [PATCH 403/493] adding code for reporting DTMF to MGC --- .../mod_media_gateway/media_gateway.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index a9bcd85fe2..ca973e10a9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -7,6 +7,7 @@ */ #include "mod_media_gateway.h" +#include "media_gateway_stack.h" megaco_profile_t *megaco_profile_locate(const char *name) { @@ -79,6 +80,24 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) return profile; } + +static switch_status_t mg_on_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf, switch_dtmf_direction_t direction) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + mg_termination_t *term = switch_channel_get_private(channel, "_mg_term_"); + char digit[2] = { dtmf->digit }; + if (!term) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find termination structure for session [%s]\n", + switch_core_session_get_uuid(session)); + return SWITCH_STATUS_SUCCESS; + } + + //switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); + //mg_send_dtmf_notify(term->profile, term->name, digit, 1); + switch_log_printf("NOT Sending notify to MGC for dtmf: %c\n", dtmf->digit); + return SWITCH_STATUS_SUCCESS; +} + /* * Creates a freeswitch channel for the specified termination. * The channel will be parked until future actions are taken @@ -136,6 +155,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) } if (zstr(term->uuid)) { + switch_channel_t *channel; if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); status = SWITCH_STATUS_FALSE; @@ -144,6 +164,9 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + channel = switch_core_session_get_channel(session); + switch_channel_set_private(channel, "_mg_term_", term); + switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); } switch_set_flag(term, MGT_ACTIVE); From d04606fb091fc97a9dc00b5a2a91b0e619be9a2e Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 8 Aug 2012 14:43:55 -0400 Subject: [PATCH 404/493] updating rfc2833 variable code --- .../mod_media_gateway/media_gateway.c | 4 +- .../mod_media_gateway/media_gateway_utils.c | 52 +++++++++++++------ 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index ca973e10a9..9df5e2a2e0 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -85,7 +85,7 @@ static switch_status_t mg_on_dtmf(switch_core_session_t *session, const switch_d { switch_channel_t *channel = switch_core_session_get_channel(session); mg_termination_t *term = switch_channel_get_private(channel, "_mg_term_"); - char digit[2] = { dtmf->digit }; + //char digit[2] = { dtmf->digit }; if (!term) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find termination structure for session [%s]\n", switch_core_session_get_uuid(session)); @@ -94,7 +94,7 @@ static switch_status_t mg_on_dtmf(switch_core_session_t *session, const switch_d //switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); //mg_send_dtmf_notify(term->profile, term->name, digit, 1); - switch_log_printf("NOT Sending notify to MGC for dtmf: %c\n", dtmf->digit); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MEGACO DTMF Signaling NOT Sending notify to MGC for dtmf:%c\n",dtmf->digit); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 3801ade93b..11d68f026c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -528,7 +528,7 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) CmSdpAttrFmtp* f = &a->u.fmtp; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_FMTP: \n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Format Type = %d \n",(NOTPRSNT == f->type.pres)?f->type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Format Type = %d \n",(NOTPRSNT != f->type.pres)?f->type.val:-1); break; } @@ -540,30 +540,47 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) if(NOTPRSNT != r->pres.pres){ /* payload type */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Payload Type = %d \n", - (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Payload Type = %d \n", + (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); /* payload value */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Payload Value = %d \n", - (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Payload Value = %d \n", + (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); /* encoding name */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Name value = %d \n", - (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Name value = %d \n", + (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Name name = %s \n", - (NOTPRSNT != r->enc.name.pres)?(char*)r->enc.name.val:"Not Present"); + if((NOTPRSNT != r->enc.val.pres ) && + (CM_SDP_ENC_TELEPHONE_EVENT == r->enc.val.val)){ + + term->u.rtp.rfc2833_pt=r->pay.val.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Updating rfc2833_pt to [%d] \n", term->u.rtp.rfc2833_pt); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Name name = %s \n", + (NOTPRSNT != r->enc.name.pres)? + (char*)r->enc.name.val:"Not Present"); #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Clock Rate = %d \n", - (NOTPRSNT != r->clk.pres)?r->clk.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Clock Rate = %d \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Clock Rate = %ld \n", - (NOTPRSNT != r->clk.pres)?r->clk.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Clock Rate = %ld \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); #endif - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Encoding Parameters = %s \n", - (NOTPRSNT != r->parms.pres)?(char*)r->parms.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Parameters = %s \n", + (NOTPRSNT != r->parms.pres)? + (char*)r->parms.val:"Not Present"); } break; } @@ -1832,8 +1849,11 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term /* see if received codec is present in our codec supported list */ for (id = 0; codecs[id] && id < codec_count; id++) { int pt = codecs[id]->ianacode; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Matching recv codec[%d] with supported codec[%d] \n", fmt->val.val, pt); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Matching recv codec[%d] with supported codec[%d] \n", fmt->val.val, pt); //const char *name = codecs[id]->iananame; + /* anything > 96 is dymanic we should skip codec match */ + if(fmt->val.val >= 96) {foundCodec = 0x01; break;} if(pt == fmt->val.val){ foundCodec = 0x01; break; From e0a7c69ca05a8df79e0cab2f8264c5c4497d9171 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 8 Aug 2012 15:21:42 -0400 Subject: [PATCH 405/493] fixing rfc2833 issue --- .../media_gateway_cmd_handler.c | 22 +++++++++------- src/mod/endpoints/mod_sofia/rtp.c | 26 ++++++++++++++++--- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 13f8107665..1eacf4fb23 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -705,6 +705,17 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i err_code = MGT_MGCO_RSP_CODE_DUP_TERM_CTXT; goto error; } + +/********************************************************************/ + + ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); + + /* IF there is any error , return */ + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + goto error; + } /********************************************************************/ /* associate physical termination to context */ @@ -715,16 +726,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } - /********************************************************************/ - - ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); - - /* IF there is any error , return */ - if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ - mg_util_set_err_string(&errTxt, " Unsupported Codec "); - err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; - goto error; - } + /* TODO - locally assigned SDP must be the part of termination...which we can use to fill responses*/ diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index bf3e36ca19..2afbb3fe02 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -74,6 +74,8 @@ typedef struct { switch_port_t local_port; switch_port_t remote_port; switch_payload_t agreed_pt; /*XXX*/ + switch_payload_t rfc2833_pt; + sofia_dtmf_t dtmf_type; enum { RTP_SENDONLY, @@ -146,7 +148,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi *codec = switch_event_get_header_nil(var_event, kCODEC), *szptime = switch_event_get_header_nil(var_event, kPTIME), //*mode = switch_event_get_header_nil(var_event, kMODE), - //*szrfc2833_pt = switch_event_get_header_nil(var_event, kRFC2833PT), + *szrfc2833_pt = switch_event_get_header_nil(var_event, kRFC2833PT), *szrate = switch_event_get_header_nil(var_event, kRATE), *szpt = switch_event_get_header_nil(var_event, kPT); @@ -155,7 +157,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi remote_port = !zstr(szremote_port) ? atoi(szremote_port) : 0; int ptime = !zstr(szptime) ? atoi(szptime) : 0, - //rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, + rfc2833_pt = !zstr(szrfc2833_pt) ? atoi(szrfc2833_pt) : 0, rate = !zstr(szrate) ? atoi(szrate) : 8000, pt = !zstr(szpt) ? atoi(szpt) : 0; @@ -185,7 +187,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->remote_port = remote_port; tech_pvt->ptime = ptime; tech_pvt->agreed_pt = pt; - tech_pvt->dtmf_type = DTMF_2833; /* XXX */ + tech_pvt->rfc2833_pt = rfc2833_pt; + if (rfc2833_pt) { + tech_pvt->dtmf_type = DTMF_2833; + } else { + tech_pvt->dtmf_type = DTMF_NONE; + } if (zstr(local_addr) || local_port == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "The local address and port must be set\n"); @@ -247,6 +254,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't setup RTP session: [%s]\n", err); goto fail; } + + if (tech_pvt->dtmf_type == DTMF_2833) { + switch_rtp_set_telephony_event(tech_pvt->rtp_session, tech_pvt->rfc2833_pt); + } if (switch_core_session_thread_launch(*new_session) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start session thread.\n"); @@ -500,11 +511,18 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi if (compare_var(event, channel, kRFC2833PT)) { const char *szpt = switch_channel_get_variable(channel, kRFC2833PT); int pt = !zstr(szpt) ? atoi(szpt) : 0; + + tech_pvt->rfc2833_pt = pt; + + if (pt) { + tech_pvt->dtmf_type = DTMF_2833; + } else { + tech_pvt->dtmf_type = DTMF_NONE; + } switch_channel_set_variable(channel, kRFC2833PT, szpt); switch_rtp_set_telephony_event(tech_pvt->rtp_session, pt); } - } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); } From c8c85fc27fda11260cd8e950bf5ed3ab5a0d1fbb Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 9 Aug 2012 11:15:07 -0400 Subject: [PATCH 406/493] add t38_options and media_type to rtp term --- .../mod_media_gateway/media_gateway.c | 3 ++ .../mod_media_gateway/mod_media_gateway.h | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 9df5e2a2e0..63646c4943 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -125,6 +125,9 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kRFC2833PT, "%d", term->u.rtp.rfc2833_pt); switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kRATE, "%d", term->u.rtp.rate); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kCODEC, term->u.rtp.codec); + + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kMEDIATYPE, mg_media_type2str(term->u.rtp.media_type)); + } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 46f850ff16..4285526af3 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -79,6 +79,7 @@ typedef struct mg_context_s mg_context_t; #define kRFC2833PT "rfc2833_pt" #define kMODE "mode" #define kRATE "rate" +#define kMEDIATYPE "media_type" /* TDM parameters understood by the controllable channel */ #define kSPAN_ID "span" @@ -96,6 +97,32 @@ enum { } mg_termination_flags; + +typedef enum { + MGM_AUDIO = 0, + MGM_IMAGE, + MGM_INVALID +} mg_media_type_t; + +static inline const char *mg_media_type2str(mg_media_type_t type) { + switch (type) { + case MGM_AUDIO: + return "audio"; + case MGM_IMAGE: + return "image"; + case MGM_INVALID: + return NULL; + } +} + +static inline mg_media_type_t mg_media_type_parse(const char *str) { + if (!strcasecmp(str, "audio")) { + return MGM_AUDIO; + } else if (!strcasecmp(str, "image")) { + return MGM_IMAGE; + } +} + struct mg_context_s { uint32_t context_id; mg_termination_t *terminations[MG_CONTEXT_MAX_TERMS]; @@ -133,6 +160,8 @@ struct mg_termination_s { int rate; /*!< Sampling rate */ const char *codec; /*!< Codec to use, using the freeswitch nomenclature. This could be "PCMU" for G711.U, "PCMA" for G711.A, or "G729" for g729 */ int term_id; + switch_t38_options_t t38_options; + mg_media_type_t media_type; } rtp; struct { From 83e0d9c3bd34711cf9368606d705c440647c7b5e Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 9 Aug 2012 11:18:13 -0400 Subject: [PATCH 407/493] should be a ptr --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 4285526af3..d0041401d4 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -160,7 +160,7 @@ struct mg_termination_s { int rate; /*!< Sampling rate */ const char *codec; /*!< Codec to use, using the freeswitch nomenclature. This could be "PCMU" for G711.U, "PCMA" for G711.A, or "G729" for g729 */ int term_id; - switch_t38_options_t t38_options; + switch_t38_options_t *t38_options; mg_media_type_t media_type; } rtp; From 17755cbd571ae7ffe9b89aa58dad1f87a2394454 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 9 Aug 2012 14:22:30 -0400 Subject: [PATCH 408/493] adding t38 option code --- .../media_gateway_cmd_handler.c | 5 +- .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/media_gateway_utils.c | 464 +++++++++++++----- .../mod_media_gateway/mod_media_gateway.h | 2 + 4 files changed, 335 insertions(+), 137 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 1eacf4fb23..cff0c7ffa9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -727,6 +727,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } + mg_print_t38_attributes(term); /* TODO - locally assigned SDP must be the part of termination...which we can use to fill responses*/ @@ -793,6 +794,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_fill_mgco_termid(out_termId, (char*)term->name, strlen((char*)term->name), &rsp.u.mgCmdRsp[0]->memCp); } + if(is_rtp){ /* Whatever Media descriptor we have received, we can copy that and then * whatever we want we can modify the fields */ /* Kapil - TODO - will see if there is any problem of coping the @@ -822,7 +824,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } /* only for RTP */ - if(is_rtp){ if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ mg_util_set_err_string(&errTxt, " Unsupported Codec "); @@ -1209,6 +1210,8 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand term->u.rtp.term_id); } + mg_print_t38_attributes(term); + /* SDP updated to termination */ megaco_activate_termination(term); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 1c7e8c614c..d06e796c54 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -218,6 +218,7 @@ switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const c switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_name, MgMgcoObsEvt* oevt); switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile); +void mg_print_t38_attributes(mg_termination_t* term); switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequestId *request_id, MgMgcoObsEvtDesc **ptr_obs_desc); void mg_print_time(); switch_status_t mg_activate_ito_timer(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 11d68f026c..7fd2d2a1ca 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -430,6 +430,56 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) } } +/*****************************************************************************************************************************/ +void mgco_fill_t38_sdp_attr(CmSdpAttrSet *s, mg_termination_t* term, CmMemListCp *memCp) +{ + int i=0x00; + + if(!term->u.rtp.t38_options) return; + if (!s->numComp.pres) return ; + + for (i = 0; i < s->numComp.val; i++) { + CmSdpAttr *a = s->attr[i]; + if(NOTPRSNT == a->type.pres) continue; + + switch(a->type.val) + { + case CM_SDP_ATTR_T38_FAX: + { + CmSdpAttrT38Fax* f = &a->u.fax; + if(NOTPRSNT == f->type.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); + break; + } + +/* NOTE - Ideally i should not change ,whatever is coming we can return..due to +trillium issue forcefully coping the data...will remove once get trillium fix*/ +if(f->type.val == CM_SDP_ATTR_T38_FAX_UNKNOWN) { +if((i==0) && term->u.rtp.t38_options->T38FaxRateManagement){ +MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxRateManagement"),"FaxRateManagement", memCp); +MG_SET_TKNSTROSXL((f->u.unknown.val), + strlen(term->u.rtp.t38_options->T38FaxRateManagement), + term->u.rtp.t38_options->T38FaxRateManagement, memCp); +} +if((i==1) && term->u.rtp.t38_options->T38FaxUdpEC){ +MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxUdpEC"),"FaxUdpEC", memCp); +MG_SET_TKNSTROSXL((f->u.unknown.val), + strlen(term->u.rtp.t38_options->T38FaxUdpEC), + term->u.rtp.t38_options->T38FaxUdpEC, memCp); +} +if((i==2)){ +char buf[10] = {0}; +sprintf(buf,"%d",term->u.rtp.t38_options->T38MaxBitRate); +MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("MaxBitRate"),"MaxBitRate", memCp); +MG_SET_TKNSTROSXL((f->u.unknown.val), + strlen(buf), buf, memCp); +} +} +} +} +} +} /*****************************************************************************************************************************/ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) { @@ -754,9 +804,47 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) break; } case CM_SDP_ATTR_T38_FAX: - { - break; - } + { + CmSdpAttrT38Fax* f = &a->u.fax; + if(NOTPRSNT == f->type.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); + break; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t CM_SDP_ATTR_T38_FAX: type=%d\n", f->type.val); + + if(f->type.val == CM_SDP_ATTR_T38_FAX_UNKNOWN) { + if(f->u.unknown.name.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : name[len=%d, value=%s] \n", + f->u.unknown.name.len,(char*)f->u.unknown.name.val); + } + if(f->u.unknown.val.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : value[len=%d, value=%s] \n", + f->u.unknown.val.len,(char*)f->u.unknown.val.val); + } + } + + /* filling default values */ + if(NULL == term->u.rtp.t38_options){ + term->u.rtp.t38_options = + switch_core_alloc(term->pool, sizeof *term->u.rtp.t38_options); + } + term->u.rtp.t38_options->T38FaxVersion = 0x01; + term->u.rtp.t38_options->T38MaxBitRate = 14400; + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"transferredTCF") ; + //term->u.rtp.t38_options->T38FaxMaxBuffer = ; + //term->u.rtp.t38_options->T38FaxMaxDatagram = ; + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPRedundancy") ; + //term->u.rtp.t38_options->T38VendorInfo = + + break; + } default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not supported Type[%d]\n",a->type.val); break; @@ -765,8 +853,6 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) }else{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "a-line not present \n"); } - - } void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) @@ -852,7 +938,8 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd CmSdpMedProtoFmts *a = s->pflst[i]; /*Prot*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Proto Type = %d \n", (NOTPRSNT != a->prot.type.pres)?a->prot.type.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Proto Type = %d \n", (NOTPRSNT != a->prot.type.pres)?a->prot.type.val:-1); switch(a->prot.type.val) { case CM_SDP_MEDIA_PROTO_UNKNOWN: @@ -867,6 +954,12 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd (NOTPRSNT != a->prot.u.subtype.type.pres)?a->prot.u.subtype.type.val: -1); break; } + case CM_SDP_MEDIA_PROTO_UDPTL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Proto Type T38 -UDPTL , subtype = %d \n", + (NOTPRSNT != a->prot.u.subtype.type.pres)?a->prot.u.subtype.type.val: -1); + } } /*repeated from "prot" field */ @@ -881,7 +974,8 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd int i = 0x00; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_MEDIA_PROTO_RTP: \n"); if(NOTPRSNT != r->num.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Number of Formats[%d] \n", r->num.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Number of Formats[%d] \n", r->num.val); for(i=0;inum.val;i++){ mgco_print_CmSdpU8OrNil(r->fmts[i]); @@ -961,10 +1055,31 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd break; } - case CM_SDP_UDPTL_FMT_T38: + case CM_SDP_MEDIA_PROTO_UDPTL: { - /*CmSdpMedFmtUdptlList* t = &a->u.t38;*/ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_UDPTL_FMT_T38: \n"); + CmSdpMedFmtUdptlList* t = &a->u.t38; + int i = 0; + + if(NOTPRSNT == t->num.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + " CM_SDP_MEDIA_PROTO_UDPTL: no format defines..\n"); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " CM_SDP_MEDIA_PROTO_UDPTL: formats[%d]\n", t->num.val); + + for(i=0; i< t->num.val;i++) + { + CmSdpT38Fmt* f = t->fmts[i]; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " f->knownFmt.pres=%d, f->knownFmt.val=%d\n", + f->knownFmt.pres,f->knownFmt.val); + if(f->unknownFmt.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "f->unknownFmt.val[%s]\n",f->unknownFmt.val); + } + } + break; } default: @@ -985,7 +1100,8 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd if (sdp->numComp.pres == NOTPRSNT) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - " No %s SDP present \n", (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE"); + " No %s SDP present \n", + (MG_SDP_LOCAL== sdp_type)?"MG_SDP_LOCAL":"MG_SDP_REMOTE"); return; } @@ -1000,38 +1116,52 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /************************************************************************************************************************/ /* Version */ if(NOTPRSNT != s->ver.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " SDP Version = %d \n", s->ver.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " SDP Version = %d \n", s->ver.val); } /************************************************************************************************************************/ /* Orig */ if(NOTPRSNT != s->orig.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "********** SDP orig line ****** \n \t Type = %d \n", s->orig.type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "********** SDP orig line ****** \n \t Type = %d \n", + s->orig.type.val); if(NOTPRSNT != s->orig.orig.pres.pres) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t User Name = %s \n", - (NOTPRSNT != s->orig.orig.usrName.pres)?(char*)s->orig.orig.usrName.val:"Not Present"); + (NOTPRSNT != s->orig.orig.usrName.pres)? + (char*)s->orig.orig.usrName.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Id = %s \n", - (NOTPRSNT != s->orig.orig.sessId.pres)?(char*)s->orig.orig.sessId.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Session Id = %s \n", + (NOTPRSNT != s->orig.orig.sessId.pres)? + (char*)s->orig.orig.sessId.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Version = %s \n", - (NOTPRSNT != s->orig.orig.sessVer.pres)?(char*)s->orig.orig.sessVer.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Session Version = %s \n", + (NOTPRSNT != s->orig.orig.sessVer.pres)? + (char*)s->orig.orig.sessVer.val:"Not Present"); /* sdpAddr */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Net Type = %d \n", - (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)?s->orig.orig.sdpAddr.netType.type.val:-1); + (NOTPRSNT != s->orig.orig.sdpAddr.netType.type.pres)? + s->orig.orig.sdpAddr.netType.type.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Address Type = %d \n", - (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres)?s->orig.orig.sdpAddr.addrType.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Address Type = %d \n", + (NOTPRSNT != s->orig.orig.sdpAddr.addrType.pres) + ?s->orig.orig.sdpAddr.addrType.val:-1); /* print IPV4 address */ - if (s->orig.orig.sdpAddr.addrType.pres && s->orig.orig.sdpAddr.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && + if (s->orig.orig.sdpAddr.addrType.pres && + s->orig.orig.sdpAddr.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && s->orig.orig.sdpAddr.netType.type.val == CM_SDP_NET_TYPE_IN && - s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { + s->orig.orig.sdpAddr.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) + { if (s->orig.orig.sdpAddr.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Address: %d.%d.%d.%d\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Address: %d.%d.%d.%d\n", s->orig.orig.sdpAddr.u.ip4.u.ip.b[0].val, s->orig.orig.sdpAddr.u.ip4.u.ip.b[1].val, s->orig.orig.sdpAddr.u.ip4.u.ip.b[2].val, @@ -1039,18 +1169,20 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd } }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t O-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t O-line not present \n"); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "********** ****** \n"); } } else{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t O-line not present \n"); } - /************************************************************************************************************************/ +/************************************************************************************************************************/ /* Session Name (s = line) */ if(NOTPRSNT != s->sessName.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Name = %s \n", s->sessName.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Session Name = %s \n", s->sessName.val); } else{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t s-line not present \n"); } @@ -1059,18 +1191,22 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /* Session Info(i= line) */ if(NOTPRSNT != s->info.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Info = %s \n", s->info.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Session Info = %s \n", s->info.val); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t i-line not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t i-line not present \n"); } /************************************************************************************************************************/ /* Session Uri */ if(NOTPRSNT != s->uri.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Session Uri = %s \n", s->uri.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Session Uri = %s \n", s->uri.val); } else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t uri not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t uri not present \n"); } /************************************************************************************************************************/ @@ -1098,26 +1234,34 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd if(NOTPRSNT != s->sdpTime.pres.pres) { if(NOTPRSNT != s->sdpTime.sdpOpTimeSet.numComp.pres) { int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP op time present with total component[%d]\n", s->sdpTime.sdpOpTimeSet.numComp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "SDP op time present with total component[%d]\n", + s->sdpTime.sdpOpTimeSet.numComp.val); for (i = 0;isdpTime.sdpOpTimeSet.numComp.val;i++){ CmSdpOpTime* t = s->sdpTime.sdpOpTimeSet.sdpOpTime[i]; if(NOTPRSNT == t->pres.pres) continue; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Start Time = %s \n", - (NOTPRSNT != t->startTime.pres)?(char*)t->startTime.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Start Time = %s \n", + (NOTPRSNT != t->startTime.pres)? + (char*)t->startTime.val:"Not Present"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Stop Time = %s \n", - (NOTPRSNT != t->stopTime.pres)?(char*)t->stopTime.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Stop Time = %s \n", + (NOTPRSNT != t->stopTime.pres)? + (char*)t->stopTime.val:"Not Present"); /*repeat time repFieldSet */ if(NOTPRSNT != t->repFieldSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP repeat time present with total component[%d]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "SDP repeat time present with total component[%d]\n", t->repFieldSet.numComp.val); /*TODO - print repeat fields */ }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SDP repeat time not present \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "SDP repeat time not present \n"); } } /* sdpOpTimeSet.numComp for loop -- end */ }else{/*sdpOpTimeSet.numComp.pres if -- end */ @@ -1139,7 +1283,8 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd (NOTPRSNT != s->keyType.keyType.pres)?s->keyType.keyType.val:-1); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Key Data = %s \n", - (NOTPRSNT != s->keyType.key_data.pres)?(char*)s->keyType.key_data.val:"Not Present"); + (NOTPRSNT != s->keyType.key_data.pres)? + (char*)s->keyType.key_data.val:"Not Present"); }else{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "k-line not present \n"); } @@ -1153,7 +1298,9 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /* Media Descriptor Set */ if (s->mediaDescSet.numComp.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "****** Media Descriptor Set present with numComp[%d]\n", s->mediaDescSet.numComp.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "****** Media Descriptor Set present with numComp[%d]\n", + s->mediaDescSet.numComp.val); for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; @@ -1162,11 +1309,17 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd /* Media Field */ { CmSdpMediaField* f = &desc->field; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Media Type = %d \n",(NOTPRSNT != f->mediaType.pres)?f->mediaType.val:-1); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Media = %s \n",(NOTPRSNT != f->media.pres)?(char*)f->media.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Media Type = %d \n", + (NOTPRSNT != f->mediaType.pres)?f->mediaType.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Media = %s \n",(NOTPRSNT != f->media.pres)? + (char*)f->media.val:"Not Present"); + /* Channel ID */ if(NOTPRSNT != f->id.type.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t VcId Type = %d \n", f->id.type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t VcId Type = %d \n", f->id.type.val); switch(f->id.type.val){ case CM_SDP_VCID_PORT: { @@ -1208,9 +1361,10 @@ void mgco_handle_incoming_sdp(CmSdpInfoSet *sdp, mg_termination_t* term, mgco_sd } /*info */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Info = %s \n",(NOTPRSNT != desc->info.pres)?(char*)desc->info.val:"Not Present"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Info = %s \n",(NOTPRSNT != desc->info.pres)?(char*)desc->info.val:"Not Present"); - /*connection set */ + /*connection set */ { int cnt=0x00; if(NOTPRSNT != desc->connSet.numComp.pres){ @@ -1976,122 +2130,160 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ } /**********************************************************************************************************************************/ /* orig (o- line) fill with our info */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", memCp); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), - CM_SDP_NET_TYPE_IN); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), +MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", memCp); +MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", memCp); +MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", memCp); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), +CM_SDP_NET_TYPE_IN); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), CM_SDP_ADDR_TYPE_IPV4); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), atoi(ipAddress[0])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), atoi(ipAddress[1])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), atoi(ipAddress[2])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), atoi(ipAddress[3])); /**********************************************************************************************************************************/ /* session-name , let it be like this if present, else skip it */ /**********************************************************************************************************************************/ /* "c=" line - ipaddress */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); +MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); /**********************************************************************************************************************************/ - /* t= line */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); +/* t= line */ +MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); /**********************************************************************************************************************************/ - /* fill media descriptors */ - { - CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; - CmSdpMediaDesc* media; +/* fill media descriptors */ +{ +CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; +CmSdpMediaDesc* media; - if((NOTPRSNT == med->numComp.pres) || (0 == med->numComp.val)){ - mg_add_lcl_media(med, mg_profile, term, memCp); - }else{ - for(j =0;j < med->numComp.val; j++){ - media = med->mediaDesc[j]; - /* check for choose port and fill the port */ - if(NOTPRSNT != media->field.id.type.pres){ - if(CM_SDP_VCID_CHOOSE == media->field.id.type.val){ - MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); +if((NOTPRSNT == med->numComp.pres) || (0 == med->numComp.val)){ + mg_add_lcl_media(med, mg_profile, term, memCp); +}else{ + for(j =0;j < med->numComp.val; j++){ + media = med->mediaDesc[j]; + /* check for choose port and fill the port */ + if(NOTPRSNT != media->field.id.type.pres){ + if(CM_SDP_VCID_CHOOSE == media->field.id.type.val){ + MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); + MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); - } - } + } + } - /* check for codec */ - if((NOTPRSNT == media->field.par.numProtFmts.pres) || - (0 == media->field.par.numProtFmts.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No codec specified in incoming local descriptor \n"); - mg_add_supported_media_codec(media, mg_profile, term, memCp ); - }else{ - /* check for media format/codec */ - for(k =0;k < media->field.par.numProtFmts.val; k++){ - format = media->field.par.pflst[k]; - if ((NOTPRSNT != format->protType.pres) && - (CM_SDP_MEDIA_PROTO_RTP == format->protType.val)) - { - if((NOTPRSNT != format->u.rtp.num.pres) - &&(0 != format->u.rtp.num.val)) - { - /* If the codec type is CHOOSE then we need to fill our list */ - for(i = 0; i < format->u.rtp.num.val; i++) - { - fmt = format->u.rtp.fmts[i]; + /* check for codec */ +if((NOTPRSNT == media->field.par.numProtFmts.pres) || + (0 == media->field.par.numProtFmts.val)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + "No codec specified in incoming local descriptor \n"); + mg_add_supported_media_codec(media, mg_profile, term, memCp ); +}else{ +/* check for media format/codec */ + for(k =0;k < media->field.par.numProtFmts.val; k++){ +format = media->field.par.pflst[k]; +if ((NOTPRSNT != format->protType.pres) && + (CM_SDP_MEDIA_PROTO_RTP == format->protType.val)) +{ + if((NOTPRSNT != format->u.rtp.num.pres) + &&(0 != format->u.rtp.num.val)) + { + /* If the codec type is CHOOSE then we need to fill our list */ + for(i = 0; i < format->u.rtp.num.val; i++) { + fmt = format->u.rtp.fmts[i]; + if((NOTPRSNT == fmt->type.pres) || (NOTPRSNT == fmt->val.pres)) continue; + if(CM_SDP_CHOOSE == fmt->type.val){ + choose_codec = 0x1; + } + } + if(choose_codec){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "CHOOSE codec is requested fill out supported codecs \n"); - if((NOTPRSNT == fmt->type.pres) || (NOTPRSNT == fmt->val.pres)) continue; - - if(CM_SDP_CHOOSE == fmt->type.val){ - choose_codec = 0x1; - } - } - if(choose_codec){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "CHOOSE codec is requested fill out supported codecs \n"); - - /* delete existing rtp format list..TODO find better way */ - for(i = 0; i < format->u.rtp.num.val; i++) - { - mgUtlShrinkList((Void ***)&format->u.rtp.fmts, sizeof(CmSdpU8OrNil), &format->u.rtp.num, memCp); - } - /* If the codec type is CHOOSE then we need to fill our list */ - mg_add_supported_media_codec(media, mg_profile, term, memCp); - } - else if (!choose_codec && (SWITCH_STATUS_FALSE == mg_rem_unsupported_codecs(mg_profile, term , &format->u.rtp, &media->attrSet, memCp))) - { - return SWITCH_STATUS_FALSE; - } - } - } - } - } - } - } + /* delete existing rtp format list..TODO find better way */ + for(i = 0; i < format->u.rtp.num.val; i++) + { + mgUtlShrinkList((Void ***)&format->u.rtp.fmts, sizeof(CmSdpU8OrNil), &format->u.rtp.num, memCp); + } + /* If the codec type is CHOOSE then we need to fill our list */ + mg_add_supported_media_codec(media, mg_profile, term, memCp); + } else if (!choose_codec && + (SWITCH_STATUS_FALSE == + mg_rem_unsupported_codecs(mg_profile, term , &format->u.rtp, &media->attrSet, memCp))) + { + return SWITCH_STATUS_FALSE; + } + } +}else if ((NOTPRSNT != format->protType.pres) && + (CM_SDP_MEDIA_PROTO_UDPTL == format->protType.val)){ +/* ideally whatever is received we can send back * +* due to issue in trillium , we need to manually copy the fields now */ + mgco_fill_t38_sdp_attr(&media->attrSet, term, memCp); +} +} +} +} +} +} /**********************************************************************************************************************************/ - } +} - } } return SWITCH_STATUS_SUCCESS; } /*****************************************************************************************************************************/ +void mg_print_t38_attributes(mg_termination_t* term) +{ + switch_assert(term); + + if((MG_TERM_RTP == term->type) && (term->u.rtp.t38_options)){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "switch_t38_options_t for termination[%s]\n", term->name); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxVersion[%d]\n", + term->u.rtp.t38_options->T38FaxVersion); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38MaxBitRate[%d]\n", + term->u.rtp.t38_options->T38MaxBitRate); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxFillBitRemoval[%d]\n", + term->u.rtp.t38_options->T38FaxFillBitRemoval); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxTranscodingMMR[%d]\n", + term->u.rtp.t38_options->T38FaxTranscodingMMR); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxTranscodingJBIG[%d]\n", + term->u.rtp.t38_options->T38FaxTranscodingJBIG); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxRateManagement[%s]\n", + (NULL != term->u.rtp.t38_options->T38FaxRateManagement)? + term->u.rtp.t38_options->T38FaxRateManagement:"NULL"); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxMaxBuffer[%d]\n", + term->u.rtp.t38_options->T38FaxMaxBuffer); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxMaxDatagram[%d]\n", + term->u.rtp.t38_options->T38FaxMaxDatagram); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38FaxUdpEC[%s]\n", + (NULL != term->u.rtp.t38_options->T38FaxUdpEC)? + term->u.rtp.t38_options->T38FaxUdpEC:"NULL"); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"T38VendorInfo[%s]\n", + (NULL != term->u.rtp.t38_options->T38VendorInfo)? + term->u.rtp.t38_options->T38VendorInfo:"NULL"); + } + +} diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index d0041401d4..da705cc86e 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -113,6 +113,7 @@ static inline const char *mg_media_type2str(mg_media_type_t type) { case MGM_INVALID: return NULL; } + return NULL; } static inline mg_media_type_t mg_media_type_parse(const char *str) { @@ -121,6 +122,7 @@ static inline mg_media_type_t mg_media_type_parse(const char *str) { } else if (!strcasecmp(str, "image")) { return MGM_IMAGE; } + return MGM_INVALID; } struct mg_context_s { From 8aee9d87b79c24ae3d4d3340dec7229314c2333f Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 9 Aug 2012 14:52:23 -0400 Subject: [PATCH 409/493] t38 fax code --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 2 ++ src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index a93bd0467c..31fac31d5c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -735,6 +735,8 @@ switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megac if(MG_TERM_RTP == term->type){ stream->write_function(stream, "RTP Termination ID [%d] \n",term->u.rtp.term_id); + stream->write_function(stream, "RTP MEDIA Type [%s] \n", + ( MGM_IMAGE == term->u.rtp.media_type)?"MGM_IMAGE":"MGM_AUDIO"); stream->write_function(stream, "RTP Termination Local Address[%s] \n", (NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:"NULL"); stream->write_function(stream, "RTP Termination Local Port[%d] \n",term->u.rtp.local_port); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 7fd2d2a1ca..985d383d9e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -972,6 +972,7 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd { CmSdpMedFmtRtpList* r = &a->u.rtp; int i = 0x00; + term->u.rtp.media_type = MGM_AUDIO; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_MEDIA_PROTO_RTP: \n"); if(NOTPRSNT != r->num.pres){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, @@ -1065,6 +1066,8 @@ void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sd " CM_SDP_MEDIA_PROTO_UDPTL: no format defines..\n"); } + term->u.rtp.media_type = MGM_IMAGE; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " CM_SDP_MEDIA_PROTO_UDPTL: formats[%d]\n", t->num.val); From 8aa901c422fb2b7815edcae216fe5666981f51c9 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 9 Aug 2012 17:10:27 -0400 Subject: [PATCH 410/493] add spandsp cng-tone detect --- .../mod_media_gateway/media_gateway.c | 12 +-- .../mod_media_gateway/mod_media_gateway.c | 88 ++++--------------- .../mod_media_gateway/mod_media_gateway.h | 2 + 3 files changed, 27 insertions(+), 75 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 63646c4943..ff96998538 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -84,7 +84,7 @@ megaco_profile_t* megaco_get_profile_by_suId(SuId suId) static switch_status_t mg_on_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf, switch_dtmf_direction_t direction) { switch_channel_t *channel = switch_core_session_get_channel(session); - mg_termination_t *term = switch_channel_get_private(channel, "_mg_term_"); + mg_termination_t *term = switch_channel_get_private(channel, PVT_MG_TERM); //char digit[2] = { dtmf->digit }; if (!term) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find termination structure for session [%s]\n", @@ -158,7 +158,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) } if (zstr(term->uuid)) { - switch_channel_t *channel; + switch_channel_t *channel; if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); status = SWITCH_STATUS_FALSE; @@ -167,9 +167,11 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); - channel = switch_core_session_get_channel(session); - switch_channel_set_private(channel, "_mg_term_", term); - switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); + channel = switch_core_session_get_channel(session); + switch_channel_set_private(channel, PVT_MG_TERM, term); + switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); + + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); } switch_set_flag(term, MGT_ACTIVE); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 771732d680..66b91072b4 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -26,6 +26,22 @@ SWITCH_STANDARD_API(megaco_function) return mg_process_cli_cmd(cmd, stream); } +SWITCH_STANDARD_APP(mg_notify_function) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + mg_termination_t *term = switch_channel_get_private(channel, PVT_MG_TERM); + + if (!term) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "mg_notify called on a non-supported channel.\n"); + return; + } + + if (!strcmp(data, "cng")) { + mg_send_t38_cng_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); + } +} + static switch_status_t console_complete_hashtable(switch_hash_t *hash, const char *line, const char *cursor, switch_console_callback_match_t **matches) { switch_hash_index_t *hi; @@ -92,6 +108,7 @@ static void mg_event_handler(switch_event_t *event) SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) { switch_api_interface_t *api_interface; + switch_application_interface_t *app_interface; memset(&megaco_globals, 0, sizeof(megaco_globals)); megaco_globals.pool = pool; @@ -105,6 +122,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_media_gateway_load) switch_thread_rwlock_create(&megaco_globals.peer_profile_rwlock, pool); SWITCH_ADD_API(api_interface, "mg", "media_gateway", megaco_function, MEGACO_FUNCTION_SYNTAX); + SWITCH_ADD_APP(app_interface, "mg_notify", "", "sends a notify to the mgc", mg_notify_function, "", 0); switch_console_set_complete("add mg profile ::mg::list_profiles start"); switch_console_set_complete("add mg profile ::mg::list_profiles stop"); @@ -246,77 +264,7 @@ void handle_sng_log(uint8_t level, char *fmt, ...) va_end(ptr); } /*****************************************************************************************************************************/ - -#if 0 -static switch_status_t mgco_parse_local_sdp(mg_termination_t *term, CmSdpInfoSet *sdp) -{ - int i; - CmSdpInfoSet *local_sdp; - /* Parse the local SDP while copying the important bits over to our local structure, - * while taking care of editing choose request and replacing them by real values */ - if (!term->u.rtp.local_sdp) { - local_sdp = term->u.rtp.local_sdp = switch_core_alloc(term->context->pool, sizeof *term->u.rtp.local_sdp); - } - - - if (sdp->numComp.pres == NOTPRSNT) { - return SWITCH_STATUS_FALSE; - } - - for (i = 0; i < sdp->numComp.val; i++) { - CmSdpInfo *s = sdp->info[i]; - int mediaId; - - local_sdp->info[i] = switch_core_alloc(term->context->pool, sizeof *(local_sdp->info[i])); - *(local_sdp->info[i]) = *(sdp->info[i]); - - if (s->conn.addrType.pres && s->conn.addrType.val == CM_SDP_ADDR_TYPE_IPV4 && - s->conn.netType.type.val == CM_SDP_NET_TYPE_IN && - s->conn.u.ip4.addrType.val == CM_SDP_IPV4_IP_UNI) { - - if (s->conn.u.ip4.addrType.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Local address: %d.%d.%d.%d\n", - s->conn.u.ip4.u.uniIp.b[0].val, - s->conn.u.ip4.u.uniIp.b[1].val, - s->conn.u.ip4.u.uniIp.b[2].val, - s->conn.u.ip4.u.uniIp.b[3].val); - - /* TODO: Double-check bind address for this profile */ - - } - if (s->attrSet.numComp.pres) { - for (mediaId = 0; mediaId < s->attrSet.numComp.val; mediaId++) { - CmSdpAttr *a = s->attrSet.attr[mediaId]; - local_sdp->info[i]->attrSet.attr[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpAttr)); - *(local_sdp->info[i]->attrSet.attr[mediaId]) = *a; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Media %p\n", (void*)a); - } - } - - if (s->mediaDescSet.numComp.pres) { - for (mediaId = 0; mediaId < s->mediaDescSet.numComp.val; mediaId++) { - CmSdpMediaDesc *desc = s->mediaDescSet.mediaDesc[mediaId]; - local_sdp->info[i]->mediaDescSet.mediaDesc[mediaId] = switch_core_alloc(term->context->pool, sizeof(CmSdpMediaDesc)); - *(local_sdp->info[i]->mediaDescSet.mediaDesc[mediaId]) = *desc; - - if (desc->field.mediaType.val == CM_SDP_MEDIA_AUDIO && - desc->field.id.type.val == CM_SDP_VCID_PORT && - desc->field.id.u.port.type.val == CM_SDP_PORT_INT && - desc->field.id.u.port.u.portInt.port.type.val == CM_SDP_SPEC) { - int port = desc->field.id.u.port.u.portInt.port.val.val; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Port: %d\n", port); - - } - } - } - } - } - - return SWITCH_STATUS_SUCCESS; -} -#endif /* KAPIL- NOTE : We are using Command mode operation of MEGACO stack, so we will always get command indication instead of transaction */ /* Below API is not useful ... just leaving as it is...*/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index d0041401d4..44f4b98319 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -22,6 +22,8 @@ #define MEGACO_LOGGING_CLI_SYNTAX "logging [enable|disable]" #define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus] [peerxmlstatus]" +#define PVT_MG_TERM "_mg_term_" + struct megaco_globals { switch_memory_pool_t *pool; switch_hash_t *profile_hash; From 24e363d6f59afb5de6883bd95afd531212f9a651 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 9 Aug 2012 18:00:15 -0400 Subject: [PATCH 411/493] quickfix --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 4 +++- src/mod/endpoints/mod_sofia/rtp.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index ff96998538..8409cdc0e1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -171,7 +171,9 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_channel_set_private(channel, PVT_MG_TERM, term); switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + if (term->type == MG_TERM_TDM) { + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + } } switch_set_flag(term, MGT_ACTIVE); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 2afbb3fe02..3a41065fe3 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -476,7 +476,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi rate, ptime, 1, - /*SWITCH_CODEC_FLAG_ENCODE |*/ SWITCH_CODEC_FLAG_DECODE, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; @@ -487,7 +487,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi rate, ptime, 1, - SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; From ad1784f87697779cb5bbcda0c0e5f81323faead6 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 10 Aug 2012 04:41:14 -0400 Subject: [PATCH 412/493] adding cli command to show status of all termination in single command --- .../mod_media_gateway/media_gateway_cli.c | 85 ++++++++++++++----- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 31fac31d5c..d2234f859c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -16,6 +16,7 @@ switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_pro switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id); +switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); void megaco_cli_print_usage(switch_stream_handle_t *stream); switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); @@ -188,21 +189,6 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre stream->write_function(stream, "-ERR No such profile\n"); } -/**********************************************************************************/ - }else if (!strcmp(argv[2], "termstatus")) { -/**********************************************************************************/ - /* mg termstatus */ - - if (zstr(argv[3])) { - goto usage; - } - - if(profile){ - megaco_profile_release(profile); - handle_term_status_cli_cmd(stream, profile, argv[3]); - } else { - stream->write_function(stream, "-ERR No such profile\n"); - } /**********************************************************************************/ }else if (!strcmp(argv[2], "show")) { /**********************************************************************************/ @@ -214,12 +200,25 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre if(profile){ megaco_profile_release(profile); if(!strcasecmp(argv[3], "activecalls")){ + /* mg show activecalls */ handle_show_activecalls_cli_cmd(stream, profile); - } - } else { + /*******************************************************************/ + }else if(!strcasecmp(argv[3], "alltermstatus")){ + /*******************************************************************/ + /* mg show alltermstatus */ + handle_all_term_status_cli_cmd(stream, profile); + }else if(!strcasecmp(argv[3], "termstatus")){ + /*******************************************************************/ + /* mg show termstatus */ + if (zstr(argv[4])) { + goto usage; + } + handle_term_status_cli_cmd(stream, profile, argv[4]); + } else { + /*******************************************************************/ stream->write_function(stream, "-ERR No such profile\n"); + } } - /**********************************************************************************/ }else { /**********************************************************************************/ @@ -271,7 +270,6 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "Usage: Profile Specific\n"); stream->write_function(stream, "mg profile start \n"); stream->write_function(stream, "mg profile stop \n"); - stream->write_function(stream, "mg profile termstatus \n"); stream->write_function(stream, "mg profile status \n"); stream->write_function(stream, "mg profile xmlstatus \n"); stream->write_function(stream, "mg profile peerxmlstatus \n"); @@ -280,6 +278,8 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile send ito notify \n"); stream->write_function(stream, "mg profile send cng \n"); stream->write_function(stream, "mg profile show activecalls \n"); + stream->write_function(stream, "mg profile show termstatus \n"); + stream->write_function(stream, "mg profile show alltermstatus \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); @@ -698,7 +698,54 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm) } /******************************************************************************/ +switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile) +{ + void *val = NULL; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + const void *var; + if(!mg_profile){ + stream->write_function(stream, "-ERR NULL profile\n"); + return SWITCH_STATUS_FALSE; + } + + stream->write_function(stream, " Termination Name"); + stream->write_function(stream, "\t Termination State"); + stream->write_function(stream, "\t Termination Type"); + stream->write_function(stream, "\t Span-Id "); + stream->write_function(stream, "\t Channel-Id "); + + for (hi = switch_hash_first(NULL, mg_profile->terminations); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + term = (mg_termination_t *) val; + if(!term) continue; + + stream->write_function(stream, "\n"); + + stream->write_function(stream, " %s",(NULL != term->name)?term->name:"NULL"); + if(MG_TERM_RTP == term->type){ + stream->write_function(stream, "\t\t\t IN-SERVICE"); + }else{ + stream->write_function(stream, "\t\t\t %s", + (switch_test_flag(term, MG_IN_SERVICE))?"IN-SERVICE":"OUT-OF-SERVICE"); + } + stream->write_function(stream, "\t\t %s",(MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); + + if(MG_TERM_TDM == term->type){ + stream->write_function(stream, "\t\t %s", + (NULL != term->u.tdm.span_name)?term->u.tdm.span_name:"NULL"); + stream->write_function(stream, "\t\t %d",term->u.tdm.channel); + }else{ + stream->write_function(stream, "\t\t -"); + stream->write_function(stream, "\t\t -"); + } + stream->write_function(stream, "\n"); + } + + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id) { mg_termination_t* term = NULL; From f6e5cae7c5ad549efa5c305b6254f061173e1684 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 10 Aug 2012 05:37:39 -0400 Subject: [PATCH 413/493] fixing modify resp issue --- .../media_gateway_cmd_handler.c | 277 ++++++++++-------- .../mod_media_gateway/media_gateway_xml.c | 13 +- 2 files changed, 170 insertions(+), 120 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index cff0c7ffa9..4e93abbf11 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1065,7 +1065,7 @@ error: */ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd) { - mg_context_t* mg_ctxt = NULL; + mg_context_t* mg_ctxt = NULL; MgMgcoContextId *ctxtId; MgStr errTxt; MgMgcoInd *mgErr; @@ -1073,7 +1073,11 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand MgMgcoTermIdLst* termLst; mg_termination_t* term = NULL; switch_status_t ret; + MgMgcoAudRetParm *desc; + MgMgcoMediaDesc* inc_med_desc = NULL; + MgMgcoLocalDesc *local = NULL; int err_code; + int mediaId; /*MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod;*/ U32 txn_id = inc_cmd->transId.val; @@ -1114,109 +1118,109 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* context id presence check is already being done, we are here it means context-id requested in megaco message is present */ /********************************************************************/ - /* MGT_TERMID_ROOT = If ROOT term then there will not be any conext */ + /* MGT_TERMID_ROOT = If ROOT term then there will not be any conext */ - if(MGT_TERMID_ROOT == termId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, - "Modify request is for ROOT termination \n"); + if(MGT_TERMID_ROOT == termId->type.val){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for ROOT termination \n"); - /* check if we have ito packg request */ - mg_is_ito_pkg_req(mg_profile, inc_cmd); + /* check if we have ito packg request */ + mg_is_ito_pkg_req(mg_profile, inc_cmd); - /* TODO */ + /* TODO */ - /********************************************************************/ - } else if(MGT_TERMID_OTHER == termId->type.val){ - /********************************************************************/ + /********************************************************************/ + } else if(MGT_TERMID_OTHER == termId->type.val){ + /********************************************************************/ #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, - "Modify request is for termination[%s] and context: type[%d], value[%d] \n", - termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for termination[%s] and context: type[%d], value[%d] \n", + termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, - "Modify request is for termination[%s] and context: type[%d], value[%ld] \n", - termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for termination[%s] and context: type[%d], value[%ld] \n", + termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); #endif - term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); - if(NULL == term){ - mg_util_set_term_string(&errTxt,termId); - err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; - goto error; - } + if(NULL == term){ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; + goto error; + } - /* termination specified...context should also be specified */ + /* termination specified...context should also be specified */ - /* check if we have terminations in the context */ + /* check if we have terminations in the context */ - if (NOTPRSNT != ctxtId->type.pres) { - if(MGT_CXTID_OTHER == ctxtId->type.val) { - /*find context based on received context-id */ - mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); - if(NULL == mg_ctxt){ - mg_util_set_ctxt_string(&errTxt, ctxtId); - err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; - goto error; - } + if (NOTPRSNT != ctxtId->type.pres) { + if(MGT_CXTID_OTHER == ctxtId->type.val) { + /*find context based on received context-id */ + mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); + if(NULL == mg_ctxt){ + mg_util_set_ctxt_string(&errTxt, ctxtId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; + goto error; + } - if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ - /* ERROR - termination didnt bind with requested context */ - mg_util_set_term_string(&errTxt,termId); - err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; - goto error; - } + if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + /* ERROR - termination didnt bind with requested context */ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; + goto error; + } - }else if(MGT_CXTID_NULL == ctxtId->type.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, - "Modify request is for NULL Context \n"); - /*TODO - NULL context...nothing to do now...jump to response to send +ve response */ - goto response; - }else if(MGT_CXTID_ALL == ctxtId->type.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, - "Modify request is for ALL Context \n"); - /*TODO - ALL context...nothing to do now...jump to response to send +ve response */ - goto response; - } - } + }else if(MGT_CXTID_NULL == ctxtId->type.val) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for NULL Context \n"); + /*TODO - NULL context...nothing to do now...jump to response to send +ve response */ + goto response; + }else if(MGT_CXTID_ALL == ctxtId->type.val) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + "Modify request is for ALL Context \n"); + /*TODO - ALL context...nothing to do now...jump to response to send +ve response */ + goto response; + } + } - /* Not sure if MODIFY can come with Context ALL with specified term */ + /* Not sure if MODIFY can come with Context ALL with specified term */ - /********************************************************************/ + /********************************************************************/ - ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); + ret = mg_prc_descriptors(mg_profile, inc_cmd, term, &inc_cmd->u.mgCmdInd[0]->memCp); - /* IF there is any error , return */ - if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ - mg_util_set_err_string(&errTxt, " Unsupported Codec "); - err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; - /* TODO delete RTP termination */ - goto error; + /* IF there is any error , return */ + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + /* TODO delete RTP termination */ + goto error; + } + + if(MG_TERM_RTP == term->type){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" + " local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " + " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", + ((NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:NULL), + term->u.rtp.local_port, + ((NULL != term->u.rtp.remote_addr)?term->u.rtp.remote_addr:NULL), + term->u.rtp.remote_port, + term->u.rtp.ptime, + term->u.rtp.pt, + term->u.rtp.rfc2833_pt, + term->u.rtp.rate, + ((NULL != term->u.rtp.codec)?term->u.rtp.codec:NULL), + term->u.rtp.term_id); + } + + mg_print_t38_attributes(term); + + + /* SDP updated to termination */ + megaco_activate_termination(term); } - if(MG_TERM_RTP == term->type){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" - " local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " - " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", - ((NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:NULL), - term->u.rtp.local_port, - ((NULL != term->u.rtp.remote_addr)?term->u.rtp.remote_addr:NULL), - term->u.rtp.remote_port, - term->u.rtp.ptime, - term->u.rtp.pt, - term->u.rtp.rfc2833_pt, - term->u.rtp.rate, - ((NULL != term->u.rtp.codec)?term->u.rtp.codec:NULL), - term->u.rtp.term_id); - } - - mg_print_t38_attributes(term); - - - /* SDP updated to termination */ - megaco_activate_termination(term); - } - /* TODO - copy inc descriptor...not sure if we need to do this.. */ /********************************************************************/ @@ -1230,54 +1234,97 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* Kapil - to fill the response structure and call the response API to send Modify response */ response: - { /* send response */ + { /* send response */ - MgMgcoCommand rsp; - int ret = 0x00; + MgMgcoCommand rsp; + int ret = 0x00; - memset(&rsp,0, sizeof(rsp)); + memset(&rsp,0, sizeof(rsp)); - /*copy transaction-id*/ - memcpy(&rsp.transId, &inc_cmd->transId,sizeof(MgMgcoTransId)); + /*copy transaction-id*/ + memcpy(&rsp.transId, &inc_cmd->transId,sizeof(MgMgcoTransId)); - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&rsp.contextId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); + /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ + memcpy(&rsp.contextId, &inc_cmd->contextId,sizeof(MgMgcoContextId)); - /*copy peer identifier */ - memcpy(&rsp.peerId, &inc_cmd->peerId,sizeof(TknU32)); + /*copy peer identifier */ + memcpy(&rsp.peerId, &inc_cmd->peerId,sizeof(TknU32)); - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&rsp.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } + /*fill response structue */ + if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&rsp.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ + return ret; + } - rsp.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - rsp.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - rsp.u.mgCmdRsp[0]->type.val = MGT_MODIFY; - rsp.u.mgCmdRsp[0]->u.mod.pres.pres = PRSNT_NODEF; - rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; - rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; + rsp.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->type.val = MGT_MODIFY; + rsp.u.mgCmdRsp[0]->u.mod.pres.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; + rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; - mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); #ifdef GCP_VER_2_1 - termId = rsp.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; + termId = rsp.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; #else - termId = &(rsp.u.mgCmdRsp[0]->u.mod.termId); + termId = &(rsp.u.mgCmdRsp[0]->u.mod.termId); #endif - /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ + /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - /* We will always send one command at a time..*/ - rsp.cmdStatus.pres = PRSNT_NODEF; - rsp.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + if((MG_TERM_RTP == term->type) && + ((NOTPRSNT != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.pres) && + (0 != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.val))) { + /* Whatever Media descriptor we have received, we can copy that and then + * whatever we want we can modify the fields */ + /* Kapil - TODO - will see if there is any problem of coping the + * descriptor */ - rsp.cmdType.pres = PRSNT_NODEF; - rsp.cmdType.val = CH_CMD_TYPE_RSP; + inc_med_desc = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.descs[0]->u.media; + + if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.mod.audit.parms, sizeof(MgMgcoAudRetParm), + &rsp.u.mgCmdRsp[0]->u.mod.audit.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + /* copy media descriptor */ + desc = rsp.u.mgCmdRsp[0]->u.mod.audit.parms[rsp.u.mgCmdRsp[0]->u.mod.audit.num.val-1]; + desc->type.pres = PRSNT_NODEF; + desc->type.val = MGT_MEDIADESC; + mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); + /* see if we have received local descriptor */ + if((NOTPRSNT != desc->u.media.num.pres) && + (0 != desc->u.media.num.val)) + { + for(mediaId=0; mediaIdu.media.num.val; mediaId++) { + if(MGT_MEDIAPAR_LOCAL == desc->u.media.parms[mediaId]->type.val) { + local = &desc->u.media.parms[mediaId]->u.local; + } + } + } + + /* only for RTP */ + if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { + if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_util_set_err_string(&errTxt, " Unsupported Codec "); + err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; + goto error; + } + } + } + + /* We will always send one command at a time..*/ + rsp.cmdStatus.pres = PRSNT_NODEF; + rsp.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; + + rsp.cmdType.pres = PRSNT_NODEF; + rsp.cmdType.val = CH_CMD_TYPE_RSP; - ret = sng_mgco_send_cmd(mg_profile->idx, &rsp); + ret = sng_mgco_send_cmd(mg_profile->idx, &rsp); - } + } return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 08044bc9f7..65b9e8b393 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -71,7 +71,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { // const char *prefix = switch_xml_attr(mg_term, "termination-id-prefix"); - //const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); + const char *sztermination_id_base = switch_xml_attr(mg_term, "termination-id-base"); const char *tech = switch_xml_attr(mg_term, "tech"); const char *channel_prefix = switch_xml_attr(mg_term, "channel-prefix"); const char *channel_map = switch_xml_attr(mg_term, "channel-map"); @@ -84,6 +84,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) int chanmap_count = 0; int i = 0; int startchan, endchan, j; + int mg_term_idx = (sztermination_id_base)?atoi(sztermination_id_base):1; /* we can have following combinations * * i) only one channel i.e. channel-map="1" @@ -103,14 +104,15 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) startchan = atoi(chanmap[0]); endchan = atoi(chanmap[1]); for (j = startchan; j <= endchan; j++) { - mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, mg_term_idx, j); + mg_term_idx++; } } }else{ /* case (i) */ p = channel_map_dup; startchan = endchan = atoi(p); - mg_create_tdm_term(profile, tech, channel_prefix, prefix, startchan, startchan); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, mg_term_idx, startchan); } }else { @@ -124,9 +126,10 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) for (j = startchan; j <= endchan; j++) { if (0 == i) - mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, mg_term_idx, j); else - mg_create_tdm_term(profile, tech, channel_prefix, prefix, j, j-1); + mg_create_tdm_term(profile, tech, channel_prefix, prefix, mg_term_idx, j-1); + mg_term_idx++; } } } From 2df26cf79d1cc3b627e1f6a38c109471a5c6e97c Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 10 Aug 2012 06:46:01 -0400 Subject: [PATCH 414/493] hardcoding t38 sdp fields... --- .../mod_media_gateway/media_gateway_cli.c | 2 +- .../mod_media_gateway/media_gateway_utils.c | 51 ++++++++++++++++--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index d2234f859c..7d50ecfa19 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -279,7 +279,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile send cng \n"); stream->write_function(stream, "mg profile show activecalls \n"); stream->write_function(stream, "mg profile show termstatus \n"); - stream->write_function(stream, "mg profile show alltermstatus \n"); + stream->write_function(stream, "mg profile show alltermstatus \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 985d383d9e..c18057d3da 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -452,24 +452,26 @@ void mgco_fill_t38_sdp_attr(CmSdpAttrSet *s, mg_termination_t* term, CmMemListCp "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); break; } +printf("f->u.unknown.name.val[%s, len=%d]\n", f->u.unknown.name.val, f->u.unknown.name.len); /* NOTE - Ideally i should not change ,whatever is coming we can return..due to trillium issue forcefully coping the data...will remove once get trillium fix*/ if(f->type.val == CM_SDP_ATTR_T38_FAX_UNKNOWN) { -if((i==0) && term->u.rtp.t38_options->T38FaxRateManagement){ +if(!strncasecmp((char*)f->u.unknown.name.val,"transferredTCF",14) && term->u.rtp.t38_options->T38FaxRateManagement){ +printf("KAPIL - adding FaxRateManagement \n"); MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxRateManagement"),"FaxRateManagement", memCp); MG_SET_TKNSTROSXL((f->u.unknown.val), strlen(term->u.rtp.t38_options->T38FaxRateManagement), term->u.rtp.t38_options->T38FaxRateManagement, memCp); -} -if((i==1) && term->u.rtp.t38_options->T38FaxUdpEC){ +}else if((!strncasecmp((char*)f->u.unknown.name.val,"t38UDPRedundancy",16)) && term->u.rtp.t38_options->T38FaxUdpEC){ +printf("KAPIL - adding FaxUdpEC \n"); MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxUdpEC"),"FaxUdpEC", memCp); MG_SET_TKNSTROSXL((f->u.unknown.val), strlen(term->u.rtp.t38_options->T38FaxUdpEC), term->u.rtp.t38_options->T38FaxUdpEC, memCp); -} -if((i==2)){ +}else if(!strncasecmp((char*)f->u.unknown.name.val,"14400",5)){ char buf[10] = {0}; +printf("KAPIL - adding MaxBitRate \n"); sprintf(buf,"%d",term->u.rtp.t38_options->T38MaxBitRate); MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("MaxBitRate"),"MaxBitRate", memCp); MG_SET_TKNSTROSXL((f->u.unknown.val), @@ -2065,16 +2067,19 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term /*****************************************************************************************************************************/ + switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_profile_t* mg_profile, mg_termination_t* term, CmMemListCp *memCp) { CmSdpU8OrNil *fmt = NULL; CmSdpInfoSet *psdp = NULL; + CmSdpInfoSet *pRsdp = NULL; char* ipAddress[4]; int i = 0x00; int j = 0x00; int choose_codec = 0x00; int k = 0x00; MgMgcoLocalDesc *local = NULL; + MgMgcoLocalDesc *remote = NULL; int fresh_sdp = 0x00; char* dup = NULL; CmSdpMedProtoFmts *format=NULL; @@ -2107,17 +2112,51 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ for(i=0; inum.val; i++) { if(MGT_MEDIAPAR_LOCAL == out->parms[i]->type.val) { local = &out->parms[i]->u.local; - break; } else if(MGT_MEDIAPAR_STRPAR == out->parms[i]->type.val){ MgMgcoStreamDesc *stream = &out->parms[i]->u.stream; if((NOTPRSNT != stream->sl.pres.pres) && (NOTPRSNT != stream->sl.local.pres.pres)){ local = &stream->sl.local; } + }else if(MGT_MEDIAPAR_REMOTE == out->parms[i]->type.val) { + remote = &out->parms[i]->u.remote; } } } } +if(remote && (NOTPRSNT != remote->sdp.numComp.pres) && (0 != remote->sdp.numComp.val)){ +pRsdp = &(remote->sdp); +for(i=0; i< pRsdp->numComp.val; i++) { +/* fill media descriptors */ +{ +CmSdpMediaDescSet* med = &pRsdp->info[pRsdp->numComp.val-1]->mediaDescSet; +CmSdpMediaDesc* media; + +if((NOTPRSNT != med->numComp.pres) || (0 != med->numComp.val)){ + for(j =0;j < med->numComp.val; j++){ + media = med->mediaDesc[j]; + + /* check for codec */ +if((NOTPRSNT != media->field.par.numProtFmts.pres) || + (0 != media->field.par.numProtFmts.val)){ + for(k =0;k < media->field.par.numProtFmts.val; k++){ +format = media->field.par.pflst[k]; +if ((NOTPRSNT != format->protType.pres) && + (CM_SDP_MEDIA_PROTO_UDPTL == format->protType.val)){ +/* ideally whatever is received we can send back * +* due to issue in trillium , we need to manually copy the fields now */ + mgco_fill_t38_sdp_attr(&media->attrSet, term, memCp); +} +} +} +} +} +} +/**********************************************************************************************************************************/ +} +} + + if(!local || (NOTPRSNT == local->sdp.numComp.pres) || (0 == local->sdp.numComp.val)){ /* local sdp is not part of media descriptor, then add local sdp*/ mg_add_local_descriptor(out, mg_profile, term, memCp); From 116a09e85476cd35ad37209954e8b7c6a0749a44 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 10 Aug 2012 07:08:47 -0400 Subject: [PATCH 415/493] add some t38 vars --- .../mod_media_gateway/media_gateway.c | 3 +- .../mod_media_gateway/mod_media_gateway.c | 1 + src/mod/endpoints/mod_sofia/rtp.c | 35 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8409cdc0e1..bd9401b419 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -127,7 +127,8 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kCODEC, term->u.rtp.codec); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kMEDIATYPE, mg_media_type2str(term->u.rtp.media_type)); - + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "fax_enable_t38", "true"); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway peer nocng"); } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 66b91072b4..2afd7a778c 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -39,6 +39,7 @@ SWITCH_STANDARD_APP(mg_notify_function) if (!strcmp(data, "cng")) { mg_send_t38_cng_notify(term->profile, term->name); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); + switch_channel_set_variable(channel, "mg_cng_detected", "true"); } } diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 3a41065fe3..279e5a5ac1 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -523,6 +523,21 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi switch_channel_set_variable(channel, kRFC2833PT, szpt); switch_rtp_set_telephony_event(tech_pvt->rtp_session, pt); } + + if (compare_var(event, channel, kMODE)) { + const char *newmode = switch_channel_get_variable(channel, kMODE); + const char *mode = switch_channel_get_variable(channel, kMODE); + + if (!strcmp(newmode, "image")) { + switch_channel_set_variable(tech_pvt->channel, "has_t38", "true"); + switch_channel_set_app_flag_key("T38", tech_pvt->channel, CF_APP_T38); + switch_channel_execute_on(tech_pvt->channel, "rtp_execute_on_image"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got IMAGE description\n"); + } + + switch_channel_set_variable(channel, kMODE, newmode); + } + } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); } @@ -554,6 +569,26 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s assert(tech_pvt != NULL); switch (msg->message_id) { + case SWITCH_MESSAGE_INDICATE_UDPTL_MODE: + { + switch_t38_options_t *t38_options = switch_channel_get_private(tech_pvt->channel, "t38_options"); + if (!t38_options) { + goto end; + } + + switch_rtp_udptl_mode(tech_pvt->rtp_session); + break; + } + case SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION\n"); + break; + } + case SWITCH_MESSAGE_INDICATE_REQUEST_IMAGE_MEDIA: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SWITCH_MESSAGE_INDICATE_REQUEST_IMAGE_MEDIA\n"); + break; + } case SWITCH_MESSAGE_INDICATE_DEBUG_AUDIO: { if (switch_rtp_ready(tech_pvt->rtp_session) && !zstr(msg->string_array_arg[0]) && !zstr(msg->string_array_arg[1])) { From 540c2a91dafad0d100b9ab2909a30fd27d780556 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 10 Aug 2012 07:22:07 -0400 Subject: [PATCH 416/493] t38 --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 9 +++++++++ src/mod/endpoints/mod_sofia/rtp.c | 9 ++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index bd9401b419..3590762cb5 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -147,6 +147,10 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_core_session_receive_event(session, &var_event); + if (term->u.rtp.t38_options) { + switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); + } + switch_core_session_rwunlock(session); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent refresh to channel [%s], for termination [%s]\n", term->uuid, term->name); @@ -170,6 +174,11 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); channel = switch_core_session_get_channel(session); switch_channel_set_private(channel, PVT_MG_TERM, term); + + if (term->u.rtp.t38_options) { + switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); + } + switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); if (term->type == MG_TERM_TDM) { diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 279e5a5ac1..9f0bc0147f 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -40,7 +40,7 @@ #define kPTIME "ptime" #define kPT "pt" #define kRFC2833PT "rfc2833_pt" -#define kMODE "mode" +#define kMEDIATYPE "media_type" #define kRATE "rate" static struct { @@ -524,9 +524,8 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi switch_rtp_set_telephony_event(tech_pvt->rtp_session, pt); } - if (compare_var(event, channel, kMODE)) { - const char *newmode = switch_channel_get_variable(channel, kMODE); - const char *mode = switch_channel_get_variable(channel, kMODE); + if (compare_var(event, channel, kMEDIATYPE)) { + const char *newmode = switch_channel_get_variable(channel, kMEDIATYPE); if (!strcmp(newmode, "image")) { switch_channel_set_variable(tech_pvt->channel, "has_t38", "true"); @@ -535,7 +534,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got IMAGE description\n"); } - switch_channel_set_variable(channel, kMODE, newmode); + switch_channel_set_variable(channel, kMEDIATYPE, newmode); } } else { From 15a0b911bb1976193f8c7706676ba59d69c1c08e Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 10 Aug 2012 11:11:21 -0400 Subject: [PATCH 417/493] removing t38 hardcoded code --- .../mod_media_gateway/media_gateway_utils.c | 205 +++++++++--------- 1 file changed, 99 insertions(+), 106 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index c18057d3da..143af18d36 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -430,58 +430,6 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) } } -/*****************************************************************************************************************************/ -void mgco_fill_t38_sdp_attr(CmSdpAttrSet *s, mg_termination_t* term, CmMemListCp *memCp) -{ - int i=0x00; - - if(!term->u.rtp.t38_options) return; - if (!s->numComp.pres) return ; - - for (i = 0; i < s->numComp.val; i++) { - CmSdpAttr *a = s->attr[i]; - if(NOTPRSNT == a->type.pres) continue; - - switch(a->type.val) - { - case CM_SDP_ATTR_T38_FAX: - { - CmSdpAttrT38Fax* f = &a->u.fax; - if(NOTPRSNT == f->type.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); - break; - } -printf("f->u.unknown.name.val[%s, len=%d]\n", f->u.unknown.name.val, f->u.unknown.name.len); - -/* NOTE - Ideally i should not change ,whatever is coming we can return..due to -trillium issue forcefully coping the data...will remove once get trillium fix*/ -if(f->type.val == CM_SDP_ATTR_T38_FAX_UNKNOWN) { -if(!strncasecmp((char*)f->u.unknown.name.val,"transferredTCF",14) && term->u.rtp.t38_options->T38FaxRateManagement){ -printf("KAPIL - adding FaxRateManagement \n"); -MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxRateManagement"),"FaxRateManagement", memCp); -MG_SET_TKNSTROSXL((f->u.unknown.val), - strlen(term->u.rtp.t38_options->T38FaxRateManagement), - term->u.rtp.t38_options->T38FaxRateManagement, memCp); -}else if((!strncasecmp((char*)f->u.unknown.name.val,"t38UDPRedundancy",16)) && term->u.rtp.t38_options->T38FaxUdpEC){ -printf("KAPIL - adding FaxUdpEC \n"); -MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("FaxUdpEC"),"FaxUdpEC", memCp); -MG_SET_TKNSTROSXL((f->u.unknown.val), - strlen(term->u.rtp.t38_options->T38FaxUdpEC), - term->u.rtp.t38_options->T38FaxUdpEC, memCp); -}else if(!strncasecmp((char*)f->u.unknown.name.val,"14400",5)){ -char buf[10] = {0}; -printf("KAPIL - adding MaxBitRate \n"); -sprintf(buf,"%d",term->u.rtp.t38_options->T38MaxBitRate); -MG_SET_TKNSTROSXL((f->u.unknown.name),strlen("MaxBitRate"),"MaxBitRate", memCp); -MG_SET_TKNSTROSXL((f->u.unknown.val), - strlen(buf), buf, memCp); -} -} -} -} -} -} /*****************************************************************************************************************************/ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) { @@ -817,24 +765,106 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_T38_FAX: type=%d\n", f->type.val); - if(f->type.val == CM_SDP_ATTR_T38_FAX_UNKNOWN) { - if(f->u.unknown.name.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "T38: Attribute : name[len=%d, value=%s] \n", - f->u.unknown.name.len,(char*)f->u.unknown.name.val); - } - if(f->u.unknown.val.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "T38: Attribute : value[len=%d, value=%s] \n", - f->u.unknown.val.len,(char*)f->u.unknown.val.val); - } + if(NULL == term->u.rtp.t38_options){ + term->u.rtp.t38_options = + switch_core_alloc(term->pool, sizeof *term->u.rtp.t38_options); + } + switch(f->type.val) + { + case CM_SDP_ATTR_T38_FAX_VER: + { + term->u.rtp.t38_options->T38FaxVersion = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_MAX_BIT_RATE: + { + term->u.rtp.t38_options->T38MaxBitRate = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_FILL_BIT_RMVL: + { + term->u.rtp.t38_options->T38FaxFillBitRemoval = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_TRNS_MMR: + { + term->u.rtp.t38_options->T38FaxTranscodingMMR = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_TRNS_JBIG: + { + term->u.rtp.t38_options->T38FaxTranscodingJBIG = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_RATE_MNGMNT: + { + switch(f->u.val.val) + { + case CM_SDP_ATTR_T38_FAX_RATE_MNG_LOC_TCF: + { + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"localTCF") ; + break; + } + case CM_SDP_ATTR_T38_FAX_RATE_MNG_TRANSF_TCF: + { + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"transferredTCF") ; + break; + } + } + break; + } + case CM_SDP_ATTR_T38_FAX_MAX_BFR: + { + term->u.rtp.t38_options->T38FaxMaxBuffer = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_MAX_DATAGRAM: + { + term->u.rtp.t38_options->T38FaxMaxDatagram = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_UDP_EC: + { + switch(f->u.val.val) + { + case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_FEC: + { + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPNoEC"); + break; + } + case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_RED: + { + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPRedundancy") ; + break; + } + } + break; + } + case CM_SDP_ATTR_T38_FAX_UNKNOWN: + { + if(f->u.unknown.name.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : name[len=%d, value=%s] \n", + f->u.unknown.name.len,(char*)f->u.unknown.name.val); + } + if(f->u.unknown.val.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : value[len=%d, value=%s] \n", + f->u.unknown.val.len,(char*)f->u.unknown.val.val); + } + break; + } + + default: + break; } - /* filling default values */ - if(NULL == term->u.rtp.t38_options){ - term->u.rtp.t38_options = - switch_core_alloc(term->pool, sizeof *term->u.rtp.t38_options); - } + +#if 0 term->u.rtp.t38_options->T38FaxVersion = 0x01; term->u.rtp.t38_options->T38MaxBitRate = 14400; term->u.rtp.t38_options->T38FaxRateManagement = @@ -844,6 +874,7 @@ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) term->u.rtp.t38_options->T38FaxUdpEC = switch_core_strdup(term->pool,"t38UDPRedundancy") ; //term->u.rtp.t38_options->T38VendorInfo = +#endif break; } @@ -2072,7 +2103,6 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ { CmSdpU8OrNil *fmt = NULL; CmSdpInfoSet *psdp = NULL; - CmSdpInfoSet *pRsdp = NULL; char* ipAddress[4]; int i = 0x00; int j = 0x00; @@ -2124,38 +2154,6 @@ switch_status_t mg_build_sdp(MgMgcoMediaDesc* out, MgMgcoMediaDesc* inc, megaco_ } } -if(remote && (NOTPRSNT != remote->sdp.numComp.pres) && (0 != remote->sdp.numComp.val)){ -pRsdp = &(remote->sdp); -for(i=0; i< pRsdp->numComp.val; i++) { -/* fill media descriptors */ -{ -CmSdpMediaDescSet* med = &pRsdp->info[pRsdp->numComp.val-1]->mediaDescSet; -CmSdpMediaDesc* media; - -if((NOTPRSNT != med->numComp.pres) || (0 != med->numComp.val)){ - for(j =0;j < med->numComp.val; j++){ - media = med->mediaDesc[j]; - - /* check for codec */ -if((NOTPRSNT != media->field.par.numProtFmts.pres) || - (0 != media->field.par.numProtFmts.val)){ - for(k =0;k < media->field.par.numProtFmts.val; k++){ -format = media->field.par.pflst[k]; -if ((NOTPRSNT != format->protType.pres) && - (CM_SDP_MEDIA_PROTO_UDPTL == format->protType.val)){ -/* ideally whatever is received we can send back * -* due to issue in trillium , we need to manually copy the fields now */ - mgco_fill_t38_sdp_attr(&media->attrSet, term, memCp); -} -} -} -} -} -} -/**********************************************************************************************************************************/ -} -} - if(!local || (NOTPRSNT == local->sdp.numComp.pres) || (0 == local->sdp.numComp.val)){ /* local sdp is not part of media descriptor, then add local sdp*/ @@ -2277,11 +2275,6 @@ if ((NOTPRSNT != format->protType.pres) && return SWITCH_STATUS_FALSE; } } -}else if ((NOTPRSNT != format->protType.pres) && - (CM_SDP_MEDIA_PROTO_UDPTL == format->protType.val)){ -/* ideally whatever is received we can send back * -* due to issue in trillium , we need to manually copy the fields now */ - mgco_fill_t38_sdp_attr(&media->attrSet, term, memCp); } } } From bb0187ba9462db626c02dae4925036f20b6e5cfb Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 10 Aug 2012 12:23:03 -0400 Subject: [PATCH 418/493] fixing issue --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3590762cb5..3b12dadfeb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -143,6 +143,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) /* A UUID is present, check if the channel still exists */ switch_core_session_t *session; if ((session = switch_core_session_locate(term->uuid))) { + switch_channel_t *channel = switch_core_session_get_channel(session); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "command", "media_modify"); switch_core_session_receive_event(session, &var_event); @@ -373,6 +374,7 @@ void megaco_termination_destroy(mg_termination_t *term) free(term->active_events); term->active_events = NULL; } + term->context = NULL; switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); @@ -412,6 +414,7 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination return SWITCH_STATUS_FALSE; } + term->context = ctx; if (ctx->terminations[0]) { ctx->terminations[1] = term; } else if (ctx->terminations[1]) { From 53543aa72d164d2fb524a84d53d9ba305fed9ddd Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 10 Aug 2012 12:24:33 -0400 Subject: [PATCH 419/493] matt code changes --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 3 ++- .../mod_media_gateway/media_gateway_cmd_handler.c | 10 ++++++++-- src/mod/endpoints/mod_sofia/rtp.c | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3590762cb5..78c0d40099 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -374,6 +374,7 @@ void megaco_termination_destroy(mg_termination_t *term) term->active_events = NULL; } + switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); @@ -427,7 +428,7 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination if (zstr(ctx->terminations[1]->uuid)) { megaco_activate_termination(ctx->terminations[1]); } - + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bridging: %s (%s) <> %s (%s)\n", ctx->terminations[0]->name, ctx->terminations[0]->uuid, ctx->terminations[1]->name, ctx->terminations[1]->uuid); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 4e93abbf11..5aa1abb4a2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2879,8 +2879,14 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n request.transId.val = get_txn_id(); request.contextId.type.pres = PRSNT_NODEF; - request.contextId.type.val = MGT_CXTID_NULL; - + if(term->context){ + printf("Temrination is in context, adding context-id[%d]\n",term->context->context_id); + request.contextId.type.val = MGT_CXTID_OTHER; + request.contextId.val.pres = PRSNT_NODEF; + request.contextId.val.val = term->context->context_id; + } else{ + request.contextId.type.val = MGT_CXTID_NULL; + } request.cmdStatus.pres = PRSNT_NODEF; request.cmdStatus.val = CH_CMD_STATUS_END_OF_TXN; diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 9f0bc0147f..4eb43b146c 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -220,7 +220,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi rate, ptime, 1, - /*SWITCH_CODEC_FLAG_ENCODE |*/ SWITCH_CODEC_FLAG_DECODE, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; @@ -231,7 +231,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi rate, ptime, 1, - SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; From 7cbdc67b0cd0155f937305b078c62adbc1956ea1 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 10 Aug 2012 13:40:27 -0400 Subject: [PATCH 420/493] wait for it... --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 12 ++++++------ src/mod/endpoints/mod_sofia/rtp.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 134b609a27..3652946bce 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -127,8 +127,8 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kCODEC, term->u.rtp.codec); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kMEDIATYPE, mg_media_type2str(term->u.rtp.media_type)); - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "fax_enable_t38", "true"); - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway peer nocng"); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "fax_enable_t38", "true"); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway peer nocng"); } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); @@ -143,14 +143,14 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) /* A UUID is present, check if the channel still exists */ switch_core_session_t *session; if ((session = switch_core_session_locate(term->uuid))) { - switch_channel_t *channel = switch_core_session_get_channel(session); + switch_channel_t *channel = switch_core_session_get_channel(session); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "command", "media_modify"); - switch_core_session_receive_event(session, &var_event); - - if (term->u.rtp.t38_options) { + if (term->u.rtp.t38_options) { switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); } + + switch_core_session_receive_event(session, &var_event); switch_core_session_rwunlock(session); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 4eb43b146c..d6284cc20a 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -509,7 +509,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } if (compare_var(event, channel, kRFC2833PT)) { - const char *szpt = switch_channel_get_variable(channel, kRFC2833PT); + const char *szpt = switch_event_get_header(event, kRFC2833PT); int pt = !zstr(szpt) ? atoi(szpt) : 0; tech_pvt->rfc2833_pt = pt; @@ -525,7 +525,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } if (compare_var(event, channel, kMEDIATYPE)) { - const char *newmode = switch_channel_get_variable(channel, kMEDIATYPE); + const char *newmode = switch_event_get_header(event, kMEDIATYPE); if (!strcmp(newmode, "image")) { switch_channel_set_variable(tech_pvt->channel, "has_t38", "true"); From a8c545d3768f88480438b113b6313f902ada3a83 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 13 Aug 2012 10:44:28 -0400 Subject: [PATCH 421/493] removing sdp port check, filling local sdp port always --- src/mod/endpoints/mod_media_gateway/media_gateway_utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 143af18d36..783e126ae4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -2223,7 +2223,8 @@ if((NOTPRSNT == med->numComp.pres) || (0 == med->numComp.val)){ media = med->mediaDesc[j]; /* check for choose port and fill the port */ if(NOTPRSNT != media->field.id.type.pres){ - if(CM_SDP_VCID_CHOOSE == media->field.id.type.val){ + //if(CM_SDP_VCID_CHOOSE == media->field.id.type.val) + { MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); From 1bd4655a41b10a8ac76d246d570217f275dda4ba Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Mon, 13 Aug 2012 13:39:29 -0400 Subject: [PATCH 422/493] don't honor park_after_bridge or transfer_after_bridge if CF_REDIRECT or CF_TRANSFER is set --- src/switch_ivr_bridge.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 4af0dbb8ff..bc5c24e5f0 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -654,9 +654,11 @@ static switch_status_t audio_bridge_on_exchange_media(switch_core_session_t *ses state = switch_channel_get_state(channel); - if (state < CS_HANGUP && switch_true(switch_channel_get_variable(channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) { + if (state < CS_HANGUP && !switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_REDIRECT) && + switch_true(switch_channel_get_variable(channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) { switch_ivr_park_session(session); - } else if (state < CS_HANGUP && (var = switch_channel_get_variable(channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) { + } else if (state < CS_HANGUP && !switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_REDIRECT) && + (var = switch_channel_get_variable(channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) { transfer_after_bridge(session, var); } else { if (!switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_REDIRECT) && From 35126a3593cf824faf84c51096eed8ed16b5c3a7 Mon Sep 17 00:00:00 2001 From: kapil Date: Mon, 13 Aug 2012 15:29:01 -0400 Subject: [PATCH 423/493] fixing T38 issue --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- .../endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 3 ++- src/mod/endpoints/mod_sofia/rtp.c | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 3652946bce..e3d9d7aafe 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -128,7 +128,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kMEDIATYPE, mg_media_type2str(term->u.rtp.media_type)); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "fax_enable_t38", "true"); - switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway peer nocng"); + switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway self nocng"); } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5aa1abb4a2..890d375df1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1200,8 +1200,9 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand if(MG_TERM_RTP == term->type){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" - " local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " + " Media_Type(%s),local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", + mg_media_type2str(term->u.rtp.media_type), ((NULL != term->u.rtp.local_addr)?term->u.rtp.local_addr:NULL), term->u.rtp.local_port, ((NULL != term->u.rtp.remote_addr)?term->u.rtp.remote_addr:NULL), diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index d6284cc20a..a773a07590 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -529,8 +529,9 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi if (!strcmp(newmode, "image")) { switch_channel_set_variable(tech_pvt->channel, "has_t38", "true"); - switch_channel_set_app_flag_key("T38", tech_pvt->channel, CF_APP_T38); switch_channel_execute_on(tech_pvt->channel, "rtp_execute_on_image"); + switch_channel_set_app_flag_key("T38", tech_pvt->channel, CF_APP_T38); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got IMAGE description\n"); } @@ -571,6 +572,7 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s case SWITCH_MESSAGE_INDICATE_UDPTL_MODE: { switch_t38_options_t *t38_options = switch_channel_get_private(tech_pvt->channel, "t38_options"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "SWITCH_MESSAGE_INDICATE_UDPTL_MODE\n"); if (!t38_options) { goto end; } From cc45f89dabbe264787dc73161adc18461c32ecea Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 13 Aug 2012 19:32:24 -0400 Subject: [PATCH 424/493] mid code changes as per modified xml --- .../mod_media_gateway/media_gateway_xml.c | 63 +++++++++++++++---- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 65b9e8b393..4d1269fea7 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -12,7 +12,8 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) ; static switch_xml_config_item_t *get_peer_instructions(mg_peer_profile_t *profile) ; static int mg_sap_id; -static switch_status_t modify_mid(char** pmid); +static switch_status_t modify_mg_profile_mid(megaco_profile_t *profile, char** pmid) ; +static switch_status_t modify_mg_peer_mid(mg_peer_profile_t *peer_profile, char** pmid) ; /****************************************************************************************************************************/ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) @@ -59,7 +60,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->total_peers++; } - if(SWITCH_STATUS_FALSE == (status = modify_mid(&profile->mid))){ + if(SWITCH_STATUS_FALSE == (status = modify_mg_profile_mid(profile, &profile->mid))){ goto done; } @@ -176,7 +177,7 @@ else goto done; } - if (SWITCH_STATUS_FALSE == (status = modify_mid(&peer_profile->mid))) { + if (SWITCH_STATUS_FALSE == (status = modify_mg_peer_mid(peer_profile, &peer_profile->mid))) { goto done; } @@ -287,6 +288,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { 9 }; +#if 0 static switch_xml_config_enum_item_t opt_default_codec_enum[] = { { "PCMA", MEGACO_CODEC_PCMA}, { "PCMU", MEGACO_CODEC_PCMU}, @@ -294,6 +296,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { { "G.723.1", MEGACO_CODEC_G723_1}, { "ILBC", MEGACO_CODEC_ILBC }, }; +#endif switch_xml_config_item_t instructions[] = { /* parameter name type reloadable pointer default value options structure */ @@ -304,10 +307,10 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("domain-name", SWITCH_CONFIG_STRING, 0, &profile->my_domain, "", &switch_config_string_strdup, "", "domain name"), SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "message identifier "), - SWITCH_CONFIG_ITEM("default-codec", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->default_codec, "PCMU", &opt_default_codec_enum, "", "default codec"), + //SWITCH_CONFIG_ITEM("default-codec", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->default_codec, "PCMU", &opt_default_codec_enum, "", "default codec"), SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), - SWITCH_CONFIG_ITEM("rtp-termination-id-len", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), + SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; @@ -318,22 +321,57 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { } /****************************************************************************************************************************/ - -static switch_status_t modify_mid(char** pmid) +static switch_status_t modify_mg_peer_mid(mg_peer_profile_t *peer_profile, char** pmid) { char* mid = *pmid; - char* dup; - char* val[10]; - int count; - switch_status_t status = SWITCH_STATUS_FALSE; switch_assert(mid); + switch_assert(peer_profile); + if(!strcasecmp(mid,"IP-PORT")){ + *pmid = switch_mprintf("[%s]:%s", peer_profile->ipaddr,peer_profile->port); + } else if(!strcasecmp(mid,"IP")){ + *pmid = switch_mprintf("[%s]", peer_profile->ipaddr); + }else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Invalid mid-type[%s] \n",mid); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Updated PEER MID [%s] \n",*pmid); + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t modify_mg_profile_mid(megaco_profile_t *profile, char** pmid) +{ + char* mid = *pmid; + //char* dup; + //char* val[10]; +// int count; + //switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_assert(mid); + switch_assert(profile); + + if(!strcasecmp(mid,"IP-PORT")){ + *pmid = switch_mprintf("[%s]:%s", profile->my_ipaddr,profile->port); + } else if(!strcasecmp(mid,"IP")){ + *pmid = switch_mprintf("[%s]", profile->my_ipaddr); + } else if(!strcasecmp(mid,"DOMAIN")){ + *pmid = switch_mprintf("<%s>", profile->my_domain); + }else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Invalid mid-type[%s] \n",mid); + return SWITCH_STATUS_FALSE; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Updated MG MID [%s] \n",*pmid); + return SWITCH_STATUS_SUCCESS; +#if 0 dup = strdup(mid); /* If MID type is IP then add mid into [] brackets , * If MID type is domain then add mid into <> brackets * */ + + count = switch_split(dup, '.', val); if(!count) { @@ -367,9 +405,10 @@ static switch_status_t modify_mid(char** pmid) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added proper brackets to MID = %s \n",mid); - status = SWITCH_STATUS_SUCCESS; + done: return status; +#endif } From 94f0196a9e4f35dfaa0cee4ac124f6d7d5fb01a7 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 14 Aug 2012 13:27:39 -0400 Subject: [PATCH 425/493] adding code for FAX connection change and ANSAM notify message --- .../media_gateway_cmd_handler.c | 134 +++++++++++++++++- 1 file changed, 132 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 890d375df1..53d6775a69 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2662,8 +2662,49 @@ switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile ) /*****************************************************************************************************************************/ /* API to send T.38 CNG tone Notification */ +switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, const char* term_name) +{ + MgMgcoObsEvt *oevt; + MgMgcoEvtPar* param; -switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char* term_name) + switch_assert(term_name); + switch_assert(mg_profile); + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_FAX); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_REQEVTIPFAXFAXCONNSTATECHNG); + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[0]; + + MG_INIT_TOKEN_VALUE(&(param->type),(U8)MGT_EVTPAR_OTHER); + + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val), MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNG); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGCONNECTED); + + return mg_send_notify(mg_profile, term_name, oevt); +} +switch_status_t mg_send_t38_v21flag_notify(megaco_profile_t* mg_profile, const char* term_name) { MgMgcoObsEvt *oevt; MgMgcoEvtPar* param; @@ -2701,11 +2742,100 @@ switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); - MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPV21FLG); return mg_send_notify(mg_profile, term_name, oevt); } + +switch_status_t mg_send_t38_ans_notify(megaco_profile_t* mg_profile, const char* term_name) +{ + MgMgcoObsEvt *oevt; + MgMgcoEvtPar* param; + + switch_assert(term_name); + switch_assert(mg_profile); + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_CALL_TYP_DISCR); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[0]; + + MG_INIT_TOKEN_VALUE(&(param->type),(U8)MGT_EVTPAR_OTHER); + + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val), MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYP); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); + //MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPANSBAR); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPANSAM); + + + return mg_send_notify(mg_profile, term_name, oevt); +} + +switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char* term_name) +{ + MgMgcoObsEvt *oevt; + MgMgcoEvtPar* param; + + switch_assert(term_name); + switch_assert(mg_profile); + + + mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); + + oevt->pres.pres = PRSNT_NODEF; + + mg_get_time_stamp(&oevt->time); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.pkgType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.valType), MGT_PKG_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->pkg.u.val), MGT_PKG_CALL_TYP_DISCR); + + MG_INIT_TOKEN_VALUE(&(oevt->name.type),MGT_GEN_TYPE_KNOWN); + + MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + + if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } + + param = oevt->pl.parms[0]; + + MG_INIT_TOKEN_VALUE(&(param->type),(U8)MGT_EVTPAR_OTHER); + + MG_INIT_TOKEN_VALUE(&(param->u.other.name.type),MGT_GEN_TYPE_KNOWN); + MG_INIT_TOKEN_VALUE(&(param->u.other.name.u.val), MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYP); + + MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); + + return mg_send_notify(mg_profile, term_name, oevt); +} /*****************************************************************************************************************************/ /* API to send DTMF Digits Notification */ From 76edb0b94ed2289d393c5de1bdb553e9a18f99c9 Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 14 Aug 2012 15:41:05 -0400 Subject: [PATCH 426/493] add ced detection --- src/mod/applications/mod_spandsp/mod_spandsp_fax.c | 12 ++++++++---- src/mod/endpoints/mod_media_gateway/media_gateway.c | 1 + .../mod_media_gateway/media_gateway_stack.h | 2 ++ .../endpoints/mod_media_gateway/mod_media_gateway.c | 4 +++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c index 975aca1fc8..b79331ab15 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c @@ -2147,6 +2147,8 @@ switch_status_t spandsp_fax_detect_session(switch_core_session_t *session, switch_media_bug_flag_t bflags = 0; const char *var; switch_codec_implementation_t read_impl = { 0 }; + switch_bool_t set_private = SWITCH_TRUE; + switch_core_session_get_read_impl(session, &read_impl); if (timeout) { @@ -2154,8 +2156,9 @@ switch_status_t spandsp_fax_detect_session(switch_core_session_t *session, } if (cont) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Max Tones Reached!\n"); - return SWITCH_STATUS_FALSE; + //switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Max Tones Reached!\n"); + set_private = SWITCH_FALSE; + cont = NULL; } if (!cont && !(cont = switch_core_session_alloc(session, sizeof(*cont)))) { @@ -2218,8 +2221,9 @@ switch_status_t spandsp_fax_detect_session(switch_core_session_t *session, cont->bug_running = 0; return status; } - - switch_channel_set_private(channel, "_fax_tone_detect_", cont); + + if (set_private) + switch_channel_set_private(channel, "_fax_tone_detect_", cont); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index e3d9d7aafe..87201b4dbb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -184,6 +184,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) if (term->type == MG_TERM_TDM) { switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); } } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index d06e796c54..e603e2c531 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -168,6 +168,8 @@ switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char* term_name); +switch_status_t mg_send_t38_ans_notify(megaco_profile_t* mg_profile, const char* term_name); +switch_status_t mg_send_t38_v21flag_notify(megaco_profile_t* mg_profile, const char* term_name); switch_status_t sng_mgco_cfg(megaco_profile_t* profile); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 2afd7a778c..a905a445e1 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -39,7 +39,9 @@ SWITCH_STANDARD_APP(mg_notify_function) if (!strcmp(data, "cng")) { mg_send_t38_cng_notify(term->profile, term->name); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); - switch_channel_set_variable(channel, "mg_cng_detected", "true"); + } else if (!strcmp(data, "ced")) { + mg_send_t38_ans_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); } } From 888393fc73a9b69057a7b57c9c0feaeda300ec37 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 14 Aug 2012 15:53:51 -0400 Subject: [PATCH 427/493] adding API to send FAX state change notification --- .../media_gateway_cmd_handler.c | 24 +++++++++++++++++-- .../mod_media_gateway/media_gateway_stack.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 53d6775a69..bb1560df46 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2662,13 +2662,14 @@ switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile ) /*****************************************************************************************************************************/ /* API to send T.38 CNG tone Notification */ -switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, const char* term_name) +switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, const char* term_name, char* state) { MgMgcoObsEvt *oevt; MgMgcoEvtPar* param; switch_assert(term_name); switch_assert(mg_profile); + switch_assert(state); mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); @@ -2700,7 +2701,26 @@ switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, MG_INIT_TOKEN_VALUE(&(param->u.other.val.type),MGT_VALUE_EQUAL); MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.type),MGT_VALTYPE_ENUM); - MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGCONNECTED); + if(!strcasecmp(state,"connected")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGCONNECTED); + } else if(!strcasecmp(state,"negotiating")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGNEGOTIATING); + } else if(!strcasecmp(state,"disconnect")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGDISCONNECT); + } else if(!strcasecmp(state,"prepare")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGPREPARE); + } else if(!strcasecmp(state,"TrainR")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGTRAINR); + } else if(!strcasecmp(state,"TrainT")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGTRAINT); + } else if(!strcasecmp(state,"EOP")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGEOP); + } else if(!strcasecmp(state,"ProcInterrupt")){ + MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGPROCINTR); + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid input state[%s] param\n", state); + return SWITCH_STATUS_FALSE; + } return mg_send_notify(mg_profile, term_name, oevt); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index d06e796c54..cac19d255d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -216,6 +216,7 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const char* term_name, int wild); switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_name, MgMgcoObsEvt* oevt); +switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, const char* term_name, char* state); switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* term_name, char* digits, int num_of_collected_digits); switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile); void mg_print_t38_attributes(mg_termination_t* term); From bd84a23f518f047a34df2c15f2bbd348c20120dc Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 14 Aug 2012 16:22:31 -0400 Subject: [PATCH 428/493] set tdm pre buffer len to 200ms by default, and set it to 0 before fax calls --- libs/freetdm/mod_freetdm/tdm.c | 37 +++++++++++++- .../mod_media_gateway/media_gateway.c | 49 ++++++++++++++++--- .../mod_media_gateway/media_gateway_xml.c | 8 +++ .../mod_media_gateway/mod_media_gateway.h | 7 ++- 4 files changed, 91 insertions(+), 10 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 7f44b640a9..1b401d364c 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -39,6 +39,7 @@ void ctdm_init(switch_loadable_module_interface_t *module_interface); #define kSPAN_ID "span" #define kCHAN_ID "chan" #define kSPAN_NAME "span_name" +#define kPREBUFFER_LEN "prebuffer_len" static struct { switch_memory_pool_t *pool; @@ -52,6 +53,7 @@ typedef struct { switch_core_session_t *session; switch_codec_t read_codec, write_codec; switch_frame_t read_frame; + int prebuffer_len; unsigned char databuf[SWITCH_RECOMMENDED_BUFFER_SIZE]; } ctdm_private_t; @@ -66,6 +68,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id); static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id); static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); +static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event); static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf); @@ -81,7 +84,8 @@ switch_io_routines_t ctdm_io_routines = { .outgoing_channel = channel_outgoing_channel, .read_frame = channel_read_frame, .write_frame = channel_write_frame, - .receive_message = channel_receive_message + .receive_message = channel_receive_message, + .receive_event = channel_receive_event }; static void ctdm_report_alarms(ftdm_channel_t *channel) @@ -293,7 +297,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_originate_flag_t flags, switch_call_cause_t *cancel_cause) { const char *szchanid = switch_event_get_header(var_event, kCHAN_ID), - *span_name = switch_event_get_header(var_event, kSPAN_NAME); + *span_name = switch_event_get_header(var_event, kSPAN_NAME), + *szprebuffer_len = switch_event_get_header(var_event, kPREBUFFER_LEN); int chan_id; int span_id; switch_caller_profile_t *caller_profile; @@ -341,6 +346,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi tech_pvt->session = *new_session; tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf); tech_pvt->read_frame.data = tech_pvt->databuf; + tech_pvt->prebuffer_len = zstr(szprebuffer_len) ? 0 : atoi(szprebuffer_len); switch_core_session_set_private(*new_session, tech_pvt); @@ -363,6 +369,11 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi return SWITCH_STATUS_GENERR; } + if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n"); + return SWITCH_STATUS_GENERR; + } + switch(codec) { case FTDM_CODEC_ULAW: { @@ -623,3 +634,25 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s return SWITCH_STATUS_SUCCESS; } +static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event) +{ + const char *command = switch_event_get_header(event, "command"); + ctdm_private_t *tech_pvt = switch_core_session_get_private(session); + + if (!zstr(command) && !strcasecmp(command, kPREBUFFER_LEN)) { + const char *szval = switch_event_get_header(event, kPREBUFFER_LEN); + int val = !zstr(szval) ? atoi(szval) : 0; + + if (tech_pvt->prebuffer_len == val) { + tech_pvt->prebuffer_len = val; + if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n"); + return SWITCH_STATUS_GENERR; + } + } + } + + + return SWITCH_STATUS_SUCCESS; +} + diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 87201b4dbb..7387343d52 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -134,6 +134,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kSPAN_NAME, term->u.tdm.span_name); switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kCHAN_ID, "%d", term->u.tdm.channel); + switch_event_add_header(var_event, SWITCH_STACK_BOTTOM, kPREBUFFER_LEN, "%d", term->profile->tdm_pre_buffer_size); } /* Set common variables on the channel */ @@ -146,9 +147,15 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_channel_t *channel = switch_core_session_get_channel(session); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "command", "media_modify"); - if (term->u.rtp.t38_options) { - switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); - } + if (term->type == MG_TERM_RTP) { + if (term->u.rtp.t38_options) { + switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); + } + + if (term->u.rtp.media_type == MGM_IMAGE) { + mg_term_set_pre_buffer_size(term, 0); + } + } switch_core_session_receive_event(session, &var_event); @@ -176,10 +183,10 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) channel = switch_core_session_get_channel(session); switch_channel_set_private(channel, PVT_MG_TERM, term); - if (term->u.rtp.t38_options) { - switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); - } - + if (term->type == MG_TERM_RTP && term->u.rtp.t38_options) { + switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); + } + switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); if (term->type == MG_TERM_TDM) { @@ -724,6 +731,34 @@ switch_status_t megaco_peer_profile_destroy(mg_peer_profile_t **profile) return SWITCH_STATUS_SUCCESS; } +void mg_term_set_pre_buffer_size(mg_termination_t *term, int newval) +{ + switch_event_t *event = NULL, *event2 = NULL; + switch_core_session_t *session, *session2; + + if (!zstr(term->uuid) && (session = switch_core_session_locate(term->uuid))) { + switch_event_create(&event, SWITCH_EVENT_CLONE); + + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "command", kPREBUFFER_LEN); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, kPREBUFFER_LEN, "%d", newval); + + /* Propagate event to bridged session if there is one */ + if (switch_core_session_get_partner(session, &session2) == SWITCH_STATUS_SUCCESS) { + switch_event_dup(&event2, event); + switch_core_session_receive_event(session2, &event2); + switch_core_session_rwunlock(session2); + } + + switch_core_session_receive_event(session, &event); + switch_core_session_rwunlock(session); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent prebuffer_size event to [%s] to [%d ms]\n", term->uuid, newval); + } + +done: + switch_event_destroy(&event); +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 4d1269fea7..d2c0e991b4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -288,6 +288,13 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { 9 }; + static switch_xml_config_int_options_t pre_buffer_len = { + SWITCH_TRUE, /* enforce min */ + 0, + SWITCH_TRUE, /* enforce Max */ + 10000 + }; + #if 0 static switch_xml_config_enum_item_t opt_default_codec_enum[] = { { "PCMA", MEGACO_CODEC_PCMA}, @@ -311,6 +318,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), + SWITCH_CONFIG_ITEM("rtp-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 200, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 62c1367f6f..15f1cf7bed 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -87,7 +87,7 @@ typedef struct mg_context_s mg_context_t; #define kSPAN_ID "span" #define kCHAN_ID "chan" #define kSPAN_NAME "span_name" - +#define kPREBUFFER_LEN "prebuffer_len" typedef struct mg_termination_s mg_termination_t; @@ -200,6 +200,7 @@ struct megaco_profile_s { char* rtp_port_range; char* rtp_termination_id_prefix; int rtp_termination_id_len; + int tdm_pre_buffer_size; char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ char* codec_prefs; int inact_tmr; /* inactivity timer value */ @@ -267,6 +268,7 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile); uint32_t mg_rtp_request_id(megaco_profile_t *profile); void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id); +void mg_term_set_pre_buffer_size(mg_termination_t *term, int newval); mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id); mg_context_t *megaco_choose_context(megaco_profile_t *profile); @@ -295,6 +297,9 @@ switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term); switch_status_t megaco_check_tdm_termination(mg_termination_t *term); + + + #endif /* MOD_MEGACO_H */ From f86ac6bcbc5bcc8c12fde7ded0a0223935ec968b Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 14 Aug 2012 16:25:38 -0400 Subject: [PATCH 429/493] s/rtp/tdm/g --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index d2c0e991b4..0c960ea827 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -318,7 +318,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), - SWITCH_CONFIG_ITEM("rtp-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 200, &pre_buffer_len, "", "freetdm pre buffer size"), + SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 200, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; From 29ec19e2945c6349e583dacfbc549c117879b9fb Mon Sep 17 00:00:00 2001 From: kapil Date: Tue, 14 Aug 2012 17:27:16 -0400 Subject: [PATCH 430/493] fix warning --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 7387343d52..0eca234419 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -755,7 +755,6 @@ void mg_term_set_pre_buffer_size(mg_termination_t *term, int newval) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent prebuffer_size event to [%s] to [%d ms]\n", term->uuid, newval); } -done: switch_event_destroy(&event); } From f51c7ee8240239e20aefeac95cf72b385562e97e Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 15 Aug 2012 00:12:15 -0400 Subject: [PATCH 431/493] Set the pre buffer to ZERO by default. This feature has not been tested yet, it cannot be set on by default. --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 0c960ea827..4bd0115c51 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -318,7 +318,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), - SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 200, &pre_buffer_len, "", "freetdm pre buffer size"), + SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; From 5bda7c6f862652460229829d1058cda59afafc5f Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 15 Aug 2012 10:24:37 -0400 Subject: [PATCH 432/493] making pre buffer size def value to 0 --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 0c960ea827..4bd0115c51 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -318,7 +318,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), - SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 200, &pre_buffer_len, "", "freetdm pre buffer size"), + SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() }; From 9ef68f1b910c88896d4eef6b7a01ac5752c2bf50 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Wed, 15 Aug 2012 11:30:12 -0400 Subject: [PATCH 433/493] return the right status in megaco_activate_termination() --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 0eca234419..2d32568f6c 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -203,7 +203,7 @@ done: } switch_event_destroy(&var_event); - return SWITCH_STATUS_SUCCESS; + return status; } switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term) From 85dfa04240578023a432b53fe222c92905230297 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 15 Aug 2012 13:31:31 -0400 Subject: [PATCH 434/493] issue fixes --- .../mod_media_gateway/media_gateway.c | 7 ++- .../media_gateway_cmd_handler.c | 56 +++++++++---------- .../media_gateway_packages.c | 5 ++ 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 2d32568f6c..f1abe47bb7 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -413,6 +413,7 @@ switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term) { + switch_status_t status = SWITCH_STATUS_SUCCESS; switch_assert(ctx != NULL); switch_assert(term != NULL); @@ -434,12 +435,14 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination if (ctx->terminations[0] && ctx->terminations[1]) { if (zstr(ctx->terminations[0]->uuid)) { - megaco_activate_termination(ctx->terminations[0]); + status = megaco_activate_termination(ctx->terminations[0]); } if (zstr(ctx->terminations[1]->uuid)) { - megaco_activate_termination(ctx->terminations[1]); + status = megaco_activate_termination(ctx->terminations[1]); } + if(SWITCH_STATUS_SUCCESS != status) return status; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bridging: %s (%s) <> %s (%s)\n", ctx->terminations[0]->name, ctx->terminations[0]->uuid, ctx->terminations[1]->name, ctx->terminations[1]->uuid); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index bb1560df46..eedd19a218 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -729,20 +729,9 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_print_t38_attributes(term); - /* TODO - locally assigned SDP must be the part of termination...which we can use to fill responses*/ - /********************************************************************/ - /* Matt - to provide the response SDP structure which needs to fill in ADD command response */ - - /* Matt - to indicate if there is any failure while processing add message */ - - /* Kapil - to return error if there is any failure based on Matt's indication */ - - /* Kapil - to fill the response structure and call the response API to send ADD response */ - - /*************************************************************************************************************************/ - /* sample resp code -- begin */ + /* resp code -- begin */ { MgMgcoCommand rsp; int ret = 0x00; @@ -1050,6 +1039,13 @@ error: sng_mgco_send_err(mg_profile->idx, mgErr); } mg_free_cmd(inc_cmd); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); + if(mg_ctxt){ + megaco_release_context(mg_ctxt); + } + if(term){ + megaco_termination_destroy(term); + } return SWITCH_STATUS_FALSE; } @@ -1127,8 +1123,6 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* check if we have ito packg request */ mg_is_ito_pkg_req(mg_profile, inc_cmd); - /* TODO */ - /********************************************************************/ } else if(MGT_TERMID_OTHER == termId->type.val){ /********************************************************************/ @@ -1194,7 +1188,6 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ mg_util_set_err_string(&errTxt, " Unsupported Codec "); err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; - /* TODO delete RTP termination */ goto error; } @@ -1219,21 +1212,15 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* SDP updated to termination */ - megaco_activate_termination(term); + if(SWITCH_STATUS_SUCCESS != megaco_activate_termination(term)) { + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + } } - /* TODO - copy inc descriptor...not sure if we need to do this.. */ - /********************************************************************/ - /* Matt - to provide the response SDP structure which needs to fill in Modify command response */ - - /* Matt - to indicate if there is any failure while processing add message */ - - /* Kapil - to return error if there is any failure based on Matt's indication */ - - /* Kapil - to fill the response structure and call the response API to send Modify response */ - response: { /* send response */ @@ -1272,9 +1259,10 @@ response: #endif /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - if((MG_TERM_RTP == term->type) && - ((NOTPRSNT != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.pres) && - (0 != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.val))) { + if((MGT_TERMID_ROOT != termId->type.val) && + (term && (MG_TERM_RTP == term->type) && + ((NOTPRSNT != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.pres) && + (0 != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.val)))) { /* Whatever Media descriptor we have received, we can copy that and then * whatever we want we can modify the fields */ /* Kapil - TODO - will see if there is any problem of coping the @@ -1335,6 +1323,14 @@ error: sng_mgco_send_err(mg_profile->idx, mgErr); } mg_free_cmd(inc_cmd); + + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Modify Request failed..releasing context/termination \n"); + if(mg_ctxt){ + megaco_release_context(mg_ctxt); + } + if(term){ + megaco_termination_destroy(term); + } return SWITCH_STATUS_FALSE; } @@ -3030,7 +3026,7 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n request.transId.val = get_txn_id(); request.contextId.type.pres = PRSNT_NODEF; - if(term->context){ + if(term && term->context){ printf("Temrination is in context, adding context-id[%d]\n",term->context->context_id); request.contextId.type.val = MGT_CXTID_OTHER; request.contextId.val.pres = PRSNT_NODEF; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c index 7d40a64b19..febc587f76 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c @@ -138,6 +138,11 @@ MgPackage_t mg_pkg_list [] = 1, /* Version 1 */ "ipfax", /* Package name */ }, + { /* INDEX : 26 */ + MGT_PKG_FAX, + 1, /* Version 1 */ + "fax", /* Package name */ + }, /* Add more packages */ }; From 4f8e843610871275d00e3ce4cd868beaa013d201 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 15 Aug 2012 14:26:09 -0400 Subject: [PATCH 435/493] adding code to check return type of "ftdm_start_span" API --- libs/freetdm/mod_freetdm/mod_freetdm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index a746c1877f..2ee1f20824 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -3558,7 +3558,10 @@ static switch_status_t load_config(void) switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan)); switch_copy_string(SPAN_CONFIG[span_id].type, "Sangoma (SS7)", sizeof(SPAN_CONFIG[span_id].type)); ftdm_log(FTDM_LOG_DEBUG, "Configured ss7 FreeTDM span %d with config node %s\n", span_id, configname); - ftdm_span_start(span); + if(FTDM_SUCCESS != ftdm_span_start(span)){ + CONFIG_ERROR("Error Starting ss7 FreeTDM span %d\n", span_id); + continue; + } } } From fd39c5b44a4698fde9efe1331b8cf66571aa2fb4 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 15 Aug 2012 16:11:13 -0400 Subject: [PATCH 436/493] renaming CONFIG_ERROR macro to LOAD_ERROR --- libs/freetdm/mod_freetdm/mod_freetdm.c | 94 +++++++++++++------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 2ee1f20824..b5b35da2eb 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -2828,7 +2828,7 @@ static uint32_t enable_analog_option(const char *str, uint32_t current_options) } -#define CONFIG_ERROR(...) { \ +#define LOAD_ERROR(...) { \ ftdm_log(FTDM_LOG_ERROR, __VA_ARGS__); \ globals.config_error = 1; \ } @@ -3162,7 +3162,7 @@ static int add_profile_parameters(switch_xml_t cfg, const char *profname, ftdm_c profnode = switch_xml_child(cfg, "config_profiles"); if (!profnode) { - CONFIG_ERROR("cannot find profile '%s', there is no 'config_profiles' XML section\n", profname); + LOAD_ERROR("cannot find profile '%s', there is no 'config_profiles' XML section\n", profname); return 0; } @@ -3178,7 +3178,7 @@ static int add_profile_parameters(switch_xml_t cfg, const char *profname, ftdm_c } if (!profile) { - CONFIG_ERROR("failed to find profile '%s'\n", profname); + LOAD_ERROR("failed to find profile '%s'\n", profname); return 0; } @@ -3213,7 +3213,7 @@ static void parse_gsm_spans(switch_xml_t cfg, switch_xml_t spans) unsigned paramindex = 0; if (!name && !id) { - CONFIG_ERROR("GSM span missing required attribute 'id' or 'name', skipping ...\n"); + LOAD_ERROR("GSM span missing required attribute 'id' or 'name', skipping ...\n"); continue; } @@ -3231,7 +3231,7 @@ static void parse_gsm_spans(switch_xml_t cfg, switch_xml_t spans) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3254,7 +3254,7 @@ static void parse_gsm_spans(switch_xml_t cfg, switch_xml_t spans) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for GSM span, ignoring any parameter after %s\n", var); + LOAD_ERROR("Too many parameters for GSM span, ignoring any parameter after %s\n", var); break; } @@ -3273,7 +3273,7 @@ static void parse_gsm_spans(switch_xml_t cfg, switch_xml_t spans) "gsm", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring Sangoma GSM FreeTDM span %d\n", span_id); + LOAD_ERROR("Error configuring Sangoma GSM FreeTDM span %d\n", span_id); continue; } SPAN_CONFIG[span_id].span = span; @@ -3302,7 +3302,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) unsigned paramindex = 0; if (!name && !id) { - CONFIG_ERROR("sangoma isdn span missing required attribute 'id' or 'name', skipping ...\n"); + LOAD_ERROR("sangoma isdn span missing required attribute 'id' or 'name', skipping ...\n"); continue; } @@ -3320,7 +3320,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3348,7 +3348,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); + LOAD_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); break; } @@ -3378,10 +3378,10 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) int calls; int seconds; if (sscanf(val, "%d/%d", &calls, &seconds) != 2) { - CONFIG_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); + LOAD_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); } else { if (calls < 1 || seconds < 1) { - CONFIG_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); + LOAD_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); } else { SPAN_CONFIG[span_id].limit_calls = calls; SPAN_CONFIG[span_id].limit_seconds = seconds; @@ -3391,7 +3391,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) if (!strcasecmp(val, "answer")) { SPAN_CONFIG[span_id].limit_reset_event = FTDM_LIMIT_RESET_ON_ANSWER; } else { - CONFIG_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); + LOAD_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); } } else { spanparameters[paramindex].var = var; @@ -3404,7 +3404,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans) "sangoma_isdn", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring Sangoma ISDN FreeTDM span %d\n", span_id); + LOAD_ERROR("Error configuring Sangoma ISDN FreeTDM span %d\n", span_id); continue; } SPAN_CONFIG[span_id].span = span; @@ -3481,11 +3481,11 @@ static switch_status_t load_config(void) uint32_t span_id = 0; unsigned paramindex = 0; if (!name && !id) { - CONFIG_ERROR("ss7 span missing required attribute 'id' or 'name', skipping ...\n"); + LOAD_ERROR("ss7 span missing required attribute 'id' or 'name', skipping ...\n"); continue; } if (!configname) { - CONFIG_ERROR("ss7 span missing required attribute, skipping ...\n"); + LOAD_ERROR("ss7 span missing required attribute, skipping ...\n"); continue; } if (name) { @@ -3502,7 +3502,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3512,7 +3512,7 @@ static switch_status_t load_config(void) ss7confnode = _get_ss7_config_node(cfg, configname, operating_mode); if (!ss7confnode) { - CONFIG_ERROR("Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); + LOAD_ERROR("Error finding ss7config '%s' for FreeTDM span id: %s\n", configname, switch_str_nil(id)); continue; } @@ -3531,7 +3531,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); + LOAD_ERROR("Too many parameters for ss7 span, ignoring any parameter after %s\n", var); break; } @@ -3550,7 +3550,7 @@ static switch_status_t load_config(void) "sangoma_ss7", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring ss7 FreeTDM span %d\n", span_id); + LOAD_ERROR("Error configuring ss7 FreeTDM span %d\n", span_id); continue; } SPAN_CONFIG[span_id].span = span; @@ -3559,7 +3559,7 @@ static switch_status_t load_config(void) switch_copy_string(SPAN_CONFIG[span_id].type, "Sangoma (SS7)", sizeof(SPAN_CONFIG[span_id].type)); ftdm_log(FTDM_LOG_DEBUG, "Configured ss7 FreeTDM span %d with config node %s\n", span_id, configname); if(FTDM_SUCCESS != ftdm_span_start(span)){ - CONFIG_ERROR("Error Starting ss7 FreeTDM span %d\n", span_id); + LOAD_ERROR("Error Starting ss7 FreeTDM span %d\n", span_id); continue; } } @@ -3605,7 +3605,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3639,10 +3639,10 @@ static switch_status_t load_config(void) int calls; int seconds; if (sscanf(val, "%d/%d", &calls, &seconds) != 2) { - CONFIG_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); + LOAD_ERROR("Invalid %s parameter, format example: 3/1 for 3 calls per second\n", var); } else { if (calls < 1 || seconds < 1) { - CONFIG_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); + LOAD_ERROR("Invalid %s parameter value, minimum call limit must be 1 per second\n", var); } else { SPAN_CONFIG[span_id].limit_calls = calls; SPAN_CONFIG[span_id].limit_seconds = seconds; @@ -3652,7 +3652,7 @@ static switch_status_t load_config(void) if (!strcasecmp(val, "answer")) { SPAN_CONFIG[span_id].limit_reset_event = FTDM_LIMIT_RESET_ON_ANSWER; } else { - CONFIG_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); + LOAD_ERROR("Invalid %s parameter value, only accepted event is 'answer'\n", var); } } else if (!strcasecmp(var, "dial-regex")) { dial_regex = val; @@ -3682,7 +3682,7 @@ static switch_status_t load_config(void) } if (!id && !name) { - CONFIG_ERROR("span missing required param 'id'\n"); + LOAD_ERROR("span missing required param 'id'\n"); continue; } @@ -3712,7 +3712,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3733,7 +3733,7 @@ static switch_status_t load_config(void) "callwaiting", &callwaiting, "wait_dialtone_timeout", &dialtone_timeout, FTDM_TAG_END) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring FreeTDM analog span %s\n", ftdm_span_get_name(span)); + LOAD_ERROR("Error configuring FreeTDM analog span %s\n", ftdm_span_get_name(span)); continue; } @@ -3809,7 +3809,7 @@ static switch_status_t load_config(void) } if (!id && !name) { - CONFIG_ERROR("span missing required param 'id'\n"); + LOAD_ERROR("span missing required param 'id'\n"); continue; } @@ -3841,7 +3841,7 @@ static switch_status_t load_config(void) } if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); + LOAD_ERROR("Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name)); continue; } @@ -3855,7 +3855,7 @@ static switch_status_t load_config(void) "digit_timeout", &to, "max_dialstr", &max, FTDM_TAG_END) != FTDM_SUCCESS) { - CONFIG_ERROR("Error starting FreeTDM span %d\n", span_id); + LOAD_ERROR("Error starting FreeTDM span %d\n", span_id); continue; } @@ -3892,7 +3892,7 @@ static switch_status_t load_config(void) uint32_t span_id = 0; if (!name) { - CONFIG_ERROR("span missing required attribute 'name'\n"); + LOAD_ERROR("span missing required attribute 'name'\n"); continue; } @@ -3903,7 +3903,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var); + LOAD_ERROR("Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var); break; } @@ -3925,13 +3925,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span %s\n", name); + LOAD_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "isdn", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); + LOAD_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -3958,7 +3958,7 @@ static switch_status_t load_config(void) int span_id = 0; if (!name) { - CONFIG_ERROR("span missing required attribute 'name'\n"); + LOAD_ERROR("span missing required attribute 'name'\n"); continue; } @@ -3969,7 +3969,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var); + LOAD_ERROR("Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var); break; } @@ -3986,13 +3986,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span %s\n", name); + LOAD_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "pritap", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); + LOAD_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -4018,7 +4018,7 @@ static switch_status_t load_config(void) uint32_t span_id = 0; if (!name) { - CONFIG_ERROR("span missing required attribute 'name'\n"); + LOAD_ERROR("span missing required attribute 'name'\n"); continue; } @@ -4029,7 +4029,7 @@ static switch_status_t load_config(void) char *val = (char *) switch_xml_attr_soft(param, "value"); if (ftdm_array_len(spanparameters) - 1 == paramindex) { - CONFIG_ERROR("Too many parameters for libpri span, ignoring everything after '%s'\n", var); + LOAD_ERROR("Too many parameters for libpri span, ignoring everything after '%s'\n", var); break; } @@ -4051,13 +4051,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM span %s\n", name); + LOAD_ERROR("Error finding FreeTDM span %s\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "libpri", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring FreeTDM span %s\n", name); + LOAD_ERROR("Error configuring FreeTDM span %s\n", name); continue; } @@ -4088,7 +4088,7 @@ static switch_status_t load_config(void) unsigned paramindex = 0; if (!name) { - CONFIG_ERROR("'name' attribute required for R2 spans!\n"); + LOAD_ERROR("'name' attribute required for R2 spans!\n"); continue; } @@ -4123,13 +4123,13 @@ static switch_status_t load_config(void) zstatus = ftdm_span_find_by_name(name, &span); if (zstatus != FTDM_SUCCESS) { - CONFIG_ERROR("Error finding FreeTDM R2 Span '%s'\n", name); + LOAD_ERROR("Error finding FreeTDM R2 Span '%s'\n", name); continue; } span_id = ftdm_span_get_id(span); if (ftdm_configure_span_signaling(span, "r2", on_r2_signal, spanparameters) != FTDM_SUCCESS) { - CONFIG_ERROR("Error configuring FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); + LOAD_ERROR("Error configuring FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); continue; } @@ -4147,7 +4147,7 @@ static switch_status_t load_config(void) switch_copy_string(SPAN_CONFIG[span_id].type, "R2", sizeof(SPAN_CONFIG[span_id].type)); if (ftdm_span_start(span) == FTDM_FAIL) { - CONFIG_ERROR("Error starting FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); + LOAD_ERROR("Error starting FreeTDM R2 span %s, error: %s\n", name, ftdm_span_get_last_error(span)); continue; } } From a7d51f5f4fb2639e0b748025d16b2f113b8dce3f Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 16 Aug 2012 01:28:32 -0400 Subject: [PATCH 437/493] turn on echo cancellation and turn it off in mg_notify --- libs/freetdm/mod_freetdm/tdm.c | 40 ++++++++++++++----- .../mod_media_gateway/media_gateway.c | 28 +++++++++++++ .../mod_media_gateway/mod_media_gateway.c | 10 +++-- .../mod_media_gateway/mod_media_gateway.h | 2 + 4 files changed, 66 insertions(+), 14 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 1b401d364c..30cc3e4307 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -40,6 +40,8 @@ void ctdm_init(switch_loadable_module_interface_t *module_interface); #define kCHAN_ID "chan" #define kSPAN_NAME "span_name" #define kPREBUFFER_LEN "prebuffer_len" +#define kECHOCANCEL "echo_cancel" + static struct { switch_memory_pool_t *pool; @@ -373,6 +375,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n"); return SWITCH_STATUS_GENERR; } + + if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to set enable echo cancellation.\n"); + } switch(codec) { case FTDM_CODEC_ULAW: @@ -476,6 +482,10 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) ctdm_private_t *tech_pvt = switch_core_session_get_private(session); if ((tech_pvt = switch_core_session_get_private(session))) { + + if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to enable echo cancellation.\n"); + } if (tech_pvt->read_codec.implementation) { switch_core_codec_destroy(&tech_pvt->read_codec); @@ -639,20 +649,28 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi const char *command = switch_event_get_header(event, "command"); ctdm_private_t *tech_pvt = switch_core_session_get_private(session); - if (!zstr(command) && !strcasecmp(command, kPREBUFFER_LEN)) { - const char *szval = switch_event_get_header(event, kPREBUFFER_LEN); - int val = !zstr(szval) ? atoi(szval) : 0; + if (!zstr(command)) { + if (!strcasecmp(command, kPREBUFFER_LEN)) { + const char *szval = switch_event_get_header(event, kPREBUFFER_LEN); + int val = !zstr(szval) ? atoi(szval) : 0; - if (tech_pvt->prebuffer_len == val) { - tech_pvt->prebuffer_len = val; - if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n"); - return SWITCH_STATUS_GENERR; - } - } + if (tech_pvt->prebuffer_len == val) { + tech_pvt->prebuffer_len = val; + if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n"); + return SWITCH_STATUS_GENERR; + } + } + } else if (!strcasecmp(command, kECHOCANCEL)) { + const char *szval = switch_event_get_header(event, kECHOCANCEL); + int enabled = !!switch_true(szval); + + if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, enabled ? FTDM_COMMAND_ENABLE_ECHOCANCEL : FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to %s echo cancellation.\n", enable ? "enable" : "disable"); + } + } } - return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index f1abe47bb7..aedf4e0abc 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -761,6 +761,34 @@ void mg_term_set_pre_buffer_size(mg_termination_t *term, int newval) switch_event_destroy(&event); } + +void mg_term_set_ec(mg_termination_t *term, int enable) +{ + switch_event_t *event = NULL, *event2 = NULL; + switch_core_session_t *session, *session2; + + if (!zstr(term->uuid) && (session = switch_core_session_locate(term->uuid))) { + switch_event_create(&event, SWITCH_EVENT_CLONE); + + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "command", kECHOCANCEL); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, kECHOCANCEL, enable ? "true" : "false"); + + /* Propagate event to bridged session if there is one */ + if (switch_core_session_get_partner(session, &session2) == SWITCH_STATUS_SUCCESS) { + switch_event_dup(&event2, event); + switch_core_session_receive_event(session2, &event2); + switch_core_session_rwunlock(session2); + } + + switch_core_session_receive_event(session, &event); + switch_core_session_rwunlock(session); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent echo_cancel event to [%s] to [%s]\n", term->uuid, enable ? "enable" : "disable"); + } + + switch_event_destroy(&event); +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index a905a445e1..bc50ddc165 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -35,13 +35,17 @@ SWITCH_STANDARD_APP(mg_notify_function) switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "mg_notify called on a non-supported channel.\n"); return; } - + if (!strcmp(data, "cng")) { mg_send_t38_cng_notify(term->profile, term->name); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); + /* Disable echo cancellation */ + mg_term_set_ec(term, 0); } else if (!strcmp(data, "ced")) { - mg_send_t38_ans_notify(term->profile, term->name); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); + mg_send_t38_ans_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); + /* Disable echo cancellation */ + mg_term_set_ec(term, 0); } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 15f1cf7bed..a3d8c2fc04 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -88,6 +88,7 @@ typedef struct mg_context_s mg_context_t; #define kCHAN_ID "chan" #define kSPAN_NAME "span_name" #define kPREBUFFER_LEN "prebuffer_len" +#define kECHOCANCEL "echo_cancel" typedef struct mg_termination_s mg_termination_t; @@ -269,6 +270,7 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile); uint32_t mg_rtp_request_id(megaco_profile_t *profile); void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id); void mg_term_set_pre_buffer_size(mg_termination_t *term, int newval); +void mg_term_set_ec(mg_termination_t *term, int enable); mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id); mg_context_t *megaco_choose_context(megaco_profile_t *profile); From e07d588d10f3232bca76ff8e8a9a6af80205a29b Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Thu, 16 Aug 2012 01:29:43 -0400 Subject: [PATCH 438/493] turn on echo cancellation and turn it off in mg_notify --- libs/freetdm/mod_freetdm/tdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 30cc3e4307..6c8657a4c9 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -666,7 +666,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi int enabled = !!switch_true(szval); if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, enabled ? FTDM_COMMAND_ENABLE_ECHOCANCEL : FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to %s echo cancellation.\n", enable ? "enable" : "disable"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to %s echo cancellation.\n", enabled ? "enable" : "disable"); } } } From a24706aed65c727cb9eecc9a539b99b7956b5d75 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Thu, 16 Aug 2012 02:06:10 -0400 Subject: [PATCH 439/493] Changed EC ENABLE/DISABLE failure from ERROR to WARNING. As some installations have no ec. I will have to test without ec and confirm that we handle that case gracefully. --- libs/freetdm/mod_freetdm/tdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 6c8657a4c9..f344f5a096 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -666,7 +666,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi int enabled = !!switch_true(szval); if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, enabled ? FTDM_COMMAND_ENABLE_ECHOCANCEL : FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to %s echo cancellation.\n", enabled ? "enable" : "disable"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to %s echo cancellation.\n", enabled ? "enable" : "disable"); } } } From 583bd7a8112ae65604bae09dc118d072a8848bb3 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 16 Aug 2012 16:42:17 -0400 Subject: [PATCH 440/493] Added debugging to confirm echo_cancel event works --- libs/freetdm/mod_freetdm/tdm.c | 8 ++++++++ .../endpoints/mod_media_gateway/mod_media_gateway.c | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 6c8657a4c9..ed0d00a1c3 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -650,6 +650,9 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi ctdm_private_t *tech_pvt = switch_core_session_get_private(session); if (!zstr(command)) { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM received %s command \n",command); + if (!strcasecmp(command, kPREBUFFER_LEN)) { const char *szval = switch_event_get_header(event, kPREBUFFER_LEN); int val = !zstr(szval) ? atoi(szval) : 0; @@ -664,10 +667,15 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } else if (!strcasecmp(command, kECHOCANCEL)) { const char *szval = switch_event_get_header(event, kECHOCANCEL); int enabled = !!switch_true(szval); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM sending echo cancel [%s] command \n",enabled ? "enable" : "disable"); if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, enabled ? FTDM_COMMAND_ENABLE_ECHOCANCEL : FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to %s echo cancellation.\n", enabled ? "enable" : "disable"); } + + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM received unknown command [%s] \n",command); } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index bc50ddc165..bcc3d3cdd8 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -39,13 +39,13 @@ SWITCH_STANDARD_APP(mg_notify_function) if (!strcmp(data, "cng")) { mg_send_t38_cng_notify(term->profile, term->name); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); - /* Disable echo cancellation */ - mg_term_set_ec(term, 0); + /* Disable echo cancellation */ + mg_term_set_ec(term, 0); } else if (!strcmp(data, "ced")) { - mg_send_t38_ans_notify(term->profile, term->name); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); - /* Disable echo cancellation */ - mg_term_set_ec(term, 0); + mg_send_t38_ans_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); + /* Disable echo cancellation */ + mg_term_set_ec(term, 0); } } From f3160f9ecf227cd32d028a1df8117f2d722c7592 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 16 Aug 2012 19:06:49 -0400 Subject: [PATCH 441/493] freetdm: ss7 - Fix bug where TDM alarms are not delivered when the span is in M2UA mode --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index ab74a9830a..fbc74d66cb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -423,6 +423,9 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj) /**********************************************************************/ } check_span_oob_events(ftdmspan); + + /* signal the core that sig events are queued for processing */ + ftdm_span_trigger_signals(ftdmspan); } goto ftdm_sangoma_ss7_stop; } From b3992ceda9b7bd89001f8d03cefae46f397e1520 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 16 Aug 2012 19:33:44 -0400 Subject: [PATCH 442/493] removing "rtp-port-range" field --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 4bd0115c51..d9f0de9803 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -315,7 +315,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("message-identifier", SWITCH_CONFIG_STRING, 0, &profile->mid, "", &switch_config_string_strdup, "", "message identifier "), //SWITCH_CONFIG_ITEM("default-codec", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->default_codec, "PCMU", &opt_default_codec_enum, "", "default codec"), - SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), + //SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), From 3eba8a79405096d3d8f844f8e094c5d6fee032be Mon Sep 17 00:00:00 2001 From: Kapil Date: Fri, 17 Aug 2012 16:10:05 -0400 Subject: [PATCH 443/493] returing proper status from megaco_context_add_termination API --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index aedf4e0abc..cad73bd4aa 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -435,14 +435,16 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination if (ctx->terminations[0] && ctx->terminations[1]) { if (zstr(ctx->terminations[0]->uuid)) { - status = megaco_activate_termination(ctx->terminations[0]); + if(SWITCH_STATUS_SUCCESS != (status = megaco_activate_termination(ctx->terminations[0]))){ + return status; + } } if (zstr(ctx->terminations[1]->uuid)) { - status = megaco_activate_termination(ctx->terminations[1]); + if(SWITCH_STATUS_SUCCESS != (status = megaco_activate_termination(ctx->terminations[1]))){ + return status; + } } - if(SWITCH_STATUS_SUCCESS != status) return status; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bridging: %s (%s) <> %s (%s)\n", ctx->terminations[0]->name, ctx->terminations[0]->uuid, ctx->terminations[1]->name, ctx->terminations[1]->uuid); From 12e61692dd9af265cb77448a74a584f09ab53d37 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 17 Aug 2012 19:05:12 -0400 Subject: [PATCH 444/493] adding signaling FTDM_SIGTYPE_M2UA type --- libs/freetdm/src/ftdm_io.c | 3 ++- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c | 5 +++++ libs/freetdm/src/include/private/ftdm_types.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 6bc5471e5a..5f89067304 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1470,7 +1470,8 @@ FT_DECLARE(ftdm_status_t) ftdm_group_channel_use_count(ftdm_group_t *group, uint static __inline__ int chan_is_avail(ftdm_channel_t *check) { - if (check->span->signal_type == FTDM_SIGTYPE_NONE) { + if ((check->span->signal_type == FTDM_SIGTYPE_M2UA) || + (check->span->signal_type == FTDM_SIGTYPE_NONE)) { if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fbc74d66cb..55b95f6acf 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -2552,6 +2552,11 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config) return FTDM_FAIL; } + if(SNG_SS7_OPR_MODE_M2UA_SG == g_ftdm_operating_mode){ + ftdm_log (FTDM_LOG_INFO, "FreeTDM running as M2UA_SG mode, Setting Span type to FTDM_SIGTYPE_M2UA\n"); + span->signal_type = FTDM_SIGTYPE_M2UA; + } + if (ft_to_sngss7_cfg_all()) { /* configure libsngss7 */ ftdm_log (FTDM_LOG_CRIT, "Failed to configure LibSngSS7!\n"); ftdm_sleep (100); diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h index 8a0a2238de..c92164dd8c 100755 --- a/libs/freetdm/src/include/private/ftdm_types.h +++ b/libs/freetdm/src/include/private/ftdm_types.h @@ -162,6 +162,7 @@ typedef enum { FTDM_SIGTYPE_ANALOG, FTDM_SIGTYPE_SANGOMABOOST, FTDM_SIGTYPE_M3UA, + FTDM_SIGTYPE_M2UA, FTDM_SIGTYPE_R2, FTDM_SIGTYPE_SS7, FTDM_SIGTYPE_GSM From 946d45fa8e918bcdf3786b1c44a45bebd8d6da38 Mon Sep 17 00:00:00 2001 From: Kapil Date: Mon, 20 Aug 2012 09:39:08 -0400 Subject: [PATCH 445/493] fixing RTP term id allocation issue(redmine issue#5598) --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index cad73bd4aa..f501d43c3a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -608,6 +608,7 @@ uint32_t mg_rtp_request_id(megaco_profile_t *profile) for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { if ((profile->rtpid_bitmap[profile->rtpid_next % 8] & (1 << (profile->rtpid_next / 8))) == 0) { profile->rtpid_bitmap[profile->rtpid_next % 8] |= 1 << (profile->rtpid_next / 8); + profile->rtpid_next++; return profile->rtpid_next; } } From b0a823851b8e48f890955b622250687d6a32213c Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 21 Aug 2012 14:34:34 -0400 Subject: [PATCH 446/493] fixing memory leak issues --- .../mod_media_gateway/media_gateway_cli.c | 13 +++++++++ .../media_gateway_cmd_handler.c | 28 +++++++++---------- .../mod_media_gateway/media_gateway_stack.h | 2 +- .../media_gateway_stack_alarms.c | 1 + .../mod_media_gateway/media_gateway_utils.c | 13 +++++---- .../mod_media_gateway/mod_media_gateway.c | 24 ++++++++++------ 6 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 7d50ecfa19..2de8ee3ac2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -207,6 +207,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /*******************************************************************/ /* mg show alltermstatus */ handle_all_term_status_cli_cmd(stream, profile); + /*******************************************************************/ }else if(!strcasecmp(argv[3], "termstatus")){ /*******************************************************************/ /* mg show termstatus */ @@ -214,6 +215,17 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } handle_term_status_cli_cmd(stream, profile, argv[4]); + /*******************************************************************/ + }else if(!strcasecmp(argv[3], "stackmem")){ + /*******************************************************************/ + sng_mg_reg_info_show(); + /*******************************************************************/ +#ifdef LEAK_TEST + }else if(!strcasecmp(argv[3], "leak-report")){ + /*******************************************************************/ + mgPrntLeakReport(); + /*******************************************************************/ +#endif } else { /*******************************************************************/ stream->write_function(stream, "-ERR No such profile\n"); @@ -280,6 +292,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile show activecalls \n"); stream->write_function(stream, "mg profile show termstatus \n"); stream->write_function(stream, "mg profile show alltermstatus \n"); + stream->write_function(stream, "mg profile show stackmem \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index eedd19a218..c29a38f474 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -307,7 +307,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * return SWITCH_STATUS_FALSE; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); + //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); if(NOTPRSNT == desc->dl.num.pres){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); @@ -316,7 +316,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * for (descId = 0; descId < desc->dl.num.val; descId++) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); switch (desc->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { @@ -381,26 +381,26 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * case MGT_LCLCTL_MODE: { /* Mode Property */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); break; } case MGT_LCLCTL_RESVAL: { /* Reserve Value */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); break; } case MGT_LCLCTL_RESGRP: { /* Reserve group */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); break; } case MGT_LCLCTL_PROPPARM: { /* Properties (of a termination) */ /* Matt - See how we can apply this to a termination */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); break; } default: @@ -578,7 +578,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * */ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, MgMgcoContextId* new_ctxtId) { - switch_status_t ret; + switch_status_t ret; MgMgcoContextId *ctxtId; MgStr errTxt; MgMgcoInd *mgErr; @@ -597,7 +597,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i MgMgcoLocalDesc *local = NULL; /*CmSdpInfoSet *psdp = NULL;*/ - /* TODO - Kapil dummy line , will need to add with proper code */ inc_med_desc = &cmd->dl.descs[0]->u.media; @@ -771,6 +770,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i }else{ /* ADD request is for RTP term we need to create termination */ + /* Grow the list of reply parameters */ if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms, sizeof(MgMgcoTermId), &rsp.u.mgCmdRsp[0]->u.add.termIdLst.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) @@ -781,6 +781,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[rsp.u.mgCmdRsp[0]->u.add.termIdLst.num.val-1]; mg_fill_mgco_termid(out_termId, (char*)term->name, strlen((char*)term->name), &rsp.u.mgCmdRsp[0]->memCp); + } if(is_rtp){ @@ -796,6 +797,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i return SWITCH_STATUS_FALSE; } + /* copy media descriptor */ desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; desc->type.pres = PRSNT_NODEF; @@ -812,6 +814,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } + /* only for RTP */ if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ @@ -821,6 +824,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } } + #if 0 if(is_rtp){ mg_build_sdp(desc, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); @@ -1026,7 +1030,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); return ret; - } /* sample resp code -- end */ /*************************************************************************************************************************/ @@ -1038,7 +1041,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); if(mg_ctxt){ megaco_release_context(mg_ctxt); @@ -1322,7 +1324,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Modify Request failed..releasing context/termination \n"); if(mg_ctxt){ @@ -1538,7 +1539,6 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - mg_free_cmd(inc_cmd); return SWITCH_STATUS_FALSE; } @@ -1973,8 +1973,6 @@ error: sng_mgco_send_err(mg_profile->idx, mgErr); } - /* deallocate the msg */ - mg_free_cmd(auditReq); return SWITCH_STATUS_FALSE; } @@ -2588,7 +2586,7 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_ svc = &request.u.mgCmdReq[0]->cmd.u.svc; - if(SWITCH_STATUS_FALSE == (ret = mg_fill_svc_change(&svc->parm, method, mg_service_change_reason[reason]))){ + if(SWITCH_STATUS_FALSE == (ret = mg_fill_svc_change(&svc->parm, method, mg_service_change_reason[reason], &request.u.mgCmdReq[0]->memCp))){ return ret; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index bce041f6ac..785cfdff63 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -207,7 +207,7 @@ switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp); -switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason); +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason,CmMemListCp *memCp); void mg_fill_null_context(MgMgcoContextId* ctxt); switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild); switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index f392203db1..6cba35d7c9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -218,6 +218,7 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) case LMG_EVENT_PEER_ENABLED: { len = len + sprintf(prBuf+len, "gateway enabled"); + /* gateway enabled now we can send termination service change for all terminations */ mgco_init_ins_service_change( usta->t.usta.alarmInfo.sapId ); break; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 783e126ae4..766b948f48 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -15,8 +15,8 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) { Mem sMem; - sMem.region = 0; - sMem.pool = 0; + sMem.region = S_REG; + sMem.pool = S_POOL; if ( _memSize <= 0 ) { @@ -119,8 +119,8 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->name.pres.pres = PRSNT_NODEF; termId->name.lcl.pres = PRSNT_NODEF; termId->name.lcl.len = term_len; - /*MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret);*/ - ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); + MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret); + //ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); if( ret != ROK) RETVALUE(ret); @@ -1554,8 +1554,9 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm } /*****************************************************************************************************************************/ -switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason) +switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason, CmMemListCp *memCp) { + S16 ret = ROK; MG_SET_TKN_VAL_PRES(&srvPar->pres, 0, PRSNT_NODEF); MG_SET_TKN_VAL_PRES(&srvPar->meth.pres, 0, PRSNT_NODEF); MG_SET_TKN_VAL_PRES(&srvPar->meth.type, method, PRSNT_NODEF); @@ -1564,7 +1565,7 @@ switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, c srvPar->reason.pres = PRSNT_NODEF; srvPar->reason.len = cmStrlen((const U8 *)reason); - mg_stack_alloc_mem((Ptr*)&srvPar->reason.val, srvPar->reason.len); + MG_GETMEM(srvPar->reason.val, srvPar->reason.len , memCp, ret); if (NULL == srvPar->reason.val) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index bcc3d3cdd8..e86f813b18 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -475,8 +475,10 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) int count; int err_code; megaco_profile_t* mg_profile; + char prnt_buf[128]; memset(&out_ctxt,0,sizeof(out_ctxt)); + memset(&prnt_buf,0,sizeof(prnt_buf)); inc_context = &cmd->contextId; memcpy(&out_ctxt, inc_context,sizeof(MgMgcoContextId)); @@ -486,7 +488,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*get mg profile associated with SuId */ if(NULL == (mg_profile = megaco_get_profile_by_suId(suId))){ - goto error1; + goto done; } /* first thing - restart ito timer */ @@ -555,7 +557,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) (MGT_TERMID_OTHER == termId->type.val) && (MGT_AUDITVAL != cmd->u.mgCmdInd[0]->cmd.type.val)){ if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n", (char*)termId->name.lcl.val); + snprintf(prnt_buf,termId->name.lcl.len,"%s",(char*)termId->name.lcl.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n",(strlen(prnt_buf))?prnt_buf:"NULL"); mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; @@ -591,7 +594,6 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /*mgAccEvntPrntMgMgcoCommand(cmd, stdout);*/ - switch(cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -784,12 +786,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) /* END OF TXN received - means last command in txn to process. * Send response to peer */ - if(CH_CMD_TYPE_IND == cmd->cmdType.val){ + if(CH_CMD_TYPE_IND == cmd->cmdType.val){ /*if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val)*/ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } - return; + goto done; ctxt_error: err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; @@ -802,9 +804,13 @@ error: if(CH_CMD_STATUS_END_OF_TXN == cmd->cmdStatus.val){ mg_send_end_of_axn(suId, &cmd->transId, &out_ctxt, &cmd->peerId); } -error1: - mg_free_cmd(cmd); - return; +done: + if(CH_CMD_TYPE_IND == cmd->cmdType.val){ + mg_free_cmd(cmd->u.mgCmdReq[0]); + }else if(CH_CMD_TYPE_CFM == cmd->cmdType.val){ + mg_free_cmd(cmd->u.mgCmdCfm[0]); + } + return; } /*****************************************************************************************************************************/ @@ -822,6 +828,8 @@ void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* txn_sta_ind) /*dump information*/ mgAccEvntPrntMgMgcoInd(txn_sta_ind, stdout); + + mg_free_cmd(txn_sta_ind); } /*****************************************************************************************************************************/ From 39390f4f267398c237e3cee060431c9b53710f55 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 21 Aug 2012 17:03:23 -0400 Subject: [PATCH 447/493] removing "rtp-termination-id-length" from xml parsing, field no more required --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index d9f0de9803..6161794d0e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -317,7 +317,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { //SWITCH_CONFIG_ITEM("default-codec", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->default_codec, "PCMU", &opt_default_codec_enum, "", "default codec"), //SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), - SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), + //SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM_END() From 6c6af2ee59b79fc56f6380b31b43f7e5effda4b4 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 21 Aug 2012 19:24:43 -0400 Subject: [PATCH 448/493] fixing warning --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 6161794d0e..6b4e5f7c9f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -281,12 +281,14 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { 3 }; +#if 0 static switch_xml_config_int_options_t opt_termination_id_len = { SWITCH_TRUE, /* enforce min */ 1, SWITCH_TRUE, /* enforce Max */ 9 }; +#endif static switch_xml_config_int_options_t pre_buffer_len = { SWITCH_TRUE, /* enforce min */ From fad4444203a5641e125450b72548ff9a18f34d63 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 22 Aug 2012 09:04:14 -0400 Subject: [PATCH 449/493] fixing memory leak issue for audit request --- .../media_gateway_cmd_handler.c | 2 +- .../mod_media_gateway/media_gateway_stack.h | 2 +- .../mod_media_gateway/media_gateway_utils.c | 16 ++++++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index c29a38f474..2c30bc6bd0 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1857,7 +1857,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_MEDIADESC; - media = get_default_media_desc(mg_profile, termId); + media = get_default_media_desc(mg_profile, termId, &reply.u.mgCmdRsp[0]->memCp); if(!media){ return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 785cfdff63..3943101285 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -186,7 +186,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *cmd); switch_status_t mg_stack_free_mem(void* msg); switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ); -MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId); +MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId, CmMemListCp *memCp); switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq); switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req); S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 766b948f48..dc6312ca91 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -1478,13 +1478,14 @@ void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId) "info, error-text is: %s\n", __PRETTY_FUNCTION__,errTxt->val); } /*****************************************************************************************************************************/ -MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId) +MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTermId* termId, CmMemListCp *memCp) { MgMgcoMediaDesc *media = NULL; MgMgcoMediaPar *mediaPar = NULL; MgMgcoTermStateParm *trmStPar = NULL; + S16 ret = ROK; - mg_stack_alloc_mem((Ptr)&media, sizeof(MgMgcoMediaDesc)); + MG_GETMEM(media, sizeof(MgMgcoMediaDesc) , memCp, ret); if (!media) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); @@ -1492,14 +1493,15 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm } media->num.pres = PRSNT_NODEF; media->num.val = 1; - mg_stack_alloc_mem((Ptr)&mediaPar, sizeof(MgMgcoMediaPar)); + + MG_GETMEM(mediaPar, sizeof(MgMgcoMediaPar) , memCp, ret); if (!mediaPar) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem(media); return NULL; } - mg_stack_alloc_mem((Ptr)&media->parms, sizeof(MgMgcoMediaPar *)); + MG_GETMEM(media->parms, sizeof(MgMgcoMediaPar*) , memCp, ret); if (!media->parms) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); @@ -1511,7 +1513,8 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm mediaPar->type.val = MGT_MEDIAPAR_TERMST; mediaPar->u.tstate.numComp.pres = PRSNT_NODEF; mediaPar->u.tstate.numComp.val = 1; - mg_stack_alloc_mem((Ptr)&trmStPar, sizeof(MgMgcoTermStateParm)); + + MG_GETMEM(trmStPar, sizeof(MgMgcoTermStateParm) , memCp, ret); if (!trmStPar) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); @@ -1520,7 +1523,8 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm mg_stack_free_mem((void*)media); return NULL; } - mg_stack_alloc_mem((Ptr)&mediaPar->u.tstate.trmStPar, sizeof(MgMgcoTermStateParm *)); + MG_GETMEM(mediaPar->u.tstate.trmStPar, sizeof(MgMgcoTermStateParm *) , memCp, ret); + if (!mediaPar->u.tstate.trmStPar) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem((void*)trmStPar); From 4a1c7bcf70db60184eadb3a0cc43142047dbb2b8 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 22 Aug 2012 10:58:13 -0400 Subject: [PATCH 450/493] memory leak fixes --- .../mod_media_gateway/media_gateway.c | 4 +- .../media_gateway_cmd_handler.c | 70 +++++++++++-------- .../media_gateway_packages.c | 4 +- .../mod_media_gateway/media_gateway_stack.h | 21 +++++- .../mod_media_gateway/media_gateway_utils.c | 2 +- 5 files changed, 67 insertions(+), 34 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index f501d43c3a..54a8fbe3fb 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -379,8 +379,8 @@ void megaco_termination_destroy(mg_termination_t *term) } if(term->active_events){ - free(term->active_events); - term->active_events = NULL; + mgUtlDelMgMgcoReqEvtDesc(term->active_events); + MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); } term->context = NULL; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 2c30bc6bd0..a1712fc672 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -476,31 +476,33 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * { MgMgcoReqEvtDesc* evt = &desc->dl.descs[descId]->u.evts; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Event descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG," Requested Event descriptor\n"); /* If we receive events from MGC , means clear any ongoing events */ /* as such we dont apply any events to term, so for us (as of now) clear events means clear active_events structure*/ if(NULL != term->active_events){ - mgUtlDelMgMgcoReqEvtDesc(term->active_events); - free(term->active_events); - term->active_events = NULL; + mgUtlDelMgMgcoReqEvtDesc(term->active_events); + MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); } - term->active_events = malloc(sizeof(*term->active_events)); - + MG_STACK_MEM_ALLOC(&term->active_events, sizeof(MgMgcoReqEvtDesc)); + + if(NULL == term->active_events){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," term->active_events Memory Alloc failed \n"); + return SWITCH_STATUS_FALSE; + } + /* copy requested event */ if(RFAILED == mgUtlCpyMgMgcoReqEvtDesc(term->active_events, evt, NULLP)){ - free(term->active_events); - term->active_events = NULL; + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," copy new events to term->active_events failed \n"); + MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); return SWITCH_STATUS_FALSE; } /* print Requested event descriptor */ - mgAccEvntPrntMgMgcoReqEvtDesc(term->active_events, stdout); + /*mgAccEvntPrntMgMgcoReqEvtDesc(term->active_events, stdout);*/ - /* TODO - We can check for it/ito package*/ - break; } case MGT_SIGNALSDESC: @@ -508,7 +510,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * MgMgcoSignalsDesc* sig = &desc->dl.descs[descId]->u.sig; MgMgcoSignalsParm* param = NULL; int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Signal descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG," Requested Signal descriptor\n"); if((NOTPRSNT != sig->pres.pres) && (NOTPRSNT != sig->num.pres) && (0 != sig->num.val)){ @@ -760,7 +762,8 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i if(!is_rtp){ /* IF ADD request is for Physical term then we can simply copy incoming * termination */ - mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + mgUtlCpyMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst, &rsp.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; @@ -1041,12 +1044,14 @@ error: mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); - if(mg_ctxt){ - megaco_release_context(mg_ctxt); - } - if(term){ - megaco_termination_destroy(term); + if(err_code != MGT_MGCO_RSP_CODE_DUP_TERM_CTXT){ + switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); + if(mg_ctxt){ + megaco_release_context(mg_ctxt); + } + if(term){ + megaco_termination_destroy(term); + } } return SWITCH_STATUS_FALSE; } @@ -1252,7 +1257,9 @@ response: rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; - mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + + mgUtlCpyMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst, &rsp.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 termId = rsp.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; @@ -1509,7 +1516,8 @@ response: rsp.u.mgCmdRsp[0]->wild.pres = PRSNT_NODEF; } - mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst); + mgUtlCpyMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.add.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.add.termIdLst, &rsp.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; @@ -1582,7 +1590,8 @@ switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); + mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; @@ -1724,6 +1733,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand uint8_t wild = 0x00; memset(&reply, 0, sizeof(reply)); + memset(&ctxt, 0, sizeof(ctxt)); audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; wild = auditReq->u.mgCmdReq[0]->wild.pres; @@ -1818,7 +1828,8 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand adtRep->type.pres = PRSNT_NODEF; adtRep->type.val = MGT_TERMAUDIT; adtRep->u.other.pres.pres = PRSNT_NODEF; - mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + mgUtlCpyMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list, &reply.u.mgCmdRsp[0]->memCp); /* NOW for each requested AUDIT descriptor we need to add entry to adtRep->u.other.audit.parms list */ @@ -1920,7 +1931,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_PKGSDESC; - if(SWITCH_STATUS_FALSE == mg_build_pkg_desc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.pkgs)){ + if(SWITCH_STATUS_FALSE == mg_build_pkg_desc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.pkgs, &reply.u.mgCmdRsp[0]->memCp)){ return SWITCH_STATUS_FALSE; } @@ -2023,7 +2034,8 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) adtRep->type.val = MGT_TERMAUDIT; adtRep->u.other.pres.pres = PRSNT_NODEF; adtRep->u.other.audit.num.pres = 0x00; - mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); + + mgUtlCpyMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list, &reply.u.mgCmdRsp[0]->memCp); /* We will always send one command at a time..*/ @@ -2359,7 +2371,8 @@ switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst); + mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 termId = cmd.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; @@ -2427,7 +2440,8 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.pres = PRSNT_NODEF; cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.val = 1; - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst); + //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst); + mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 termId = cmd.u.mgCmdRsp[0]->u.sub.termIdLst.terms[0]; @@ -2630,7 +2644,7 @@ switch_status_t mg_send_ito_notify(megaco_profile_t* mg_profile ) { MgMgcoObsEvt *oevt; - switch_assert(mg_profile); + switch_assert(mg_profile); mg_stack_alloc_mem((Ptr*)&oevt, sizeof(MgMgcoObsEvt)); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c index febc587f76..fc86096335 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_packages.c @@ -147,7 +147,7 @@ MgPackage_t mg_pkg_list [] = }; /***************************************************************************************/ -switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg) +switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg, CmMemListCp *memCp) { uint16_t i = 0x00; uint16_t num_of_pkgs = sizeof(mg_pkg_list)/sizeof(MgPackage_t); @@ -157,7 +157,7 @@ switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg) for (i = 0; i < num_of_pkgs; i++) { if (mgUtlGrowList((void ***)&pkg->items, - sizeof(MgMgcoPkgsItem), &pkg->num, NULLP) != ROK) { + sizeof(MgMgcoPkgsItem), &pkg->num, memCp) != ROK) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Package descriptor Grow List failed\n"); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 3943101285..0b8c5746e1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -113,6 +113,25 @@ typedef enum { cmMemcpy((U8*) (_dst), (const U8*) (_src), _len) +#define MG_STACK_MEM_ALLOC(_buf, _size)\ +{\ + if (SGetSBuf(S_REG, S_POOL, (Data**) _buf, (Size) _size) == ROK){ \ + cmMemset((U8 *) *(_buf), 0, _size); \ + } else { \ + *(_buf) = NULLP; \ + } \ +} + +#define MG_STACK_MEM_FREE(_buf, _size)\ +{\ + if(_buf != NULL){ \ + (Void) SPutSBuf(S_REG, S_POOL, (Data *) _buf, (Size) _size);\ + (_buf) = NULL; \ + } \ +} + + + #define MG_INIT_TOKEN_VALUE(_tkn, _val) \ { \ (_tkn)->pres = PRSNT_NODEF; \ @@ -204,7 +223,7 @@ switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req); void mg_util_set_term_string ( MgStr *errTxt, MgMgcoTermId *termId); MgMgcoTermIdLst *mg_get_term_id_list(MgMgcoCommand *cmd); switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq); -switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg); +switch_status_t mg_build_pkg_desc(MgMgcoPkgsDesc* pkg, CmMemListCp *memCp); switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq); void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp); switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, const char *reason,CmMemListCp *memCp); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index dc6312ca91..c032ab43d8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -961,7 +961,7 @@ const char* mg_get_codec_name(megaco_profile_t* mg_profile, int iana_code) return name; } -void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmSdpAttrSet *attrSet, CmMemListCp *memCp) +void mgco_handle_sdp_media_param(CmSdpMedPar *s, mg_termination_t* term, mgco_sdp_types_e sdp_type, megaco_profile_t* mg_profile, CmSdpAttrSet *attrSet, CmMemListCp *memCp) { int i=0x00; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "***** Media Parameter *********** \n"); From a68e52fa679e9c12a5df704c5e17d38e186b23e3 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 22 Aug 2012 18:12:13 -0400 Subject: [PATCH 451/493] fixing term svc change mem leak issue --- .../mod_media_gateway/media_gateway_utils.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index c032ab43d8..916969e059 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -108,7 +108,6 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->type.pres = PRSNT_NODEF; if(!strcmp(term_str,"ROOT")){ - /* ROOT Termination */ termId->type.val = MGT_TERMID_ROOT; } else { termId->type.val = MGT_TERMID_OTHER; @@ -117,19 +116,12 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->name.dom.len = 0x00; termId->name.pres.pres = PRSNT_NODEF; - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = term_len; - MG_GETMEM(termId->name.lcl.val, termId->name.lcl.len , memCp, ret); - //ret = mg_stack_alloc_mem((Ptr*)&termId->name.lcl.val,term_len); - if( ret != ROK) - RETVALUE(ret); + MG_SET_TKNSTROSXL(termId->name.lcl,term_len,term_str,memCp); - /*cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)term_str,termId->name.lcl.len);*/ - strncpy((char*)(termId->name.lcl.val), term_str, termId->name.lcl.len); - termId->name.lcl.val[termId->name.lcl.len] = '\0'; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n",termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n", + termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); } From b0ecdfd1de649cb03e8afa394fb1297c4bdaddec Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 23 Aug 2012 09:51:33 -0400 Subject: [PATCH 452/493] printing proper termid if recv term is oos --- src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index e86f813b18..2f2666957c 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -557,7 +557,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) (MGT_TERMID_OTHER == termId->type.val) && (MGT_AUDITVAL != cmd->u.mgCmdInd[0]->cmd.type.val)){ if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ - snprintf(prnt_buf,termId->name.lcl.len,"%s",(char*)termId->name.lcl.val); + MG_MEM_COPY(&prnt_buf, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n",(strlen(prnt_buf))?prnt_buf:"NULL"); mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; From 15428bdf741e56577f6a4f76500aa09bcc69f478 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 23 Aug 2012 10:10:28 -0400 Subject: [PATCH 453/493] fixing cli profile lock issue --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 2de8ee3ac2..749054ac65 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -198,14 +198,15 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } if(profile){ - megaco_profile_release(profile); if(!strcasecmp(argv[3], "activecalls")){ /* mg show activecalls */ + megaco_profile_release(profile); handle_show_activecalls_cli_cmd(stream, profile); /*******************************************************************/ }else if(!strcasecmp(argv[3], "alltermstatus")){ /*******************************************************************/ /* mg show alltermstatus */ + megaco_profile_release(profile); handle_all_term_status_cli_cmd(stream, profile); /*******************************************************************/ }else if(!strcasecmp(argv[3], "termstatus")){ @@ -214,21 +215,25 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre if (zstr(argv[4])) { goto usage; } + megaco_profile_release(profile); handle_term_status_cli_cmd(stream, profile, argv[4]); /*******************************************************************/ }else if(!strcasecmp(argv[3], "stackmem")){ /*******************************************************************/ + megaco_profile_release(profile); sng_mg_reg_info_show(); /*******************************************************************/ #ifdef LEAK_TEST }else if(!strcasecmp(argv[3], "leak-report")){ /*******************************************************************/ + megaco_profile_release(profile); mgPrntLeakReport(); /*******************************************************************/ #endif } else { /*******************************************************************/ - stream->write_function(stream, "-ERR No such profile\n"); + stream->write_function(stream, "-ERR No such profile\n"); + goto usage; } } /**********************************************************************************/ From 33e0b7175f13e9050a3d56dc0064c0c37cca06d1 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 23 Aug 2012 10:40:48 -0400 Subject: [PATCH 454/493] error scenario , releasing context and setting null to term->context ptr --- .../endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index a1712fc672..e45fc1cda8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1047,6 +1047,10 @@ error: if(err_code != MGT_MGCO_RSP_CODE_DUP_TERM_CTXT){ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); if(mg_ctxt){ + /* we can call sub all from context api to release terminations.. + as it could possible that phy term added to context but + failure happened while adding rtp term, sub_all will release phy term also */ + megaco_context_sub_all_termination(mg_ctxt); megaco_release_context(mg_ctxt); } if(term){ From 917609df1badcf06bb1d15ec5848374da7584c8a Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 23 Aug 2012 10:59:21 -0400 Subject: [PATCH 455/493] removing "raw_ftdm_chan_open" API as we have M2UA sig type --- libs/freetdm/mod_freetdm/tdm.c | 2 +- libs/freetdm/src/ftdm_io.c | 135 ----------------------------- libs/freetdm/src/include/freetdm.h | 2 - 3 files changed, 1 insertion(+), 138 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index a97465c90f..aa787d30c4 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -334,7 +334,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); - if (ftdm_raw_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { + if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); goto fail; } diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 5f89067304..b3266e54f4 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1893,130 +1893,6 @@ done: return status; } -static ftdm_status_t _ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) -{ - ftdm_channel_t *check = NULL; - ftdm_span_t *span = NULL; - ftdm_channel_t *best_rated = NULL; - ftdm_status_t status = FTDM_FAIL; - int best_rate = 0; - - *ftdmchan = NULL; - - ftdm_mutex_lock(globals.mutex); - - ftdm_span_find(span_id, &span); - - if (!span) { - ftdm_log(FTDM_LOG_CRIT, "Could not find span!\n"); - goto done; - } - - if (!ftdm_test_flag(span, FTDM_SPAN_CONFIGURED)) { - ftdm_log(FTDM_LOG_CRIT, "Span %d is not configured\n", span_id); - goto done; - } - - if (span->channel_request) { - ftdm_log(FTDM_LOG_ERROR, "Individual channel selection not implemented on this span.\n"); - goto done; - } - - if (chan_id < 1 || chan_id > span->chan_count) { - ftdm_log(FTDM_LOG_ERROR, "Invalid channel %d to open in span %d\n", chan_id, span_id); - goto done; - } - - if (!(check = span->channels[chan_id])) { - ftdm_log(FTDM_LOG_CRIT, "Wow, no channel %d in span %d\n", chan_id, span_id); - goto done; - } - - ftdm_channel_lock(check); - - if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) { - /* let them know is already open, but return the channel anyway */ - status = FTDM_EBUSY; - *ftdmchan = check; - goto unlockchan; - } - - /* The following if's and gotos replace a big if (this || this || this || this) else { nothing; } */ - - /* if it is not a voice channel, nothing else to check to open it */ - if (!FTDM_IS_VOICE_CHANNEL(check)) { - goto openchan; - } - - /* if it's an FXS device with a call active and has callwaiting enabled, we allow to open it twice */ - if (check->type == FTDM_CHAN_TYPE_FXS - && check->token_count == 1 - && ftdm_channel_test_feature(check, FTDM_CHANNEL_FEATURE_CALLWAITING)) { - goto openchan; - } - - /* chan_is_avail API without signaling check */ - if (check->span->signal_type == FTDM_SIGTYPE_NONE) { - if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || - ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || - ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || - ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || - check->state != FTDM_CHANNEL_STATE_DOWN) { - - ftdm_log(FTDM_LOG_ERROR, "channel %d not available to open in span %d\n", chan_id, span_id); - goto done; - } - } else if (!ftdm_test_flag(check, FTDM_CHANNEL_READY) || - ftdm_test_flag(check, FTDM_CHANNEL_INUSE) || - ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) || - ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) || - check->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_log(FTDM_LOG_ERROR, "channel %d not available to open in span %d\n", chan_id, span_id); - goto done; - }else { - /* channel is ready to open */ - ftdm_log(FTDM_LOG_INFO, "channel %d available to open in span %d\n", chan_id, span_id); - goto openchan; - } - - - /* not available, but still might be available ... */ - calculate_best_rate(check, &best_rated, &best_rate); - if (best_rated) { - goto openchan; - } - - /* channel is unavailable, do not open the channel */ - goto unlockchan; - -openchan: - if (!ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) { - status = check->fio->open(check); - if (status == FTDM_SUCCESS) { - ftdm_set_flag(check, FTDM_CHANNEL_OPEN); - } - } else { - status = FTDM_SUCCESS; - } - ftdm_set_flag(check, FTDM_CHANNEL_INUSE); - ftdm_set_flag(check, FTDM_CHANNEL_OUTBOUND); - *ftdmchan = check; - - /* we've got the channel, do not unlock it */ - goto done; - -unlockchan: - ftdm_channel_unlock(check); - -done: - ftdm_mutex_unlock(globals.mutex); - if (status != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Failed to open channel %d:%d\n", span_id, chan_id); - } - - return status; -} - static ftdm_status_t _ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) { ftdm_channel_t *check = NULL; @@ -2132,17 +2008,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, return status; } -FT_DECLARE(ftdm_status_t) ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) -{ - ftdm_status_t status; - status = _ftdm_raw_channel_open(span_id, chan_id, ftdmchan); - if (status == FTDM_SUCCESS) { - ftdm_channel_t *fchan = *ftdmchan; - ftdm_channel_unlock(fchan); - } - return status; -} - FT_DECLARE(uint32_t) ftdm_channel_get_id(const ftdm_channel_t *ftdmchan) { return ftdmchan->chan_id; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index b875388ad8..e041e1f0e7 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -1374,8 +1374,6 @@ FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group); */ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); -FT_DECLARE(ftdm_status_t) ftdm_raw_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); - /*! * \brief Hunts and opens a channel specifying the span id only * From b6bd80718624b0153f4d1d560885c843e870afd1 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 23 Aug 2012 18:15:07 -0400 Subject: [PATCH 456/493] adding "peer_active" flag to check before send any message to megaco stack --- .../endpoints/mod_media_gateway/media_gateway.c | 3 +++ .../mod_media_gateway/media_gateway_cmd_handler.c | 14 ++++++++++++++ .../mod_media_gateway/mod_media_gateway.h | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 54a8fbe3fb..8105b8b158 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -637,6 +637,7 @@ switch_status_t megaco_profile_start(const char *profilename) profile->name = switch_core_strdup(pool, profilename); profile->next_context_id++; profile->inact_tmr = 0x00; + profile->peer_active = 0x00; profile->inact_tmr_task_id = 0x00; switch_thread_rwlock_create(&profile->rwlock, pool); @@ -708,6 +709,8 @@ switch_status_t mgco_init_ins_service_change(SuId suId) return SWITCH_STATUS_FALSE; } + profile->peer_active = 0x01; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "mgco_init_ins_service_change : Initiating terminations service change for profile: %s\n", profile->name); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index e45fc1cda8..9c078bec5a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -2479,6 +2479,14 @@ U32 get_txn_id(){ return outgoing_txn_id; } /*****************************************************************************************************************************/ +switch_status_t mg_is_peer_active(megaco_profile_t* profile) +{ + if((profile) && (0x01 == profile->peer_active)){ + return SWITCH_STATUS_SUCCESS; + } + return SWITCH_STATUS_FALSE; +} +/*****************************************************************************************************************************/ switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, mg_term_states_e term_state) { mg_termination_t* term = NULL; @@ -2493,6 +2501,12 @@ switch_status_t mg_send_term_service_change(char *span_name, char *chan_number, return SWITCH_STATUS_FALSE; } + if(SWITCH_STATUS_FALSE == mg_is_peer_active(term->profile)) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "profile: %s peer not yet enabled..\n", term->profile->name); + return SWITCH_STATUS_FALSE; + } + switch(term_state) { case MG_TERM_SERVICE_STATE_IN_SERVICE: diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index a3d8c2fc04..ce44617e28 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -205,6 +205,7 @@ struct megaco_profile_s { char* peer_list[MG_MAX_PEERS]; /* MGC Peer ID LIST */ char* codec_prefs; int inact_tmr; /* inactivity timer value */ + int peer_active; /* inactivity timer value */ uint32_t inact_tmr_task_id; /* FS timer scheduler task-id */ switch_thread_rwlock_t *contexts_rwlock; @@ -221,6 +222,8 @@ struct megaco_profile_s { switch_thread_rwlock_t *terminations_rwlock; }; + + static inline const char *megaco_codec_str(megaco_codec_t codec) { switch (codec) { From 377e5a736899300bc749bddd28bd70f9ff641677 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 24 Aug 2012 17:45:46 +0200 Subject: [PATCH 457/493] closes #5641 --- .../endpoints/mod_media_gateway/media_gateway.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8105b8b158..af52d17a22 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -514,11 +514,11 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) if (context_id > MG_MAX_CONTEXTS) { return NULL; } - + switch_thread_rwlock_rdlock(profile->contexts_rwlock); /* Context exists */ - if (profile->contexts_bitmap[context_id % 8] & (1 << (context_id / 8))) { + if (profile->contexts_bitmap[context_id / 8] & (1 << (context_id % 8))) { for (result = profile->contexts[context_id % MG_CONTEXT_MODULO]; result; result = result->next) { if (result->context_id == context_id) { break; @@ -544,10 +544,10 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) /* Look for an available context */ for (; profile->next_context_id < MG_MAX_CONTEXTS; profile->next_context_id++) { - if ((profile->contexts_bitmap[profile->next_context_id % 8] & (1 << (profile->next_context_id / 8))) == 0) { + if ((profile->contexts_bitmap[profile->next_context_id / 8] & (1 << (profile->next_context_id % 8))) == 0) { /* Found! */ int i = profile->next_context_id % MG_CONTEXT_MODULO; - profile->contexts_bitmap[profile->next_context_id % 8] |= 1 << (profile->next_context_id / 8); + profile->contexts_bitmap[profile->next_context_id / 8] |= 1 << (profile->next_context_id % 8); ctx = malloc(sizeof *ctx); memset(ctx, 0, sizeof *ctx); ctx->context_id = profile->next_context_id; @@ -591,7 +591,7 @@ void megaco_release_context(mg_context_t *ctx) } } - profile->contexts_bitmap[context_id % 8] &= ~(1 << (context_id / 8)); + profile->contexts_bitmap[context_id / 8] &= ~(1 << (context_id % 8)); memset(ctx, 0, sizeof *ctx); free(ctx); @@ -606,8 +606,8 @@ uint32_t mg_rtp_request_id(megaco_profile_t *profile) } for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { - if ((profile->rtpid_bitmap[profile->rtpid_next % 8] & (1 << (profile->rtpid_next / 8))) == 0) { - profile->rtpid_bitmap[profile->rtpid_next % 8] |= 1 << (profile->rtpid_next / 8); + if ((profile->rtpid_bitmap[profile->rtpid_next / 8] & (1 << (profile->rtpid_next % 8))) == 0) { + profile->rtpid_bitmap[profile->rtpid_next / 8] |= 1 << (profile->rtpid_next % 8); profile->rtpid_next++; return profile->rtpid_next; } @@ -618,7 +618,7 @@ uint32_t mg_rtp_request_id(megaco_profile_t *profile) void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id) { - profile->rtpid_bitmap[id % 8] &= ~(1 << (id / 8)); + profile->rtpid_bitmap[id / 8] &= ~(1 << (id % 8)); } switch_status_t megaco_profile_start(const char *profilename) From 22655f2644c2055d9550c3de0cc886411a442174 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Fri, 24 Aug 2012 17:47:31 +0200 Subject: [PATCH 458/493] fix leak --- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 6b4e5f7c9f..a923b8d452 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -200,6 +200,9 @@ done: if (event) { switch_event_destroy(&event); } + + switch_safe_free(instructions); + return status; } From 3acd1cc86a72ea826dd13332f85dc561a2181b53 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 24 Aug 2012 13:20:39 -0400 Subject: [PATCH 459/493] fixing term svc change issue with other minor fixes --- .../media_gateway_cmd_handler.c | 969 +++--------------- .../mod_media_gateway/media_gateway_utils.c | 103 +- .../mod_media_gateway/mod_media_gateway.c | 5 - 3 files changed, 220 insertions(+), 857 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 9c078bec5a..fbf7ffd940 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -37,7 +37,7 @@ static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) { megaco_profile_t* profile = (megaco_profile_t*) task->cmd_arg; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," mg_inactivity_timer_exp for profile[%s]\n", profile->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," mg_inactivity_timer_exp for profile[%s]\n", profile->name); mg_print_time(); mg_send_ito_notify(profile); @@ -49,7 +49,7 @@ static void mg_inactivity_timer_exp(switch_scheduler_task_t *task) /*****************************************************************************************************************************/ switch_status_t mg_activate_ito_timer(megaco_profile_t* profile) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Starting IT/ITO Timer \n"); mg_print_time(); profile->inact_tmr_task_id = switch_scheduler_add_task(switch_epoch_time_now(NULL)+profile->inact_tmr, mg_inactivity_timer_exp,"","media_gateway",0,profile,0); @@ -63,7 +63,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c int descId = 0x00; MgMgcoAmmReq* desc = NULL; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); if(CH_CMD_TYPE_IND != cmd->cmdType.val) return SWITCH_STATUS_FALSE; @@ -74,22 +74,22 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c desc = &cmd->u.mgCmdInd[0]->cmd.u.mod; if(NULL == desc){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); return SWITCH_STATUS_FALSE; } if(NOTPRSNT == desc->dl.num.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); return SWITCH_STATUS_SUCCESS; } for (descId = 0; descId < desc->dl.num.val; descId++) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); switch (desc->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Media descriptor on ROOT termination..Not Supporting now\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Media descriptor on ROOT termination..Not Supporting now\n"); break; } @@ -103,7 +103,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c /* As of now only handling ito package */ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Requested Event descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Requested Event descriptor\n"); if (evts->el.num.pres) numEvts = evts->el.num.val; @@ -143,10 +143,10 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c (reqEvtPar->u.other.val.u.eq.type.val == MGT_VALTYPE_UINT32)) { #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%d]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Received Inactivity timer value [%d]\n", reqEvtPar->u.other.val.u.eq.u.decInt.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Received Inactivity timer value [%ld]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Received Inactivity timer value [%ld]\n", reqEvtPar->u.other.val.u.eq.u.decInt.val); #endif @@ -170,7 +170,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c } case MGT_SIGNALSDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Signal descriptor on ROOT termination..Not Supporting now\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Signal descriptor on ROOT termination..Not Supporting now\n"); break; } case MGT_MODEMDESC: @@ -212,7 +212,7 @@ switch_status_t mg_prc_sig_desc(MgMgcoSignalsReq* req, megaco_profile_t* mg_prof (NOTPRSNT != req->name.type.pres) && (MGT_GEN_TYPE_KNOWN == req->name.type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Received Signal Descriptor : T.38 ctyp package\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Received Signal Descriptor : T.38 ctyp package\n"); if((NOTPRSNT != req->pl.num.pres) && (NOTPRSNT != req->pl.num.val)){ for(sig = 0x00; sig < req->pl.num.val; sig++){ @@ -229,7 +229,7 @@ switch_status_t mg_prc_sig_desc(MgMgcoSignalsReq* req, megaco_profile_t* mg_prof (NOTPRSNT != o->val.u.eq.type.pres) && (MGT_VALTYPE_ENUM == o->val.u.eq.type.val) && (MGT_PKG_ENUM_SIGOTHERCALLTYPDISCRANSSIGANSTYPANS == o->val.u.eq.u.enume.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Signal Descriptor : T.38 CED/ANS TONE \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Signal Descriptor : T.38 CED/ANS TONE \n"); /* apply CED/ANS tone to specify channel */ } } @@ -268,7 +268,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * MgMgcoLocalDesc *local; MgMgcoRemoteDesc* remote; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); switch (cmd->cmdType.val) { @@ -291,7 +291,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * break; } default: - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid cmd.type[%d] for descriptor processing \n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Invalid cmd.type[%d] for descriptor processing \n", cmd->u.mgCmdInd[0]->cmd.type.val); return SWITCH_STATUS_FALSE; } @@ -303,20 +303,20 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * } if(NULL == desc){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); return SWITCH_STATUS_FALSE; } - //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); if(NOTPRSNT == desc->dl.num.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); return SWITCH_STATUS_SUCCESS; } for (descId = 0; descId < desc->dl.num.val; descId++) { - //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); switch (desc->dl.descs[descId]->type.val) { case MGT_MEDIADESC: { @@ -476,7 +476,7 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * { MgMgcoReqEvtDesc* evt = &desc->dl.descs[descId]->u.evts; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG," Requested Event descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Event descriptor\n"); /* If we receive events from MGC , means clear any ongoing events */ /* as such we dont apply any events to term, so for us (as of now) clear events means clear active_events structure*/ @@ -489,13 +489,13 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * MG_STACK_MEM_ALLOC(&term->active_events, sizeof(MgMgcoReqEvtDesc)); if(NULL == term->active_events){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," term->active_events Memory Alloc failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," term->active_events Memory Alloc failed \n"); return SWITCH_STATUS_FALSE; } /* copy requested event */ if(RFAILED == mgUtlCpyMgMgcoReqEvtDesc(term->active_events, evt, NULLP)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," copy new events to term->active_events failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," copy new events to term->active_events failed \n"); MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); return SWITCH_STATUS_FALSE; } @@ -510,18 +510,18 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * MgMgcoSignalsDesc* sig = &desc->dl.descs[descId]->u.sig; MgMgcoSignalsParm* param = NULL; int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG," Requested Signal descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Signal descriptor\n"); if((NOTPRSNT != sig->pres.pres) && (NOTPRSNT != sig->num.pres) && (0 != sig->num.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Total number of Signal descriptors[%d]\n", sig->num.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Total number of Signal descriptors[%d]\n", sig->num.val); for(i=0; i< sig->num.val; i++){ param = sig->parms[i]; if(NOTPRSNT == param->type.pres) continue; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Signal Descriptor[%d] type[%s]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Signal Descriptor[%d] type[%s]\n", i, ((MGT_SIGSPAR_LST == param->type.val)?"MGT_SIGSPAR_LST":"MGT_SIGSPAR_REQ")); switch(param->type.val) @@ -616,7 +616,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i ((MGT_CXTID_ALL == ctxtId->type.val) || (MGT_CXTID_NULL == ctxtId->type.val))) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," ADD Request processing failed, Context ALL/NULL not allowed\n"); mg_util_set_ctxt_string(&errTxt, ctxtId); err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; @@ -631,13 +631,13 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_choose_context(mg_profile); if(NULL == mg_ctxt){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); /* fill Trillium Context structure with allocated context */ MG_SET_VAL_PRES(new_ctxtId->type, MGT_CXTID_OTHER); @@ -649,10 +649,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_get_context(mg_profile, inc_cmd->contextId.val.val); if(NULL == mg_ctxt){ #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " megaco_get_context failed for context-id[%d]\n", inc_cmd->contextId.val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " megaco_get_context failed for context-id[%ld]\n", inc_cmd->contextId.val.val); #endif mg_util_set_err_string(&errTxt, " Resource Failure "); @@ -669,13 +669,13 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i term = megaco_choose_termination(mg_profile, mg_profile->rtp_termination_id_prefix); if(NULL == term){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," megaco_choose_termination failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); is_rtp = 0x01; @@ -684,7 +684,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); if(NULL == term){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " megaco_find_termination failed for term-id[%s] \n",(char*)termId->name.lcl.val); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; @@ -692,14 +692,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); } /********************************************************************/ /* check if termination already is in call */ if(term->context){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Termination[%p : %s] " + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Termination[%p : %s] " "already in context[%p -%d]..rejecting ADD \n", (void*)term, term->name, (void*)term->context,term->context->context_id); mg_util_set_err_string(&errTxt, " Term already is in call "); @@ -721,7 +721,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* associate physical termination to context */ if(SWITCH_STATUS_FALSE == megaco_context_add_termination(mg_ctxt, term)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"megaco_context_add_termination failed \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"megaco_context_add_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -778,47 +778,46 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms, sizeof(MgMgcoTermId), &rsp.u.mgCmdRsp[0]->u.add.termIdLst.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } out_termId = rsp.u.mgCmdRsp[0]->u.add.termIdLst.terms[rsp.u.mgCmdRsp[0]->u.add.termIdLst.num.val-1]; mg_fill_mgco_termid(out_termId, (char*)term->name, strlen((char*)term->name), &rsp.u.mgCmdRsp[0]->memCp); - } if(is_rtp){ - /* Whatever Media descriptor we have received, we can copy that and then - * whatever we want we can modify the fields */ - /* Kapil - TODO - will see if there is any problem of coping the - * descriptor */ + /* Whatever Media descriptor we have received, we can copy that and then + * whatever we want we can modify the fields */ + /* Kapil - TODO - will see if there is any problem of coping the + * descriptor */ - if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.audit.parms, sizeof(MgMgcoAudRetParm), - &rsp.u.mgCmdRsp[0]->u.add.audit.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } + if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.add.audit.parms, sizeof(MgMgcoAudRetParm), + &rsp.u.mgCmdRsp[0]->u.add.audit.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); + return SWITCH_STATUS_FALSE; + } - /* copy media descriptor */ - desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; - desc->type.pres = PRSNT_NODEF; - desc->type.val = MGT_MEDIADESC; - mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); - /* see if we have received local descriptor */ - if((NOTPRSNT != desc->u.media.num.pres) && - (0 != desc->u.media.num.val)) - { - for(mediaId=0; mediaIdu.media.num.val; mediaId++) { - if(MGT_MEDIAPAR_LOCAL == desc->u.media.parms[mediaId]->type.val) { - local = &desc->u.media.parms[mediaId]->u.local; + /* copy media descriptor */ + desc = rsp.u.mgCmdRsp[0]->u.add.audit.parms[rsp.u.mgCmdRsp[0]->u.add.audit.num.val-1]; + desc->type.pres = PRSNT_NODEF; + desc->type.val = MGT_MEDIADESC; + mgUtlCpyMgMgcoMediaDesc(&desc->u.media, inc_med_desc, &rsp.u.mgCmdRsp[0]->memCp); + /* see if we have received local descriptor */ + if((NOTPRSNT != desc->u.media.num.pres) && + (0 != desc->u.media.num.val)) + { + for(mediaId=0; mediaIdu.media.num.val; mediaId++) { + if(MGT_MEDIAPAR_LOCAL == desc->u.media.parms[mediaId]->type.val) { + local = &desc->u.media.parms[mediaId]->u.local; + } } } - } - /* only for RTP */ + /* only for RTP */ if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ mg_util_set_err_string(&errTxt, " Unsupported Codec "); @@ -828,200 +827,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } } -#if 0 - if(is_rtp){ - mg_build_sdp(desc, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp); - /* build local descriptors */ - /*MgMgcoStreamDesc *stream;*/ - char* ipAddress[4];// = "192.168.1.1"; - char* dup = strdup((char*)term->u.rtp.local_addr); - MgMgcoMediaDesc* media = &desc->u.media; - - switch_split(dup,'.',ipAddress); - - /* Most probably we need to add local descriptor */ - if(!local){ - - /* allocating mem for local descriptor */ - if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), - &media->num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - -#if 0 - /* Kapil - NOT REQUIRED..keeping now just for ref..will delete asap */ - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - /*media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_STRPAR;*/ - - printf("media->num.val[%d]\n",media->num.val); - - stream = &media->parms[media->num.val-1]->u.stream; - stream->pres.pres = PRSNT_NODEF; - stream->pres.val = 0x01; -#if 0 - if(inc_med_desc->num.pres && inc_med_desc->num.val){ - /* TODO - check stream descriptor type for all medias */ - inc_strm_desc = &inc_med_desc->parms[0]->u.stream; - memcpy(&stream->streamId, &inc_strm_desc->streamId, sizeof(MgMgcoStreamId)); - } -#endif - - MG_INIT_TOKEN_VALUE(&(stream->streamId), 1); - - - stream->sl.pres.pres = PRSNT_NODEF; - stream->sl.pres.val = 0x01; - - local = &stream->sl.local; -#endif - media->parms[media->num.val-1]->type.pres = PRSNT_NODEF; - media->parms[media->num.val-1]->type.val = MGT_MEDIAPAR_LOCAL; - - local = &media->parms[media->num.val-1]->u.local; - } - - local->pres.pres = PRSNT_NODEF; - - psdp = &(local->sdp); - - if((NOTPRSNT == local->sdp.numComp.pres) || (0 == local->sdp.numComp.val)){ - - if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), - &psdp->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - } - - psdp->info[psdp->numComp.val-1]->pres.pres = PRSNT_NODEF; - - /* fill version */ - /*memcpy(&psdp->info[0]->ver, &prsdp->info[0]->ver, sizeof(TknU16)); */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->ver),1); - - /* fill orig */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.pres), 1); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->orig.orig.pres), 1); - - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.usrName, 1, "-", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessId, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->orig.orig.sessVer, 1, "0", - &rsp.u.mgCmdRsp[0]->memCp); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.netType.type), - CM_SDP_NET_TYPE_IN); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.addrType), - CM_SDP_ADDR_TYPE_IPV4); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.addrType), - CM_SDP_IPV4_IP_UNI); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[0]), - atoi(ipAddress[0])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[1]), - atoi(ipAddress[1])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[2]), - atoi(ipAddress[2])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->orig.orig.sdpAddr.u.ip4.u.ip.b[3]), - atoi(ipAddress[3])); - - /* fill session name */ - /* TODO - need to fill proper session name or skip it..*/ - MG_SET_TKNSTROSXL(psdp->info[psdp->numComp.val-1]->sessName, 8, "SANGOMA",&rsp.u.mgCmdRsp[0]->memCp); - - - /* Fill the SDP Connection Info */ - /* "c=" line - ipaddress */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.netType.type),CM_SDP_NET_TYPE_IN); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.addrType), CM_SDP_ADDR_TYPE_IPV4); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->conn.u.ip4.addrType), CM_SDP_IPV4_IP_UNI); - - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[0]), atoi(ipAddress[0])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[1]), atoi(ipAddress[1])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[2]), atoi(ipAddress[2])); - MG_SET_VAL_PRES( (psdp->info[psdp->numComp.val-1]->conn.u.ip4.u.uniIp.b[3]), atoi(ipAddress[3])); - - - /* t= line */ - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.pres),1); -#if 0 - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.sdpOpTimeSet.numComp),0); - MG_INIT_TOKEN_VALUE(&(psdp->info[psdp->numComp.val-1]->sdpTime.zoneAdjSet.numComp),0); -#endif - - /* fill media descriptors */ - { - CmSdpMediaDescSet* med = &psdp->info[psdp->numComp.val-1]->mediaDescSet; - CmSdpMediaDesc* media; - - if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), - &med->numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - media = med->mediaDesc[med->numComp.val-1]; - - MG_INIT_TOKEN_VALUE(&(media->pres),1); - - /* Fill CmSdpMediaField */ - MG_INIT_TOKEN_VALUE(&(media->field.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.mediaType),CM_SDP_MEDIA_AUDIO); - - MG_INIT_TOKEN_VALUE(&(media->field.id.type),CM_SDP_VCID_PORT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.type),CM_SDP_PORT_INT); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.pres),1); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.type), CM_SDP_SPEC); - MG_INIT_TOKEN_VALUE(&(media->field.id.u.port.u.portInt.port.val), term->u.rtp.local_port); - - if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), - &media->field.par.numProtFmts, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - /* CmSdpMedProtoFmts */ - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.type), CM_SDP_MEDIA_PROTO_RTP) - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->prot.u.subtype.type), CM_SDP_PROTO_RTP_AVP); - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->protType), CM_SDP_MEDIA_PROTO_RTP); - - - if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), - &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->type), CM_SDP_SPEC); - - MG_INIT_TOKEN_VALUE(&(media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts[0]->val), 8); - - /* Fill attribute if reqd */ - { - if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), - &media->attrSet.numComp, &rsp.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->type),CM_SDP_ATTR_PTIME); - MG_INIT_TOKEN_VALUE(&(media->attrSet.attr[0]->u.ptime), term->u.rtp.ptime); - } - } - - free(dup); - } -#endif - /* We will always send one command at a time..*/ rsp.cmdStatus.pres = PRSNT_NODEF; @@ -1032,20 +837,23 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); - return ret; + + if(is_rtp){ + /* releasing memory allocated for term->lcl.val */ + MG_STACK_MEM_FREE(out_termId->name.lcl.val, ((sizeof(U8)* strlen(term->name)))); + } } - /* sample resp code -- end */ + /*************************************************************************************************************************/ + return ret; - - return SWITCH_STATUS_SUCCESS; error: if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); } if(err_code != MGT_MGCO_RSP_CODE_DUP_TERM_CTXT){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," ADD Request failed..releasing context/termination(if allocated) \n"); if(mg_ctxt){ /* we can call sub all from context api to release terminations.. as it could possible that phy term added to context but @@ -1102,7 +910,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand if ((NOTPRSNT != ctxtId->type.pres) && (MGT_CXTID_CHOOSE == ctxtId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request processing failure, CHOOSE Context should not present in Modify\n"); err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; @@ -1113,7 +921,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand else if ((NOTPRSNT != termId->type.pres) && (MGT_TERMID_CHOOSE == termId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request processing failure, CHOOSE Termination should not present in Modify\n"); err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; @@ -1128,7 +936,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* MGT_TERMID_ROOT = If ROOT term then there will not be any conext */ if(MGT_TERMID_ROOT == termId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modify request is for ROOT termination \n"); /* check if we have ito packg request */ @@ -1138,11 +946,11 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand } else if(MGT_TERMID_OTHER == termId->type.val){ /********************************************************************/ #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modify request is for termination[%s] and context: type[%d], value[%d] \n", termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modify request is for termination[%s] and context: type[%d], value[%ld] \n", termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); #endif @@ -1164,12 +972,21 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /*find context based on received context-id */ mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); if(NULL == mg_ctxt){ +#ifdef BIT_64 + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Modify request Failed, context[%d] not found \n",ctxtId->val.val); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Modify request Failed, context[%ld] not found \n",ctxtId->val.val); +#endif mg_util_set_ctxt_string(&errTxt, ctxtId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; goto error; } if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Modify request Failed, requested term not associated with any context \n"); /* ERROR - termination didnt bind with requested context */ mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; @@ -1177,12 +994,12 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand } }else if(MGT_CXTID_NULL == ctxtId->type.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modify request is for NULL Context \n"); /*TODO - NULL context...nothing to do now...jump to response to send +ve response */ goto response; }else if(MGT_CXTID_ALL == ctxtId->type.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modify request is for ALL Context \n"); /*TODO - ALL context...nothing to do now...jump to response to send +ve response */ goto response; @@ -1197,13 +1014,15 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* IF there is any error , return */ if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Modify request Failed, Unsupported Codec \n"); mg_util_set_err_string(&errTxt, " Unsupported Codec "); err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; goto error; } if(MG_TERM_RTP == term->type){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" " Media_Type(%s),local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", mg_media_type2str(term->u.rtp.media_type), @@ -1224,6 +1043,8 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* SDP updated to termination */ if(SWITCH_STATUS_SUCCESS != megaco_activate_termination(term)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Modify request Failed, Activation of termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -1261,8 +1082,6 @@ response: rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; rsp.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; - //mgUtlAllocMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst); - mgUtlCpyMgMgcoTermIdLst(&rsp.u.mgCmdRsp[0]->u.mod.termIdLst, &inc_cmd->u.mgCmdReq[0]->cmd.u.mod.termIdLst, &rsp.u.mgCmdRsp[0]->memCp); #ifdef GCP_VER_2_1 @@ -1270,8 +1089,6 @@ response: #else termId = &(rsp.u.mgCmdRsp[0]->u.mod.termId); #endif - /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - if((MGT_TERMID_ROOT != termId->type.val) && (term && (MG_TERM_RTP == term->type) && ((NOTPRSNT != inc_cmd->u.mgCmdInd[0]->cmd.u.mod.dl.num.pres) && @@ -1286,7 +1103,7 @@ response: if (mgUtlGrowList((void ***)&rsp.u.mgCmdRsp[0]->u.mod.audit.parms, sizeof(MgMgcoAudRetParm), &rsp.u.mgCmdRsp[0]->u.mod.audit.num, &rsp.u.mgCmdRsp[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1336,7 +1153,7 @@ error: sng_mgco_send_err(mg_profile->idx, mgErr); } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," Modify Request failed..releasing context/termination \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Modify Request failed..releasing context/termination \n"); if(mg_ctxt){ megaco_release_context(mg_ctxt); } @@ -1382,14 +1199,14 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma /* Validating Subtract request *******************************************/ if(NOTPRSNT == ctxtId->type.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Context Not Present\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," SUB Request processing failed, Context Not Present\n"); mg_util_set_ctxt_string(&errTxt, ctxtId); err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; goto error; } if(NOTPRSNT == termId->type.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Termination Not Present\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," SUB Request processing failed, Termination Not Present\n"); mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; goto error; @@ -1399,7 +1216,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma if ((MGT_CXTID_CHOOSE == ctxtId->type.val) || (MGT_CXTID_NULL == ctxtId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Context CHOOSE/NULL not allowed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," SUB Request processing failed, Context CHOOSE/NULL not allowed\n"); mg_util_set_ctxt_string(&errTxt, ctxtId); err_code = MGT_MGCO_RSP_CODE_PROT_ERROR; @@ -1409,7 +1226,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma else if ((MGT_TERMID_ROOT == termId->type.val) || (MGT_TERMID_CHOOSE == termId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR," SUB Request processing failed, Termination ROOT/CHOOSE not allowed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," SUB Request processing failed, Termination ROOT/CHOOSE not allowed\n"); mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_INVLD_IDENTIFIER; @@ -1420,9 +1237,9 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma if (MGT_CXTID_OTHER == ctxtId->type.val){ #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for Context[%d] \n", ctxtId->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for Context[%d] \n", ctxtId->val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for Context[%ld] \n", ctxtId->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for Context[%ld] \n", ctxtId->val.val); #endif /*find context based on received context-id */ @@ -1433,21 +1250,23 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma goto error; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Found Context[%p] for context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); if(MGT_TERMID_ALL == termId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for context[%d] with ALL termination \n", mg_ctxt->context_id); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for context[%d] with ALL termination \n", mg_ctxt->context_id); /* remove terminations from context */ megaco_context_sub_all_termination(mg_ctxt); }else if(MGT_TERMID_OTHER == termId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for termination[%s] \n", (char*)termId->name.lcl.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for termination[%s] \n", (char*)termId->name.lcl.val); term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Subtract request Failed, termination no associated with any context \n"); /* ERROR - termination didnt bind with requested context */ mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; @@ -1455,6 +1274,8 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma } if(NULL == term){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Subtract request Failed, no termination found for input term string[%s] \n", (char*)termId->name.lcl.val); mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; @@ -1475,7 +1296,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma if (MGT_CXTID_ALL == ctxtId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO," SUB Request for ALL context \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for ALL context \n"); /* TODO */ @@ -1554,68 +1375,6 @@ error: return SWITCH_STATUS_FALSE; } -/*****************************************************************************************************************************/ -/* -* -* Fun: mg_send_add_rsp -* -* Desc: this api will send the ADD response based on ADD request received from MG stack -* -* TODO - Dummy response , needs to have proper ADD response code -*/ -switch_status_t mg_send_add_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.val = MGT_ADD; - cmd.u.mgCmdRsp[0]->u.add.pres.pres = PRSNT_NODEF; - - - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.add.termIdLst.num.val = 1; - - //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst); - mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.add.termIdLst, &req->u.mgCmdReq[0]->cmd.u.add.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); -#endif - /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - ret = sng_mgco_send_cmd(suId, &cmd); - - return ret; -} - /*****************************************************************************************************************************/ /* * @@ -1639,11 +1398,11 @@ switch_status_t mg_send_end_of_axn(SuId suId, MgMgcoTransId* transId, MgMgcoCont #if 0 #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%d], peerId[%d], context[type = %s, value = %d]\n", transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); #else - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mg_send_end_of_axn: Sending END_OF_AXN for transId[%lu], peerId[%lu], context[type = %s, value = %lu]\n", transId->val, peerId->val, PRNT_MG_CTXT_TYPE(ctxtId->type.val), ctxtId->val.val); @@ -1673,10 +1432,18 @@ switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgM mgErr = NULLP; ret = ROK; +#ifdef BIT_64 + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Sending Error Request with erro code[%d] for trans_id[%d]\n",trans_id, err); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Sending Error Request with erro code[%ld] for trans_id[%ld]\n",trans_id, err); +#endif + /* Allocate for AG error */ mg_stack_alloc_mem((Ptr*)&mgErr, sizeof(MgMgcoInd)); if (NULL == mgErr) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); return SWITCH_STATUS_FALSE; } @@ -1700,7 +1467,7 @@ switch_status_t mg_build_mgco_err_request(MgMgcoInd **errcmd,U32 trans_id, MgM { MG_GETMEM(mgErr->err.text.val, (errTxt->len)*sizeof(U8), &mgErr->memCp, &ret); if (ROK != ret) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " mg_build_mgco_err_request Failed : memory alloc \n"); return SWITCH_STATUS_FALSE; } mgErr->err.text.pres = PRSNT_NODEF; @@ -1743,14 +1510,14 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand wild = auditReq->u.mgCmdReq[0]->wild.pres; if(NOTPRSNT == audit->pres.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); return SWITCH_STATUS_FALSE; } audit_desc = &audit->audit; if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ - //switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Audit Descriptor not present.. Could be HeartBeat message\n"); return mg_send_heartbeat_audit_rsp(mg_profile->idx, auditReq); } @@ -1772,7 +1539,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand if ((NOTPRSNT != ctxtId->type.pres) && (MGT_CXTID_CHOOSE == ctxtId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, Ctxt: CHOOSE not allowed in Audit Value\n"); /* set correct error code */ @@ -1784,7 +1551,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand else if ((NOTPRSNT != termId->type.pres) && (MGT_TERMID_CHOOSE == termId->type.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, Term: CHOOSE not allowed in Audit Value\n"); mg_util_set_term_string(&errTxt,termId); @@ -1799,7 +1566,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand ((NOTPRSNT != ctxtId->type.pres) && (MGT_CXTID_OTHER == ctxtId->type.val))) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, Term: Invalid combination, ROOT Term with OTHER CONTEXT\n"); mg_util_set_ctxt_string(&errTxt,ctxtId); @@ -1846,7 +1613,7 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand audit_item = audit_desc->al[i]; if (!audit_item) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Audit Descriptor is NULL.. rejecting \n"); return SWITCH_STATUS_FALSE; } @@ -1858,13 +1625,13 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand { case MGT_MEDIADESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MEDIA \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing MEDIA \n"); /* Grow the list of reply parameters */ if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1882,52 +1649,52 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand } case MGT_MODEMDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MODEM \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing MODEM \n"); break; } case MGT_MUXDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing MULTIPLEX \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing MULTIPLEX \n"); break; } case MGT_REQEVTDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Events \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Events \n"); break; } case MGT_SIGNALSDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Signals \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Signals \n"); break; } case MGT_DIGMAPDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Digit Maps \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Digit Maps \n"); break; } case MGT_OBSEVTDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Buffer Events \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Buffer Events \n"); break; } case MGT_EVBUFDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Events Buffer \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Events Buffer \n"); break; } case MGT_STATSDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Statistics \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Statistics \n"); break; } case MGT_PKGSDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Auditing Packages \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Auditing Packages \n"); /* Grow the list of reply parameters */ if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1943,12 +1710,12 @@ switch_status_t handle_mg_audit_cmd( megaco_profile_t* mg_profile, MgMgcoCommand } case MGT_INDAUD_TERMAUDDESC: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Individual Term Audit \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Individual Term Audit \n"); break; } default: { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid Audit Descriptor[%d] request\n",audit_item->auditItem.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Invalid Audit Descriptor[%d] request\n",audit_item->auditItem.val); err_code = MGT_MGCO_RSP_CODE_UNSUPPORTED_DESC; goto error; } @@ -2006,7 +1773,7 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; if(NOTPRSNT == audit->pres.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); return SWITCH_STATUS_FALSE; } @@ -2062,417 +1829,6 @@ switch_status_t mg_send_heartbeat_audit_rsp( SuId suId, MgMgcoCommand *auditReq) return ret; } -/*****************************************************************************************************************************/ -#if 0 -/* Kapil - Not using any more */ -switch_status_t handle_media_audit( SuId suId, MgMgcoCommand *auditReq) -{ - switch_status_t ret; - MgMgcoCommand reply; - MgMgcoTermIdLst *term_list; - MgMgcoTermId *termId; - MgMgcoSubAudReq *audit; - MgMgcoAuditDesc *audit_desc; - MgMgcoAuditReply *adtRep = NULLP; - U16 numOfParms; - MgMgcoMediaDesc* media; - - - memset(&reply, 0, sizeof(reply)); - audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; - - if(NOTPRSNT == audit->pres.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); - return SWITCH_STATUS_FALSE; - } - - audit_desc = &audit->audit; - - if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); - return SWITCH_STATUS_FALSE; - } - - /* dump AUDIT message information */ - /*mgAccEvntPrntMgMgcoSubAudReq(auditReq,stdout);*/ - - /*-- Get termination list --*/ - term_list = mg_get_term_id_list(auditReq); - termId = term_list->terms[0]; - - - /*copy transaction-id*/ - memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); - /*copy context-id*/ - memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); - /*copy peer identifier */ - memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; - - - adtRep = &(reply.u.mgCmdRsp[0]->u.aval); - - adtRep->type.pres = PRSNT_NODEF; - adtRep->type.val = MGT_TERMAUDIT; - adtRep->u.other.pres.pres = PRSNT_NODEF; - mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); - - /* Grow the list of reply parameters */ - if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), - &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - numOfParms = adtRep->u.other.audit.num.val; - adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; - adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_MEDIADESC; - - media = get_default_media_desc(); - if(!media){ - return SWITCH_STATUS_FALSE; - } - mgUtlCpyMgMgcoMediaDesc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.media, media, &reply.u.mgCmdRsp[0]->memCp); - - /* We will always send one command at a time..*/ - reply.cmdStatus.pres = PRSNT_NODEF; - reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - reply.cmdType.pres = PRSNT_NODEF; - reply.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &reply); - -#if 0 - /*will send once all audit done*/ - memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); -#endif - - return ret; - - - -} - -/*****************************************************************************************************************************/ -switch_status_t handle_pkg_audit( SuId suId, MgMgcoCommand *auditReq) -{ - switch_status_t ret; - MgMgcoCommand reply; - MgMgcoTermIdLst *term_list; - MgMgcoTermId *termId; - MgMgcoSubAudReq *audit; - MgMgcoAuditDesc *audit_desc; - MgMgcoAuditReply *adtRep = NULLP; - U16 numOfParms; - - memset(&reply, 0, sizeof(reply)); - audit = &auditReq->u.mgCmdReq[0]->cmd.u.aval; - - if(NOTPRSNT == audit->pres.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit structure not present..rejecting \n"); - return SWITCH_STATUS_FALSE; - } - - audit_desc = &audit->audit; - - if((NOTPRSNT == audit_desc->pres.pres) || ( NOTPRSNT == audit_desc->num.pres)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Audit Descriptor not present..rejecting \n"); - return SWITCH_STATUS_FALSE; - } - - /* dump AUDIT message information */ - /*mgAccEvntPrntMgMgcoSubAudReq(auditReq,stdout);*/ - - /*-- Get termination list --*/ - term_list = mg_get_term_id_list(auditReq); - termId = term_list->terms[0]; - - - /*copy transaction-id*/ - memcpy(&reply.transId, &auditReq->transId,sizeof(MgMgcoTransId)); - /*copy context-id*/ - memcpy(&reply.contextId, &auditReq->contextId,sizeof(MgMgcoContextId)); - /*copy peer identifier */ - memcpy(&reply.peerId, &auditReq->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&reply.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - reply.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - reply.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - reply.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; - - - adtRep = &(reply.u.mgCmdRsp[0]->u.aval); - - adtRep->type.pres = PRSNT_NODEF; - adtRep->type.val = MGT_TERMAUDIT; - adtRep->u.other.pres.pres = PRSNT_NODEF; - mgUtlAllocMgMgcoTermIdLst(&adtRep->u.other.termIdLst, term_list); - - /* Grow the list of reply parameters */ - if (mgUtlGrowList((void ***)&adtRep->u.other.audit.parms, sizeof(MgMgcoAudRetParm), - &adtRep->u.other.audit.num, &reply.u.mgCmdRsp[0]->memCp) != ROK) - { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; - } - - numOfParms = adtRep->u.other.audit.num.val; - adtRep->u.other.audit.parms[numOfParms - 1]->type.pres = PRSNT_NODEF; - adtRep->u.other.audit.parms[numOfParms - 1]->type.val = MGT_PKGSDESC; - - if(SWITCH_STATUS_FALSE == mg_build_pkg_desc(&adtRep->u.other.audit.parms[numOfParms - 1]->u.pkgs)){ - return SWITCH_STATUS_FALSE; - } - - /* We will always send one command at a time..*/ - reply.cmdStatus.pres = PRSNT_NODEF; - reply.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - reply.cmdType.pres = PRSNT_NODEF; - reply.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &reply); - -#if 0 - /*will send once all audit done*/ - memcpy(&ctxt.transId,&auditReq->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &auditReq->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &auditReq->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); -#endif - - return ret; - - - -} -#endif -/*****************************************************************************************************************************/ -#if 0 -/* Kapil - Not using any more */ -switch_status_t mg_send_audit_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - MgMgcoAuditReply *adtRep = NULLP; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->wild.pres = NOTPRSNT; - cmd.u.mgCmdRsp[0]->type.val = MGT_AUDITVAL; - - adtRep = &(cmd.u.mgCmdRsp[0]->u.aval); - - /* Set type as Cxt Audit */ - MG_INIT_TOKEN_VALUE(&(adtRep->type), MGT_CXTAUDIT); - /* Set no of Terminations to 1 */ - MG_INIT_TOKEN_VALUE(&(adtRep->u.cxt.num), 1); - - - - cmd.u.mgCmdRsp[0]->u.aval.u.cxt.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.aval.u.cxt.num.val = 1; - - mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.aval.u.cxt, &req->u.mgCmdReq[0]->cmd.u.aval.termIdLst); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.add.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.add.termId); -#endif - mg_fill_mgco_termid(termId, (CONSTANT U8*)"term1",&req->u.mgCmdRsp[0]->memCp); - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &cmd); - - memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); - - return ret; -} -#endif - -/*****************************************************************************************************************************/ -switch_status_t mg_send_modify_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - - memset(&cmd,0, sizeof(cmd)); - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.val = MGT_MODIFY; - cmd.u.mgCmdRsp[0]->u.mod.pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.mod.termIdLst.num.val = 1; - - //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst); - mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.mod.termIdLst, &req->u.mgCmdReq[0]->cmd.u.mod.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.mod.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.mod.termId); -#endif - /*mg_fill_mgco_termid(termId, (char*)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &cmd); - - memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); - - return ret; -} - -/*****************************************************************************************************************************/ -/*****************************************************************************************************************************/ -switch_status_t mg_send_subtract_rsp(SuId suId, MgMgcoCommand *req) -{ - MgMgcoCommand cmd; - int ret = 0x00; - MgMgcoTermId *termId; - MgMgcoCtxt ctxt; - uint8_t wild = 0x00; - - memset(&cmd,0, sizeof(cmd)); - - wild = req->u.mgCmdReq[0]->wild.pres; - - /*copy transaction-id*/ - memcpy(&cmd.transId, &req->transId,sizeof(MgMgcoTransId)); - - /*copy context-id*/ /*TODO - in case of $ context should be generated by app, we should not simply copy incoming structure */ - memcpy(&cmd.contextId, &req->contextId,sizeof(MgMgcoContextId)); - - /*copy peer identifier */ - memcpy(&cmd.peerId, &req->peerId,sizeof(TknU32)); - - /*fill response structue */ - if(SWITCH_STATUS_FALSE == (ret = mg_stack_alloc_mem((Ptr*)&cmd.u.mgCmdRsp[0],sizeof(MgMgcoCmdReply)))){ - return ret; - } - - if(wild){ - cmd.u.mgCmdRsp[0]->wild.pres = PRSNT_NODEF; - } - - cmd.u.mgCmdRsp[0]->pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->type.val = MGT_SUB; - cmd.u.mgCmdRsp[0]->u.sub.pres.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.pres = PRSNT_NODEF; - cmd.u.mgCmdRsp[0]->u.sub.termIdLst.num.val = 1; - - //mgUtlAllocMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst); - mgUtlCpyMgMgcoTermIdLst(&cmd.u.mgCmdRsp[0]->u.sub.termIdLst, &req->u.mgCmdReq[0]->cmd.u.sub.termIdLst, &cmd.u.mgCmdRsp[0]->memCp); - -#ifdef GCP_VER_2_1 - termId = cmd.u.mgCmdRsp[0]->u.sub.termIdLst.terms[0]; -#else - termId = &(cmd.u.mgCmdRsp[0]->u.sub.termId); -#endif - /*mg_fill_mgco_termid(termId, (char *)"term1",&req->u.mgCmdRsp[0]->memCp);*/ - - /* We will always send one command at a time..*/ - cmd.cmdStatus.pres = PRSNT_NODEF; - cmd.cmdStatus.val = CH_CMD_STATUS_END_OF_CMD; - - cmd.cmdType.pres = PRSNT_NODEF; - cmd.cmdType.val = CH_CMD_TYPE_RSP; - - - ret = sng_mgco_send_cmd(suId, &cmd); - - memcpy(&ctxt.transId,&req->transId,sizeof(MgMgcoTransId)); - memcpy(&ctxt.cntxtId, &req->contextId,sizeof(MgMgcoContextId)); - memcpy(&ctxt.peerId, &req->peerId,sizeof(TknU32)); - ctxt.cmdStatus.pres = PRSNT_NODEF; - ctxt.cmdStatus.val = CH_CMD_STATUS_END_OF_AXN; - ret = sng_mgco_send_axn_req(suId, &ctxt); - - return ret; -} /*****************************************************************************************************************************/ U32 get_txn_id(){ outgoing_txn_id++; @@ -2579,13 +1935,11 @@ switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const c */ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_t method, MgServiceChangeReason_e reason,uint8_t wild) { - MgMgcoSvcChgPar srvPar; MgMgcoTermId* termId; switch_status_t ret; MgMgcoCommand request; MgMgcoSvcChgReq *svc; - MG_ZERO(&srvPar, sizeof(MgMgcoSvcChgPar)); MG_ZERO(&request, sizeof(request)); @@ -2622,13 +1976,11 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_ return ret; } - /*mgUtlCpyMgMgcoSvcChgPar(&svc->parm, &srvPar, &request.u.mgCmdReq[0]->memCp);*/ - if (mgUtlGrowList((void ***)&svc->termIdLst.terms, sizeof(MgMgcoTermIdLst), &svc->termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); - return SWITCH_STATUS_FALSE; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); + goto err; } #ifdef GCP_VER_2_1 @@ -2637,23 +1989,25 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_ termId = &(svc->termId); #endif - mg_fill_mgco_termid(termId, (char*)term_name ,strlen(term_name), &request.u.mgCmdReq[0]->memCp); if(wild){ request.u.mgCmdReq[0]->wild.pres = PRSNT_NODEF; } - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Sending %s Service Change for termId[%s] with reason[%s], len[%d]\n", + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Sending %s Service Change for termId[%s] with reason[%s], len[%d]\n", ((1==wild)?"WildCard":"Non Wild Card"), term_name, svc->parm.reason.val, svc->parm.reason.len); sng_mgco_send_cmd(suId, &request); + /* releasing memory allocated for term->lcl.val */ + MG_STACK_MEM_FREE(termId->name.lcl.val, ((sizeof(U8)* strlen(term_name)))); + return SWITCH_STATUS_SUCCESS; err: - mgUtlDelMgMgcoSvcChgPar(&srvPar); - return ret; + mgUtlDelMgMgcoSvcChgPar(&svc->parm); + return SWITCH_STATUS_FALSE; } /*****************************************************************************************************************************/ @@ -2714,7 +2068,7 @@ switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_REQEVTIPFAXFAXCONNSTATECHNG); if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2744,7 +2098,7 @@ switch_status_t mg_send_t38_fax_con_change_notify(megaco_profile_t* mg_profile, } else if(!strcasecmp(state,"ProcInterrupt")){ MG_INIT_TOKEN_VALUE(&(param->u.other.val.u.eq.u.enume),MGT_PKG_ENUM_OBSEVTOTHERIPFAXFAXCONNSTATECHNGFAXCONNSTATECHNGPROCINTR); }else{ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Invalid input state[%s] param\n", state); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Invalid input state[%s] param\n", state); return SWITCH_STATUS_FALSE; } @@ -2775,7 +2129,7 @@ switch_status_t mg_send_t38_v21flag_notify(megaco_profile_t* mg_profile, const MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2819,7 +2173,7 @@ switch_status_t mg_send_t38_ans_notify(megaco_profile_t* mg_profile, const char MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2865,7 +2219,7 @@ switch_status_t mg_send_t38_cng_notify(megaco_profile_t* mg_profile, const char MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_OBSEVTOTHERCALLTYPDISCRDISCTONEDETDISCTONETYPCNG); if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2897,7 +2251,7 @@ switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* t switch_assert(digits); if(0 == num_of_collected_digits ){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"num_of_collected_digits cannt be ZERO \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"num_of_collected_digits cannt be ZERO \n"); return SWITCH_STATUS_FALSE; } @@ -2918,7 +2272,7 @@ switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* t MG_INIT_TOKEN_VALUE(&(oevt->name.u.val),(U8)MGT_PKG_ENUM_REQEVT_EXT_DTMF_EXT_CE); if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2962,7 +2316,7 @@ switch_status_t mg_send_dtmf_notify(megaco_profile_t* mg_profile, const char* t param->u.other.val.u.eq.u.osxl.val[num_of_collected_digits+1] = '\"'; if (mgUtlGrowList((void ***)&oevt->pl.parms, sizeof(MgMgcoEvtPar), &oevt->pl.num, NULL) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2998,7 +2352,7 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n MgMgcoObsEvtDesc *obs_desc = NULL; MgMgcoRequestId reqId; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "Sending Notify Message for termination[%s] !\n", term_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Sending Notify Message for termination[%s] !\n", term_name); MG_ZERO(&request, sizeof(request)); MG_ZERO(&reqId, sizeof(reqId)); @@ -3008,12 +2362,12 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n term = megaco_find_termination(mg_profile, (char*)term_name); if(!term){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No termination configured for given name[%s] !\n", term_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No termination configured for given name[%s] !\n", term_name); return SWITCH_STATUS_FALSE; } if(NULL == term->active_events){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Active events observed on given termination[%s] !\n", term_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No Active events observed on given termination[%s] !\n", term_name); /* return SWITCH_STATUS_FALSE; */ /*TODO - ideally we should return ... * as of now not returning .. if we dont have active signals then @@ -3034,7 +2388,7 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n if (mgUtlGrowList((void ***)&request.u.mgCmdReq[0]->cmd.u.ntfy.obs.el.evts, sizeof(MgMgcoObsEvtLst), &request.u.mgCmdReq[0]->cmd.u.ntfy.obs.el.num, &request.u.mgCmdReq[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -3074,7 +2428,7 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n if (mgUtlGrowList((void ***)&request.u.mgCmdReq[0]->cmd.u.ntfy.termIdLst.terms, sizeof(MgMgcoTermIdLst), &request.u.mgCmdReq[0]->cmd.u.ntfy.termIdLst.num, &request.u.mgCmdReq[0]->memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -3088,6 +2442,9 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n sng_mgco_send_cmd(mg_profile->idx, &request); + /* releasing memory allocated for term->lcl.val */ + MG_STACK_MEM_FREE(termId->name.lcl.val, ((sizeof(U8)* strlen(term_name)))); + return SWITCH_STATUS_SUCCESS; } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 916969e059..6cea2f1480 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -20,13 +20,13 @@ switch_status_t mg_stack_alloc_mem( Ptr* _memPtr, Size _memSize ) if ( _memSize <= 0 ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: invalid size\n"); return SWITCH_STATUS_FALSE; } if ( ROK != cmAllocEvnt( _memSize, MG_MAXBLKSIZE, &sMem, _memPtr ) ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",(int)_memSize); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed mg_stack_alloc_mem: cmAllocEvnt return failure for _memSize=%d\n",(int)_memSize); return SWITCH_STATUS_FALSE; } @@ -41,19 +41,19 @@ switch_status_t mg_stack_get_mem(MgMgcoMsg* msg, Ptr* _memPtr, Size _memSize ) { if ( _memSize <= 0 ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid size\n"); return SWITCH_STATUS_FALSE; } if ( !msg ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); return SWITCH_STATUS_FALSE; } if ( cmGetMem( (Ptr)msg, _memSize, (Ptr*)_memPtr ) != ROK ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", (int)_memSize ); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed alloc_mg_stack_mem: get memory failed _memSize=%d\n", (int)_memSize ); return SWITCH_STATUS_FALSE; } @@ -68,7 +68,7 @@ switch_status_t mg_stack_free_mem(void* msg) { if ( !msg ) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed mg_stack_get_mem: invalid message\n"); return SWITCH_STATUS_FALSE; } @@ -100,30 +100,41 @@ switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, CmMemListCp *memCp) { + char prnt_buf[128]; #ifdef GCP_ASN Size size; #endif S16 ret = ROK; + memset(&prnt_buf,0,sizeof(prnt_buf)); termId->type.pres = PRSNT_NODEF; - if(!strcmp(term_str,"ROOT")){ - termId->type.val = MGT_TERMID_ROOT; - } else { - termId->type.val = MGT_TERMID_OTHER; + if(!strcmp(term_str,"ROOT")){ + termId->type.val = MGT_TERMID_ROOT; + } else { - termId->name.dom.pres = NOTPRSNT; - termId->name.dom.len = 0x00; + termId->type.val = MGT_TERMID_OTHER; - termId->name.pres.pres = PRSNT_NODEF; + termId->name.dom.pres = NOTPRSNT; + termId->name.dom.len = 0x00; - MG_SET_TKNSTROSXL(termId->name.lcl,term_len,term_str,memCp); + termId->name.pres.pres = PRSNT_NODEF; + + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = cmStrlen((U8*)term_str); + size = ((sizeof(U8)* term_len)); + MG_STACK_MEM_ALLOC(&termId->name.lcl.val, size); + cmMemcpy((U8*)(termId->name.lcl.val),(CONSTANT U8*)term_str,termId->name.lcl.len); + + MG_MEM_COPY(&prnt_buf, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "mg_fill_mgco_termid: Megaco termination name[%s], len[%d], input_term_str[%s], input_term_len[%d]\n", + prnt_buf, termId->name.lcl.len, term_str,term_len); + + //MG_STACK_MEM_FREE(termId->name.lcl.val, size); + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "mg_fill_mgco_termid: name.lcl.val[%s], len[%d], term_str[%s], term_len[%d]\n", - termId->name.lcl.val, termId->name.lcl.len, term_str,term_len); - } - #ifdef GCP_ASN if((termId->type.val == MGT_TERMID_ALL) || @@ -148,7 +159,7 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->wildcard.wildcard[0]->val[0] = 0x55; }else{ - termId->wildcard.num.pres = NOTPRSNT; + termId->wildcard.num.pres = NOTPRSNT; } #endif /* GCP_ASN */ @@ -1480,7 +1491,7 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm MG_GETMEM(media, sizeof(MgMgcoMediaDesc) , memCp, ret); if (!media) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); return NULL; } media->num.pres = PRSNT_NODEF; @@ -1489,14 +1500,14 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm MG_GETMEM(mediaPar, sizeof(MgMgcoMediaPar) , memCp, ret); if (!mediaPar) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem(media); return NULL; } MG_GETMEM(media->parms, sizeof(MgMgcoMediaPar*) , memCp, ret); if (!media->parms) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem((void*)mediaPar); mg_stack_free_mem((void*)media); return NULL; @@ -1509,7 +1520,7 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm MG_GETMEM(trmStPar, sizeof(MgMgcoTermStateParm) , memCp, ret); if (!trmStPar) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem((void*)mediaPar); mg_stack_free_mem((void*)media->parms); mg_stack_free_mem((void*)media); @@ -1518,7 +1529,7 @@ MgMgcoMediaDesc* get_default_media_desc(megaco_profile_t* mg_profile, MgMgcoTerm MG_GETMEM(mediaPar->u.tstate.trmStPar, sizeof(MgMgcoTermStateParm *) , memCp, ret); if (!mediaPar->u.tstate.trmStPar) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); mg_stack_free_mem((void*)trmStPar); mg_stack_free_mem((void*)mediaPar); mg_stack_free_mem((void*)media->parms); @@ -1564,7 +1575,7 @@ switch_status_t mg_fill_svc_change(MgMgcoSvcChgPar *srvPar, uint8_t method, c MG_GETMEM(srvPar->reason.val, srvPar->reason.len , memCp, ret); if (NULL == srvPar->reason.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed, memory alloc\n"); return SWITCH_STATUS_FALSE; } @@ -1613,7 +1624,7 @@ void mg_get_time_stamp(MgMgcoTimeStamp *timeStamp) timeStamp->time.pres = PRSNT_NODEF; timeStamp->time.len = 8; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"mg_get_time_stamp: time(%s)\n", dmBuf); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"mg_get_time_stamp: time(%s)\n", dmBuf); } /*****************************************************************************************************************************/ switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, uint8_t cmdType) @@ -1640,7 +1651,7 @@ switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, ui } if (NULL == cmd->u.mgCmdReq[0]) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); return SWITCH_STATUS_FALSE; } @@ -1669,7 +1680,7 @@ switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, ui } if (NULL == cmd->u.mgCmdRsp[0]) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, memory alloc\n"); return SWITCH_STATUS_FALSE; } cmdRep = cmd->u.mgCmdRsp[0]; @@ -1710,7 +1721,7 @@ switch_status_t mg_create_mgco_command(MgMgcoCommand *cmd, uint8_t apiType, ui } default: - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, invalid Cmd type[%d]\n",apiType); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"mg_create_mgco_command: failed, invalid Cmd type[%d]\n",apiType); return SWITCH_STATUS_FALSE; } /* switch -apiType */ @@ -1736,7 +1747,7 @@ switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequ mg_stack_alloc_mem((Ptr*)&obs_desc, sizeof(MgMgcoObsEvtDesc)); if (NULL == obs_desc) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvtDesc!\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvtDesc!\n"); return SWITCH_STATUS_FALSE; } @@ -1748,7 +1759,7 @@ switch_status_t mg_util_build_obs_evt_desc (MgMgcoObsEvt *obs_event, MgMgcoRequ mg_stack_alloc_mem((Ptr*)&obs_desc->el.evts, sizeof(MgMgcoObsEvt*)); if (NULL == obs_desc->el.evts) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvt!\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to allocate MgMgcoObsEvt!\n"); return SWITCH_STATUS_FALSE; } @@ -1764,7 +1775,7 @@ void mg_print_time() time_t now; time(&now); - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO,"Current Time = %s", ctime(&now)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Current Time = %s", ctime(&now)); } /*****************************************************************************************************************************/ switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t* mg_profile, mg_termination_t* term,CmMemListCp *memCp) @@ -1786,7 +1797,7 @@ switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t /* allocating mem for local descriptor */ if (mgUtlGrowList((void ***)&media->parms, sizeof(MgMgcoMediaPar), &media->num, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1801,7 +1812,7 @@ switch_status_t mg_add_local_descriptor(MgMgcoMediaDesc* media, megaco_profile_t if (mgUtlGrowList((void ***)&psdp->info, sizeof(CmSdpInfo), &psdp->numComp, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1896,7 +1907,7 @@ switch_status_t mg_add_supported_media_codec(CmSdpMediaDesc* media, megaco_profi if (mgUtlGrowList((void ***)&media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.fmts, sizeof(CmSdpU8OrNil), &media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } fmt = media->field.par.pflst[media->field.par.numProtFmts.val-1]->u.rtp.num.val-1; @@ -1909,7 +1920,7 @@ switch_status_t mg_add_supported_media_codec(CmSdpMediaDesc* media, megaco_profi { if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), &media->attrSet.numComp, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1940,7 +1951,7 @@ switch_status_t mg_add_lcl_media(CmSdpMediaDescSet* med, megaco_profile_t* mg_pr if (mgUtlGrowList((void ***)&med->mediaDesc, sizeof(CmSdpMediaDesc), &med->numComp, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1961,7 +1972,7 @@ switch_status_t mg_add_lcl_media(CmSdpMediaDescSet* med, megaco_profile_t* mg_pr if (mgUtlGrowList((void ***)&media->field.par.pflst, sizeof(CmSdpMedProtoFmts), &media->field.par.numProtFmts, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -1976,7 +1987,7 @@ switch_status_t mg_add_lcl_media(CmSdpMediaDescSet* med, megaco_profile_t* mg_pr { if (mgUtlGrowList((void ***)&media->attrSet.attr, sizeof(CmSdpAttr), &media->attrSet.numComp, memCp) != ROK) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR,"Grow List failed\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Grow List failed\n"); return SWITCH_STATUS_FALSE; } @@ -2009,7 +2020,7 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term /* Check if code list is present */ if (!fmtList || (NOTPRSNT == fmtList->num.pres)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "codec List Not present\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "codec List Not present\n"); return SWITCH_STATUS_FALSE; } @@ -2036,7 +2047,7 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term /* see if received codec is present in our codec supported list */ for (id = 0; codecs[id] && id < codec_count; id++) { int pt = codecs[id]->ianacode; - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Matching recv codec[%d] with supported codec[%d] \n", fmt->val.val, pt); //const char *name = codecs[id]->iananame; /* anything > 96 is dymanic we should skip codec match */ @@ -2067,7 +2078,7 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term rtp = &attr->u.rtpmap; if((NOTPRSNT != rtp->pres.pres) && (fmt->val.val == rtp->pay.val.val)) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "a line found against codec[%d]..Removing a line \n", fmt->val.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "a line found against codec[%d]..Removing a line \n", fmt->val.val); /* mgUtlShrinkList API will delete last node from list, hence suffling list nodes */ for(j = a; j < attrSet->numComp.val - 1; j++) @@ -2082,7 +2093,7 @@ switch_status_t mg_rem_unsupported_codecs (megaco_profile_t* mg_profile, mg_term } if(0 == fmtList->num.val) { - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, "No Supported codec found in offer, Rejecting request \n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No Supported codec found in offer, Rejecting request \n"); term->mg_error_code = switch_core_alloc(term->pool, sizeof(term->mg_error_code)); *term->mg_error_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; @@ -2234,7 +2245,7 @@ if((NOTPRSNT == med->numComp.pres) || (0 == med->numComp.val)){ /* check for codec */ if((NOTPRSNT == media->field.par.numProtFmts.pres) || (0 == media->field.par.numProtFmts.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_ERROR, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No codec specified in incoming local descriptor \n"); mg_add_supported_media_codec(media, mg_profile, term, memCp ); }else{ @@ -2256,7 +2267,7 @@ if ((NOTPRSNT != format->protType.pres) && } } if(choose_codec){ - switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_INFO, + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "CHOOSE codec is requested fill out supported codecs \n"); /* delete existing rtp format list..TODO find better way */ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 2f2666957c..57d2fa6286 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -606,15 +606,12 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) case MGT_ADD: { handle_mg_add_cmd(mg_profile, cmd, &out_ctxt); - /*mg_send_add_rsp(suId, cmd);*/ break; } case MGT_MODIFY: { - /*MgMgcoAmmReq *addReq = &cmdReq->cmd.u.mod;*/ handle_mg_modify_cmd(mg_profile, cmd); - /*mg_send_modify_rsp(suId, cmd);*/ break; } case MGT_MOVE: @@ -626,9 +623,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) } case MGT_SUB: { - /*MgMgcoSubAudReq *addReq = &cmdReq->cmd.u.sub;*/ handle_mg_subtract_cmd(mg_profile, cmd); - /*mg_send_subtract_rsp(suId, cmd);*/ break; } case MGT_SVCCHG: From cd6f4fbff9c27f33f02534c2ff2dfa05b324c3dc Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 24 Aug 2012 14:08:26 -0400 Subject: [PATCH 460/493] logging improvement --- .../mod_media_gateway/media_gateway_cmd_handler.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index fbf7ffd940..0c24a9e75b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -268,8 +268,6 @@ switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand * MgMgcoLocalDesc *local; MgMgcoRemoteDesc* remote; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); - switch (cmd->cmdType.val) { case CH_CMD_TYPE_IND: @@ -675,7 +673,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated RTP Termination[%p] with term name[%s]\n", (void*)term, term->name); is_rtp = 0x01; @@ -692,14 +690,14 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Termination[%p] with term name[%s]\n", (void*)term, term->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Physical Termination[%p] with term name[%s]\n", (void*)term, term->name); } /********************************************************************/ /* check if termination already is in call */ if(term->context){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Termination[%p : %s] " + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Termination[%p : %s] " "already in context[%p -%d]..rejecting ADD \n", (void*)term, term->name, (void*)term->context,term->context->context_id); mg_util_set_err_string(&errTxt, " Term already is in call "); From 44a542719ba3da4ce9a33630ca955622d1228071 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 24 Aug 2012 16:55:11 -0400 Subject: [PATCH 461/493] adding statistics --- .../mod_media_gateway/media_gateway.c | 3 + .../mod_media_gateway/media_gateway_cli.c | 57 +++++++++++++++++-- .../media_gateway_cmd_handler.c | 55 ++++++++++++------ .../mod_media_gateway/mod_media_gateway.h | 19 +++++++ 4 files changed, 111 insertions(+), 23 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index af52d17a22..c4a1ab5acd 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -450,6 +450,8 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination ctx->terminations[1]->name, ctx->terminations[1]->uuid); switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); + + ctx->terminations[0]->profile->mg_stats->total_num_of_call_recvd++; } return SWITCH_STATUS_SUCCESS; @@ -638,6 +640,7 @@ switch_status_t megaco_profile_start(const char *profilename) profile->next_context_id++; profile->inact_tmr = 0x00; profile->peer_active = 0x00; + profile->mg_stats = switch_core_alloc(pool, sizeof(mg_stats_t)); profile->inact_tmr_task_id = 0x00; switch_thread_rwlock_create(&profile->rwlock, pool); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 749054ac65..00670be0c4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -20,6 +20,7 @@ switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, m void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); void megaco_cli_print_usage(switch_stream_handle_t *stream); switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); +switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); /******************************************************************************/ @@ -202,6 +203,12 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre /* mg show activecalls */ megaco_profile_release(profile); handle_show_activecalls_cli_cmd(stream, profile); + /*******************************************************************/ + } else if(!strcasecmp(argv[3], "stats")){ + /*******************************************************************/ + /* mg show stats */ + megaco_profile_release(profile); + handle_show_stats(stream, profile); /*******************************************************************/ }else if(!strcasecmp(argv[3], "alltermstatus")){ /*******************************************************************/ @@ -287,13 +294,13 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "Usage: Profile Specific\n"); stream->write_function(stream, "mg profile start \n"); stream->write_function(stream, "mg profile stop \n"); - stream->write_function(stream, "mg profile status \n"); - stream->write_function(stream, "mg profile xmlstatus \n"); + //stream->write_function(stream, "mg profile status \n"); + //stream->write_function(stream, "mg profile xmlstatus \n"); stream->write_function(stream, "mg profile peerxmlstatus \n"); - stream->write_function(stream, "mg profile send sc \n"); - stream->write_function(stream, "mg profile send notify \n"); - stream->write_function(stream, "mg profile send ito notify \n"); - stream->write_function(stream, "mg profile send cng \n"); + //stream->write_function(stream, "mg profile send sc \n"); + //stream->write_function(stream, "mg profile send notify \n"); + //stream->write_function(stream, "mg profile send ito notify \n"); + //stream->write_function(stream, "mg profile send cng \n"); stream->write_function(stream, "mg profile show activecalls \n"); stream->write_function(stream, "mg profile show termstatus \n"); stream->write_function(stream, "mg profile show alltermstatus \n"); @@ -868,3 +875,41 @@ switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, return SWITCH_STATUS_SUCCESS; } +/******************************************************************************/ +switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile_t* mg_profile) +{ + if(!mg_profile || !mg_profile->mg_stats){ + stream->write_function(stream, "-ERR NULL profile/term pointer \n"); + return SWITCH_STATUS_FALSE; + } + + stream->write_function(stream, "Total Number of Physical ADD received = %d \n", mg_profile->mg_stats->total_num_of_phy_add_recvd); + stream->write_function(stream, "Total Number of RTP ADD received = %d \n", mg_profile->mg_stats->total_num_of_rtp_add_recvd); + stream->write_function(stream, "Total Number of SUB received = %d \n", mg_profile->mg_stats->total_num_of_sub_recvd); + stream->write_function(stream, "Total Number of CALL received = %d \n", mg_profile->mg_stats->total_num_of_call_recvd); + stream->write_function(stream, "Total Number of ADD failed = %d \n", mg_profile->mg_stats->total_num_of_add_failed); + stream->write_function(stream, "Total Number of Term Already in context Error = %d \n", + mg_profile->mg_stats->total_num_of_term_already_in_ctxt_error); + stream->write_function(stream, "Total Number of choose context failed Error = %d \n", + mg_profile->mg_stats->total_num_of_choose_ctxt_failed_error); + stream->write_function(stream, "Total Number of choose term failed Error = %d \n", + mg_profile->mg_stats->total_num_of_choose_term_failed_error); + stream->write_function(stream, "Total Number of find term failed Error = %d \n", + mg_profile->mg_stats->total_num_of_find_term_failed_error); + stream->write_function(stream, "Total Number of get context failed Error = %d \n", + mg_profile->mg_stats->total_num_of_get_ctxt_failed_error); + stream->write_function(stream, "Total Number of un-supported codec error = %d \n", + mg_profile->mg_stats->total_num_of_un_supported_codec_error); + stream->write_function(stream, "Total Number of Term addition to context failed error = %d \n", + mg_profile->mg_stats->total_num_of_add_term_failed_error); + stream->write_function(stream, "Total Number of Term activation failed error = %d \n", + mg_profile->mg_stats->total_num_of_term_activation_failed_error); + stream->write_function(stream, "Total Number of Term not found in context error = %d \n", + mg_profile->mg_stats->total_num_of_no_term_ctxt_error); + + + + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ + diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 0c24a9e75b..17a0f01527 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -629,10 +629,11 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_choose_context(mg_profile); if(NULL == mg_ctxt){ + mg_profile->mg_stats->total_num_of_choose_ctxt_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); - mg_util_set_err_string(&errTxt, " Resource Failure "); - err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; - goto error; + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); @@ -653,6 +654,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " megaco_get_context failed for context-id[%ld]\n", inc_cmd->contextId.val.val); #endif + mg_profile->mg_stats->total_num_of_get_ctxt_failed_error++; mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -665,8 +667,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i (MGT_TERMID_CHOOSE == termId->type.val)){ term = megaco_choose_termination(mg_profile, mg_profile->rtp_termination_id_prefix); + mg_profile->mg_stats->total_num_of_rtp_add_recvd++; if(NULL == term){ + mg_profile->mg_stats->total_num_of_choose_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; @@ -680,8 +684,10 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /********************************************************************/ }else{ /* Physical termination */ term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + mg_profile->mg_stats->total_num_of_phy_add_recvd++; if(NULL == term){ + mg_profile->mg_stats->total_num_of_find_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " megaco_find_termination failed for term-id[%s] \n",(char*)termId->name.lcl.val); mg_util_set_err_string(&errTxt, " Resource Failure "); @@ -697,6 +703,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* check if termination already is in call */ if(term->context){ + mg_profile->mg_stats->total_num_of_term_already_in_ctxt_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Termination[%p : %s] " "already in context[%p -%d]..rejecting ADD \n", (void*)term, term->name, (void*)term->context,term->context->context_id); @@ -711,6 +718,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* IF there is any error , return */ if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_profile->mg_stats->total_num_of_un_supported_codec_error++; mg_util_set_err_string(&errTxt, " Unsupported Codec "); err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; goto error; @@ -719,6 +727,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* associate physical termination to context */ if(SWITCH_STATUS_FALSE == megaco_context_add_termination(mg_ctxt, term)){ + mg_profile->mg_stats->total_num_of_add_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"megaco_context_add_termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; @@ -818,6 +827,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /* only for RTP */ if(SWITCH_STATUS_FALSE == mg_build_sdp(&desc->u.media, inc_med_desc, mg_profile, term, &rsp.u.mgCmdRsp[0]->memCp)) { if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_profile->mg_stats->total_num_of_un_supported_codec_error++; mg_util_set_err_string(&errTxt, " Unsupported Codec "); err_code = MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT; goto error; @@ -846,6 +856,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i return ret; error: + mg_profile->mg_stats->total_num_of_add_failed++; if (SWITCH_STATUS_SUCCESS == mg_build_mgco_err_request(&mgErr, txn_id, ctxtId, err_code, &errTxt)) { sng_mgco_send_err(mg_profile->idx, mgErr); @@ -956,6 +967,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); if(NULL == term){ + mg_profile->mg_stats->total_num_of_find_term_failed_error++; mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; @@ -970,6 +982,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /*find context based on received context-id */ mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); if(NULL == mg_ctxt){ + mg_profile->mg_stats->total_num_of_get_ctxt_failed_error++; #ifdef BIT_64 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request Failed, context[%d] not found \n",ctxtId->val.val); @@ -983,6 +996,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand } if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + mg_profile->mg_stats->total_num_of_no_term_ctxt_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request Failed, requested term not associated with any context \n"); /* ERROR - termination didnt bind with requested context */ @@ -1012,6 +1026,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* IF there is any error , return */ if(term->mg_error_code && (*term->mg_error_code == MGT_MGCP_RSP_CODE_INCONSISTENT_LCL_OPT)){ + mg_profile->mg_stats->total_num_of_un_supported_codec_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request Failed, Unsupported Codec \n"); mg_util_set_err_string(&errTxt, " Unsupported Codec "); @@ -1041,6 +1056,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand /* SDP updated to termination */ if(SWITCH_STATUS_SUCCESS != megaco_activate_termination(term)) { + mg_profile->mg_stats->total_num_of_term_activation_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Modify request Failed, Activation of termination failed \n"); mg_util_set_err_string(&errTxt, " Resource Failure "); @@ -1193,6 +1209,8 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; + mg_profile->mg_stats->total_num_of_sub_recvd++; + /************************************************************************************************************************************************************/ /* Validating Subtract request *******************************************/ @@ -1243,6 +1261,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma /*find context based on received context-id */ mg_ctxt = megaco_get_context(mg_profile, ctxtId->val.val); if(NULL == mg_ctxt){ + mg_profile->mg_stats->total_num_of_get_ctxt_failed_error++; mg_util_set_ctxt_string(&errTxt, ctxtId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; goto error; @@ -1262,22 +1281,24 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); - if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "Subtract request Failed, termination no associated with any context \n"); - /* ERROR - termination didnt bind with requested context */ - mg_util_set_term_string(&errTxt,termId); - err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; - goto error; - } - - if(NULL == term){ + if(NULL == term){ + mg_profile->mg_stats->total_num_of_find_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Subtract request Failed, no termination found for input term string[%s] \n", (char*)termId->name.lcl.val); - mg_util_set_term_string(&errTxt,termId); - err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; - goto error; - } + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; + goto error; + } + + if(SWITCH_STATUS_FALSE == megaco_context_is_term_present(mg_ctxt, term)){ + mg_profile->mg_stats->total_num_of_no_term_ctxt_error++; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Subtract request Failed, termination no associated with any context \n"); + /* ERROR - termination didnt bind with requested context */ + mg_util_set_term_string(&errTxt,termId); + err_code = MGT_MGCO_RSP_CODE_NO_TERM_CTXT; + goto error; + } /* remove termination from context */ megaco_context_sub_termination(mg_ctxt, term); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index ce44617e28..ab039108fc 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -61,6 +61,24 @@ typedef struct mg_peer_profile_s{ } mg_peer_profile_t; +typedef struct mg_stats_s{ + uint32_t total_num_of_phy_add_recvd; + uint32_t total_num_of_rtp_add_recvd; + uint32_t total_num_of_sub_recvd; + uint32_t total_num_of_call_recvd; + uint32_t total_num_of_add_failed; + uint32_t total_num_of_term_already_in_ctxt_error; + uint32_t total_num_of_choose_ctxt_failed_error; + uint32_t total_num_of_choose_term_failed_error; + uint32_t total_num_of_find_term_failed_error; + uint32_t total_num_of_get_ctxt_failed_error; + uint32_t total_num_of_un_supported_codec_error; + uint32_t total_num_of_add_term_failed_error; + uint32_t total_num_of_term_activation_failed_error; + uint32_t total_num_of_no_term_ctxt_error; +}mg_stats_t; + + typedef enum { MG_TERM_FREE = 0, MG_TERM_TDM, @@ -217,6 +235,7 @@ struct megaco_profile_s { uint32_t rtpid_next; mg_termination_t *physical_terminations; + mg_stats_t* mg_stats; switch_hash_t *terminations; switch_thread_rwlock_t *terminations_rwlock; From 9c35f46edd97cdd94adcb05c1b8e57d2da187556 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 24 Aug 2012 17:21:44 -0400 Subject: [PATCH 462/493] adding more stats counters --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 4 ++++ src/mod/endpoints/mod_media_gateway/mod_media_gateway.c | 4 +++- src/mod/endpoints/mod_media_gateway/mod_media_gateway.h | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 00670be0c4..3a740a6f25 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -906,6 +906,10 @@ switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile mg_profile->mg_stats->total_num_of_term_activation_failed_error); stream->write_function(stream, "Total Number of Term not found in context error = %d \n", mg_profile->mg_stats->total_num_of_no_term_ctxt_error); + stream->write_function(stream, "Total Number of Term not in service error = %d \n", + mg_profile->mg_stats->total_num_of_term_not_in_service_error); + stream->write_function(stream, "Total Number of unknown context error = %d \n", + mg_profile->mg_stats->total_num_of_unknown_ctxt_error); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 57d2fa6286..d6d600f456 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -559,6 +559,7 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ MG_MEM_COPY(&prnt_buf, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n",(strlen(prnt_buf))?prnt_buf:"NULL"); + mg_profile->mg_stats->total_num_of_term_not_in_service_error++; mg_util_set_term_string(&errTxt, termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; @@ -789,7 +790,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) goto done; ctxt_error: - err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; + mg_profile->mg_stats->total_num_of_unknown_ctxt_error++; + err_code = MGT_MGCO_RSP_CODE_UNKNOWN_CTXT; error: if (SWITCH_STATUS_SUCCESS == diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index ab039108fc..a8438cc109 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -76,6 +76,8 @@ typedef struct mg_stats_s{ uint32_t total_num_of_add_term_failed_error; uint32_t total_num_of_term_activation_failed_error; uint32_t total_num_of_no_term_ctxt_error; + uint32_t total_num_of_term_not_in_service_error; + uint32_t total_num_of_unknown_ctxt_error; }mg_stats_t; From 3424380630837171c50e4161e75fda0ddeaa39c0 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 27 Aug 2012 10:12:14 -0400 Subject: [PATCH 463/493] fixing minor issues observed during load testing --- .../mod_media_gateway/media_gateway_cli.c | 19 ++++++++++++- .../media_gateway_cmd_handler.c | 28 +++++++++++++------ .../mod_media_gateway/media_gateway_utils.c | 12 ++++++-- .../mod_media_gateway/mod_media_gateway.c | 2 +- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 3a740a6f25..dff9da3294 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -21,6 +21,7 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); void megaco_cli_print_usage(switch_stream_handle_t *stream); switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); +switch_status_t handle_show_stack_mem(switch_stream_handle_t *stream); /******************************************************************************/ @@ -194,6 +195,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre }else if (!strcmp(argv[2], "show")) { /**********************************************************************************/ /* mg show activecalls*/ + if(zstr(argv[3])) { goto usage; } @@ -228,7 +230,7 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre }else if(!strcasecmp(argv[3], "stackmem")){ /*******************************************************************/ megaco_profile_release(profile); - sng_mg_reg_info_show(); + handle_show_stack_mem(stream); /*******************************************************************/ #ifdef LEAK_TEST }else if(!strcasecmp(argv[3], "leak-report")){ @@ -305,6 +307,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) stream->write_function(stream, "mg profile show termstatus \n"); stream->write_function(stream, "mg profile show alltermstatus \n"); stream->write_function(stream, "mg profile show stackmem \n"); + stream->write_function(stream, "mg profile show stats \n"); stream->write_function(stream, "Usage: Logging \n"); stream->write_function(stream, "mg logging enable \n"); @@ -913,6 +916,20 @@ switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ +switch_status_t handle_show_stack_mem(switch_stream_handle_t *stream) +{ + U32 availMem = 0; + char buffer[4098]; + + memset(buffer,0,sizeof(buffer)); + + SGetMemInfoBuffer(S_REG, &availMem, buffer); + + stream->write_function(stream, "%s",buffer); + return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 17a0f01527..0cf98ed137 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -595,16 +595,19 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_context_t* mg_ctxt; int mediaId; MgMgcoLocalDesc *local = NULL; + char term_name[128]; /*CmSdpInfoSet *psdp = NULL;*/ - /* TODO - Kapil dummy line , will need to add with proper code */ + memset(&term_name,0,sizeof(term_name)); + inc_med_desc = &cmd->dl.descs[0]->u.media; /********************************************************************/ ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; - /* For Matt - termId->name.lcl.val - to get the termination id name */ + MG_MEM_COPY(&term_name, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + /********************************************************************/ /* Validating ADD request *******************************************/ @@ -683,13 +686,13 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i /********************************************************************/ }else{ /* Physical termination */ - term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + term = megaco_find_termination(mg_profile, term_name); mg_profile->mg_stats->total_num_of_phy_add_recvd++; if(NULL == term){ mg_profile->mg_stats->total_num_of_find_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - " megaco_find_termination failed for term-id[%s] \n",(char*)termId->name.lcl.val); + " megaco_find_termination failed for term-id[%s] \n", term_name); mg_util_set_err_string(&errTxt, " Resource Failure "); err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; goto error; @@ -904,12 +907,16 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand int mediaId; /*MgMgcoAmmReq *cmd = &inc_cmd->u.mgCmdInd[0]->cmd.u.mod;*/ U32 txn_id = inc_cmd->transId.val; + char term_name[128]; + + memset(&term_name,0,sizeof(term_name)); /********************************************************************/ ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; - /* For Matt - termId->name.lcl.val - to get the termination id name */ + + MG_MEM_COPY(&term_name, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); /********************************************************************/ /* Validation *******************************************/ @@ -964,7 +971,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand termId->name.lcl.val, ctxtId->type.val, ctxtId->val.val); #endif - term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + term = megaco_find_termination(mg_profile, term_name); if(NULL == term){ mg_profile->mg_stats->total_num_of_find_term_failed_error++; @@ -1200,7 +1207,9 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma mg_context_t* mg_ctxt = NULL; mg_termination_t* term = NULL; uint8_t wild = 0x00; + char term_name[128]; + memset(&term_name,0,sizeof(term_name)); wild = inc_cmd->u.mgCmdReq[0]->wild.pres; @@ -1208,6 +1217,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma ctxtId = &inc_cmd->contextId; termLst = mg_get_term_id_list(inc_cmd); termId = termLst->terms[0]; + MG_MEM_COPY(&term_name, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); mg_profile->mg_stats->total_num_of_sub_recvd++; @@ -1277,14 +1287,14 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma }else if(MGT_TERMID_OTHER == termId->type.val){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for termination[%s] \n", (char*)termId->name.lcl.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for termination[%s] \n", term_name); - term = megaco_find_termination(mg_profile, (char*)termId->name.lcl.val); + term = megaco_find_termination(mg_profile, term_name); if(NULL == term){ mg_profile->mg_stats->total_num_of_find_term_failed_error++; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "Subtract request Failed, no termination found for input term string[%s] \n", (char*)termId->name.lcl.val); + "Subtract request Failed, no termination found for input term string[%s] \n", term_name); mg_util_set_term_string(&errTxt,termId); err_code = MGT_MGCO_RSP_CODE_UNKNOWN_TERM_ID; goto error; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 6cea2f1480..9ff581f916 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -86,12 +86,18 @@ switch_status_t mg_stack_termination_is_in_service(megaco_profile_t* mg_profile, mg_termination_t* term = NULL; term = megaco_find_termination(mg_profile, term_str); + if(term && MG_TERM_RTP == term->type) { return SWITCH_STATUS_SUCCESS; - }else if(term && (MG_TERM_TDM == term->type) && - switch_test_flag(term, MG_IN_SERVICE)){ - return SWITCH_STATUS_SUCCESS; + }else if(term && (MG_TERM_TDM == term->type)){ + if(switch_test_flag(term, MG_IN_SERVICE)){ + return SWITCH_STATUS_SUCCESS; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, " Term[%s] not in service\n", term_str); + return SWITCH_STATUS_FALSE; + } } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, " Failed to find term for term string[%s]\n", term_str); return SWITCH_STATUS_FALSE; } } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index d6d600f456..1306d658ba 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -556,8 +556,8 @@ void handle_mgco_cmd_ind(Pst *pst, SuId suId, MgMgcoCommand* cmd) if ((CH_CMD_TYPE_IND == cmd->cmdType.val) && (MGT_TERMID_OTHER == termId->type.val) && (MGT_AUDITVAL != cmd->u.mgCmdInd[0]->cmd.type.val)){ - if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, (char*)termId->name.lcl.val, termId->name.lcl.len)){ MG_MEM_COPY(&prnt_buf, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + if(SWITCH_STATUS_FALSE == mg_stack_termination_is_in_service(mg_profile, prnt_buf, strlen(prnt_buf))){ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Termination[%s] not in service \n",(strlen(prnt_buf))?prnt_buf:"NULL"); mg_profile->mg_stats->total_num_of_term_not_in_service_error++; mg_util_set_term_string(&errTxt, termId); From 07cf111e8ec2131e170a01e752402c5fffb40e76 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 27 Aug 2012 11:54:05 -0400 Subject: [PATCH 464/493] fixing term service change mem leak issue --- .../mod_media_gateway/media_gateway_cli.c | 4 +++ .../media_gateway_cmd_handler.c | 14 ++------ .../mod_media_gateway/media_gateway_utils.c | 35 ++++++++++++++----- .../mod_media_gateway/mod_media_gateway.h | 2 ++ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index dff9da3294..97b3d1c79d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -886,6 +886,10 @@ switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile return SWITCH_STATUS_FALSE; } + stream->write_function(stream, "Total Number of IN-Service Service change sent = %d \n", + mg_profile->mg_stats->total_num_of_term_in_service_change_sent); + stream->write_function(stream, "Total Number of Out-Of-Service Service change sent = %d \n", + mg_profile->mg_stats->total_num_of_term_oos_service_change_sent); stream->write_function(stream, "Total Number of Physical ADD received = %d \n", mg_profile->mg_stats->total_num_of_phy_add_recvd); stream->write_function(stream, "Total Number of RTP ADD received = %d \n", mg_profile->mg_stats->total_num_of_rtp_add_recvd); stream->write_function(stream, "Total Number of SUB received = %d \n", mg_profile->mg_stats->total_num_of_sub_recvd); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 0cf98ed137..9ed09d8b7b 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -848,11 +848,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i ret = sng_mgco_send_cmd( mg_profile->idx, &rsp); - - if(is_rtp){ - /* releasing memory allocated for term->lcl.val */ - MG_STACK_MEM_FREE(out_termId->name.lcl.val, ((sizeof(U8)* strlen(term->name)))); - } } /*************************************************************************************************************************/ @@ -1936,6 +1931,7 @@ switch_status_t mg_send_ins_service_change(megaco_profile_t* mg_profile, const c "Sending In-Service Service Change for termination[%s] configured in mg profile[%s], suId[%d]\n", term_name, mg_profile->name, mg_profile->idx); + mg_profile->mg_stats->total_num_of_term_in_service_change_sent++; return mg_send_service_change(mg_profile->idx, term_name, MGT_SVCCHGMETH_RESTART, MG_SVC_REASON_900_RESTORED, wild); } @@ -1952,6 +1948,8 @@ switch_status_t mg_send_oos_service_change(megaco_profile_t* mg_profile, const c "Sending Out-Of-Service Service Change for termination[%s] configured in mg profile[%s], suId[%d]\n", term_name, mg_profile->name, mg_profile->idx); + mg_profile->mg_stats->total_num_of_term_oos_service_change_sent++; + return mg_send_service_change(mg_profile->idx, term_name, MGT_SVCCHGMETH_FORCED, MG_SVC_REASON_905_TERM_OOS, wild); } /*****************************************************************************************************************************/ @@ -2029,9 +2027,6 @@ switch_status_t mg_send_service_change(SuId suId, const char* term_name, uint8_ sng_mgco_send_cmd(suId, &request); - /* releasing memory allocated for term->lcl.val */ - MG_STACK_MEM_FREE(termId->name.lcl.val, ((sizeof(U8)* strlen(term_name)))); - return SWITCH_STATUS_SUCCESS; err: @@ -2471,9 +2466,6 @@ switch_status_t mg_send_notify(megaco_profile_t* mg_profile, const char* term_n sng_mgco_send_cmd(mg_profile->idx, &request); - /* releasing memory allocated for term->lcl.val */ - MG_STACK_MEM_FREE(termId->name.lcl.val, ((sizeof(U8)* strlen(term_name)))); - return SWITCH_STATUS_SUCCESS; } /*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 9ff581f916..8594e41d97 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -111,6 +111,8 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C Size size; #endif S16 ret = ROK; + Ptr* ptr = NULL; + memset(&prnt_buf,0,sizeof(prnt_buf)); termId->type.pres = PRSNT_NODEF; @@ -121,18 +123,33 @@ S16 mg_fill_mgco_termid ( MgMgcoTermId *termId, char* term_str, int term_len, C termId->type.val = MGT_TERMID_OTHER; - termId->name.dom.pres = NOTPRSNT; - termId->name.dom.len = 0x00; - termId->name.pres.pres = PRSNT_NODEF; - termId->name.lcl.pres = PRSNT_NODEF; - termId->name.lcl.len = cmStrlen((U8*)term_str); - size = ((sizeof(U8)* term_len)); - MG_STACK_MEM_ALLOC(&termId->name.lcl.val, size); - cmMemcpy((U8*)(termId->name.lcl.val),(CONSTANT U8*)term_str,termId->name.lcl.len); + /* domain */ + termId->name.dom.pres = NOTPRSNT; + termId->name.dom.len = 0x00; - MG_MEM_COPY(&prnt_buf, termId->name.lcl.val, sizeof(U8) * termId->name.lcl.len); + ptr = (Ptr*)&termId->name.dom.val; + if( cmGetMem(memCp, 128, ptr) != ROK ){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmGetMem failed \n"); + RETVALUE(RFAILED); + } + + /* term name */ + termId->name.lcl.pres = PRSNT_NODEF; + termId->name.lcl.len = cmStrlen((CONSTANT U8*)term_str); + + ptr = (Ptr*)&termId->name.lcl.val; + if( cmGetMem(memCp, termId->name.lcl.len, ptr) != ROK ){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmGetMem failed \n"); + RETVALUE(RFAILED); + } + + cmMemset((U8 *)(termId->name.lcl.val), (U8)0, (PTR)(termId->name.lcl.len)); + + cmMemcpy((U8*)(termId->name.lcl.val), (CONSTANT U8*)term_str,termId->name.lcl.len); + + cmMemcpy((U8*)(prnt_buf), (CONSTANT U8*)termId->name.lcl.val,termId->name.lcl.len); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mg_fill_mgco_termid: Megaco termination name[%s], len[%d], input_term_str[%s], input_term_len[%d]\n", diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index a8438cc109..fba52c881d 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -63,6 +63,8 @@ typedef struct mg_peer_profile_s{ typedef struct mg_stats_s{ uint32_t total_num_of_phy_add_recvd; + uint32_t total_num_of_term_in_service_change_sent; + uint32_t total_num_of_term_oos_service_change_sent; uint32_t total_num_of_rtp_add_recvd; uint32_t total_num_of_sub_recvd; uint32_t total_num_of_call_recvd; From c670489495c6911b52e80cbd6cd51b4ee451ca29 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 27 Aug 2012 14:38:08 -0400 Subject: [PATCH 465/493] adding code to lock term hash list before reading --- .../endpoints/mod_media_gateway/media_gateway_cli.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 97b3d1c79d..24ec5989ce 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -740,10 +740,13 @@ switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, m stream->write_function(stream, " Termination Name"); stream->write_function(stream, "\t Termination State"); + stream->write_function(stream, "\t Call State"); stream->write_function(stream, "\t Termination Type"); stream->write_function(stream, "\t Span-Id "); stream->write_function(stream, "\t Channel-Id "); + switch_thread_rwlock_rdlock(mg_profile->terminations_rwlock); + for (hi = switch_hash_first(NULL, mg_profile->terminations); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, &var, NULL, &val); term = (mg_termination_t *) val; @@ -758,6 +761,8 @@ switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, m stream->write_function(stream, "\t\t\t %s", (switch_test_flag(term, MG_IN_SERVICE))?"IN-SERVICE":"OUT-OF-SERVICE"); } + + stream->write_function(stream, "\t\t%s",(NULL != term->uuid)?"IN-CALL ":"IDLE "); stream->write_function(stream, "\t\t %s",(MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); if(MG_TERM_TDM == term->type){ @@ -771,6 +776,8 @@ switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, m stream->write_function(stream, "\n"); } + switch_thread_rwlock_unlock(mg_profile->terminations_rwlock); + return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ @@ -849,6 +856,9 @@ switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, } stream->write_function(stream, "\n ------- Active Calls Terminations ------- \n"); + + switch_thread_rwlock_rdlock(mg_profile->terminations_rwlock); + for (hi = switch_hash_first(NULL, mg_profile->terminations); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, &var, NULL, &val); term = (mg_termination_t *) val; @@ -870,6 +880,8 @@ switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, stream->write_function(stream, "\n ********************************* \n"); } + switch_thread_rwlock_unlock(mg_profile->terminations_rwlock); + if(!found) stream->write_function(stream, "\n ------- NO Active Calls FOUND ------- \n"); From 94297df2acb45cceae726f3fc69140350a382503 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 27 Aug 2012 15:21:21 -0400 Subject: [PATCH 466/493] adding "spantermstatus " cli command to show terms status based on span name --- .../mod_media_gateway/media_gateway_cli.c | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 24ec5989ce..eb7356eccd 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -22,6 +22,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream); switch_status_t handle_show_activecalls_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile_t* mg_profile); switch_status_t handle_show_stack_mem(switch_stream_handle_t *stream); +switch_status_t handle_span_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* span_name); /******************************************************************************/ @@ -226,6 +227,16 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } megaco_profile_release(profile); handle_term_status_cli_cmd(stream, profile, argv[4]); + /*******************************************************************/ + }else if(!strcasecmp(argv[3], "spantermstatus")){ + /*******************************************************************/ + /* mg show spantermstatus */ + if (zstr(argv[4])) { + goto usage; + } + megaco_profile_release(profile); + handle_span_term_status_cli_cmd(stream, profile, argv[4]); + /*******************************************************************/ }else if(!strcasecmp(argv[3], "stackmem")){ /*******************************************************************/ @@ -304,6 +315,7 @@ void megaco_cli_print_usage(switch_stream_handle_t *stream) //stream->write_function(stream, "mg profile send ito notify \n"); //stream->write_function(stream, "mg profile send cng \n"); stream->write_function(stream, "mg profile show activecalls \n"); + stream->write_function(stream, "mg profile show spantermstatus \n"); stream->write_function(stream, "mg profile show termstatus \n"); stream->write_function(stream, "mg profile show alltermstatus \n"); stream->write_function(stream, "mg profile show stackmem \n"); @@ -781,6 +793,80 @@ switch_status_t handle_all_term_status_cli_cmd(switch_stream_handle_t *stream, m return SWITCH_STATUS_SUCCESS; } /******************************************************************************/ + +switch_status_t handle_span_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* span_name) +{ + void *val = NULL; + switch_hash_index_t *hi = NULL; + mg_termination_t *term = NULL; + const void *var; + int found = 0x00; + int first = 0x01; + + if(!mg_profile || !span_name){ + stream->write_function(stream, "-ERR NULL profile or NULL span_name\n"); + return SWITCH_STATUS_FALSE; + } + + switch_thread_rwlock_rdlock(mg_profile->terminations_rwlock); + + for (hi = switch_hash_first(NULL, mg_profile->terminations); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &var, NULL, &val); + term = (mg_termination_t *) val; + if(!term) continue; + + if(MG_TERM_RTP == term->type) continue; + + if(!term->u.tdm.span_name) continue; + + if(strcasecmp(span_name,term->u.tdm.span_name)) continue; + + found = 0x01; + + if(first){ + stream->write_function(stream, " Termination Name"); + stream->write_function(stream, "\t Termination State"); + stream->write_function(stream, "\t Call State"); + stream->write_function(stream, "\t Termination Type"); + stream->write_function(stream, "\t Span-Id "); + stream->write_function(stream, "\t Channel-Id "); + first = 0x00; + } + + stream->write_function(stream, "\n"); + + stream->write_function(stream, " %s",(NULL != term->name)?term->name:"NULL"); + if(MG_TERM_RTP == term->type){ + stream->write_function(stream, "\t\t\t IN-SERVICE"); + }else{ + stream->write_function(stream, "\t\t\t %s", + (switch_test_flag(term, MG_IN_SERVICE))?"IN-SERVICE":"OUT-OF-SERVICE"); + } + + stream->write_function(stream, "\t\t%s",(NULL != term->uuid)?"IN-CALL ":"IDLE "); + stream->write_function(stream, "\t\t %s",(MG_TERM_RTP == term->type)?"MG_TERM_RTP":"MG_TERM_TDM"); + + if(MG_TERM_TDM == term->type){ + stream->write_function(stream, "\t\t %s", + (NULL != term->u.tdm.span_name)?term->u.tdm.span_name:"NULL"); + stream->write_function(stream, "\t\t %d",term->u.tdm.channel); + }else{ + stream->write_function(stream, "\t\t -"); + stream->write_function(stream, "\t\t -"); + } + stream->write_function(stream, "\n"); + } + + if(!found){ + stream->write_function(stream, "No span[%s] configured\n",span_name); + } + + switch_thread_rwlock_unlock(mg_profile->terminations_rwlock); + + return SWITCH_STATUS_SUCCESS; +} +/******************************************************************************/ + switch_status_t handle_term_status_cli_cmd(switch_stream_handle_t *stream, megaco_profile_t* mg_profile, char* term_id) { mg_termination_t* term = NULL; From d5ea03d6931b77b8495b07356d8c59ced941d694 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 28 Aug 2012 17:35:37 -0400 Subject: [PATCH 467/493] fixing rtp termination id issue --- .../endpoints/mod_media_gateway/media_gateway.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index c4a1ab5acd..ec6313f035 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -374,8 +374,13 @@ void megaco_termination_destroy(mg_termination_t *term) term->uuid = NULL; } - if (term->type == MG_TERM_RTP && term->u.rtp.local_port != 0) { - switch_rtp_release_port(term->u.rtp.local_addr, term->u.rtp.local_port); + if (term->type == MG_TERM_RTP ){ + if(term->u.rtp.local_port != 0) { + switch_rtp_release_port(term->u.rtp.local_addr, term->u.rtp.local_port); + } + if(term->u.rtp.term_id != 0) { + mg_rtp_release_id(term->profile,term->u.rtp.term_id); + } } if(term->active_events){ @@ -603,6 +608,8 @@ void megaco_release_context(mg_context_t *ctx) uint32_t mg_rtp_request_id(megaco_profile_t *profile) { + uint32_t rtp_id = 0x00; + if (profile->rtpid_next >= MG_MAX_RTPID || profile->rtpid_next == 0) { profile->rtpid_next = 1; } @@ -610,8 +617,9 @@ uint32_t mg_rtp_request_id(megaco_profile_t *profile) for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { if ((profile->rtpid_bitmap[profile->rtpid_next / 8] & (1 << (profile->rtpid_next % 8))) == 0) { profile->rtpid_bitmap[profile->rtpid_next / 8] |= 1 << (profile->rtpid_next % 8); - profile->rtpid_next++; - return profile->rtpid_next; + rtp_id = profile->rtpid_next; + profile->rtpid_next++; + return rtp_id; } } From 5f02dd8b36766a8bb84c616961b5bbd9272106d9 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Wed, 29 Aug 2012 16:19:46 -0400 Subject: [PATCH 468/493] adding mg term license validation code --- .../mod_media_gateway/media_gateway.c | 3 +- .../mod_media_gateway/media_gateway_xml.c | 32 +++++++++++++++---- .../mod_media_gateway/mod_media_gateway.h | 2 ++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index ec6313f035..853674d636 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -575,7 +575,7 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) } switch_thread_rwlock_unlock(profile->contexts_rwlock); - + return ctx; } @@ -647,6 +647,7 @@ switch_status_t megaco_profile_start(const char *profilename) profile->name = switch_core_strdup(pool, profilename); profile->next_context_id++; profile->inact_tmr = 0x00; + profile->total_cfg_term = 0x00; profile->peer_active = 0x00; profile->mg_stats = switch_core_alloc(pool, sizeof(mg_stats_t)); profile->inact_tmr_task_id = 0x00; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index a923b8d452..8f1a358d3e 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -25,10 +25,14 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) switch_xml_config_item_t *instructions = (profile ? get_instructions(profile) : NULL); int count; int idx; + int ret=0; char *var, *val; mg_peer_profile_t* peer_profile = NULL; switch_xml_config_item_t *instructions1 = NULL; switch_memory_pool_t *pool; + char lic_sig_file[4096]; + + memset(&lic_sig_file[0],0,sizeof(lic_sig_file)); if (!(xml = switch_xml_open_cfg(file, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open %s\n", file); @@ -64,10 +68,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) goto done; } - profile->idx = ++mg_sap_id; - if ((mg_phys_terms = switch_xml_child(mg_interface, "physical_terminations"))) { for (mg_term = switch_xml_child(mg_phys_terms, "map"); mg_term; mg_term = mg_term->next) { // @@ -148,11 +150,28 @@ else if (!mg_interface) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error profile %s not found\n", profile->name); - return SWITCH_STATUS_FALSE; + status = SWITCH_STATUS_FALSE; + } + + + if((profile->license) && ('\0' != profile->license[0])){ + sprintf(lic_sig_file, "%s.sig", profile->license); + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to get License file \n"); + status = SWITCH_STATUS_FALSE; + goto done; + } + + MG_CHECK_LICENSE(profile->total_cfg_term,profile->license, &lic_sig_file[0], ret); + if(ret){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "License validation failed \n"); + status = SWITCH_STATUS_FALSE; + goto done; } /* go through the peer configuration and get the mg profile associated peers only */ if (!(mg_peers = switch_xml_child(cfg, "mg_peers"))) { + status = SWITCH_STATUS_FALSE; goto done; } @@ -232,6 +251,8 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char "Mapped termination [%s] to freetdm span: %s chan: %d\n", term->name, term->u.tdm.span_name, term->u.tdm.channel); megaco_prepare_tdm_termination(term); + + profile->total_cfg_term++; } /****************************************************************************************************************************/ switch_status_t mg_config_cleanup(megaco_profile_t* profile) @@ -291,7 +312,6 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_TRUE, /* enforce Max */ 9 }; -#endif static switch_xml_config_int_options_t pre_buffer_len = { SWITCH_TRUE, /* enforce min */ @@ -300,7 +320,6 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { 10000 }; -#if 0 static switch_xml_config_enum_item_t opt_default_codec_enum[] = { { "PCMA", MEGACO_CODEC_PCMA}, { "PCMU", MEGACO_CODEC_PCMU}, @@ -323,8 +342,9 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { //SWITCH_CONFIG_ITEM("rtp-port-range", SWITCH_CONFIG_STRING, CONFIG_REQUIRED, &profile->rtp_port_range, "1-65535", &switch_config_string_strdup, "", "rtp port range"), SWITCH_CONFIG_ITEM("rtp-termination-id-prefix", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_termination_id_prefix, "", &switch_config_string_strdup, "", "rtp termination prefix"), //SWITCH_CONFIG_ITEM("rtp-termination-id-length", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->rtp_termination_id_len, "", &opt_termination_id_len, "", "rtp termination id"), - SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), + //SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), + SWITCH_CONFIG_ITEM("license", SWITCH_CONFIG_STRING, 0, &profile->license, "/usr/local/nsg/conf/license.txt", &switch_config_string_strdup, "", "License file"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index fba52c881d..4db3226218 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -217,8 +217,10 @@ struct megaco_profile_s { char* my_ipaddr; /* local domain name */ char* port; /* port */ char* protocol_type; /* MEGACO/MGCP */ + char* license; /* License file location/name */ int protocol_version; /* Protocol supported version */ int total_peers; + int total_cfg_term; megaco_codec_t default_codec; char* rtp_port_range; char* rtp_termination_id_prefix; From 4569bbec2214cc034d4175d9447d6b5e1c6badf2 Mon Sep 17 00:00:00 2001 From: Kapil Date: Fri, 31 Aug 2012 11:54:24 -0400 Subject: [PATCH 469/493] redmine task# 5692 fix, changing log level for link error cases --- .../ftmod_sangoma_ss7_logger.c | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index e9b370a151..5280aeaa06 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -114,6 +114,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) { char buf[50]; int x = 1; + int log_level = FTDM_LOG_DEBUG; memset(buf, '\0', sizeof(buf)); @@ -158,11 +159,22 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) break; case (LCM_CAUSE_UNKNOWN): default: - ftdm_log(FTDM_LOG_DEBUG,"[MTP2]%s cause:%s event:%s\n", - buf, - DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), - DECODE_LSD_EVENT(sta->t.usta.alarm.event)); - break; + { + if((LSD_EVENT_ALIGN_LOST == sta->t.usta.alarm.event) || + (LSD_EVENT_PROT_ST_DN == sta->t.usta.alarm.event)){ + log_level = FTDM_LOG_ERROR; + }else if((LSD_EVENT_LINK_ALIGNED == sta->t.usta.alarm.event) || + ( LSD_EVENT_PROT_ST_UP == sta->t.usta.alarm.event)){ + log_level = FTDM_LOG_DEBUG; + }else { + log_level = FTDM_LOG_WARNING; + } + ftdm_log(log_level,"[MTP2]%s cause:%s event:%s\n", + buf, + DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), + DECODE_LSD_EVENT(sta->t.usta.alarm.event)); + break; + } /******************************************************************/ } /* switch (sta->t.usta.alarm.cause) */ break; @@ -207,7 +219,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_DEBUG,"[MTP2]%s %s : %s\n", + ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_DISC_REASON(sta->t.usta.evntParm[1])); From 5c3e8955de563a7a5b4c881351aa828d9a9dbbec Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 4 Sep 2012 11:03:26 -0400 Subject: [PATCH 470/493] Task #5695 - Need to have RTP IP input field in mod_media_gateway.conf.xml --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 5 ++++- .../endpoints/mod_media_gateway/media_gateway_xml.c | 10 ++++++++++ .../endpoints/mod_media_gateway/mod_media_gateway.h | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 853674d636..a520703933 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -129,6 +129,8 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, kMEDIATYPE, mg_media_type2str(term->u.rtp.media_type)); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "fax_enable_t38", "true"); switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "rtp_execute_on_image", "t38_gateway self nocng"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s local_add[%s]\n",__FUNCTION__, term->u.rtp.local_addr); } else if (term->type == MG_TERM_TDM) { switch_snprintf(dialstring, sizeof dialstring, "tdm/%s", term->name); @@ -276,7 +278,8 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha if (termtype == MG_TERM_RTP) { /* Fill in local address and reserve an rtp port */ - term->u.rtp.local_addr = profile->my_ipaddr; + //term->u.rtp.local_addr = profile->my_ipaddr; + term->u.rtp.local_addr = profile->rtp_ipaddr; term->u.rtp.local_port = switch_rtp_request_port(term->u.rtp.local_addr); term->u.rtp.codec = megaco_codec_str(profile->default_codec); term->u.rtp.term_id = term_id; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 8f1a358d3e..8b278279fe 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -64,6 +64,14 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) profile->total_peers++; } + /* If RTP-IP is not defined then default to local-ip */ + if((!profile->rtp_ipaddr) || + (profile->rtp_ipaddr && ('\0' == profile->rtp_ipaddr[0]))){ + profile->rtp_ipaddr = switch_mprintf("%s", profile->my_ipaddr); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"rtp_ipaddr[%s], local ip[%s]\n", profile->rtp_ipaddr, profile->my_ipaddr); + if(SWITCH_STATUS_FALSE == (status = modify_mg_profile_mid(profile, &profile->mid))){ goto done; } @@ -169,6 +177,7 @@ else goto done; } + /* go through the peer configuration and get the mg profile associated peers only */ if (!(mg_peers = switch_xml_child(cfg, "mg_peers"))) { status = SWITCH_STATUS_FALSE; @@ -345,6 +354,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { //SWITCH_CONFIG_ITEM("tdm-pre-buffer-size", SWITCH_CONFIG_INT, CONFIG_RELOADABLE, &profile->tdm_pre_buffer_size, 0, &pre_buffer_len, "", "freetdm pre buffer size"), SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM("license", SWITCH_CONFIG_STRING, 0, &profile->license, "/usr/local/nsg/conf/license.txt", &switch_config_string_strdup, "", "License file"), + SWITCH_CONFIG_ITEM("rtp-ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_ipaddr, "" , &switch_config_string_strdup, "", "rtp ip"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 4db3226218..b39a6ca51c 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -215,6 +215,7 @@ struct megaco_profile_s { char* mid; /* MG H.248 MID */ char* my_domain; /* local domain name */ char* my_ipaddr; /* local domain name */ + char* rtp_ipaddr; /* local rtp ip */ char* port; /* port */ char* protocol_type; /* MEGACO/MGCP */ char* license; /* License file location/name */ From 999f39cd34b18d6f2227254d1ff6d02252670bf3 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 4 Sep 2012 15:03:46 -0400 Subject: [PATCH 471/493] Copied over code that Robert used for mod_opal --- src/mod/endpoints/mod_opal/mod_opal.cpp | 118 +++++++++++++++++------- src/mod/endpoints/mod_opal/mod_opal.h | 36 ++++++-- 2 files changed, 115 insertions(+), 39 deletions(-) diff --git a/src/mod/endpoints/mod_opal/mod_opal.cpp b/src/mod/endpoints/mod_opal/mod_opal.cpp index 8244737115..82827015a7 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.cpp +++ b/src/mod/endpoints/mod_opal/mod_opal.cpp @@ -153,13 +153,27 @@ private: return 0; //Due to explicit setting of flags we know exactly what we are getting - PStringArray fields(6); - static PRegularExpression logRE("^([0-9]+)\t *([^(]+)\\(([0-9]+)\\)\t(.*)", PRegularExpression::Extended); + #define THREAD_ID_INDEX 2 + #define FILE_NAME_INDEX 3 + #define FILE_LINE_INDEX 4 +#if PTLIB_CHECK_VERSION(2,11,1) + #define CONTEXT_ID_REGEX "([0-9]+|- - - - - - -)\t" + #define LOG_PRINTF_FORMAT "{%s,%s} %s" + #define FULL_TEXT_INDEX 6 +#else + #define CONTEXT_ID_REGEX + #define LOG_PRINTF_FORMAT "{%s} %s" + #define FULL_TEXT_INDEX 5 +#endif + PStringArray fields(7); + static PRegularExpression logRE("^([0-9]+)\t *(.+)\t *([^(]+)\\(([0-9]+)\\)\t"CONTEXT_ID_REGEX"(.*)", + PRegularExpression::Extended); if (!logRE.Execute(s.c_str(), fields)) { fields[1] = "4"; - fields[2] = __FILE__; - fields[3] = __LINE__; - fields[4] = s; + fields[THREAD_ID_INDEX] = "unknown"; + fields[FILE_NAME_INDEX] = __FILE__; + fields[FILE_LINE_INDEX] = __LINE__; + fields[FULL_TEXT_INDEX] = s; } switch_log_level_t level; @@ -182,13 +196,21 @@ private: } fields[4].Replace("\t", " ", true); +#if PTLIB_CHECK_VERSION(2,11,1) + fields[5].Replace("- - - - - - -", "-"), +#endif switch_log_printf(SWITCH_CHANNEL_ID_LOG, - fields[2], + fields[FILE_NAME_INDEX], "PTLib-OPAL", - fields[3].AsUnsigned(), + fields[FILE_LINE_INDEX].AsUnsigned(), NULL, level, - "%s", fields[4].GetPointer()); + LOG_PRINTF_FORMAT, + fields[THREAD_ID_INDEX].GetPointer(), +#if PTLIB_CHECK_VERSION(2,11,1) + fields[5].GetPointer(), +#endif + fields[FULL_TEXT_INDEX].GetPointer()); // Reset string str(std::string()); @@ -337,6 +359,8 @@ switch_status_t FSManager::ReadConfig(int reload) m_dialplan = val; } else if (var == "codec-prefs") { m_codecPrefs = val; + } else if (var == "disable-transcoding") { + m_disableTranscoding = switch_true(val); } else if (var == "jitter-size") { SetAudioJitterDelay(val.AsUnsigned(), val.Mid(val.Find(',')+1).AsUnsigned()); // In milliseconds } else if (var == "gk-address") { @@ -352,7 +376,7 @@ switch_status_t FSManager::ReadConfig(int reload) PTrace::SetLevel(level); PTrace::ClearOptions(0xffffffff); // Everything off PTrace::SetOptions( // Except these - PTrace::TraceLevel|PTrace::FileAndLine + PTrace::TraceLevel|PTrace::FileAndLine|PTrace::Thread #if PTLIB_CHECK_VERSION(2,11,1) |PTrace::ContextIdentifier #endif @@ -493,6 +517,7 @@ FSConnection::FSConnection(OpalCall & call, switch_channel_set_caller_profile(m_fsChannel, caller_profile); SetLocalPartyName(caller_profile->caller_id_number); SetDisplayName(caller_profile->caller_id_name); + *params->new_session = m_fsSession; } @@ -629,19 +654,42 @@ void FSConnection::SetCodecs() PString codec_string = switch_channel_get_variable(m_fsChannel, "absolute_codec_string"); if (codec_string.IsEmpty()) { codec_string = switch_channel_get_variable(m_fsChannel, "codec_string"); - const char *orig_codec = switch_channel_get_variable(m_fsChannel, SWITCH_ORIGINATOR_CODEC_VARIABLE); - if (orig_codec) { - codec_string.Splice(orig_codec, 0); + if (codec_string.IsEmpty()) { + codec_string = m_endpoint.GetManager().GetCodecPrefs(); + if (codec_string.IsEmpty()) { + numCodecs = switch_loadable_module_get_codecs(codecs, sizeof(codecs) / sizeof(codecs[0])); + for (int i = 0; i < numCodecs; i++) { + if (i > 0) + codec_string += ','; + codec_string += codecs[i]->iananame; + } + PTRACE(4, "mod_opal\tDefault to all loaded codecs=" << codec_string); + } + else { + PTRACE(4, "mod_opal\tSettings codec-prefs=" << codec_string); + } + } + else { + PTRACE(4, "mod_opal\tChannel codec_string=" << codec_string); + } + + PString orig_codec = switch_channel_get_variable(m_fsChannel, SWITCH_ORIGINATOR_CODEC_VARIABLE); + if (!orig_codec.IsEmpty()) { + if (m_endpoint.GetManager().GetDisableTranscoding()) { + codec_string = orig_codec; + PTRACE(4, "mod_opal\tNo transcoding, forced to originator codec=" << orig_codec); + } + else { + codec_string.Splice(orig_codec+',', 0); + PTRACE(4, "mod_opal\tSetting preference to originator codec=" << orig_codec); + } } } - - if (codec_string.IsEmpty()) { - codec_string = m_endpoint.GetManager().GetCodecPrefs(); + else { + PTRACE(4, "mod_opal\tChannel absolute_codec_string=" << codec_string); } - if (codec_string.IsEmpty()) { - numCodecs = switch_loadable_module_get_codecs(codecs, sizeof(codecs) / sizeof(codecs[0])); - } else { + if (!codec_string.IsEmpty()) { char *codec_order[SWITCH_MAX_CODECS]; int codec_order_last = switch_separate_string((char *)codec_string.GetPointer(), ',', codec_order, SWITCH_MAX_CODECS); numCodecs = switch_loadable_module_get_codecs_sorted(codecs, SWITCH_MAX_CODECS, codec_order, codec_order_last); @@ -658,16 +706,19 @@ void FSConnection::SetCodecs() // See if we have a match by name alone switchFormat = codec->iananame; if (!switchFormat.IsValid()) { - PTRACE(2, "mod_opal\tCould not match FS codec " << codec->iananame << " to OPAL media format."); + PTRACE(2, "mod_opal\tCould not match FS codec " + << codec->iananame << '@' << codec->samples_per_second + << " (pt=" << codec->ianacode << ")" + " to an OPAL media format."); continue; } } - // Did we match or create a new media format? - if (switchFormat.IsValid() && codec->codec_type == SWITCH_CODEC_TYPE_AUDIO) { - PTRACE(3, "mod_opal\tMatched FS codec " << codec->iananame << " to OPAL media format " << switchFormat); + PTRACE(4, "mod_opal\tMatched FS codec " << codec->iananame << " to OPAL media format " << switchFormat); #if IMPLEMENT_MULTI_FAME_AUDIO + // Did we match or create a new media format? + if (switchFormat.IsValid() && codec->codec_type == SWITCH_CODEC_TYPE_AUDIO) { // Calculate frames per packet, do not use codec->codec_frames_per_packet as that field // has slightly different semantics when used in streamed codecs such as G.711 int fpp = codec->samples_per_packet/switchFormat.GetFrameTime(); @@ -687,8 +738,8 @@ void FSConnection::SetCodecs() if (fpp > switchFormat.GetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption())) { switchFormat.SetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption(), fpp); } -#endif // IMPLEMENT_MULTI_FAME_AUDIO } +#endif // IMPLEMENT_MULTI_FAME_AUDIO m_switchMediaFormats += switchFormat; } @@ -1006,7 +1057,7 @@ PBoolean FSMediaStream::Open() } else if (mediaFormat.GetMediaType() == OpalMediaType::Video()) { isAudio = false; } else { - return OpalMediaStream::Open(); + return false; } int ptime = mediaFormat.GetOptionInteger(OpalAudioFormat::TxFramesPerPacketOption()) * mediaFormat.GetFrameTime() / mediaFormat.GetTimeUnits(); @@ -1145,17 +1196,20 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag } } - if (!m_switchTimer) { - PTRACE(2, "mod_opal\tread_frame: no timer!"); - return SWITCH_STATUS_FALSE; + if (m_switchTimer != NULL) { + switch_core_timer_next(m_switchTimer); } - switch_core_timer_next(m_switchTimer); - if (!switch_core_codec_ready(m_switchCodec)) { - PTRACE(2, "mod_opal\tread_frame: codec not ready!"); - return SWITCH_STATUS_FALSE; + if (m_switchCodec != NULL) { + if (!switch_core_codec_ready(m_switchCodec)) { + PTRACE(2, "mod_opal\tread_frame: codec not ready!"); + return SWITCH_STATUS_FALSE; + } } + m_readFrame.packet = m_readRTP.GetPointer(); + m_readFrame.packetlen = m_readRTP.GetHeaderSize() + m_readFrame.datalen; + #if IMPLEMENT_MULTI_FAME_AUDIO // Repackage frames in incoming packet to agree with what FS expects. // Not implmented yet!!!!!!!!! @@ -1165,8 +1219,6 @@ switch_status_t FSMediaStream::read_frame(switch_frame_t **frame, switch_io_flag m_readFrame.buflen = m_readRTP.GetSize(); m_readFrame.data = m_readRTP.GetPayloadPtr(); m_readFrame.datalen = m_readRTP.GetPayloadSize(); - m_readFrame.packet = m_readRTP.GetPointer(); - m_readFrame.packetlen = m_readRTP.GetHeaderSize() + m_readFrame.datalen; m_readFrame.timestamp = m_readRTP.GetTimestamp(); m_readFrame.seq = m_readRTP.GetSequenceNumber(); m_readFrame.ssrc = m_readRTP.GetSyncSource(); diff --git a/src/mod/endpoints/mod_opal/mod_opal.h b/src/mod/endpoints/mod_opal/mod_opal.h index 07ba28a1f3..6a4590f654 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.h +++ b/src/mod/endpoints/mod_opal/mod_opal.h @@ -44,8 +44,29 @@ #undef strcasecmp #undef strncasecmp + +#if _MSC_VER < 1600 +/*The following insanity is because libteletone_generate.h defines int8_t in + a slightly different manner to most other cases (SDL, PCAP, Java V8, stdint.h + etc) and does not provide a mechanism to prevent it's inclusion. Then, to + cap it off, VS2008 barfs on the difference. VS2010 seems OK with it. + + Sigh. + */ +#pragma include_alias(, <../../libs/libteletone/src/libteletone.h>) +#pragma include_alias(, <../../libs/libteletone/src/libteletone_generate.h>) +#pragma include_alias(, <../../libs/libteletone/src/libteletone_detect.h>) +#define int8_t signed int8_t +#include +#undef int8_t +#endif // End of insanity + + #define HAVE_APR +#define uint32_t uint32_t // Avoid conflict in stdint definitions #include +#undef uint32_t + #include @@ -100,6 +121,7 @@ class FSManager : public OpalManager const PString & GetContext() const { return m_context; } const PString & GetDialPlan() const { return m_dialplan; } const PString & GetCodecPrefs() const { return m_codecPrefs; } + bool GetDisableTranscoding() const { return m_disableTranscoding; } private: switch_endpoint_interface_t *m_FreeSwitch; @@ -111,6 +133,7 @@ class FSManager : public OpalManager PString m_context; PString m_dialplan; PString m_codecPrefs; + bool m_disableTranscoding; PString m_gkAddress; PString m_gkIdentifer; PString m_gkInterface; @@ -221,9 +244,6 @@ class FSConnection : public OpalLocalConnection virtual OpalMediaFormatList GetMediaFormats() const; virtual PBoolean SendUserInputTone(char tone, unsigned duration); - void SetCodecs(); - bool WaitForMedia(); - DECLARE_CALLBACK0(on_init); DECLARE_CALLBACK0(on_destroy); DECLARE_CALLBACK0(on_routing); @@ -243,9 +263,6 @@ class FSConnection : public OpalLocalConnection DECLARE_CALLBACK3(read_video_frame, switch_frame_t **, frame, switch_io_flag_t, flag, int, stream_id); DECLARE_CALLBACK3(write_video_frame, switch_frame_t *, frame, switch_io_flag_t, flag, int, stream_id); - switch_status_t read_frame(const OpalMediaType & mediaType, switch_frame_t **frame, switch_io_flag_t flags); - switch_status_t write_frame(const OpalMediaType & mediaType, const switch_frame_t *frame, switch_io_flag_t flags); - __inline switch_core_session_t *GetSession() const { return m_fsSession; @@ -269,6 +286,13 @@ class FSConnection : public OpalLocalConnection return true; } + protected: + void SetCodecs(); + bool WaitForMedia(); + + switch_status_t read_frame(const OpalMediaType & mediaType, switch_frame_t **frame, switch_io_flag_t flags); + switch_status_t write_frame(const OpalMediaType & mediaType, const switch_frame_t *frame, switch_io_flag_t flags); + private: FSEndPoint &m_endpoint; switch_core_session_t *m_fsSession; From 3e39945d73bc55c9bae492161e968bed239a4f4f Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 4 Sep 2012 16:57:06 -0400 Subject: [PATCH 472/493] refs #5684 - make sure we retry all contexts ids if we start at the end of the list --- .../mod_media_gateway/media_gateway.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index a520703933..a82a28743f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -545,6 +545,7 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile) { mg_context_t *ctx=NULL; + uint32_t start_id = profile->next_context_id; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ @@ -552,6 +553,7 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) profile->next_context_id = 1; } +again: /* Look for an available context */ for (; profile->next_context_id < MG_MAX_CONTEXTS; profile->next_context_id++) { if ((profile->contexts_bitmap[profile->next_context_id / 8] & (1 << (profile->next_context_id % 8))) == 0) { @@ -576,6 +578,12 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) break; } } + + if (!ctx && start_id > 1) { + start_id = 1; + profile->next_context_id = 1; + goto again; + } switch_thread_rwlock_unlock(profile->contexts_rwlock); @@ -612,19 +620,27 @@ void megaco_release_context(mg_context_t *ctx) uint32_t mg_rtp_request_id(megaco_profile_t *profile) { uint32_t rtp_id = 0x00; + uint32_t start_id = profile->rtpid_next; if (profile->rtpid_next >= MG_MAX_RTPID || profile->rtpid_next == 0) { profile->rtpid_next = 1; } +again: for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { if ((profile->rtpid_bitmap[profile->rtpid_next / 8] & (1 << (profile->rtpid_next % 8))) == 0) { profile->rtpid_bitmap[profile->rtpid_next / 8] |= 1 << (profile->rtpid_next % 8); rtp_id = profile->rtpid_next; - profile->rtpid_next++; + profile->rtpid_next++; return rtp_id; } } + + if (start_id > 1) { + start_id = 1; + profile->rtpid_next = 1; + goto again; + } return 0; } From 15fa2276999f3b3a02194b0f0aa527bc5577427d Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Wed, 5 Sep 2012 02:26:39 -0400 Subject: [PATCH 473/493] freetdm: Fix ss7 logger broken compilation --- configure.in | 8 ++--- .../ftmod_sangoma_ss7_logger.c | 34 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/configure.in b/configure.in index 83cb4144eb..f6390b85e5 100644 --- a/configure.in +++ b/configure.in @@ -3,11 +3,11 @@ # Must change all of the below together # For a release, set revision for that tagged release as well and uncomment -AC_INIT([freeswitch], [1.2-rc2], BUG-REPORT-ADDRESS) -AC_SUBST(SWITCH_VERSION_MAJOR, [1]) -AC_SUBST(SWITCH_VERSION_MINOR, [2]) +AC_INIT([freeswitch], [4.3.0], BUG-REPORT-ADDRESS) +AC_SUBST(SWITCH_VERSION_MAJOR, [4]) +AC_SUBST(SWITCH_VERSION_MINOR, [3]) AC_SUBST(SWITCH_VERSION_MICRO, [0]) -AC_SUBST(SWITCH_VERSION_REVISION, [-rc2]) +AC_SUBST(SWITCH_VERSION_REVISION, [3e39945d73bc55c9bae492161e968bed239a4f4f]) AC_CONFIG_FILES([src/include/switch_version.h.in:src/include/switch_version.h.template]) AC_CONFIG_FILES([.version:.version.in]) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 5280aeaa06..7ea447f739 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -114,7 +114,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) { char buf[50]; int x = 1; - int log_level = FTDM_LOG_DEBUG; + int log_level = FTDM_LOG_LEVEL_DEBUG; memset(buf, '\0', sizeof(buf)); @@ -159,22 +159,22 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) break; case (LCM_CAUSE_UNKNOWN): default: - { - if((LSD_EVENT_ALIGN_LOST == sta->t.usta.alarm.event) || - (LSD_EVENT_PROT_ST_DN == sta->t.usta.alarm.event)){ - log_level = FTDM_LOG_ERROR; - }else if((LSD_EVENT_LINK_ALIGNED == sta->t.usta.alarm.event) || - ( LSD_EVENT_PROT_ST_UP == sta->t.usta.alarm.event)){ - log_level = FTDM_LOG_DEBUG; - }else { - log_level = FTDM_LOG_WARNING; - } - ftdm_log(log_level,"[MTP2]%s cause:%s event:%s\n", - buf, - DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), - DECODE_LSD_EVENT(sta->t.usta.alarm.event)); - break; - } + { + if ((LSD_EVENT_ALIGN_LOST == sta->t.usta.alarm.event) || + (LSD_EVENT_PROT_ST_DN == sta->t.usta.alarm.event)) { + log_level = FTDM_LOG_LEVEL_ERROR; + } else if ((LSD_EVENT_LINK_ALIGNED == sta->t.usta.alarm.event) || + (LSD_EVENT_PROT_ST_UP == sta->t.usta.alarm.event)){ + log_level = FTDM_LOG_LEVEL_DEBUG; + } else { + log_level = FTDM_LOG_LEVEL_WARNING; + } + ftdm_log(FTDM_PRE, log_level,"[MTP2]%s cause:%s event:%s\n", + buf, + DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), + DECODE_LSD_EVENT(sta->t.usta.alarm.event)); + break; + } /******************************************************************/ } /* switch (sta->t.usta.alarm.cause) */ break; From c260bc4b8a5e55988ee5efc54c79c600e6094091 Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 5 Sep 2012 18:03:08 -0400 Subject: [PATCH 474/493] Update mtp2 loglevels Alignment loss - wanring Alignment up - info --- .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 7ea447f739..987449069e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -162,10 +162,10 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) { if ((LSD_EVENT_ALIGN_LOST == sta->t.usta.alarm.event) || (LSD_EVENT_PROT_ST_DN == sta->t.usta.alarm.event)) { - log_level = FTDM_LOG_LEVEL_ERROR; + log_level = FTDM_LOG_LEVEL_WARNING; } else if ((LSD_EVENT_LINK_ALIGNED == sta->t.usta.alarm.event) || (LSD_EVENT_PROT_ST_UP == sta->t.usta.alarm.event)){ - log_level = FTDM_LOG_LEVEL_DEBUG; + log_level = FTDM_LOG_LEVEL_INFO; } else { log_level = FTDM_LOG_LEVEL_WARNING; } From 0c49449746b002d9c37a1f6fbea116aaaa389def Mon Sep 17 00:00:00 2001 From: Nenad Corbic Date: Wed, 5 Sep 2012 23:06:08 -0400 Subject: [PATCH 475/493] Changed MTP2 events from ERROR to WARN --- .../ftmod_sangoma_ss7_logger.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c index 987449069e..6d87738ceb 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c @@ -196,7 +196,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2]%s %s : %s\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_LSD_CAUSE(sta->t.usta.alarm.cause)); @@ -219,7 +219,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2]%s %s : %s\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_DISC_REASON(sta->t.usta.evntParm[1])); @@ -243,7 +243,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : RTB Queue Len(%d)|Oldest BSN(%d)|Tx Queue Len(%d)|Outstanding Frames(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2]%s %s : RTB Queue Len(%d)|Oldest BSN(%d)|Tx Queue Len(%d)|Outstanding Frames(%d)\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), sta->t.usta.evntParm[1], @@ -269,7 +269,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : RTB Queue Len(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2]%s %s : RTB Queue Len(%d)\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), sta->t.usta.evntParm[1]); @@ -292,7 +292,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name); } - ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %d\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2]%s %s : %d\n", buf, DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_DISC_REASON(sta->t.usta.evntParm[1])); @@ -300,7 +300,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) /**********************************************************************/ case (LCM_EVENT_UI_INV_EVT): case (LCM_EVENT_LI_INV_EVT): - ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s(%d) : %s(%d) : Primitive (%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2] %s(%d) : %s(%d) : Primitive (%d)\n", DECODE_LSD_EVENT(sta->t.usta.alarm.event), sta->t.usta.alarm.event, DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), @@ -314,14 +314,14 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) /******************************************************************/ case (LCM_CAUSE_UNKNOWN): case (LCM_CAUSE_SWVER_NAVAIL): - ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s : %s : Event (%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2] %s : %s : Event (%d)\n", DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), sta->t.usta.evntParm[0]); break; /******************************************************************/ case (LCM_CAUSE_DECODE_ERR): - ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s : %s : Primitive (%d)|Version (%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2] %s : %s : Primitive (%d)|Version (%d)\n", DECODE_LSD_EVENT(sta->t.usta.alarm.event), DECODE_LCM_CAUSE(sta->t.usta.alarm.cause), sta->t.usta.evntParm[0], @@ -329,7 +329,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) break; /******************************************************************/ default: - ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s(%d) : %s(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2] %s(%d) : %s(%d)\n", DECODE_LSD_EVENT(sta->t.usta.alarm.event), sta->t.usta.alarm.event, DECODE_LSD_CAUSE(sta->t.usta.alarm.cause), @@ -340,7 +340,7 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta) break; /**********************************************************************/ default: - ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s(%d) : %s(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP2] %s(%d) : %s(%d)\n", DECODE_LSD_EVENT(sta->t.usta.alarm.event), sta->t.usta.alarm.event, DECODE_LSD_CAUSE(sta->t.usta.alarm.cause), @@ -393,7 +393,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) /**********************************************************************/ case (LSN_EVENT_INV_OPC_OTHER_END): - ftdm_log(FTDM_LOG_ERROR,"[MTP3]%s %s : %s : OPC(0x%X%X%X%X)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP3]%s %s : %s : OPC(0x%X%X%X%X)\n", buf, DECODE_LSN_EVENT(sta->t.usta.alarm.event), DECODE_LSN_CAUSE(sta->t.usta.alarm.cause), @@ -404,7 +404,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) break; /**********************************************************************/ case (LSN_EVENT_INV_SLC_OTHER_END): - ftdm_log(FTDM_LOG_ERROR,"[MTP3]%s %s : %s : SLC(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP3]%s %s : %s : SLC(%d)\n", buf, DECODE_LSN_EVENT(sta->t.usta.alarm.event), DECODE_LSN_CAUSE(sta->t.usta.alarm.cause), @@ -412,7 +412,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) break; /**********************************************************************/ default: - ftdm_log(FTDM_LOG_DEBUG,"[MTP3]%s %s(%d) : %s(%d)\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP3]%s %s(%d) : %s(%d)\n", buf, DECODE_LSN_EVENT(sta->t.usta.alarm.event), sta->t.usta.alarm.event, @@ -424,7 +424,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) break; /**************************************************************************/ case (STNSAP): - ftdm_log(FTDM_LOG_ERROR,"[MTP3][SAPID:%d] %s : %s\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP3][SAPID:%d] %s : %s\n", sta->hdr.elmId.elmntInst1, DECODE_LSN_EVENT(sta->t.usta.alarm.event), DECODE_LSN_CAUSE(sta->t.usta.alarm.cause)); @@ -475,7 +475,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta) break; /**********************************************************************/ default: - ftdm_log(FTDM_LOG_ERROR,"[MTP3][DPC:0x%X%X%X%X] %s : %s\n", + ftdm_log(FTDM_LOG_WARNING,"[MTP3][DPC:0x%X%X%X%X] %s : %s\n", sta->t.usta.evntParm[0], sta->t.usta.evntParm[1], sta->t.usta.evntParm[2], @@ -745,7 +745,7 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta) } /* switch (sta->t.usta.dgn.dgnVal[x].t.type) */ } /* for (x = 0; x < 5; x++) */ - ftdm_log(FTDM_LOG_ERROR,"%s %s : %s\n", + ftdm_log(FTDM_LOG_WARNING,"%s %s : %s\n", msg, DECODE_LSI_EVENT(sta->t.usta.alarm.event), DECODE_LSI_CAUSE(sta->t.usta.alarm.cause)); @@ -771,7 +771,7 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) switch (sta->hdr.elmId.elmnt) { /**************************************************************************/ case (LRY_USTA_ERR): /* ERROR */ - ftdm_log(FTDM_LOG_ERROR,"[RELAY] Error: tx procId %d: err procId %d: channel %d: seq %s: reason %s\n", + ftdm_log(FTDM_LOG_WARNING,"[RELAY] Error: tx procId %d: err procId %d: channel %d: seq %s: reason %s\n", sta->t.usta.s.ryErrUsta.sendPid, sta->t.usta.s.ryErrUsta.errPid, sta->t.usta.s.ryErrUsta.id, @@ -795,7 +795,7 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) break; /**************************************************************************/ case (LRY_USTA_CNG): /* Congestion */ - ftdm_log(FTDM_LOG_ERROR,"[RELAY] Congestion: tx procId %d: rem procId %d: channel %d: %s\n", + ftdm_log(FTDM_LOG_WARNING,"[RELAY] Congestion: tx procId %d: rem procId %d: channel %d: %s\n", sta->t.usta.s.ryCongUsta.sendPid, sta->t.usta.s.ryCongUsta.remPid, sta->t.usta.s.ryCongUsta.id, @@ -813,7 +813,7 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) break; /**************************************************************************/ case (LRY_USTA_DN): /* channel down */ - ftdm_log(FTDM_LOG_ERROR,"[RELAY] Channel DOWN: tx procId %d: channel %d\n", + ftdm_log(FTDM_LOG_WARNING,"[RELAY] Channel DOWN: tx procId %d: channel %d\n", sta->t.usta.s.ryUpUsta.sendPid, sta->t.usta.s.ryUpUsta.id); @@ -823,7 +823,7 @@ void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta) break; /**************************************************************************/ case (LRY_USTA_TCP_CONN_FAILED): - ftdm_log(FTDM_LOG_ERROR,"[RELAY] TCP connection failed \n" ); + ftdm_log(FTDM_LOG_WARNING,"[RELAY] TCP connection failed \n" ); break; /**************************************************************************/ From a425177bbf7805c06b8137361eefdde13d43a01e Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 11:28:30 -0400 Subject: [PATCH 476/493] adding new "fax-detect-evevt-type" field in config --- .../mod_media_gateway/media_gateway.c | 32 ++++++++++++++++--- .../mod_media_gateway/media_gateway_xml.c | 9 ++++++ .../mod_media_gateway/mod_media_gateway.h | 26 +++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index a82a28743f..8b5d96930d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -191,10 +191,34 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); - if (term->type == MG_TERM_TDM) { - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); - } + if ((term->type == MG_TERM_TDM) && (term->profile)){ + switch(term->profile->fax_detect_evt_type){ + case MG_FAX_DETECT_EVENT_TYPE_CED: + { + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); + break; + } + case MG_FAX_DETECT_EVENT_TYPE_CNG: + { + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + break; + } + case MG_FAX_DETECT_EVENT_TYPE_CNG_CED: + { + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); + break; + } + case MG_FAX_DETECT_EVENT_TYPE_DISABLE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FAX detection Disable\n"); + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid FAX detection Event[%d]\n",term->profile->fax_detect_evt_type); + break; + } + } } switch_set_flag(term, MGT_ACTIVE); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 8b278279fe..4568030371 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -71,6 +71,7 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"rtp_ipaddr[%s], local ip[%s]\n", profile->rtp_ipaddr, profile->my_ipaddr); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"fax_detect_evt_type[%s]\n", mg_fax_detect_evt_type2str(profile->fax_detect_evt_type)); if(SWITCH_STATUS_FALSE == (status = modify_mg_profile_mid(profile, &profile->mid))){ goto done; @@ -337,6 +338,13 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { { "ILBC", MEGACO_CODEC_ILBC }, }; #endif + static switch_xml_config_enum_item_t opt_fax_detect_type_enum[] = { + { "CED", MG_FAX_DETECT_EVENT_TYPE_CED}, + { "CNG", MG_FAX_DETECT_EVENT_TYPE_CNG}, + { "CED_CNG", MG_FAX_DETECT_EVENT_TYPE_CNG_CED}, + { "DISABLE", MG_FAX_DETECT_EVENT_TYPE_DISABLE}, + }; + switch_xml_config_item_t instructions[] = { /* parameter name type reloadable pointer default value options structure */ @@ -355,6 +363,7 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM("license", SWITCH_CONFIG_STRING, 0, &profile->license, "/usr/local/nsg/conf/license.txt", &switch_config_string_strdup, "", "License file"), SWITCH_CONFIG_ITEM("rtp-ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_ipaddr, "" , &switch_config_string_strdup, "", "rtp ip"), + SWITCH_CONFIG_ITEM("fax-detect-event-type", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->fax_detect_evt_type, MG_FAX_DETECT_EVENT_TYPE_CNG_CED , &opt_fax_detect_type_enum, "", "fax-detect-event-type"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index b39a6ca51c..dfd1edb58e 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -150,6 +150,31 @@ static inline mg_media_type_t mg_media_type_parse(const char *str) { return MGM_INVALID; } +typedef enum { + MG_FAX_DETECT_EVENT_TYPE_NONE = 0, + MG_FAX_DETECT_EVENT_TYPE_CED, + MG_FAX_DETECT_EVENT_TYPE_CNG, + MG_FAX_DETECT_EVENT_TYPE_CNG_CED, + MG_FAX_DETECT_EVENT_TYPE_DISABLE, + MG_FAX_DETECT_EVENT_TYPE_INVALID, +} mg_fax_detect_event_type_t; + +static inline const char *mg_fax_detect_evt_type2str(mg_fax_detect_event_type_t type) { + switch (type) { + case MG_FAX_DETECT_EVENT_TYPE_CED: + return "CED"; + case MG_FAX_DETECT_EVENT_TYPE_CNG: + return "CNG"; + case MG_FAX_DETECT_EVENT_TYPE_CNG_CED: + return "CED AND CNG"; + case MG_FAX_DETECT_EVENT_TYPE_DISABLE: + return "DISABLE"; + default: + return "Invalid"; + } + return NULL; +} + struct mg_context_s { uint32_t context_id; mg_termination_t *terminations[MG_CONTEXT_MAX_TERMS]; @@ -232,6 +257,7 @@ struct megaco_profile_s { int inact_tmr; /* inactivity timer value */ int peer_active; /* inactivity timer value */ uint32_t inact_tmr_task_id; /* FS timer scheduler task-id */ + mg_fax_detect_event_type_t fax_detect_evt_type; switch_thread_rwlock_t *contexts_rwlock; uint32_t next_context_id; From 5f73d7457f2a92edf73750553b6ab983b5e0d43d Mon Sep 17 00:00:00 2001 From: Kapil Date: Thu, 6 Sep 2012 11:33:08 -0400 Subject: [PATCH 477/493] Revert "refs #5684 - make sure we retry all contexts ids if we start at the end of the list" This reverts commit 3e39945d73bc55c9bae492161e968bed239a4f4f. --- .../mod_media_gateway/media_gateway.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 8b5d96930d..eaf33cdcc2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -569,7 +569,6 @@ mg_context_t *megaco_get_context(megaco_profile_t *profile, uint32_t context_id) mg_context_t *megaco_choose_context(megaco_profile_t *profile) { mg_context_t *ctx=NULL; - uint32_t start_id = profile->next_context_id; switch_thread_rwlock_wrlock(profile->contexts_rwlock); /* Try the next one */ @@ -577,7 +576,6 @@ mg_context_t *megaco_choose_context(megaco_profile_t *profile) profile->next_context_id = 1; } -again: /* Look for an available context */ for (; profile->next_context_id < MG_MAX_CONTEXTS; profile->next_context_id++) { if ((profile->contexts_bitmap[profile->next_context_id / 8] & (1 << (profile->next_context_id % 8))) == 0) { @@ -602,12 +600,6 @@ again: break; } } - - if (!ctx && start_id > 1) { - start_id = 1; - profile->next_context_id = 1; - goto again; - } switch_thread_rwlock_unlock(profile->contexts_rwlock); @@ -644,27 +636,19 @@ void megaco_release_context(mg_context_t *ctx) uint32_t mg_rtp_request_id(megaco_profile_t *profile) { uint32_t rtp_id = 0x00; - uint32_t start_id = profile->rtpid_next; if (profile->rtpid_next >= MG_MAX_RTPID || profile->rtpid_next == 0) { profile->rtpid_next = 1; } -again: for (; profile->rtpid_next < MG_MAX_RTPID; profile->rtpid_next++) { if ((profile->rtpid_bitmap[profile->rtpid_next / 8] & (1 << (profile->rtpid_next % 8))) == 0) { profile->rtpid_bitmap[profile->rtpid_next / 8] |= 1 << (profile->rtpid_next % 8); rtp_id = profile->rtpid_next; - profile->rtpid_next++; + profile->rtpid_next++; return rtp_id; } } - - if (start_id > 1) { - start_id = 1; - profile->rtpid_next = 1; - goto again; - } return 0; } From b285155449e6c294d63d15a5f1cf05671d70a9f4 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 11:52:23 -0400 Subject: [PATCH 478/493] temp fix - calling mg_choose_context api again if failure in first attempt --- .../media_gateway_cmd_handler.c | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 9ed09d8b7b..1268660d82 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -631,13 +631,19 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_ctxt = megaco_choose_context(mg_profile); - if(NULL == mg_ctxt){ - mg_profile->mg_stats->total_num_of_choose_ctxt_failed_error++; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); - mg_util_set_err_string(&errTxt, " Resource Failure "); - err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; - goto error; - } + if(NULL == mg_ctxt){ + /* temp fix - Calling again, just in case if this time we get context */ + mg_ctxt = megaco_choose_context(mg_profile); + if(NULL == mg_ctxt){ + mg_profile->mg_stats->total_num_of_choose_ctxt_failed_error++; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_context failed \n"); + mg_util_set_err_string(&errTxt, " Resource Failure "); + err_code = MGT_MGCO_RSP_CODE_RSRC_ERROR; + goto error; + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," megaco_choose_context - Success in 2nd Attempt \n"); + } + } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Allocated Context[%p] with context_id[%d]\n", (void*)mg_ctxt, mg_ctxt->context_id); From 6381d06c23d8a50550beae2497236b98bef9bfa3 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 12:56:57 -0400 Subject: [PATCH 479/493] adding TUCL enable/disable logging --- .../mod_media_gateway/media_gateway_stack.c | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c index 8a300ff97e..4030104c23 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.c @@ -33,6 +33,7 @@ int sng_mgco_mg_shutdown(); int sng_mgco_mg_ssap_stop(int sapId); int sng_mgco_mg_tpt_server_stop(megaco_profile_t* profile); int sng_mgco_mg_app_ssap_stop(int idx); +int mg_tucl_debug(int action); switch_status_t sng_mgco_stack_gen_cfg(); @@ -581,13 +582,15 @@ int mg_enable_logging() memset(&mgMngmt, 0, sizeof(mgMngmt)); cntrl = &mgMngmt.t.cntrl; + mg_tucl_debug(AENA); + /* initalize the post structure */ smPstInit(&pst); /* insert the destination Entity */ pst.dstEnt = ENTMG; mgMngmt.hdr.msgType = TCFG; - mgMngmt.hdr.entId.ent = ENTHI; + mgMngmt.hdr.entId.ent = ENTMG; mgMngmt.hdr.entId.inst = S_INST; mgMngmt.hdr.elmId.elmnt = STGEN; @@ -608,13 +611,15 @@ int mg_disable_logging() memset(&mgMngmt, 0, sizeof(mgMngmt)); cntrl = &mgMngmt.t.cntrl; + mg_tucl_debug(ADISIMM); + /* initalize the post structure */ smPstInit(&pst); /* insert the destination Entity */ pst.dstEnt = ENTMG; mgMngmt.hdr.msgType = TCFG; - mgMngmt.hdr.entId.ent = ENTHI; + mgMngmt.hdr.entId.ent = ENTMG; mgMngmt.hdr.entId.inst = S_INST; mgMngmt.hdr.elmId.elmnt = STGEN; @@ -625,6 +630,38 @@ int mg_disable_logging() return(sng_cntrl_mg(&pst, &mgMngmt)); } +/******************************************************************************/ +int mg_tucl_debug(int action) +{ + Pst pst; + HiMngmt cntrl; + + memset((U8 *)&pst, 0, sizeof(Pst)); + memset((U8 *)&cntrl, 0, sizeof(HiMngmt)); + + smPstInit(&pst); + + pst.dstEnt = ENTHI; + + /* prepare header */ + cntrl.hdr.msgType = TCNTRL; /* message type */ + cntrl.hdr.entId.ent = ENTHI; /* entity */ + cntrl.hdr.entId.inst = 0; /* instance */ + cntrl.hdr.elmId.elmnt = STGEN; /* General */ + + cntrl.hdr.response.selector = 0; + cntrl.hdr.response.prior = PRIOR0; + cntrl.hdr.response.route = RTESPEC; + cntrl.hdr.response.mem.region = S_REG; + cntrl.hdr.response.mem.pool = S_POOL; + + cntrl.t.cntrl.action = action; + cntrl.t.cntrl.subAction = SADBG; + cntrl.t.cntrl.ctlType.hiDbg.dbgMask = 0xFFFF; + + return (sng_cntrl_tucl (&pst, &cntrl)); +} + /******************************************************************************/ int mgco_tucl_gen_config(void) { From 2097799bf94829cd360a82cd4086ba7921847fa5 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 14:31:28 -0400 Subject: [PATCH 480/493] changing logtype from error to info for couple of logging prints --- .../endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 1268660d82..f2673ac0c2 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -63,8 +63,6 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c int descId = 0x00; MgMgcoAmmReq* desc = NULL; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"cmd->cmdType.val[%d]\n",cmd->cmdType.val); - if(CH_CMD_TYPE_IND != cmd->cmdType.val) return SWITCH_STATUS_FALSE; @@ -103,7 +101,7 @@ switch_status_t mg_is_ito_pkg_req(megaco_profile_t* mg_profile, MgMgcoCommand *c /* As of now only handling ito package */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," Requested Event descriptor\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Requested Event descriptor\n"); if (evts->el.num.pres) numEvts = evts->el.num.val; @@ -1043,7 +1041,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand } if(MG_TERM_RTP == term->type){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"MODIFY REQUEST - Updated RTP attributes:" + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"MODIFY REQUEST - Updated RTP attributes:" " Media_Type(%s),local_addr[%s] local_port[%d] remote_addr[%s], remote_port[%d], ptime[%d] pt[%d], " " rfc2833_pt[%d] rate[%d], codec[%s], term_id[%d]\n", mg_media_type2str(term->u.rtp.media_type), From e3de0a5c70df8af9fbd254266c969ec4c386b6e9 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 14:37:36 -0400 Subject: [PATCH 481/493] logging change from ERROR to Warning [rtp.c:542 - Receive unknown command] --- src/mod/endpoints/mod_sofia/rtp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index a773a07590..50288a43df 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -539,7 +539,7 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi } } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Received unknown command [%s] in event.\n", !command ? "null" : command); } return SWITCH_STATUS_SUCCESS; From f49ee5ebf9dfcb2cbde425fa4f9d57ed97cb893d Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Thu, 6 Sep 2012 16:53:58 -0400 Subject: [PATCH 482/493] FreeTDM: Added function to listen for mg-tdm-dtmfremoval command to disable/enable DTMF removal per channel --- libs/freetdm/mod_freetdm/tdm.c | 64 +++++++++++++------ .../src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 22 +++++++ libs/freetdm/src/include/freetdm.h | 4 ++ 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index aa787d30c4..0c7657301d 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -141,6 +141,25 @@ static void ctdm_report_alarms(ftdm_channel_t *channel) return; } +static ftdm_channel_t *ctdm_get_channel_from_event(switch_event_t *event, ftdm_span_t *span) +{ + uint32_t chan_id = 0; + const char *chan_number = NULL; + + chan_number = switch_event_get_header(event, "chan-number"); + + if (zstr(chan_number)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No channel number specified\n"); + return NULL; + } + chan_id = atoi(chan_number); + if (!chan_id) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel number:%s\n", chan_number); + return NULL; + } + + return ftdm_span_get_channel(span, chan_id); +} static void ctdm_event_handler(switch_event_t *event) @@ -152,17 +171,15 @@ static void ctdm_event_handler(switch_event_t *event) ftdm_span_t *span = NULL; ftdm_channel_t *channel = NULL; const char *span_name = NULL; - const char *chan_number = NULL; - uint32_t chan_id = 0; + const char *cond = switch_event_get_header(event, "condition"); - + const char *command = switch_event_get_header(event, "command"); if (zstr(cond)) { return; } span_name = switch_event_get_header(event, "span-name"); - chan_number = switch_event_get_header(event, "chan-number"); - + if (ftdm_span_find_by_name(span_name, &span) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name); return; @@ -171,22 +188,12 @@ static void ctdm_event_handler(switch_event_t *event) if (!strcmp(cond, "mg-tdm-prepare")) { status = ctdm_span_prepare(span); if (status == FTDM_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Span %s prepared successfully\n", span_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s:prepared successfully\n", span_name); } else if (status != FTDM_EINVAL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to prepare span %s.\n", span_name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s:Failed to prepare span\n", span_name); } } else if (!strcmp(cond, "mg-tdm-check")) { - if (zstr(chan_number)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No channel number specified\n"); - return; - } - chan_id = atoi(chan_number); - if (!chan_id) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel number:%s\n", chan_number); - return; - } - - channel = ftdm_span_get_channel(span, chan_id); + channel = ctdm_get_channel_from_event(event, span); if (!channel) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find channel\n"); return; @@ -196,6 +203,27 @@ static void ctdm_event_handler(switch_event_t *event) ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); ctdm_report_alarms(channel); + } else if (!strcmp(cond, "mg-tdm-dtmfremoval")) { + uint8_t enable = 0; + channel = ctdm_get_channel_from_event(event, span); + if (!channel) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find channel\n"); + return; + } + + if (zstr(command)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s:No command specified for mg-tdm-dtmfremoval\n", span_name); + return; + } + + if (!strcmp(command, "enable")) { + enable = 1; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s DTMF-removal for %s:%d\n", + enable ? "Enabling" : "Disabling", ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel)); + + ftdm_channel_command(channel, enable ? FTDM_COMMAND_ENABLE_DTMF_REMOVAL : FTDM_COMMAND_DISABLE_DTMF_REMOVAL, 0); } } break; diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c index 87ba7ed728..707a82282a 100755 --- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c +++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c @@ -764,6 +764,28 @@ static FIO_COMMAND_FUNCTION(wanpipe_command) ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Disabled DTMF events\n"); #else return FTDM_NOTIMPL; +#endif + } + break; + case FTDM_COMMAND_ENABLE_DTMF_REMOVAL: + { +#ifdef WP_API_FEATURE_LIBSNG_HWEC + int return_code = 0; + err = sangoma_hwec_set_hwdtmf_removal(ftdmchan->sockfd, ftdmchan->physical_chan_id, &return_code, 1, 0); + if (return_code) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_ERROR, "Wanpipe failed to Disable HW-DTMF removal\n"); + } +#endif + } + break; + case FTDM_COMMAND_DISABLE_DTMF_REMOVAL: + { +#ifdef WP_API_FEATURE_LIBSNG_HWEC + int return_code = 0; + err = sangoma_hwec_set_hwdtmf_removal(ftdmchan->sockfd, ftdmchan->physical_chan_id, &return_code, 0, 0); + if (return_code) { + ftdm_log_chan_msg(ftdmchan, FTDM_LOG_ERROR, "Wanpipe failed to Disable HW-DTMF removal\n"); + } #endif } break; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index e041e1f0e7..6f0ac50371 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -733,6 +733,10 @@ typedef enum { /*!< Enable/disable IO stats in the channel */ FTDM_COMMAND_SWITCH_IOSTATS = 60, + /*!< Enable/disable DTMF removal */ + FTDM_COMMAND_ENABLE_DTMF_REMOVAL = 61, + FTDM_COMMAND_DISABLE_DTMF_REMOVAL = 62, + FTDM_COMMAND_COUNT, } ftdm_command_t; From fbfdfc1591325bb4b05e2ffe8819834c7912b5d8 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Thu, 6 Sep 2012 17:14:42 -0400 Subject: [PATCH 483/493] adding MG_FAX_NOTIFIED flag to notify only one fax event(ced or cng) per call to mgc --- .../mod_media_gateway/media_gateway.c | 76 +++++++------------ .../mod_media_gateway/media_gateway_xml.c | 15 +++- .../mod_media_gateway/mod_media_gateway.c | 47 +++++++++--- .../mod_media_gateway/mod_media_gateway.h | 11 ++- 4 files changed, 85 insertions(+), 64 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index eaf33cdcc2..ee96bc319d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -172,54 +172,30 @@ switch_status_t megaco_activate_termination(mg_termination_t *term) term->uuid = NULL; } - if (zstr(term->uuid)) { - switch_channel_t *channel; - if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); - status = SWITCH_STATUS_FALSE; - goto done; - } - - term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); - channel = switch_core_session_get_channel(session); - switch_channel_set_private(channel, PVT_MG_TERM, term); + if (zstr(term->uuid)) { + switch_channel_t *channel; + if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause)); + status = SWITCH_STATUS_FALSE; + goto done; + } - if (term->type == MG_TERM_RTP && term->u.rtp.t38_options) { - switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); - } - - switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); - - if ((term->type == MG_TERM_TDM) && (term->profile)){ - switch(term->profile->fax_detect_evt_type){ - case MG_FAX_DETECT_EVENT_TYPE_CED: - { - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); - break; - } - case MG_FAX_DETECT_EVENT_TYPE_CNG: - { - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); - break; - } - case MG_FAX_DETECT_EVENT_TYPE_CNG_CED: - { - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); - switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); - break; - } - case MG_FAX_DETECT_EVENT_TYPE_DISABLE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "FAX detection Disable\n"); - break; - } - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid FAX detection Event[%d]\n",term->profile->fax_detect_evt_type); - break; - } - } - } + term->uuid = switch_core_strdup(term->pool, switch_core_session_get_uuid(session)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session)); + channel = switch_core_session_get_channel(session); + switch_channel_set_private(channel, PVT_MG_TERM, term); + + if (term->type == MG_TERM_RTP && term->u.rtp.t38_options) { + switch_channel_set_private(channel, "t38_options", term->u.rtp.t38_options); + } + + switch_core_event_hook_add_recv_dtmf(session, mg_on_dtmf); + if (term->type == MG_TERM_TDM){ + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify ced 120 ced"); + switch_core_session_execute_application_async(session, "spandsp_start_fax_detect", "mg_notify cng 120 cng"); + } + + } switch_set_flag(term, MGT_ACTIVE); @@ -419,6 +395,7 @@ void megaco_termination_destroy(mg_termination_t *term) switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); + switch_clear_flag(term, MG_FAX_NOTIFIED); if (term->type == MG_TERM_RTP) { switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); @@ -757,8 +734,9 @@ switch_status_t mgco_init_ins_service_change(SuId suId) for (hi = switch_hash_first(NULL, profile->terminations); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, &key, &keylen, &val); term = (mg_termination_t *) val; - if(!term) continue; - megaco_check_tdm_termination(term); + if(!term) continue; + if(MG_TERM_RTP == term->type) continue; + megaco_check_tdm_termination(term); } return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 4568030371..3bfe075c80 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -71,7 +71,8 @@ switch_status_t config_profile(megaco_profile_t *profile, switch_bool_t reload) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"rtp_ipaddr[%s], local ip[%s]\n", profile->rtp_ipaddr, profile->my_ipaddr); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"fax_detect_evt_type[%s]\n", mg_fax_detect_evt_type2str(profile->fax_detect_evt_type)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"t38_fax_notify[%s]\n", + (MG_T38_FAX_NOTIFY_YES == profile->t38_fax_notify)?"ENABLE":"DISABLE"); if(SWITCH_STATUS_FALSE == (status = modify_mg_profile_mid(profile, &profile->mid))){ goto done; @@ -252,6 +253,7 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->u.tdm.channel = tdm_chan_num; term->u.tdm.span_name = switch_core_strdup(pool, channel_prefix); switch_set_flag(term, MG_OUT_OF_SERVICE); + switch_clear_flag(term, MG_FAX_NOTIFIED); switch_core_hash_insert_wrlock(profile->terminations, term->name, term, profile->terminations_rwlock); term->next = profile->physical_terminations; @@ -337,13 +339,19 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { { "G.723.1", MEGACO_CODEC_G723_1}, { "ILBC", MEGACO_CODEC_ILBC }, }; -#endif + static switch_xml_config_enum_item_t opt_fax_detect_type_enum[] = { { "CED", MG_FAX_DETECT_EVENT_TYPE_CED}, { "CNG", MG_FAX_DETECT_EVENT_TYPE_CNG}, { "CED_CNG", MG_FAX_DETECT_EVENT_TYPE_CNG_CED}, { "DISABLE", MG_FAX_DETECT_EVENT_TYPE_DISABLE}, }; +#endif + static switch_xml_config_enum_item_t opt_t38_fax_notify[] = { + { "ENABLE", MG_T38_FAX_NOTIFY_YES}, + { "DISABLE", MG_T38_FAX_NOTIFY_NO}, + }; + switch_xml_config_item_t instructions[] = { @@ -363,7 +371,8 @@ static switch_xml_config_item_t *get_instructions(megaco_profile_t *profile) { SWITCH_CONFIG_ITEM("codec-prefs", SWITCH_CONFIG_STRING, 0, &profile->codec_prefs, "", &switch_config_string_strdup, "", "codec preferences, coma-separated"), SWITCH_CONFIG_ITEM("license", SWITCH_CONFIG_STRING, 0, &profile->license, "/usr/local/nsg/conf/license.txt", &switch_config_string_strdup, "", "License file"), SWITCH_CONFIG_ITEM("rtp-ip", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rtp_ipaddr, "" , &switch_config_string_strdup, "", "rtp ip"), - SWITCH_CONFIG_ITEM("fax-detect-event-type", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->fax_detect_evt_type, MG_FAX_DETECT_EVENT_TYPE_CNG_CED , &opt_fax_detect_type_enum, "", "fax-detect-event-type"), + //SWITCH_CONFIG_ITEM("fax-detect-event-type", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->fax_detect_evt_type, MG_FAX_DETECT_EVENT_TYPE_CNG_CED , &opt_fax_detect_type_enum, "", "fax-detect-event-type"), + SWITCH_CONFIG_ITEM("t38-fax-notify", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &profile->t38_fax_notify, MG_T38_FAX_NOTIFY_YES , &opt_t38_fax_notify, "", "t38_fax_notify"), SWITCH_CONFIG_ITEM_END() }; diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 1306d658ba..45f240901d 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -36,17 +36,42 @@ SWITCH_STANDARD_APP(mg_notify_function) return; } - if (!strcmp(data, "cng")) { - mg_send_t38_cng_notify(term->profile, term->name); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); - /* Disable echo cancellation */ - mg_term_set_ec(term, 0); - } else if (!strcmp(data, "ced")) { - mg_send_t38_ans_notify(term->profile, term->name); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); - /* Disable echo cancellation */ - mg_term_set_ec(term, 0); - } + if (!strcmp(data, "cng")) { + if((term->profile) && + (term->profile->t38_fax_notify == MG_T38_FAX_NOTIFY_YES) && + !switch_test_flag(term, MG_FAX_NOTIFIED)){ + switch_set_flag(term, MG_FAX_NOTIFIED); + mg_send_t38_cng_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CNG notify\n"); + }else{ + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Not reporting CNG tone " + "FAX Notify[%s] MG_FAX_NOTIFIED flag [%s]\n", + (MG_T38_FAX_NOTIFY_YES == term->profile->t38_fax_notify)?"ENABLE":"DISABLE", + (switch_test_flag(term, MG_FAX_NOTIFIED))?"TRUE":"FALSE"); + } + /* Disable echo cancellation */ + if(MG_TERM_TDM == term->type){ + mg_term_set_ec(term, 0); + } + } else if (!strcmp(data, "ced")) { + if((term->profile) && + (term->profile->t38_fax_notify == MG_T38_FAX_NOTIFY_YES) && + !switch_test_flag(term, MG_FAX_NOTIFIED)){ + switch_set_flag(term, MG_FAX_NOTIFIED); + mg_send_t38_ans_notify(term->profile, term->name); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sent CED notify\n"); + }else{ + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Not reporting CED tone " + "FAX Notify[%s] MG_FAX_NOTIFIED flag [%s]\n", + (MG_T38_FAX_NOTIFY_YES == term->profile->t38_fax_notify)?"ENABLE":"DISABLE", + (switch_test_flag(term, MG_FAX_NOTIFIED))?"TRUE":"FALSE"); + } + + if(MG_TERM_TDM == term->type){ + mg_term_set_ec(term, 0); + } + } + } static switch_status_t console_complete_hashtable(switch_hash_t *hash, const char *line, const char *cursor, switch_console_callback_match_t **matches) diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index dfd1edb58e..b30c7d41b1 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -119,10 +119,19 @@ enum { MGT_ACTIVE = (1 << 1), MG_IN_SERVICE = (1 << 2), MG_OUT_OF_SERVICE = (1 << 3), + MG_FAX_NOTIFIED = (1 << 4), } mg_termination_flags; +typedef enum { + MG_T38_FAX_NOTIFY_NONE, + MG_T38_FAX_NOTIFY_YES, + MG_T38_FAX_NOTIFY_NO, + MG_T38_FAX_NOTIFY_INVALID, +} mg_t38_fax_notify_t; + + typedef enum { MGM_AUDIO = 0, MGM_IMAGE, @@ -257,7 +266,7 @@ struct megaco_profile_s { int inact_tmr; /* inactivity timer value */ int peer_active; /* inactivity timer value */ uint32_t inact_tmr_task_id; /* FS timer scheduler task-id */ - mg_fax_detect_event_type_t fax_detect_evt_type; + mg_t38_fax_notify_t t38_fax_notify; switch_thread_rwlock_t *contexts_rwlock; uint32_t next_context_id; From 1c907e5b047daa4dc05df46713dcfb2f5815e1db Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 7 Sep 2012 10:14:58 -0400 Subject: [PATCH 484/493] adding code to invoke freetdm dtmf removal api --- .../mod_media_gateway/media_gateway.c | 62 +++++++++++++++++++ .../media_gateway_cmd_handler.c | 11 ++++ .../mod_media_gateway/mod_media_gateway.h | 2 + 3 files changed, 75 insertions(+) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index ee96bc319d..4272e414af 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -208,6 +208,51 @@ done: return status; } +switch_status_t megaco_tdm_term_dtmf_removal(mg_termination_t *term, int enable) +{ + char buf[128]; + switch_event_t *event = NULL; + mg_termination_t* tdm_term = NULL; + + if(NULL == term) return SWITCH_STATUS_FALSE; + + if(MG_TERM_RTP == term->type){ + if(NULL == term->context) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Null Context from rtp term, not able to get tdm term \n"); + return SWITCH_STATUS_FALSE; + } + tdm_term = megaco_context_get_peer_term(term->context, term); + }else{ + tdm_term = term; + } + + if(NULL == tdm_term) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Null TDM term \n"); + return SWITCH_STATUS_FALSE; + } + + memset(&buf[0],0,sizeof(buf)); + + if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to create NOTIFY event\n"); + return SWITCH_STATUS_FALSE; + } + + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", tdm_term->u.tdm.span_name); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", tdm_term->u.tdm.channel); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "mg-tdm-dtmfremoval"); + + sprintf(buf,"%s",(1 == enable)?"enable":"disable"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Sending DTMF Removal Event[%s] for MG Term[%s], TDM span[%s] channel[%d]\n", + buf,tdm_term->name, tdm_term->u.tdm.span_name, tdm_term->u.tdm.channel); + + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "command", buf); + + switch_event_fire(&event); + return SWITCH_STATUS_SUCCESS; +} + switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term) { switch_event_t *event = NULL; @@ -403,6 +448,23 @@ void megaco_termination_destroy(mg_termination_t *term) } } +mg_termination_t* megaco_context_get_peer_term(mg_context_t *ctx, mg_termination_t *term) +{ + + switch_assert(ctx != NULL); + switch_assert(term != NULL); + + if (ctx->terminations[0] && (term == ctx->terminations[0])) { + return ctx->terminations[1]; + } + + if (ctx->terminations[1] && (term == ctx->terminations[1])) { + return ctx->terminations[0]; + } + + return NULL; +} + switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination_t *term) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index f2673ac0c2..cc393d8ff8 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -741,6 +741,17 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } + if(is_rtp){ + mg_termination_t* tdm_term = NULL; + /* disable dtmf removal */ + tdm_term = megaco_context_get_peer_term(mg_ctxt, term); + if(term->u.rtp.rfc2833_pt){ + megaco_tdm_term_dtmf_removal(tdm_term,0x01); + }else{ + megaco_tdm_term_dtmf_removal(tdm_term,0x00); + } + } + mg_print_t38_attributes(term); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index b30c7d41b1..95d738d559 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -321,6 +321,7 @@ static inline megaco_codec_t megaco_codec_parse(const char *codec) { } +switch_status_t megaco_tdm_term_dtmf_removal(mg_termination_t *term, int enable); megaco_profile_t *megaco_profile_locate(const char *name); mg_termination_t *megaco_term_locate_by_span_chan_id(const char *span_name, const char *chan_number); mg_peer_profile_t *megaco_peer_profile_locate(const char *name); @@ -363,6 +364,7 @@ switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination switch_status_t megaco_prepare_tdm_termination(mg_termination_t *term); switch_status_t megaco_check_tdm_termination(mg_termination_t *term); +mg_termination_t* megaco_context_get_peer_term(mg_context_t *ctx, mg_termination_t *term); From 84cd6f087317ee36ff9d977542066850af922eb1 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 7 Sep 2012 11:44:45 -0400 Subject: [PATCH 485/493] DTMF removal code - by default making disable --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 9 +++++++++ .../mod_media_gateway/media_gateway_cmd_handler.c | 2 -- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 4 ++++ src/mod/endpoints/mod_media_gateway/mod_media_gateway.h | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 4272e414af..1a1bba5475 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -244,6 +244,10 @@ switch_status_t megaco_tdm_term_dtmf_removal(mg_termination_t *term, int enable) sprintf(buf,"%s",(1 == enable)?"enable":"disable"); + if(enable){ + switch_set_flag(term, MG_DTMF_REMOVAL_ENABLE); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Sending DTMF Removal Event[%s] for MG Term[%s], TDM span[%s] channel[%d]\n", buf,tdm_term->name, tdm_term->u.tdm.span_name, tdm_term->u.tdm.channel); @@ -441,6 +445,11 @@ void megaco_termination_destroy(mg_termination_t *term) switch_clear_flag(term, MGT_ALLOCATED); switch_clear_flag(term, MGT_ACTIVE); switch_clear_flag(term, MG_FAX_NOTIFIED); + + if(switch_test_flag(term, MG_DTMF_REMOVAL_ENABLE)){ + switch_clear_flag(term, MG_DTMF_REMOVAL_ENABLE); + megaco_tdm_term_dtmf_removal(term,0x00); + } if (term->type == MG_TERM_RTP) { switch_core_hash_delete_wrlock(term->profile->terminations, term->name, term->profile->terminations_rwlock); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index cc393d8ff8..fe99a25b8d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -747,8 +747,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i tdm_term = megaco_context_get_peer_term(mg_ctxt, term); if(term->u.rtp.rfc2833_pt){ megaco_tdm_term_dtmf_removal(tdm_term,0x01); - }else{ - megaco_tdm_term_dtmf_removal(tdm_term,0x00); } } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 3bfe075c80..3f3e2c01c5 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -264,6 +264,10 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->name, term->u.tdm.span_name, term->u.tdm.channel); megaco_prepare_tdm_termination(term); + /* by-default : DTMF removal disable + * by default do not modify in-band audio stream*/ + megaco_tdm_term_dtmf_removal(term,0x00); + profile->total_cfg_term++; } /****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 95d738d559..640b22d7e0 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -120,6 +120,7 @@ enum { MG_IN_SERVICE = (1 << 2), MG_OUT_OF_SERVICE = (1 << 3), MG_FAX_NOTIFIED = (1 << 4), + MG_DTMF_REMOVAL_ENABLE = (1 << 5), } mg_termination_flags; From 50b044d66f8213077002f2df585203ad5c54a3f1 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Fri, 7 Sep 2012 12:10:16 -0400 Subject: [PATCH 486/493] adding api to release all calls/context during Subtract with Context ALL(C=*{S=*}) request processing --- .../mod_media_gateway/media_gateway.c | 16 ++++++++++++++++ .../media_gateway_cmd_handler.c | 2 +- .../mod_media_gateway/media_gateway_stack.h | 2 ++ .../media_gateway_stack_alarms.c | 1 + .../mod_media_gateway/mod_media_gateway.c | 19 +++++++++++++++++++ .../mod_media_gateway/mod_media_gateway.h | 1 + 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 1a1bba5475..2025ab2443 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -781,6 +781,22 @@ switch_status_t megaco_profile_destroy(megaco_profile_t **profile) return SWITCH_STATUS_SUCCESS; } +switch_status_t mgco_process_mgc_failure(SuId suId) +{ + megaco_profile_t* profile = NULL; + + if(NULL == (profile = megaco_get_profile_by_suId(suId))){ + return SWITCH_STATUS_FALSE; + } + + if(0x01 == profile->peer_active){ + /* MGC failure during active association , release all on-going calls contexts */ + megaco_release_all_calls(profile); + profile->peer_active = 0x00; + } + + return SWITCH_STATUS_SUCCESS; +} switch_status_t mgco_init_ins_service_change(SuId suId) { diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index fe99a25b8d..db297c7ff1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -1335,7 +1335,7 @@ switch_status_t handle_mg_subtract_cmd(megaco_profile_t* mg_profile, MgMgcoComma switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," SUB Request for ALL context \n"); - /* TODO */ + megaco_release_all_calls(mg_profile); /* As of now sending +ve response */ goto response; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 0b8c5746e1..4b1c80c220 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -247,6 +247,8 @@ switch_status_t mg_activate_ito_timer(megaco_profile_t* profile); void mg_restart_inactivity_timer(megaco_profile_t* profile); +switch_status_t mgco_process_mgc_failure(SuId suId); + /****************************************************************************************************************/ /* MG Stack defines */ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c index 6cba35d7c9..4c3e507fd1 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack_alarms.c @@ -76,6 +76,7 @@ void handle_mg_alarm(Pst *pst, MgMngmt *usta) { case LMG_EVENT_ALL_MGC_FAILED: { + //mgco_process_mgc_failure(usta->t.usta.alarmInfo.sapId); len = len + sprintf(prBuf+len, "ALL MGC Failed "); break; } diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c index 45f240901d..395254031c 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.c @@ -230,6 +230,25 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_media_gateway_shutdown) return SWITCH_STATUS_SUCCESS; } +/*****************************************************************************************************************************/ +switch_status_t megaco_release_all_calls(megaco_profile_t* mg_profile) +{ + mg_context_t* ctx = NULL; + uint32_t context_id = 0x00; + + if(NULL == mg_profile) return SWITCH_STATUS_FALSE; + + for (context_id = 0; context_id < MG_MAX_CONTEXTS; context_id++) { + ctx = megaco_get_context(mg_profile, context_id); + if(NULL == ctx) continue; + + megaco_context_sub_all_termination(ctx); + megaco_release_context(ctx); + } + + return SWITCH_STATUS_SUCCESS; +} + /*****************************************************************************************************************************/ switch_status_t megaco_start_all_profiles() { diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 640b22d7e0..004c5153b7 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -332,6 +332,7 @@ mg_termination_t* megaco_find_termination_by_span_chan(megaco_profile_t *profile switch_status_t megaco_start_all_profiles(void); switch_status_t megaco_profile_start(const char *profilename); switch_status_t megaco_profile_destroy(megaco_profile_t **profile); +switch_status_t megaco_release_all_calls(megaco_profile_t* mg_profile); uint32_t mg_rtp_request_id(megaco_profile_t *profile); void mg_rtp_release_id(megaco_profile_t *profile, uint32_t id); From c916c159e75d7bcbf0da0c823e7d1452ea07c9fb Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Sat, 8 Sep 2012 07:37:25 -0400 Subject: [PATCH 487/493] adding code to generate "DTMF Removal Enable/Disable" event from mod_media gateway to freetdm. --- src/mod/endpoints/mod_media_gateway/media_gateway.c | 3 +-- .../mod_media_gateway/media_gateway_cmd_handler.c | 9 ++++++--- src/mod/endpoints/mod_media_gateway/media_gateway_xml.c | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index 2025ab2443..e63c922f65 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -448,7 +448,7 @@ void megaco_termination_destroy(mg_termination_t *term) if(switch_test_flag(term, MG_DTMF_REMOVAL_ENABLE)){ switch_clear_flag(term, MG_DTMF_REMOVAL_ENABLE); - megaco_tdm_term_dtmf_removal(term,0x00); + //megaco_tdm_term_dtmf_removal(term,0x00); } if (term->type == MG_TERM_RTP) { @@ -792,7 +792,6 @@ switch_status_t mgco_process_mgc_failure(SuId suId) if(0x01 == profile->peer_active){ /* MGC failure during active association , release all on-going calls contexts */ megaco_release_all_calls(profile); - profile->peer_active = 0x00; } return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index db297c7ff1..9d0f19295a 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -744,9 +744,12 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i if(is_rtp){ mg_termination_t* tdm_term = NULL; /* disable dtmf removal */ - tdm_term = megaco_context_get_peer_term(mg_ctxt, term); - if(term->u.rtp.rfc2833_pt){ - megaco_tdm_term_dtmf_removal(tdm_term,0x01); + if(NULL != (tdm_term = megaco_context_get_peer_term(mg_ctxt, term))){ + if(term->u.rtp.rfc2833_pt){ + megaco_tdm_term_dtmf_removal(tdm_term,0x01); + }else{ + megaco_tdm_term_dtmf_removal(tdm_term,0x00); + } } } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c index 3f3e2c01c5..40ced6087d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_xml.c @@ -264,9 +264,11 @@ void mg_create_tdm_term(megaco_profile_t *profile, const char *tech, const char term->name, term->u.tdm.span_name, term->u.tdm.channel); megaco_prepare_tdm_termination(term); +#if 0 /* by-default : DTMF removal disable * by default do not modify in-band audio stream*/ megaco_tdm_term_dtmf_removal(term,0x00); +#endif profile->total_cfg_term++; } From fc4365c8a53677d890ad48b45a5c278a94d5fbea Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 10 Sep 2012 11:09:28 -0400 Subject: [PATCH 488/493] fixing issue of applying tdm dtmf removal --- .../media_gateway_cmd_handler.c | 14 ++------------ .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/media_gateway_utils.c | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 9d0f19295a..754bebece9 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -741,19 +741,8 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i goto error; } - if(is_rtp){ - mg_termination_t* tdm_term = NULL; - /* disable dtmf removal */ - if(NULL != (tdm_term = megaco_context_get_peer_term(mg_ctxt, term))){ - if(term->u.rtp.rfc2833_pt){ - megaco_tdm_term_dtmf_removal(tdm_term,0x01); - }else{ - megaco_tdm_term_dtmf_removal(tdm_term,0x00); - } - } - } + mg_apply_tdm_dtmf_removal(term, mg_ctxt); - mg_print_t38_attributes(term); /********************************************************************/ @@ -1069,6 +1058,7 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand term->u.rtp.term_id); } + mg_apply_tdm_dtmf_removal(term, mg_ctxt); mg_print_t38_attributes(term); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 4b1c80c220..6dfe9d2434 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -248,6 +248,7 @@ switch_status_t mg_activate_ito_timer(megaco_profile_t* profile); void mg_restart_inactivity_timer(megaco_profile_t* profile); switch_status_t mgco_process_mgc_failure(SuId suId); +void mg_apply_tdm_dtmf_removal(mg_termination_t* term, mg_context_t *mg_ctxt); /****************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 8594e41d97..b3de32b0fe 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -2354,3 +2354,22 @@ void mg_print_t38_attributes(mg_termination_t* term) } } + +/*****************************************************************************************************************************/ +void mg_apply_tdm_dtmf_removal(mg_termination_t* term, mg_context_t *mg_ctxt) +{ + mg_termination_t* tdm_term = NULL; + + if(NULL == term) return ; + + if((MG_TERM_RTP == term->type)){ + if(NULL != (tdm_term = megaco_context_get_peer_term(mg_ctxt, term))){ + if(term->u.rtp.rfc2833_pt){ + megaco_tdm_term_dtmf_removal(tdm_term,0x01); + }else{ + megaco_tdm_term_dtmf_removal(tdm_term,0x00); + } + } + } +} +/*****************************************************************************************************************************/ From 9537ed37378df6a3a1f552487c25d40780c06339 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 10 Sep 2012 13:33:54 -0400 Subject: [PATCH 489/493] code changes for the following issue 1)resetting term->u.rtp.rfc2833 , if ADD/MODIFY SDP does not have rfc2833 2) calling DTMF removal from modify request also depends on rfc2833 present in sdp or not 3) calling EC disable from ADD/MODIFY api handler if sdp contains T38 --- .../media_gateway_cmd_handler.c | 7 +- .../mod_media_gateway/media_gateway_stack.h | 1 + .../mod_media_gateway/media_gateway_utils.c | 900 +++++++++--------- 3 files changed, 469 insertions(+), 439 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 754bebece9..10157c173f 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -743,7 +743,9 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_apply_tdm_dtmf_removal(term, mg_ctxt); - mg_print_t38_attributes(term); + mg_apply_tdm_ec(term, mg_ctxt); + mg_print_t38_attributes(term); + /********************************************************************/ @@ -1059,9 +1061,12 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand } mg_apply_tdm_dtmf_removal(term, mg_ctxt); + + mg_apply_tdm_ec(term, mg_ctxt); mg_print_t38_attributes(term); + /* SDP updated to termination */ if(SWITCH_STATUS_SUCCESS != megaco_activate_termination(term)) { mg_profile->mg_stats->total_num_of_term_activation_failed_error++; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index 6dfe9d2434..e599ce70c4 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -249,6 +249,7 @@ void mg_restart_inactivity_timer(megaco_profile_t* profile); switch_status_t mgco_process_mgc_failure(SuId suId); void mg_apply_tdm_dtmf_removal(mg_termination_t* term, mg_context_t *mg_ctxt); +void mg_apply_tdm_ec(mg_termination_t* term, mg_context_t *mg_ctxt); /****************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index b3de32b0fe..1fd2a9cdad 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -459,459 +459,468 @@ void mg_util_set_cmd_name_string (MgStr *errTxt, MgMgcoCommand *cmd) /*****************************************************************************************************************************/ void mgco_handle_sdp_attr_set(CmSdpAttrSet *s, mg_termination_t* term) { - int i=0x00; - if (s->numComp.pres) { - for (i = 0; i < s->numComp.val; i++) { - CmSdpAttr *a = s->attr[i]; + int i=0x00; + int rfc2833_pres = 0x00; + if (s->numComp.pres) { + for (i = 0; i < s->numComp.val; i++) { + CmSdpAttr *a = s->attr[i]; - if(NOTPRSNT == a->type.pres) continue; + if(NOTPRSNT == a->type.pres) continue; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Attribute Type[%d]\n",a->type.val); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Attribute Type[%d]\n",a->type.val); - switch(a->type.val) - { - case CM_SDP_ATTR_GENERIC: - { - break; - } - case CM_SDP_ATTR_CAT: - { - break; - } + switch(a->type.val) + { + case CM_SDP_ATTR_GENERIC: + { + break; + } + case CM_SDP_ATTR_CAT: + { + break; + } - case CM_SDP_ATTR_KEYWDS: - { - break; - } - case CM_SDP_ATTR_TOOL: - { - break; - } - case CM_SDP_ATTR_PTIME: - { + case CM_SDP_ATTR_KEYWDS: + { + break; + } + case CM_SDP_ATTR_TOOL: + { + break; + } + case CM_SDP_ATTR_PTIME: + { #ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %d \n", - (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %d \n", + (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); #else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %ld \n", - (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t PTIME = %ld \n", + (NOTPRSNT != a->u.ptime.pres)?a->u.ptime.val:-1); #endif - if(MG_TERM_RTP == term->type){ - term->u.rtp.ptime = a->u.ptime.val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating ptime to [%d]\n", term->u.rtp.ptime); - } - break; - } - case CM_SDP_ATTR_RECVONLY: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RECVONLY: \n"); - break; - } - case CM_SDP_ATTR_SENDRECV: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDRECV: \n"); - break; - } - case CM_SDP_ATTR_SENDONLY: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDONLY: \n"); - break; - } - case CM_SDP_ATTR_ORIENT: - { - break; - } - case CM_SDP_ATTR_TYPE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_TYPE: \n"); - break; - } - case CM_SDP_ATTR_CHARSET: - { - break; - } - - case CM_SDP_ATTR_SDPLANG: - { - break; - } - - case CM_SDP_ATTR_LANG: - { - break; - } - case CM_SDP_ATTR_FRAMERATE: - { - break; - } - case CM_SDP_ATTR_QUALITY: - { - break; - } - case CM_SDP_ATTR_FMTP: - { - CmSdpAttrFmtp* f = &a->u.fmtp; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_FMTP: \n"); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Format Type = %d \n",(NOTPRSNT != f->type.pres)?f->type.val:-1); - - break; - } - case CM_SDP_ATTR_RTPMAP: - { - CmSdpAttrRtpMap* r = &a->u.rtpmap; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RTPMAP: \n"); - - if(NOTPRSNT != r->pres.pres){ - - /* payload type */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Payload Type = %d \n", - (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); - - /* payload value */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Payload Value = %d \n", - (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); - - /* encoding name */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Encoding Name value = %d \n", - (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); - - if((NOTPRSNT != r->enc.val.pres ) && - (CM_SDP_ENC_TELEPHONE_EVENT == r->enc.val.val)){ - - term->u.rtp.rfc2833_pt=r->pay.val.val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - " Updating rfc2833_pt to [%d] \n", term->u.rtp.rfc2833_pt); - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Encoding Name name = %s \n", - (NOTPRSNT != r->enc.name.pres)? - (char*)r->enc.name.val:"Not Present"); - -#ifdef BIT_64 - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Clock Rate = %d \n", - (NOTPRSNT != r->clk.pres)?r->clk.val:-1); -#else - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Clock Rate = %ld \n", - (NOTPRSNT != r->clk.pres)?r->clk.val:-1); -#endif - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t Encoding Parameters = %s \n", - (NOTPRSNT != r->parms.pres)? - (char*)r->parms.val:"Not Present"); - } - break; - } - case CM_SDP_ATTR_INACTIVE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_INACTIVE: \n"); - break; - } - case CM_SDP_ATTR_CONTROL: - { - break; - } - case CM_SDP_ATTR_RANGE: - { - break; - } - case CM_SDP_ATTR_ETAG: - { - break; - } - case CM_SDP_ATTR_ATMMAP: - { - break; - } - case CM_SDP_ATTR_EECID: - { - break; - } - case CM_SDP_ATTR_AALTYPE: - { - break; - } - case CM_SDP_ATTR_SILENCESUPP: - { - break; - } - case CM_SDP_ATTR_ECAN: - { - break; - } - case CM_SDP_ATTR_GC: - { - break; - } - case CM_SDP_ATTR_PROFILEDESC: - { - break; - } - case CM_SDP_ATTR_VSEL: - { - break; - } - case CM_SDP_ATTR_DSEL: - { - break; - } - case CM_SDP_ATTR_FSEL: - { - break; - } - case CM_SDP_ATTR_CAPABILITY: - { - break; - } - case CM_SDP_ATTR_QOSCLASS: - { - break; - } - case CM_SDP_ATTR_BCOB: - { - break; - } - case CM_SDP_ATTR_STC: - { - break; - } - case CM_SDP_ATTR_UPCC: - { - break; - } - case CM_SDP_ATTR_ATMQOSPARMS: - { - break; - } - case CM_SDP_ATTR_AAL2QOSFPARMS: - { - break; - } - case CM_SDP_ATTR_AAL2QOSBPARMS: - { - break; - } - case CM_SDP_ATTR_ATMTRFCDESC: - { - break; - } - case CM_SDP_ATTR_AAL2FTRFCDESC: - { - break; - } - case CM_SDP_ATTR_AAL2BTRFCDESC: - { - break; - } - case CM_SDP_ATTR_ABRPARMS: - { - break; - } - case CM_SDP_ATTR_CLKREC: - { - break; - } - case CM_SDP_ATTR_FEC: - { - break; - } - case CM_SDP_ATTR_PRTFL: - { - break; - } - case CM_SDP_ATTR_BEARERTYPE: - { - break; - } - case CM_SDP_ATTR_STRUCTURE: - { - break; - } - case CM_SDP_ATTR_SBC: - { - break; - } - case CM_SDP_ATTR_CPSSDUSIZE: - { - break; - } - case CM_SDP_ATTR_AAL2CPS: - { - break; - } - case CM_SDP_ATTR_ANYCAST: - { - break; - } - case CM_SDP_ATTR_WTP: - { - break; - } - case CM_SDP_ATTR_CACHE: - { - break; - } - case CM_SDP_ATTR_CHAIN: - { - break; - } - case CM_SDP_ATTR_PHONECONTEXT: - { - break; - } - case CM_SDP_ATTR_CLIR: - { - break; - } - case CM_SDP_ATTR_DIRECTION: - { - break; - } - case CM_SDP_ATTR_MAXPTIME: - { - break; - } - case CM_SDP_ATTR_T38_FAX: - { - CmSdpAttrT38Fax* f = &a->u.fax; - if(NOTPRSNT == f->type.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); - break; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "\t CM_SDP_ATTR_T38_FAX: type=%d\n", f->type.val); - - if(NULL == term->u.rtp.t38_options){ - term->u.rtp.t38_options = - switch_core_alloc(term->pool, sizeof *term->u.rtp.t38_options); - } - switch(f->type.val) - { - case CM_SDP_ATTR_T38_FAX_VER: - { - term->u.rtp.t38_options->T38FaxVersion = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_MAX_BIT_RATE: - { - term->u.rtp.t38_options->T38MaxBitRate = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_FILL_BIT_RMVL: - { - term->u.rtp.t38_options->T38FaxFillBitRemoval = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_TRNS_MMR: - { - term->u.rtp.t38_options->T38FaxTranscodingMMR = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_TRNS_JBIG: - { - term->u.rtp.t38_options->T38FaxTranscodingJBIG = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_RATE_MNGMNT: - { - switch(f->u.val.val) - { - case CM_SDP_ATTR_T38_FAX_RATE_MNG_LOC_TCF: - { - term->u.rtp.t38_options->T38FaxRateManagement = - switch_core_strdup(term->pool,"localTCF") ; - break; - } - case CM_SDP_ATTR_T38_FAX_RATE_MNG_TRANSF_TCF: - { - term->u.rtp.t38_options->T38FaxRateManagement = - switch_core_strdup(term->pool,"transferredTCF") ; - break; - } - } - break; - } - case CM_SDP_ATTR_T38_FAX_MAX_BFR: - { - term->u.rtp.t38_options->T38FaxMaxBuffer = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_MAX_DATAGRAM: - { - term->u.rtp.t38_options->T38FaxMaxDatagram = f->u.num.val; - break; - } - case CM_SDP_ATTR_T38_FAX_UDP_EC: - { - switch(f->u.val.val) - { - case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_FEC: - { - term->u.rtp.t38_options->T38FaxUdpEC = - switch_core_strdup(term->pool,"t38UDPNoEC"); - break; - } - case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_RED: - { - term->u.rtp.t38_options->T38FaxUdpEC = - switch_core_strdup(term->pool,"t38UDPRedundancy") ; - break; - } - } - break; - } - case CM_SDP_ATTR_T38_FAX_UNKNOWN: - { - if(f->u.unknown.name.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "T38: Attribute : name[len=%d, value=%s] \n", - f->u.unknown.name.len,(char*)f->u.unknown.name.val); + if(MG_TERM_RTP == term->type){ + term->u.rtp.ptime = a->u.ptime.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"Updating ptime to [%d]\n", term->u.rtp.ptime); } - if(f->u.unknown.val.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "T38: Attribute : value[len=%d, value=%s] \n", - f->u.unknown.val.len,(char*)f->u.unknown.val.val); - } - break; - } + break; + } + case CM_SDP_ATTR_RECVONLY: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RECVONLY: \n"); + break; + } + case CM_SDP_ATTR_SENDRECV: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDRECV: \n"); + break; + } + case CM_SDP_ATTR_SENDONLY: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_SENDONLY: \n"); + break; + } + case CM_SDP_ATTR_ORIENT: + { + break; + } + case CM_SDP_ATTR_TYPE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_TYPE: \n"); + break; + } + case CM_SDP_ATTR_CHARSET: + { + break; + } - default: - break; - } + case CM_SDP_ATTR_SDPLANG: + { + break; + } + + case CM_SDP_ATTR_LANG: + { + break; + } + case CM_SDP_ATTR_FRAMERATE: + { + break; + } + case CM_SDP_ATTR_QUALITY: + { + break; + } + case CM_SDP_ATTR_FMTP: + { + CmSdpAttrFmtp* f = &a->u.fmtp; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_FMTP: \n"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t Format Type = %d \n",(NOTPRSNT != f->type.pres)?f->type.val:-1); + + break; + } + case CM_SDP_ATTR_RTPMAP: + { + CmSdpAttrRtpMap* r = &a->u.rtpmap; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_RTPMAP: \n"); + + if(NOTPRSNT != r->pres.pres){ + + /* payload type */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Payload Type = %d \n", + (NOTPRSNT != r->pay.type.pres)?r->pay.type.val:-1); + + /* payload value */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Payload Value = %d \n", + (NOTPRSNT != r->pay.val.pres)?r->pay.val.val:-1); + + /* encoding name */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Name value = %d \n", + (NOTPRSNT != r->enc.val.pres)?r->enc.val.val:-1); + + if((NOTPRSNT != r->enc.val.pres ) && + (CM_SDP_ENC_TELEPHONE_EVENT == r->enc.val.val)){ + + rfc2833_pres = 0x01; + term->u.rtp.rfc2833_pt=r->pay.val.val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Updating rfc2833_pt to [%d] \n", term->u.rtp.rfc2833_pt); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Name name = %s \n", + (NOTPRSNT != r->enc.name.pres)? + (char*)r->enc.name.val:"Not Present"); + +#ifdef BIT_64 + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Clock Rate = %d \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); +#else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Clock Rate = %ld \n", + (NOTPRSNT != r->clk.pres)?r->clk.val:-1); +#endif + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t Encoding Parameters = %s \n", + (NOTPRSNT != r->parms.pres)? + (char*)r->parms.val:"Not Present"); + } + break; + } + case CM_SDP_ATTR_INACTIVE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\t CM_SDP_ATTR_INACTIVE: \n"); + break; + } + case CM_SDP_ATTR_CONTROL: + { + break; + } + case CM_SDP_ATTR_RANGE: + { + break; + } + case CM_SDP_ATTR_ETAG: + { + break; + } + case CM_SDP_ATTR_ATMMAP: + { + break; + } + case CM_SDP_ATTR_EECID: + { + break; + } + case CM_SDP_ATTR_AALTYPE: + { + break; + } + case CM_SDP_ATTR_SILENCESUPP: + { + break; + } + case CM_SDP_ATTR_ECAN: + { + break; + } + case CM_SDP_ATTR_GC: + { + break; + } + case CM_SDP_ATTR_PROFILEDESC: + { + break; + } + case CM_SDP_ATTR_VSEL: + { + break; + } + case CM_SDP_ATTR_DSEL: + { + break; + } + case CM_SDP_ATTR_FSEL: + { + break; + } + case CM_SDP_ATTR_CAPABILITY: + { + break; + } + case CM_SDP_ATTR_QOSCLASS: + { + break; + } + case CM_SDP_ATTR_BCOB: + { + break; + } + case CM_SDP_ATTR_STC: + { + break; + } + case CM_SDP_ATTR_UPCC: + { + break; + } + case CM_SDP_ATTR_ATMQOSPARMS: + { + break; + } + case CM_SDP_ATTR_AAL2QOSFPARMS: + { + break; + } + case CM_SDP_ATTR_AAL2QOSBPARMS: + { + break; + } + case CM_SDP_ATTR_ATMTRFCDESC: + { + break; + } + case CM_SDP_ATTR_AAL2FTRFCDESC: + { + break; + } + case CM_SDP_ATTR_AAL2BTRFCDESC: + { + break; + } + case CM_SDP_ATTR_ABRPARMS: + { + break; + } + case CM_SDP_ATTR_CLKREC: + { + break; + } + case CM_SDP_ATTR_FEC: + { + break; + } + case CM_SDP_ATTR_PRTFL: + { + break; + } + case CM_SDP_ATTR_BEARERTYPE: + { + break; + } + case CM_SDP_ATTR_STRUCTURE: + { + break; + } + case CM_SDP_ATTR_SBC: + { + break; + } + case CM_SDP_ATTR_CPSSDUSIZE: + { + break; + } + case CM_SDP_ATTR_AAL2CPS: + { + break; + } + case CM_SDP_ATTR_ANYCAST: + { + break; + } + case CM_SDP_ATTR_WTP: + { + break; + } + case CM_SDP_ATTR_CACHE: + { + break; + } + case CM_SDP_ATTR_CHAIN: + { + break; + } + case CM_SDP_ATTR_PHONECONTEXT: + { + break; + } + case CM_SDP_ATTR_CLIR: + { + break; + } + case CM_SDP_ATTR_DIRECTION: + { + break; + } + case CM_SDP_ATTR_MAXPTIME: + { + break; + } + case CM_SDP_ATTR_T38_FAX: + { + CmSdpAttrT38Fax* f = &a->u.fax; + if(NOTPRSNT == f->type.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "CM_SDP_ATTR_T38_FAX: TYPE not present \n"); + break; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "\t CM_SDP_ATTR_T38_FAX: type=%d\n", f->type.val); + + if(NULL == term->u.rtp.t38_options){ + term->u.rtp.t38_options = + switch_core_alloc(term->pool, sizeof *term->u.rtp.t38_options); + } + switch(f->type.val) + { + case CM_SDP_ATTR_T38_FAX_VER: + { + term->u.rtp.t38_options->T38FaxVersion = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_MAX_BIT_RATE: + { + term->u.rtp.t38_options->T38MaxBitRate = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_FILL_BIT_RMVL: + { + term->u.rtp.t38_options->T38FaxFillBitRemoval = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_TRNS_MMR: + { + term->u.rtp.t38_options->T38FaxTranscodingMMR = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_TRNS_JBIG: + { + term->u.rtp.t38_options->T38FaxTranscodingJBIG = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_RATE_MNGMNT: + { + switch(f->u.val.val) + { + case CM_SDP_ATTR_T38_FAX_RATE_MNG_LOC_TCF: + { + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"localTCF") ; + break; + } + case CM_SDP_ATTR_T38_FAX_RATE_MNG_TRANSF_TCF: + { + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"transferredTCF") ; + break; + } + } + break; + } + case CM_SDP_ATTR_T38_FAX_MAX_BFR: + { + term->u.rtp.t38_options->T38FaxMaxBuffer = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_MAX_DATAGRAM: + { + term->u.rtp.t38_options->T38FaxMaxDatagram = f->u.num.val; + break; + } + case CM_SDP_ATTR_T38_FAX_UDP_EC: + { + switch(f->u.val.val) + { + case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_FEC: + { + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPNoEC"); + break; + } + case CM_SDP_ATTR_T38_FAX_UDP_EC_UDP_RED: + { + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPRedundancy") ; + break; + } + } + break; + } + case CM_SDP_ATTR_T38_FAX_UNKNOWN: + { + if(f->u.unknown.name.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : name[len=%d, value=%s] \n", + f->u.unknown.name.len,(char*)f->u.unknown.name.val); + } + if(f->u.unknown.val.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "T38: Attribute : value[len=%d, value=%s] \n", + f->u.unknown.val.len,(char*)f->u.unknown.val.val); + } + break; + } + + default: + break; + } #if 0 - term->u.rtp.t38_options->T38FaxVersion = 0x01; - term->u.rtp.t38_options->T38MaxBitRate = 14400; - term->u.rtp.t38_options->T38FaxRateManagement = - switch_core_strdup(term->pool,"transferredTCF") ; - //term->u.rtp.t38_options->T38FaxMaxBuffer = ; - //term->u.rtp.t38_options->T38FaxMaxDatagram = ; - term->u.rtp.t38_options->T38FaxUdpEC = - switch_core_strdup(term->pool,"t38UDPRedundancy") ; - //term->u.rtp.t38_options->T38VendorInfo = + term->u.rtp.t38_options->T38FaxVersion = 0x01; + term->u.rtp.t38_options->T38MaxBitRate = 14400; + term->u.rtp.t38_options->T38FaxRateManagement = + switch_core_strdup(term->pool,"transferredTCF") ; + //term->u.rtp.t38_options->T38FaxMaxBuffer = ; + //term->u.rtp.t38_options->T38FaxMaxDatagram = ; + term->u.rtp.t38_options->T38FaxUdpEC = + switch_core_strdup(term->pool,"t38UDPRedundancy") ; + //term->u.rtp.t38_options->T38VendorInfo = #endif - break; - } - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not supported Type[%d]\n",a->type.val); - break; - } - } - }else{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "a-line not present \n"); - } + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not supported Type[%d]\n",a->type.val); + break; + } + } + + }else{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "a-line not present \n"); + } + + if(0x00 == rfc2833_pres){ + term->u.rtp.rfc2833_pt = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + " Resetting rfc2833_pt to [%d] \n", term->u.rtp.rfc2833_pt); + } } void mgco_handle_sdp_c_line(CmSdpConn *s, mg_termination_t* term, mgco_sdp_types_e sdp_type) @@ -2373,3 +2382,18 @@ void mg_apply_tdm_dtmf_removal(mg_termination_t* term, mg_context_t *mg_ctxt) } } /*****************************************************************************************************************************/ +void mg_apply_tdm_ec(mg_termination_t* term, mg_context_t *mg_ctxt) +{ + mg_termination_t* tdm_term = NULL; + + if(NULL == term) return ; + + if((MG_TERM_RTP == term->type)){ + if(NULL != (tdm_term = megaco_context_get_peer_term(mg_ctxt, term))){ + if(term->u.rtp.t38_options){ + mg_term_set_ec(tdm_term,0x00); + } + } + } +} +/*****************************************************************************************************************************/ From b47c9d929ceee81de3e885adffac612494cd02fb Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Mon, 10 Sep 2012 18:26:39 -0400 Subject: [PATCH 490/493] adding echo cancel code based on tdmc package --- .../mod_media_gateway/media_gateway.c | 20 +- .../media_gateway_cmd_handler.c | 579 +++++++++--------- .../mod_media_gateway/media_gateway_stack.h | 4 +- .../mod_media_gateway/media_gateway_utils.c | 8 + .../mod_media_gateway/mod_media_gateway.h | 24 + 5 files changed, 351 insertions(+), 284 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway.c b/src/mod/endpoints/mod_media_gateway/media_gateway.c index e63c922f65..98c10a7ca3 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway.c @@ -493,6 +493,7 @@ switch_status_t megaco_context_is_term_present(mg_context_t *ctx, mg_termination switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination_t *term) { + mg_termination_t* tdm_term = NULL; switch_status_t status = SWITCH_STATUS_SUCCESS; switch_assert(ctx != NULL); @@ -531,7 +532,19 @@ switch_status_t megaco_context_add_termination(mg_context_t *ctx, mg_termination switch_ivr_uuid_bridge(ctx->terminations[0]->uuid, ctx->terminations[1]->uuid); - ctx->terminations[0]->profile->mg_stats->total_num_of_call_recvd++; + if(MG_TERM_TDM == ctx->terminations[0]->type){ + tdm_term = ctx->terminations[0]; + }else{ + tdm_term = ctx->terminations[1]; + } + if(MG_EC_ENABLE == tdm_term->ec_type){ + mg_term_set_ec(tdm_term,0x01); + }else if(MG_EC_DISABLE == tdm_term->ec_type){ + mg_term_set_ec(tdm_term,0x00); + } + mg_set_term_ec_status(tdm_term, MG_EC_UNDEFINED); + + ctx->terminations[0]->profile->mg_stats->total_num_of_call_recvd++; } return SWITCH_STATUS_SUCCESS; @@ -893,7 +906,10 @@ void mg_term_set_ec(mg_termination_t *term, int enable) switch_core_session_rwunlock(session); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent echo_cancel event to [%s] to [%s]\n", term->uuid, enable ? "enable" : "disable"); - } + }else{ + mg_ec_types_t status = ((enable)?MG_EC_ENABLE:MG_EC_DISABLE); + mg_set_term_ec_status(term, status); + } switch_event_destroy(&event); } diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 10157c173f..5a6b4d8936 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -248,319 +248,336 @@ switch_status_t mg_prc_sig_desc(MgMgcoSignalsReq* req, megaco_profile_t* mg_prof * * */ -switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *cmd, mg_termination_t* term, CmMemListCp *memCp) +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *cmd, mg_termination_t* term, CmMemListCp *memCp) { - CmSdpMedProtoFmts *format; - TknU8 *fmt; - CmSdpMedFmtRtpList *fmt_list; - MgMgcoTermStateDesc *tstate; - int fmtCnt; - int i; - int descId = 0x00; - int j; - MgMgcoLocalParm *lclParm; - CmSdpInfo *sdp; - MgMgcoLclCtlDesc *locCtl; - MgMgcoTermStateParm *tsp; - MgMgcoAmmReq* desc = NULL; - MgMgcoLocalDesc *local; - MgMgcoRemoteDesc* remote; + CmSdpMedProtoFmts *format; + TknU8 *fmt; + CmSdpMedFmtRtpList *fmt_list; + MgMgcoTermStateDesc *tstate; + int fmtCnt; + int i; + int descId = 0x00; + int j; + MgMgcoLocalParm *lclParm; + CmSdpInfo *sdp; + MgMgcoLclCtlDesc *locCtl; + MgMgcoTermStateParm *tsp; + MgMgcoAmmReq* desc = NULL; + MgMgcoLocalDesc *local; + MgMgcoRemoteDesc* remote; - switch (cmd->cmdType.val) - { - case CH_CMD_TYPE_IND: - switch(cmd->u.mgCmdInd[0]->cmd.type.val) - { - case MGT_ADD: - { - desc = &cmd->u.mgCmdInd[0]->cmd.u.add; - break; - } - case MGT_MOVE: - { - desc = &cmd->u.mgCmdInd[0]->cmd.u.move; - break; - } - case MGT_MODIFY: - { - desc = &cmd->u.mgCmdInd[0]->cmd.u.mod; - break; - } - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Invalid cmd.type[%d] for descriptor processing \n", - cmd->u.mgCmdInd[0]->cmd.type.val); - return SWITCH_STATUS_FALSE; - } - break; - default: - { - return SWITCH_STATUS_FALSE; - } - } + switch (cmd->cmdType.val) + { + case CH_CMD_TYPE_IND: + switch(cmd->u.mgCmdInd[0]->cmd.type.val) + { + case MGT_ADD: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.add; + break; + } + case MGT_MOVE: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.move; + break; + } + case MGT_MODIFY: + { + desc = &cmd->u.mgCmdInd[0]->cmd.u.mod; + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"Invalid cmd.type[%d] for descriptor processing \n", + cmd->u.mgCmdInd[0]->cmd.type.val); + return SWITCH_STATUS_FALSE; + } + break; + default: + { + return SWITCH_STATUS_FALSE; + } + } - if(NULL == desc){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); - return SWITCH_STATUS_FALSE; - } + if(NULL == desc){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No Valid descriptor found \n"); + return SWITCH_STATUS_FALSE; + } - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] found in-coming megaco request \n", desc->dl.num.val); - if(NOTPRSNT == desc->dl.num.pres){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); - return SWITCH_STATUS_SUCCESS; - } + if(NOTPRSNT == desc->dl.num.pres){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"No descriptor found in-coming megaco request \n"); + return SWITCH_STATUS_SUCCESS; + } - for (descId = 0; descId < desc->dl.num.val; descId++) { - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); - switch (desc->dl.descs[descId]->type.val) { - case MGT_MEDIADESC: - { - int mediaId; - for (mediaId = 0; mediaId < desc->dl.descs[descId]->u.media.num.val; mediaId++) { - MgMgcoMediaPar *mediaPar = desc->dl.descs[descId]->u.media.parms[mediaId]; - switch (mediaPar->type.val) { - case MGT_MEDIAPAR_LOCAL: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL"); - /* Matt - check local descriptor processing */ - local = &mediaPar->u.local; - sdp = local->sdp.info[0]; - for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { - /* sdp formats */ - for (j = 0; j < - sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) - { - format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; - /* Matt - format has field for T38 also */ - if ((format->protType.pres != NOTPRSNT) && - (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { + for (descId = 0; descId < desc->dl.num.val; descId++) { + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,"descriptors[%d] type in-coming megaco request \n", desc->dl.descs[descId]->type.val); + switch (desc->dl.descs[descId]->type.val) { + case MGT_MEDIADESC: + { + int mediaId; + for (mediaId = 0; mediaId < desc->dl.descs[descId]->u.media.num.val; mediaId++) { + MgMgcoMediaPar *mediaPar = desc->dl.descs[descId]->u.media.parms[mediaId]; + switch (mediaPar->type.val) { + case MGT_MEDIAPAR_LOCAL: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCAL\n"); + /* Matt - check local descriptor processing */ + local = &mediaPar->u.local; + sdp = local->sdp.info[0]; + for (i = 0; i < sdp->mediaDescSet.numComp.val; i++) { + /* sdp formats */ + for (j = 0; j < + sdp->mediaDescSet.mediaDesc[i]->field.par.numProtFmts.val; j++) + { + format = sdp->mediaDescSet.mediaDesc[i]->field.par.pflst[j]; + /* Matt - format has field for T38 also */ + if ((format->protType.pres != NOTPRSNT) && + (format->protType.val == CM_SDP_MEDIA_PROTO_RTP)) { - /* protocol type RTP */ - fmt_list = &format->u.rtp; + /* protocol type RTP */ + fmt_list = &format->u.rtp; - /* print format */ - for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ - fmt = &fmt_list->fmts[i]->val; - if(fmt->pres == NOTPRSNT) continue; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Format [%d]\n", fmt->val); - } - } - } - } + /* print format */ + for(fmtCnt = 0; fmtCnt < fmt_list->num.val; fmtCnt++){ + fmt = &fmt_list->fmts[i]->val; + if(fmt->pres == NOTPRSNT) continue; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Format [%d]\n", fmt->val); + } + } + } + } - mgco_handle_incoming_sdp(&local->sdp, term, MG_SDP_LOCAL, mg_profile, memCp); + mgco_handle_incoming_sdp(&local->sdp, term, MG_SDP_LOCAL, mg_profile, memCp); - break; - } + break; + } - case MGT_MEDIAPAR_REMOTE: - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE"); - /* Matt - check remote descriptor processing */ - remote = &mediaPar->u.remote; - sdp = remote->sdp.info[0]; - /* for Matt - same like local descriptor */ - mgco_handle_incoming_sdp(&remote->sdp, term, MG_SDP_REMOTE, mg_profile, memCp); - break; - } + case MGT_MEDIAPAR_REMOTE: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_REMOTE\n"); + /* Matt - check remote descriptor processing */ + remote = &mediaPar->u.remote; + sdp = remote->sdp.info[0]; + /* for Matt - same like local descriptor */ + mgco_handle_incoming_sdp(&remote->sdp, term, MG_SDP_REMOTE, mg_profile, memCp); + break; + } - case MGT_MEDIAPAR_LOCCTL: - { - /* Matt - check Local Control descriptor processing */ - locCtl = &mediaPar->u.locCtl; - for (i = 0; i < locCtl->num.val; i++){ - lclParm = locCtl->parms[i]; - if (PRSNT_NODEF == lclParm->type.pres){ - switch(lclParm->type.val) - { - case MGT_LCLCTL_MODE: - { - /* Mode Property */ - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); - break; - } - case MGT_LCLCTL_RESVAL: - { - /* Reserve Value */ - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); - break; - } - case MGT_LCLCTL_RESGRP: - { - /* Reserve group */ - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); - break; - } - case MGT_LCLCTL_PROPPARM: - { - /* Properties (of a termination) */ - /* Matt - See how we can apply this to a termination */ - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); - break; - } - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid local control descriptor type[%d]\n",lclParm->type.val); - break; - } - } - } + case MGT_MEDIAPAR_LOCCTL: + { + /* Matt - check Local Control descriptor processing */ + locCtl = &mediaPar->u.locCtl; + for (i = 0; i < locCtl->num.val; i++){ + lclParm = locCtl->parms[i]; + if (PRSNT_NODEF == lclParm->type.pres){ + switch(lclParm->type.val) + { + case MGT_LCLCTL_MODE: + { + /* Mode Property */ + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_MODE - Mode value [%d]\n", lclParm->u.mode.val); + break; + } + case MGT_LCLCTL_RESVAL: + { + /* Reserve Value */ + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESVAL: Reserve Value[%d] \n", lclParm->u.resVal.val); + break; + } + case MGT_LCLCTL_RESGRP: + { + /* Reserve group */ + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_RESGRP: Reserve Group[%d]\n", lclParm->u.resGrp.val); + break; + } + case MGT_LCLCTL_PROPPARM: + { + MgMgcoPropParm* p = &lclParm->u.propParm; + /* Properties (of a termination) */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_LCLCTL_PROPPARM: \n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL"); - break; - } - case MGT_MEDIAPAR_TERMST: - { - /* Matt - apply termination state descriptor */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); - tstate = &mediaPar->u.tstate; - for (i = 0; i < tstate->numComp.val; i++) - { - /* Matt to see how to apply below descriptors to a termination */ - tsp = tstate->trmStPar[i]; - if (PRSNT_NODEF == tsp->type.pres) { - switch(tsp->type.val) - { - case MGT_TERMST_PROPLST: - { - /* Matt to see how to apply properties to a termination */ - /* Properties of a termination */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_TERMST_PROPLST:\n"); - break; - } - case MGT_TERMST_EVTBUFCTL: - { - /* Event /buffer Control Properties */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); - break; - } - case MGT_TERMST_SVCST: - { - /* Service State Properties */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); - break; - } - default: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid termination state descriptor type[%d]\n",tsp->type.val); - break; - } - } - } - break; - } - case MGT_MEDIAPAR_STRPAR: - { - MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; + if((MGT_PKG_KNOWN == p->pkg.valType.val) && + (MGT_PKG_TDM_CKT == p->pkg.u.val.val) && + (MGT_GEN_TYPE_KNOWN == p->name.type.val) && + (MGT_PKG_TDMC_PROP_EC == p->name.u.val.val) && + (PRSNT_NODEF == p->val.type.pres) && + (MGT_VALUE_EQUAL == p->val.type.val) && + (NOTPRSNT != p->val.u.eq.type.pres) && + (MGT_VALTYPE_ENUM == p->val.u.eq.type.val)) { + if(MGT_PKG_ENUM_PROPPARMTDMCEC_ON == p->val.u.eq.u.enume.val){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"TDMC EC=ON\n"); + mg_term_set_ec(term,0x01); + }else if(MGT_PKG_ENUM_PROPPARMTDMCEC_OFF == p->val.u.eq.u.enume.val){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"TDMC EC=OFF\n"); + mg_term_set_ec(term,0x00); + } + } + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid local control descriptor type[%d]\n",lclParm->type.val); + break; + } + } + } - if (mgStream->sl.remote.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); - mgco_handle_incoming_sdp(&mgStream->sl.remote.sdp, term, MG_SDP_LOCAL, mg_profile, memCp); - } + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_LOCCTL\n"); + break; + } + case MGT_MEDIAPAR_TERMST: + { + /* Matt - apply termination state descriptor */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MGT_MEDIAPAR_TERMST"); + tstate = &mediaPar->u.tstate; + for (i = 0; i < tstate->numComp.val; i++) + { + /* Matt to see how to apply below descriptors to a termination */ + tsp = tstate->trmStPar[i]; + if (PRSNT_NODEF == tsp->type.pres) { + switch(tsp->type.val) + { + case MGT_TERMST_PROPLST: + { + /* Matt to see how to apply properties to a termination */ + /* Properties of a termination */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"MGT_TERMST_PROPLST:\n"); + break; + } + case MGT_TERMST_EVTBUFCTL: + { + /* Event /buffer Control Properties */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_EVTBUFCTL: value[%d]\n", tsp->u.evtBufCtl.val); + break; + } + case MGT_TERMST_SVCST: + { + /* Service State Properties */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE," MGT_TERMST_SVCST: value[%d]\n", tsp->u.svcState.val); + break; + } + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Invalid termination state descriptor type[%d]\n",tsp->type.val); + break; + } + } + } + break; + } + case MGT_MEDIAPAR_STRPAR: + { + MgMgcoStreamDesc *mgStream = &mediaPar->u.stream; - if (mgStream->sl.local.pres.pres) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); - mgco_handle_incoming_sdp(&mgStream->sl.local.sdp, term, MG_SDP_REMOTE, mg_profile, memCp); - } + if (mgStream->sl.remote.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got remote stream media description:\n"); + mgco_handle_incoming_sdp(&mgStream->sl.remote.sdp, term, MG_SDP_LOCAL, mg_profile, memCp); + } - break; - } - } - } - break; - } - case MGT_REQEVTDESC: - { - MgMgcoReqEvtDesc* evt = &desc->dl.descs[descId]->u.evts; + if (mgStream->sl.local.pres.pres) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Got local stream media description:\n"); + mgco_handle_incoming_sdp(&mgStream->sl.local.sdp, term, MG_SDP_REMOTE, mg_profile, memCp); + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Event descriptor\n"); - - /* If we receive events from MGC , means clear any ongoing events */ - /* as such we dont apply any events to term, so for us (as of now) clear events means clear active_events structure*/ + break; + } + } + } + break; + } + case MGT_REQEVTDESC: + { + MgMgcoReqEvtDesc* evt = &desc->dl.descs[descId]->u.evts; - if(NULL != term->active_events){ - mgUtlDelMgMgcoReqEvtDesc(term->active_events); - MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Event descriptor\n"); - MG_STACK_MEM_ALLOC(&term->active_events, sizeof(MgMgcoReqEvtDesc)); + /* If we receive events from MGC , means clear any ongoing events */ + /* as such we dont apply any events to term, so for us (as of now) clear events means clear active_events structure*/ - if(NULL == term->active_events){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," term->active_events Memory Alloc failed \n"); - return SWITCH_STATUS_FALSE; - } + if(NULL != term->active_events){ + mgUtlDelMgMgcoReqEvtDesc(term->active_events); + MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); + } - /* copy requested event */ - if(RFAILED == mgUtlCpyMgMgcoReqEvtDesc(term->active_events, evt, NULLP)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," copy new events to term->active_events failed \n"); - MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); - return SWITCH_STATUS_FALSE; - } + MG_STACK_MEM_ALLOC(&term->active_events, sizeof(MgMgcoReqEvtDesc)); - /* print Requested event descriptor */ - /*mgAccEvntPrntMgMgcoReqEvtDesc(term->active_events, stdout);*/ - - break; - } - case MGT_SIGNALSDESC: - { - MgMgcoSignalsDesc* sig = &desc->dl.descs[descId]->u.sig; - MgMgcoSignalsParm* param = NULL; - int i = 0x00; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Signal descriptor\n"); + if(NULL == term->active_events){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," term->active_events Memory Alloc failed \n"); + return SWITCH_STATUS_FALSE; + } - if((NOTPRSNT != sig->pres.pres) && (NOTPRSNT != sig->num.pres) && (0 != sig->num.val)){ + /* copy requested event */ + if(RFAILED == mgUtlCpyMgMgcoReqEvtDesc(term->active_events, evt, NULLP)){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," copy new events to term->active_events failed \n"); + MG_STACK_MEM_FREE(term->active_events, sizeof(MgMgcoReqEvtDesc)); + return SWITCH_STATUS_FALSE; + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Total number of Signal descriptors[%d]\n", sig->num.val); + /* print Requested event descriptor */ + /*mgAccEvntPrntMgMgcoReqEvtDesc(term->active_events, stdout);*/ - for(i=0; i< sig->num.val; i++){ - param = sig->parms[i]; + break; + } + case MGT_SIGNALSDESC: + { + MgMgcoSignalsDesc* sig = &desc->dl.descs[descId]->u.sig; + MgMgcoSignalsParm* param = NULL; + int i = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG," Requested Signal descriptor\n"); - if(NOTPRSNT == param->type.pres) continue; + if((NOTPRSNT != sig->pres.pres) && (NOTPRSNT != sig->num.pres) && (0 != sig->num.val)){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Signal Descriptor[%d] type[%s]\n", - i, ((MGT_SIGSPAR_LST == param->type.val)?"MGT_SIGSPAR_LST":"MGT_SIGSPAR_REQ")); - - switch(param->type.val) - { - case MGT_SIGSPAR_LST: - { - MgMgcoSignalsLst* lst = ¶m->u.lst; - int sigId = 0x00; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Total number of Signal descriptors[%d]\n", sig->num.val); - if((NOTPRSNT == lst->pl.num.pres) || (0 == lst->pl.num.val)) break; + for(i=0; i< sig->num.val; i++){ + param = sig->parms[i]; - for(sigId = 0; sigId < lst->pl.num.val; sigId++){ - mg_prc_sig_desc(lst->pl.reqs[sigId], mg_profile, term); - } + if(NOTPRSNT == param->type.pres) continue; - break; - } - case MGT_SIGSPAR_REQ: - { - MgMgcoSignalsReq* req = ¶m->u.req; - mg_prc_sig_desc(req, mg_profile, term); - break; - } - default: - break; - } - } - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO," Signal Descriptor[%d] type[%s]\n", + i, ((MGT_SIGSPAR_LST == param->type.val)?"MGT_SIGSPAR_LST":"MGT_SIGSPAR_REQ")); - break; - } - case MGT_MODEMDESC: - case MGT_MUXDESC: - case MGT_EVBUFDESC: - case MGT_DIGMAPDESC: - case MGT_AUDITDESC: - case MGT_STATSDESC: - break; + switch(param->type.val) + { + case MGT_SIGSPAR_LST: + { + MgMgcoSignalsLst* lst = ¶m->u.lst; + int sigId = 0x00; - } - } + if((NOTPRSNT == lst->pl.num.pres) || (0 == lst->pl.num.val)) break; - return SWITCH_STATUS_SUCCESS; + for(sigId = 0; sigId < lst->pl.num.val; sigId++){ + mg_prc_sig_desc(lst->pl.reqs[sigId], mg_profile, term); + } + + break; + } + case MGT_SIGSPAR_REQ: + { + MgMgcoSignalsReq* req = ¶m->u.req; + mg_prc_sig_desc(req, mg_profile, term); + break; + } + default: + break; + } + } + } + + break; + } + case MGT_MODEMDESC: + case MGT_MUXDESC: + case MGT_EVBUFDESC: + case MGT_DIGMAPDESC: + case MGT_AUDITDESC: + case MGT_STATSDESC: + break; + + } + } + + return SWITCH_STATUS_SUCCESS; } @@ -744,6 +761,7 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_apply_tdm_dtmf_removal(term, mg_ctxt); mg_apply_tdm_ec(term, mg_ctxt); + mg_print_t38_attributes(term); @@ -1063,10 +1081,9 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand mg_apply_tdm_dtmf_removal(term, mg_ctxt); mg_apply_tdm_ec(term, mg_ctxt); + mg_print_t38_attributes(term); - - /* SDP updated to termination */ if(SWITCH_STATUS_SUCCESS != megaco_activate_termination(term)) { mg_profile->mg_stats->total_num_of_term_activation_failed_error++; diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h index e599ce70c4..b2e9a91340 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_stack.h @@ -167,7 +167,9 @@ typedef enum { (_reqId)->id.val = 0xFFFFFFFF; -switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term, CmMemListCp *memCp); + +void mg_set_term_ec_status(mg_termination_t* term, mg_ec_types_t status); +switch_status_t mg_prc_descriptors(megaco_profile_t* mg_profile, MgMgcoCommand *inc_cmd, mg_termination_t* term, CmMemListCp *memCp); void handle_sng_log(uint8_t level, char *fmt, ...); void handle_mgco_sta_ind(Pst *pst, SuId suId, MgMgtSta* msg); void handle_mgco_txn_sta_ind(Pst *pst, SuId suId, MgMgcoInd* msg); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c index 1fd2a9cdad..02f568a78d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_utils.c @@ -2397,3 +2397,11 @@ void mg_apply_tdm_ec(mg_termination_t* term, mg_context_t *mg_ctxt) } } /*****************************************************************************************************************************/ +void mg_set_term_ec_status(mg_termination_t* term, mg_ec_types_t status) +{ + if(NULL != term) { + term->ec_type = status; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"Setting Term EC[%s]\n",mg_ec_types_tostr(term->ec_type)); + } +} +/*****************************************************************************************************************************/ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 004c5153b7..1c09fdc517 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -132,6 +132,29 @@ typedef enum { MG_T38_FAX_NOTIFY_INVALID, } mg_t38_fax_notify_t; +typedef enum { + MG_EC_UNDEFINED = 0, + MG_EC_ENABLE, + MG_EC_DISABLE, + MG_EC_INVALID +} mg_ec_types_t; + +static inline const char *mg_ec_types_tostr(mg_ec_types_t type) { + switch (type) { + case MG_EC_UNDEFINED: + return "UNDEFINED"; + case MG_EC_ENABLE: + return "ENABLE"; + case MG_EC_DISABLE: + return "DISABLE"; + case MG_EC_INVALID: + return "INVALID"; + default: + return "Invalid"; + } + return NULL; +} + typedef enum { MGM_AUDIO = 0, @@ -205,6 +228,7 @@ struct mg_termination_s { int *mg_error_code; /* MEGACO error code */ uint32_t flags; const char *tech; /* Endpoint controlling the TDM interface - only FreeTDM tested so far */ + mg_ec_types_t ec_type; union { struct { From d1c04ef6ef925f5fd670e1ddef7ae8af25d2dcef Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 11 Sep 2012 09:35:17 -0400 Subject: [PATCH 491/493] adding total number of fax call recv statistics counter --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 9 +++++---- .../mod_media_gateway/media_gateway_cmd_handler.c | 3 +++ src/mod/endpoints/mod_media_gateway/mod_media_gateway.h | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index eb7356eccd..5834931b49 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -984,14 +984,15 @@ switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile return SWITCH_STATUS_FALSE; } - stream->write_function(stream, "Total Number of IN-Service Service change sent = %d \n", - mg_profile->mg_stats->total_num_of_term_in_service_change_sent); - stream->write_function(stream, "Total Number of Out-Of-Service Service change sent = %d \n", - mg_profile->mg_stats->total_num_of_term_oos_service_change_sent); stream->write_function(stream, "Total Number of Physical ADD received = %d \n", mg_profile->mg_stats->total_num_of_phy_add_recvd); stream->write_function(stream, "Total Number of RTP ADD received = %d \n", mg_profile->mg_stats->total_num_of_rtp_add_recvd); stream->write_function(stream, "Total Number of SUB received = %d \n", mg_profile->mg_stats->total_num_of_sub_recvd); stream->write_function(stream, "Total Number of CALL received = %d \n", mg_profile->mg_stats->total_num_of_call_recvd); + stream->write_function(stream, "Total Number of T38-FAX CALL received = %d \n", mg_profile->mg_stats->total_num_of_fax_call_recvd++); + stream->write_function(stream, "Total Number of IN-Service Service change sent = %d \n", + mg_profile->mg_stats->total_num_of_term_in_service_change_sent); + stream->write_function(stream, "Total Number of Out-Of-Service Service change sent = %d \n", + mg_profile->mg_stats->total_num_of_term_oos_service_change_sent); stream->write_function(stream, "Total Number of ADD failed = %d \n", mg_profile->mg_stats->total_num_of_add_failed); stream->write_function(stream, "Total Number of Term Already in context Error = %d \n", mg_profile->mg_stats->total_num_of_term_already_in_ctxt_error); diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 5a6b4d8936..7b0533269d 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -760,6 +760,9 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_apply_tdm_dtmf_removal(term, mg_ctxt); + if((MG_TERM_RTP == term->type) && (term->u.rtp.t38_options)) + mg_profile->mg_stats->total_num_of_fax_call_recvd++; + mg_apply_tdm_ec(term, mg_ctxt); mg_print_t38_attributes(term); diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 1c09fdc517..0b70920baa 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -68,6 +68,7 @@ typedef struct mg_stats_s{ uint32_t total_num_of_rtp_add_recvd; uint32_t total_num_of_sub_recvd; uint32_t total_num_of_call_recvd; + uint32_t total_num_of_fax_call_recvd; uint32_t total_num_of_add_failed; uint32_t total_num_of_term_already_in_ctxt_error; uint32_t total_num_of_choose_ctxt_failed_error; From e422b31e6d100863df8f90a0f952140a13b25ce8 Mon Sep 17 00:00:00 2001 From: Kapil Gupta Date: Tue, 11 Sep 2012 09:59:48 -0400 Subject: [PATCH 492/493] renaming stats counter from fax to t38 --- src/mod/endpoints/mod_media_gateway/media_gateway_cli.c | 2 +- .../endpoints/mod_media_gateway/media_gateway_cmd_handler.c | 5 +++-- src/mod/endpoints/mod_media_gateway/mod_media_gateway.h | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c index 5834931b49..dabaf2cc94 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cli.c @@ -988,7 +988,7 @@ switch_status_t handle_show_stats(switch_stream_handle_t *stream, megaco_profile stream->write_function(stream, "Total Number of RTP ADD received = %d \n", mg_profile->mg_stats->total_num_of_rtp_add_recvd); stream->write_function(stream, "Total Number of SUB received = %d \n", mg_profile->mg_stats->total_num_of_sub_recvd); stream->write_function(stream, "Total Number of CALL received = %d \n", mg_profile->mg_stats->total_num_of_call_recvd); - stream->write_function(stream, "Total Number of T38-FAX CALL received = %d \n", mg_profile->mg_stats->total_num_of_fax_call_recvd++); + stream->write_function(stream, "Total Number of T38 CALL received = %d \n", mg_profile->mg_stats->total_num_of_t38_call_recvd); stream->write_function(stream, "Total Number of IN-Service Service change sent = %d \n", mg_profile->mg_stats->total_num_of_term_in_service_change_sent); stream->write_function(stream, "Total Number of Out-Of-Service Service change sent = %d \n", diff --git a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c index 7b0533269d..d7c03915fd 100644 --- a/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c +++ b/src/mod/endpoints/mod_media_gateway/media_gateway_cmd_handler.c @@ -760,8 +760,6 @@ switch_status_t handle_mg_add_cmd(megaco_profile_t* mg_profile, MgMgcoCommand *i mg_apply_tdm_dtmf_removal(term, mg_ctxt); - if((MG_TERM_RTP == term->type) && (term->u.rtp.t38_options)) - mg_profile->mg_stats->total_num_of_fax_call_recvd++; mg_apply_tdm_ec(term, mg_ctxt); @@ -1085,6 +1083,9 @@ switch_status_t handle_mg_modify_cmd(megaco_profile_t* mg_profile, MgMgcoCommand mg_apply_tdm_ec(term, mg_ctxt); + if((MG_TERM_RTP == term->type) && (term->u.rtp.t38_options)) + mg_profile->mg_stats->total_num_of_t38_call_recvd++; + mg_print_t38_attributes(term); /* SDP updated to termination */ diff --git a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h index 0b70920baa..ac18dca7ee 100644 --- a/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h +++ b/src/mod/endpoints/mod_media_gateway/mod_media_gateway.h @@ -68,7 +68,7 @@ typedef struct mg_stats_s{ uint32_t total_num_of_rtp_add_recvd; uint32_t total_num_of_sub_recvd; uint32_t total_num_of_call_recvd; - uint32_t total_num_of_fax_call_recvd; + uint32_t total_num_of_t38_call_recvd; uint32_t total_num_of_add_failed; uint32_t total_num_of_term_already_in_ctxt_error; uint32_t total_num_of_choose_ctxt_failed_error; From fcbfc6946655b274751095ea14d375589df45d9b Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 11 Sep 2012 14:45:57 -0400 Subject: [PATCH 493/493] mod_media_gateway now specifies physical channel when opening TDM terminations --- libs/freetdm/mod_freetdm/tdm.c | 4 +- libs/freetdm/src/ftdm_io.c | 96 ++++++++++++++++++++++++++---- libs/freetdm/src/include/freetdm.h | 33 +++++++++- 3 files changed, 118 insertions(+), 15 deletions(-) diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index 0c7657301d..0f8b5814c1 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -158,7 +158,7 @@ static ftdm_channel_t *ctdm_get_channel_from_event(switch_event_t *event, ftdm_s return NULL; } - return ftdm_span_get_channel(span, chan_id); + return ftdm_span_get_channel_ph(span, chan_id); } @@ -362,7 +362,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi channel = switch_core_session_get_channel(*new_session); - if (ftdm_channel_open(span_id, chan_id, &chan) != FTDM_SUCCESS) { + if (ftdm_channel_open_ph(span_id, chan_id, &chan) != FTDM_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n"); goto fail; } diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index b3266e54f4..f80ded35b8 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1893,7 +1893,7 @@ done: return status; } -static ftdm_status_t _ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) +static ftdm_status_t _ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan, uint8_t physical) { ftdm_channel_t *check = NULL; ftdm_span_t *span = NULL; @@ -1922,14 +1922,46 @@ static ftdm_status_t _ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm goto done; } - if (chan_id < 1 || chan_id > span->chan_count) { - ftdm_log(FTDM_LOG_ERROR, "Invalid channel %d to open in span %d\n", chan_id, span_id); - goto done; - } + if (physical) { /* Open by physical */ + ftdm_channel_t *fchan = NULL; + ftdm_iterator_t *citer = NULL; + ftdm_iterator_t *curr = NULL; - if (!(check = span->channels[chan_id])) { - ftdm_log(FTDM_LOG_CRIT, "Wow, no channel %d in span %d\n", chan_id, span_id); - goto done; + if (chan_id < 1) { + ftdm_log(FTDM_LOG_ERROR, "Invalid physical channel %d to open in span %d\n", chan_id, span_id); + status = FTDM_FAIL; + goto done; + } + + citer = ftdm_span_get_chan_iterator(span, NULL); + if (!citer) { + status = ENOMEM; + goto done; + } + + for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) { + fchan = ftdm_iterator_current(curr); + if (fchan->physical_chan_id == chan_id) { + check = fchan; + break; + } + } + + ftdm_iterator_free(citer); + if (!check) { + ftdm_log(FTDM_LOG_CRIT, "Wow, no physical channel %d in span %d\n", chan_id, span_id); + goto done; + } + } else { /* Open by logical */ + if (chan_id < 1 || chan_id > span->chan_count) { + ftdm_log(FTDM_LOG_ERROR, "Invalid channel %d to open in span %d\n", chan_id, span_id); + goto done; + } + + if (!(check = span->channels[chan_id])) { + ftdm_log(FTDM_LOG_CRIT, "Wow, no channel %d in span %d\n", chan_id, span_id); + goto done; + } } ftdm_channel_lock(check); @@ -2000,7 +2032,18 @@ done: FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) { ftdm_status_t status; - status = _ftdm_channel_open(span_id, chan_id, ftdmchan); + status = _ftdm_channel_open(span_id, chan_id, ftdmchan, 0); + if (status == FTDM_SUCCESS) { + ftdm_channel_t *fchan = *ftdmchan; + ftdm_channel_unlock(fchan); + } + return status; +} + +FT_DECLARE(ftdm_status_t) ftdm_channel_open_ph(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan) +{ + ftdm_status_t status; + status = _ftdm_channel_open(span_id, chan_id, ftdmchan, 1); if (status == FTDM_SUCCESS) { ftdm_channel_t *fchan = *ftdmchan; ftdm_channel_unlock(fchan); @@ -2377,6 +2420,39 @@ FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint return chan; } +FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel_ph(const ftdm_span_t *span, uint32_t chanid) +{ + ftdm_channel_t *chan = NULL; + ftdm_channel_t *fchan = NULL; + ftdm_iterator_t *citer = NULL; + ftdm_iterator_t *curr = NULL; + + ftdm_mutex_lock(span->mutex); + if (chanid == 0) { + ftdm_mutex_unlock(span->mutex); + return NULL; + } + + citer = ftdm_span_get_chan_iterator(span, NULL); + if (!citer) { + ftdm_mutex_unlock(span->mutex); + return NULL; + } + + for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) { + fchan = ftdm_iterator_current(curr); + if (fchan->physical_chan_id == chanid) { + chan = fchan; + break; + } + } + + ftdm_iterator_free(citer); + + ftdm_mutex_unlock(span->mutex); + return chan; +} + FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span) { uint32_t count; @@ -2673,7 +2749,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_call_place(const char *file, const char *func, i status = _ftdm_channel_open_by_group(hunting->mode_data.group.group_id, hunting->mode_data.group.direction, caller_data, &fchan); } else if (hunting->mode == FTDM_HUNT_CHAN) { - status = _ftdm_channel_open(hunting->mode_data.chan.span_id, hunting->mode_data.chan.chan_id, &fchan); + status = _ftdm_channel_open(hunting->mode_data.chan.span_id, hunting->mode_data.chan.chan_id, &fchan, 0); } else { ftdm_log(FTDM_LOG_ERROR, "Cannot make outbound call with invalid hunting mode %d\n", hunting->mode); return FTDM_EINVAL; diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 6f0ac50371..18dfb7605b 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -1370,7 +1370,7 @@ FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group); * Only use ftdm_channel_close if there is no call (incoming or outgoing) in the channel * * \param span_id The span id the channel belongs to - * \param chan_id Channel id of the channel you want to open + * \param chan_id Logical channel id of the channel you want to open * \param ftdmchan Pointer to store the channel once is open * * \retval FTDM_SUCCESS success (the channel was found and is available) @@ -1378,6 +1378,23 @@ FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group); */ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); +/*! + * \brief Open a channel specifying the span id and physical chan id (required before placing a call on the channel) + * + * \warning Try using ftdm_call_place instead if you plan to place a call after opening the channel + * + * \note You must call ftdm_channel_close() or ftdm_channel_call_hangup() to release the channel afterwards + * Only use ftdm_channel_close if there is no call (incoming or outgoing) in the channel + * + * \param span_id The span id the channel belongs to + * \param chan_id Physical channel id of the channel you want to open + * \param ftdmchan Pointer to store the channel once is open + * + * \retval FTDM_SUCCESS success (the channel was found and is available) + * \retval FTDM_FAIL failure (channel was not found or not available) + */ +FT_DECLARE(ftdm_status_t) ftdm_channel_open_ph(uint32_t span_id, uint32_t chan_id, ftdm_channel_t **ftdmchan); + /*! * \brief Hunts and opens a channel specifying the span id only * @@ -1759,15 +1776,25 @@ FT_DECLARE(ftdm_trunk_type_t) ftdm_span_get_trunk_type(const ftdm_span_t *span); FT_DECLARE(const char *) ftdm_span_get_trunk_type_str(const ftdm_span_t *span); /*! - * \brief Return the channel identified by the provided id + * \brief Return the channel identified by the provided logical id * * \param span The span where the channel belongs - * \param chanid The channel id within the span + * \param chanid The logical channel id within the span * * \return The channel pointer if found, NULL otherwise */ FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint32_t chanid); +/*! + * \brief Return the channel identified by the provided physical id + * + * \param span The span where the channel belongs + * \param chanid The physical channel id within the span + * + * \return The channel pointer if found, NULL otherwise + */ +FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel_ph(const ftdm_span_t *span, uint32_t chanid); + /*! \brief Return the channel count number for the given span */ FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span);