From 03e3e52790056d62bf6eb9d9d67ee0548bab9d24 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 3 Sep 2010 16:17:26 -0400 Subject: [PATCH 001/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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/731] 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 a511ff3026b8efdfc185723bf9d0728e0f8a86ca Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 7 May 2012 13:44:10 -0500 Subject: [PATCH 188/731] re-implement sla barge using eavesdrop backend --- src/include/private/switch_core_pvt.h | 3 + src/include/switch_core.h | 12 +- src/include/switch_ivr.h | 5 + src/include/switch_resample.h | 2 +- src/include/switch_types.h | 8 +- src/mod/endpoints/mod_sofia/mod_sofia.c | 34 +++++ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 98 ++++++-------- src/mod/endpoints/mod_sofia/sofia_presence.c | 1 + src/switch_core_io.c | 60 +++++++-- src/switch_core_media_bug.c | 83 +++++++++++- src/switch_ivr_async.c | 132 ++++++++++++++++++- src/switch_resample.c | 19 +++ 13 files changed, 378 insertions(+), 80 deletions(-) diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 781f0e4d06..95e66f2f6d 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -171,6 +171,8 @@ struct switch_core_session { uint32_t soft_lock; switch_ivr_dmachine_t *dmachine[2]; plc_state_t *plc; + uint8_t recur_buffer[SWITCH_RECOMMENDED_BUFFER_SIZE]; + switch_size_t recur_buffer_len; }; struct switch_media_bug { @@ -199,6 +201,7 @@ struct switch_media_bug { uint32_t record_pre_buffer_count; uint32_t record_pre_buffer_max; switch_frame_t *ping_frame; + switch_frame_t *read_demux_frame; struct switch_media_bug *next; }; diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 0011652475..91cff21d67 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -137,6 +137,11 @@ SWITCH_DECLARE(void) switch_core_session_disable_heartbeat(switch_core_session_t #define switch_core_session_get_name(_s) switch_channel_get_name(switch_core_session_get_channel(_s)) +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_pop(switch_core_session_t *orig_session, const char *function, switch_media_bug_t **pop); + +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_exec_all(switch_core_session_t *orig_session, + const char *function, switch_media_bug_exec_cb_t cb, void *user_data); + /*! \brief Add a media bug to the session \param session the session to add the bug to @@ -193,7 +198,7 @@ SWITCH_DECLARE(void) switch_core_media_bug_set_write_replace_frame(_In_ switch_m \param bug the bug to get the data from */ SWITCH_DECLARE(switch_frame_t *) switch_core_media_bug_get_read_replace_frame(_In_ switch_media_bug_t *bug); - +SWITCH_DECLARE(void) switch_core_media_bug_set_read_demux_frame(_In_ switch_media_bug_t *bug, _In_ switch_frame_t *frame); /*! \brief Obtain the session from a media bug \param bug the bug to get the data from @@ -225,6 +230,7 @@ SWITCH_DECLARE(uint32_t) switch_core_cpu_count(void); \param bug bug to remove \return SWITCH_STATUS_SUCCESS if the operation was a success */ + SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove(_In_ switch_core_session_t *session, _Inout_ switch_media_bug_t **bug); SWITCH_DECLARE(uint32_t) switch_core_media_bug_prune(switch_core_session_t *session); @@ -247,7 +253,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_close(_Inout_ switch_media \param session the session to remove the bugs from \return SWITCH_STATUS_SUCCESS if the operation was a success */ -SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_all(_In_ switch_core_session_t *session); +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_all_function(_In_ switch_core_session_t *session, const char *function); + +#define switch_core_media_bug_remove_all(_s) switch_core_media_bug_remove_all_function(_s, NULL) SWITCH_DECLARE(switch_status_t) switch_core_media_bug_enumerate(switch_core_session_t *session, switch_stream_handle_t *stream); SWITCH_DECLARE(switch_status_t) switch_core_media_bug_transfer_recordings(switch_core_session_t *orig_session, switch_core_session_t *new_session); diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index 8f553b957e..ef5155512c 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -269,6 +269,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(swit */ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t *session, char *file, uint32_t limit, switch_file_handle_t *fh); + +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_pop_eavesdropper(switch_core_session_t *session, switch_core_session_t **sessionp); +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_exec_all(switch_core_session_t *session, const char *app, const char *arg); +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_update_display(switch_core_session_t *session, const char *name, const char *number); + /*! \brief Eavesdrop on a another session \param session our session diff --git a/src/include/switch_resample.h b/src/include/switch_resample.h index 7ae37669c7..f85a61f065 100644 --- a/src/include/switch_resample.h +++ b/src/include/switch_resample.h @@ -170,7 +170,7 @@ SWITCH_DECLARE(void) switch_change_sln_volume_granular(int16_t *data, uint32_t s ///\} SWITCH_DECLARE(uint32_t) switch_merge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples); - +SWITCH_DECLARE(uint32_t) switch_unmerge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples); SWITCH_DECLARE(void) switch_mux_channels(int16_t *data, switch_size_t samples, uint32_t channels); SWITCH_END_EXTERN_C diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 93a2e48ced..5fda9c369e 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -288,7 +288,8 @@ typedef enum { ED_NONE = 0, ED_MUX_READ = (1 << 0), ED_MUX_WRITE = (1 << 1), - ED_DTMF = (1 << 2) + ED_DTMF = (1 << 2), + ED_COPY_DISPLAY = (1 << 3) } switch_eavesdrop_flag_enum_t; typedef uint32_t switch_eavesdrop_flag_t; @@ -1434,7 +1435,8 @@ typedef enum { SMBF_THREAD_LOCK = (1 << 7), SMBF_PRUNE = (1 << 8), SMBF_NO_PAUSE = (1 << 9), - SMBF_STEREO_SWAP = (1 << 10) + SMBF_STEREO_SWAP = (1 << 10), + SMBF_LOCK = (1 << 11) } switch_media_bug_flag_enum_t; typedef uint32_t switch_media_bug_flag_t; @@ -1821,6 +1823,8 @@ struct switch_console_callback_match { }; typedef struct switch_console_callback_match switch_console_callback_match_t; +typedef void (*switch_media_bug_exec_cb_t)(switch_media_bug_t *bug, void *user_data); + typedef void (*switch_cap_callback_t) (const char *var, const char *val, void *user_data); typedef switch_status_t (*switch_console_complete_callback_t) (const char *, const char *, switch_console_callback_match_t **matches); typedef switch_bool_t (*switch_media_bug_callback_t) (switch_media_bug_t *, void *, switch_abc_type_t); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index ea2ba7ce4d..a71dc4c714 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -2100,6 +2100,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi number = tech_pvt->caller_profile->destination_number; } + switch_ivr_eavesdrop_update_display(session, name, number); + if (!sofia_test_flag(tech_pvt, TFLAG_UPDATING_DISPLAY) && switch_channel_test_flag(channel, CF_ANSWERED)) { if (zstr(tech_pvt->last_sent_callee_id_name) || strcmp(tech_pvt->last_sent_callee_id_name, name) || zstr(tech_pvt->last_sent_callee_id_number) || strcmp(tech_pvt->last_sent_callee_id_number, number)) { @@ -5342,11 +5344,40 @@ static switch_status_t list_profile_gateway(const char *line, const char *cursor } +SWITCH_STANDARD_APP(sofia_sla_function) +{ + private_object_t *tech_pvt; + switch_core_session_t *bargee_session; + + if (zstr(data)) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Usage: \n"); + return; + } + + if ((bargee_session = switch_core_session_locate((char *)data))) { + if (bargee_session == session) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "BARGE: %s (cannot barge on myself)\n", (char *) data); + } else { + if (switch_core_session_check_interface(bargee_session, sofia_endpoint_interface)) { + tech_pvt = switch_core_session_get_private(bargee_session); + sofia_set_flag(tech_pvt, TFLAG_SLA_BARGE); + switch_ivr_transfer_variable(bargee_session, session, SWITCH_SIGNAL_BOND_VARIABLE); + } + } + + switch_core_session_rwunlock(bargee_session); + } + + switch_ivr_eavesdrop_session(session, data, NULL, ED_MUX_READ | ED_MUX_WRITE | ED_COPY_DISPLAY); +} + + SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) { switch_chat_interface_t *chat_interface; switch_api_interface_t *api_interface; switch_management_interface_t *management_interface; + switch_application_interface_t *app_interface; struct in_addr in; memset(&mod_sofia_globals, 0, sizeof(mod_sofia_globals)); @@ -5468,6 +5499,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) management_interface->relative_oid = "1001"; management_interface->management_function = sofia_manage; + SWITCH_ADD_APP(app_interface, "sofia_sla", "private sofia sla function", + "private sofia sla function", sofia_sla_function, "", SAF_NONE); + SWITCH_ADD_API(api_interface, "sofia", "Sofia Controls", sofia_function, " "); SWITCH_ADD_API(api_interface, "sofia_gateway_data", "Get data from a sofia gateway", sofia_gateway_data_function, " [ivar|ovar|var] "); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 5a51f68a2d..b66b29fb44 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -332,6 +332,7 @@ typedef enum { TFLAG_GOT_ACK, TFLAG_CAPTURE, TFLAG_REINVITED, + TFLAG_SLA_BARGE, /* No new flags below this line */ TFLAG_MAX } TFLAGS; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 7ae868ef62..26815b6f5e 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -599,6 +599,43 @@ void sofia_handle_sip_i_bye(switch_core_session_t *session, int status, status = 200; phrase = "OK"; + if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE)) { + switch_core_session_t *new_session, *other_session; + const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE); + char *cmd = NULL; + + if (!zstr(other_uuid) && (other_session = switch_core_session_locate(other_uuid))) { + switch_channel_t *other_channel = switch_core_session_get_channel(other_session); + + switch_mutex_lock(profile->ireg_mutex); + if (switch_ivr_eavesdrop_pop_eavesdropper(session, &new_session) == SWITCH_STATUS_SUCCESS) { + switch_channel_t *new_channel = switch_core_session_get_channel(new_session); + const char *new_uuid = switch_core_session_get_uuid(new_session); + + + switch_channel_set_variable(new_channel, SWITCH_SIGNAL_BOND_VARIABLE, NULL); + + switch_channel_set_flag(other_channel, CF_REDIRECT); + + switch_channel_set_state(new_channel, CS_RESET); + + switch_ivr_uuid_bridge(new_uuid, other_uuid); + cmd = switch_core_session_sprintf(session, "sleep:500,sofia_sla:%s inline", new_uuid); + + switch_channel_clear_flag(other_channel, CF_REDIRECT); + + switch_core_session_rwunlock(new_session); + } + switch_mutex_unlock(profile->ireg_mutex); + + switch_core_session_rwunlock(other_session); + } + + if (!zstr(cmd)) { + switch_ivr_eavesdrop_exec_all(session, "transfer", cmd); + } + } + sofia_set_flag_locked(tech_pvt, TFLAG_BYE); call_info = switch_channel_get_variable(channel, "presence_call_info_full"); @@ -8354,8 +8391,6 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ if ((b_session = switch_core_session_locate(b_private->uuid))) { switch_channel_t *b_channel = switch_core_session_get_channel(b_session); const char *uuid; - int one_leg = 1; - private_object_t *b_tech_pvt = NULL; const char *app = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_VARIABLE); const char *data = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE); switch_caller_profile_t *orig_cp; @@ -8387,68 +8422,15 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,conference:%s+flags{dist-dtmf}", data); tech_pvt->caller_profile->dialplan = "inline"; } else { - if (switch_core_session_check_interface(b_session, sofia_endpoint_interface)) { - b_tech_pvt = switch_core_session_get_private(b_session); - } - - if ((uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE))) { - one_leg = 0; - } else { + if (!(uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE))) { uuid = switch_core_session_get_uuid(b_session); } if (uuid) { - switch_core_session_t *c_session = NULL; - int do_conf = 0; - const char *c_app = NULL; - const char *c_data = NULL; - uuid = switch_core_session_strdup(b_session, uuid); + tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, + "answer,sofia_sla:%s", b_private->uuid); - if (call_info && (c_session = switch_core_session_locate(uuid))) { - switch_channel_t *c_channel = switch_core_session_get_channel(c_session); - private_object_t *c_tech_pvt = NULL; - - c_app = switch_channel_get_variable(c_channel, SWITCH_CURRENT_APPLICATION_VARIABLE); - c_data = switch_channel_get_variable(c_channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE); - - if (switch_core_session_check_interface(c_session, sofia_endpoint_interface)) { - c_tech_pvt = switch_core_session_get_private(c_session); - } - - - if (!one_leg && - (!b_tech_pvt || !sofia_test_flag(b_tech_pvt, TFLAG_SIP_HOLD)) && - (!c_tech_pvt || !sofia_test_flag(c_tech_pvt, TFLAG_SIP_HOLD))) { - char *ext = switch_core_session_sprintf(session, "answer,conference:%s@sla+flags{mintwo|dist-dtmf}", uuid); - - switch_channel_set_flag(c_channel, CF_REDIRECT); - switch_ivr_session_transfer(b_session, ext, "inline", NULL); - switch_ivr_session_transfer(c_session, ext, "inline", NULL); - switch_channel_clear_flag(c_channel, CF_REDIRECT); - do_conf = 1; - } - switch_core_session_rwunlock(c_session); - } - - if (do_conf) { - tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,conference:%s@sla+flags{mintwo|dist-dtmf}", uuid); - } else { - if (one_leg && c_app) { - if (c_data) { - tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,%s:%s", c_app, c_data); - } else { - tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,%s", c_app); - } - } else { - switch_channel_mark_hold(b_channel, SWITCH_FALSE); - tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,intercept:%s", uuid); - } - } tech_pvt->caller_profile->dialplan = "inline"; } diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 6befca3439..c4eb565f85 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -1167,6 +1167,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) } } #endif + if (hup && dh.hits > 0) { goto done; diff --git a/src/switch_core_io.c b/src/switch_core_io.c index 020556a490..f20fa7bff9 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -498,21 +498,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi continue; } - if (bp->ready && switch_test_flag(bp, SMBF_READ_STREAM)) { - switch_mutex_lock(bp->read_mutex); - switch_buffer_write(bp->raw_read_buffer, read_frame->data, read_frame->datalen); - - if (bp->callback) { - ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ); - } - switch_mutex_unlock(bp->read_mutex); - } - if (ok && switch_test_flag(bp, SMBF_READ_REPLACE)) { do_bugs = 0; if (bp->callback) { bp->read_replace_frame_in = read_frame; bp->read_replace_frame_out = read_frame; + bp->read_demux_frame = NULL; if ((ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ_REPLACE)) == SWITCH_TRUE) { read_frame = bp->read_replace_frame_out; } @@ -532,6 +523,55 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi } } + if (session->bugs) { + switch_media_bug_t *bp; + switch_bool_t ok = SWITCH_TRUE; + int prune = 0; + switch_thread_rwlock_rdlock(session->bug_rwlock); + + for (bp = session->bugs; bp; bp = bp->next) { + if (switch_channel_test_flag(session->channel, CF_PAUSE_BUGS) && !switch_core_media_bug_test_flag(bp, SMBF_NO_PAUSE)) { + continue; + } + + if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) { + continue; + } + if (switch_test_flag(bp, SMBF_PRUNE)) { + prune++; + continue; + } + + if (ok && bp->ready && switch_test_flag(bp, SMBF_READ_STREAM)) { + switch_mutex_lock(bp->read_mutex); + if (bp->read_demux_frame) { + uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE]; + int bytes = read_frame->datalen / 2; + + memcpy(data, read_frame->data, read_frame->datalen); + switch_unmerge_sln((int16_t *)data, bytes, bp->read_demux_frame->data, bytes); + switch_buffer_write(bp->raw_read_buffer, data, read_frame->datalen); + } else { + switch_buffer_write(bp->raw_read_buffer, read_frame->data, read_frame->datalen); + } + + if (bp->callback) { + ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ); + } + switch_mutex_unlock(bp->read_mutex); + } + + if ((bp->stop_time && bp->stop_time <= switch_epoch_time_now(NULL)) || ok == SWITCH_FALSE) { + switch_set_flag(bp, SMBF_PRUNE); + prune++; + } + } + switch_thread_rwlock_unlock(session->bug_rwlock); + if (prune) { + switch_core_media_bug_prune(session); + } + } + if (do_bugs) { goto done; } diff --git a/src/switch_core_media_bug.c b/src/switch_core_media_bug.c index f5d14137b7..a320d9a345 100644 --- a/src/switch_core_media_bug.c +++ b/src/switch_core_media_bug.c @@ -72,6 +72,9 @@ SWITCH_DECLARE(uint32_t) switch_core_media_bug_test_flag(switch_media_bug_t *bug SWITCH_DECLARE(uint32_t) switch_core_media_bug_set_flag(switch_media_bug_t *bug, uint32_t flag) { + if ((flag & SMBF_PRUNE)) { + switch_clear_flag(bug, SMBF_LOCK); + } return switch_set_flag(bug, flag); } @@ -105,6 +108,11 @@ SWITCH_DECLARE(void) switch_core_media_bug_set_read_replace_frame(switch_media_b bug->read_replace_frame_out = frame; } +SWITCH_DECLARE(void) switch_core_media_bug_set_read_demux_frame(switch_media_bug_t *bug, switch_frame_t *frame) +{ + bug->read_demux_frame = frame; +} + SWITCH_DECLARE(void *) switch_core_media_bug_get_user_data(switch_media_bug_t *bug) { return bug->user_data; @@ -175,6 +183,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(switch_media_bug_t *b bytes = read_impl.decoded_bytes_per_packet; + if (0 && bug->session->recur_buffer_len) { + frame->datalen = bug->session->recur_buffer_len; + frame->samples = bug->session->recur_buffer_len / sizeof(int16_t); + frame->rate = read_impl.actual_samples_per_second; + frame->codec = NULL; + memcpy(frame->data, bug->session->recur_buffer, bug->session->recur_buffer_len); + return SWITCH_STATUS_SUCCESS; + } + + if (frame->buflen < bytes) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)), SWITCH_LOG_ERROR, "%s frame buffer too small!\n", switch_channel_get_name(bug->session->channel)); @@ -363,6 +381,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(switch_media_bug_t *b return SWITCH_STATUS_BREAK; } + memcpy(bug->session->recur_buffer, frame->data, frame->datalen); + bug->session->recur_buffer_len = frame->datalen; + return SWITCH_STATUS_SUCCESS; } @@ -552,6 +573,53 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_transfer_recordings(switch return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_pop(switch_core_session_t *orig_session, const char *function, switch_media_bug_t **pop) +{ + switch_media_bug_t *bp; + + if (orig_session->bugs) { + switch_thread_rwlock_wrlock(orig_session->bug_rwlock); + for (bp = orig_session->bugs; bp; bp = bp->next) { + if (!strcmp(bp->function, function)) { + switch_set_flag(bp, SMBF_LOCK); + break; + } + } + switch_thread_rwlock_unlock(orig_session->bug_rwlock); + + if (bp) { + *pop = bp; + return SWITCH_STATUS_SUCCESS; + } else { + *pop = NULL; + } + } + + return SWITCH_STATUS_FALSE; +} + +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_exec_all(switch_core_session_t *orig_session, + const char *function, switch_media_bug_exec_cb_t cb, void *user_data) +{ + switch_media_bug_t *bp; + int x = 0; + + switch_assert(cb); + + if (orig_session->bugs) { + switch_thread_rwlock_wrlock(orig_session->bug_rwlock); + for (bp = orig_session->bugs; bp; bp = bp->next) { + if (!switch_test_flag(bp, SMBF_PRUNE) && !switch_test_flag(bp, SMBF_LOCK) && !strcmp(bp->function, function)) { + cb(bp, user_data); + x++; + } + } + switch_thread_rwlock_unlock(orig_session->bug_rwlock); + } + + return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; +} + SWITCH_DECLARE(switch_status_t) switch_core_media_bug_enumerate(switch_core_session_t *session, switch_stream_handle_t *stream) { switch_media_bug_t *bp; @@ -579,7 +647,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_enumerate(switch_core_sess return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_all(switch_core_session_t *session) +SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_all_function(switch_core_session_t *session, const char *function) { switch_media_bug_t *bp; switch_status_t status = SWITCH_STATUS_FALSE; @@ -587,10 +655,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_all(switch_core_ses if (session->bugs) { switch_thread_rwlock_wrlock(session->bug_rwlock); for (bp = session->bugs; bp; bp = bp->next) { - if (bp->thread_id && bp->thread_id != switch_thread_self()) { + if ((bp->thread_id && bp->thread_id != switch_thread_self()) || switch_test_flag(bp, SMBF_LOCK)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "BUG is thread locked skipping.\n"); continue; } + + if (!zstr(function) && strcmp(bp->function, function)) { + continue; + } + if (bp->callback) { bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_CLOSE); @@ -614,7 +687,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_close(switch_media_bug_t * { switch_media_bug_t *bp = *bug; if (bp) { - if (bp->thread_id && bp->thread_id != switch_thread_self()) { + if ((bp->thread_id && bp->thread_id != switch_thread_self()) || switch_test_flag(bp, SMBF_LOCK)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(*bug)), SWITCH_LOG_DEBUG, "BUG is thread locked skipping.\n"); return SWITCH_STATUS_FALSE; } @@ -637,6 +710,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove(switch_core_session { switch_media_bug_t *bp = NULL, *last = NULL; switch_status_t status = SWITCH_STATUS_FALSE; + + if (switch_core_media_bug_test_flag(*bug, SMBF_LOCK)) { + return status; + } switch_thread_rwlock_wrlock(session->bug_rwlock); if (session->bugs) { diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index ecddfdbbb6..5d6127d054 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1148,9 +1148,14 @@ struct eavesdrop_pvt { switch_mutex_t *r_mutex; switch_buffer_t *w_buffer; switch_mutex_t *w_mutex; + switch_core_session_t *eavesdropper; uint32_t flags; + switch_frame_t demux_frame; + uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE]; }; + + static switch_bool_t eavesdrop_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) { struct eavesdrop_pvt *ep = (struct eavesdrop_pvt *) user_data; @@ -1190,13 +1195,18 @@ static switch_bool_t eavesdrop_callback(switch_media_bug_t *bug, void *user_data if (switch_buffer_inuse(ep->r_buffer) >= rframe->datalen) { uint32_t bytes; switch_buffer_lock(ep->r_buffer); - bytes = (uint32_t) switch_buffer_read(ep->r_buffer, data, rframe->datalen); + bytes = (uint32_t) switch_buffer_read(ep->r_buffer, ep->data, rframe->datalen); - rframe->datalen = switch_merge_sln(rframe->data, rframe->samples, (int16_t *) data, bytes / 2) * 2; + rframe->datalen = switch_merge_sln(rframe->data, rframe->samples, (int16_t *) ep->data, bytes / 2) * 2; rframe->samples = rframe->datalen / 2; + ep->demux_frame.data = ep->data; + ep->demux_frame.datalen = bytes; + ep->demux_frame.samples = bytes / 2; + switch_buffer_unlock(ep->r_buffer); switch_core_media_bug_set_read_replace_frame(bug, rframe); + switch_core_media_bug_set_read_demux_frame(bug, &ep->demux_frame); } } } @@ -1229,6 +1239,99 @@ static switch_bool_t eavesdrop_callback(switch_media_bug_t *bug, void *user_data return SWITCH_TRUE; } +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_pop_eavesdropper(switch_core_session_t *session, switch_core_session_t **sessionp) +{ + switch_media_bug_t *bug; + switch_status_t status = SWITCH_STATUS_FALSE; + + if (switch_core_media_bug_pop(session, "eavesdrop", &bug) == SWITCH_STATUS_SUCCESS) { + struct eavesdrop_pvt *ep = (struct eavesdrop_pvt *) switch_core_media_bug_get_user_data(bug); + + if (ep && ep->eavesdropper && ep->eavesdropper != session) { + switch_core_session_read_lock(ep->eavesdropper); + *sessionp = ep->eavesdropper; + switch_core_media_bug_set_flag(bug, SMBF_PRUNE); + status = SWITCH_STATUS_SUCCESS; + } + } + + + return status; +} + +struct exec_cb_data { + switch_core_session_t *caller; + char *var; + char *val; +}; + +static void exec_cb(switch_media_bug_t *bug, void *user_data) +{ + struct exec_cb_data *data = (struct exec_cb_data *) user_data; + struct eavesdrop_pvt *ep = (struct eavesdrop_pvt *) switch_core_media_bug_get_user_data(bug); + + if (ep && ep->eavesdropper && ep->eavesdropper != data->caller) { + switch_channel_t *a = switch_core_session_get_channel(ep->eavesdropper); + switch_channel_t *b = switch_core_session_get_channel(data->caller); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s telling %s to exec %s:%s\n", + switch_channel_get_name(b), switch_channel_get_name(a), data->var, data->val); + + switch_core_session_execute_application(ep->eavesdropper, data->var, data->val); + } +} + +static void display_exec_cb(switch_media_bug_t *bug, void *user_data) +{ + struct exec_cb_data *data = (struct exec_cb_data *) user_data; + struct eavesdrop_pvt *ep = (struct eavesdrop_pvt *) switch_core_media_bug_get_user_data(bug); + + if (ep && ep->eavesdropper && ep->eavesdropper != data->caller) { + switch_core_session_message_t msg = { 0 }; + + msg.from = __FILE__; + msg.message_id = SWITCH_MESSAGE_INDICATE_DISPLAY; + msg.string_array_arg[0] = data->var; + msg.string_array_arg[1] = data->val; + + switch_core_session_receive_message(ep->eavesdropper, &msg); + } +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_exec_all(switch_core_session_t *session, const char *app, const char *arg) +{ + struct exec_cb_data *data = NULL; + + data = switch_core_session_alloc(session, sizeof(*data)); + data->var = switch_core_session_strdup(session, app); + data->val = switch_core_session_strdup(session, arg); + data->caller = session; + + return switch_core_media_bug_exec_all(session, "eavesdrop", exec_cb, data); +} + + +SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_update_display(switch_core_session_t *session, const char *name, const char *number) +{ + struct exec_cb_data *data = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_status_t status = SWITCH_STATUS_FALSE; + + data = switch_core_session_alloc(session, sizeof(*data)); + data->var = switch_core_session_strdup(session, name); + data->val = switch_core_session_strdup(session, number); + data->caller = session; + + if (!switch_channel_test_app_flag_key("EAVESDROP", channel, 1)) { + switch_channel_set_app_flag_key("EAVESDROP", channel, 1); + status = switch_core_media_bug_exec_all(session, "eavesdrop", display_exec_cb, data); + switch_channel_clear_app_flag_key("EAVESDROP", channel, 1); + } + + return status; +} + + SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session_t *session, const char *uuid, const char *require_group, switch_eavesdrop_flag_t flags) { @@ -1236,6 +1339,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session switch_status_t status = SWITCH_STATUS_FALSE; switch_channel_t *channel = switch_core_session_get_channel(session); int codec_initialized = 0; + const char *name, *num; if ((tsession = switch_core_session_locate(uuid))) { struct eavesdrop_pvt *ep = NULL; @@ -1341,6 +1445,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session write_frame.buflen = sizeof(buf); write_frame.rate = codec.implementation->actual_samples_per_second; + ep->eavesdropper = session; ep->flags = flags; switch_mutex_init(&ep->mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(tsession)); switch_buffer_create_dynamic(&ep->buffer, 2048, 2048, 8192); @@ -1370,9 +1475,28 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session /* Tell the channel we are going to be in a bridge */ msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE; switch_core_session_receive_message(session, &msg); - cp = switch_channel_get_caller_profile(tchannel); - switch_snprintf(cid_buf, sizeof(cid_buf), "%s|%s", cp->caller_id_number, cp->caller_id_name); + name = cp->caller_id_name; + num = cp->caller_id_number; + + if (flags & ED_COPY_DISPLAY) { + const char *tmp_name = NULL, *tmp_num = NULL; + name = cp->callee_id_name; + num = cp->callee_id_number; + + if (!((tmp_name = switch_channel_get_variable(tchannel, "last_sent_callee_id_name")) + && (tmp_num = switch_channel_get_variable(tchannel, "last_sent_callee_id_number")))) { + + tmp_name = switch_channel_get_variable(tchannel, "callee_id_name"); + tmp_num = switch_channel_get_variable(tchannel, "callee_id_number"); + } + + if (tmp_name) name = tmp_name; + if (tmp_num) num = tmp_num; + + } + + switch_snprintf(cid_buf, sizeof(cid_buf), "%s|%s", name, num); msg.string_arg = cid_buf; msg.message_id = SWITCH_MESSAGE_INDICATE_DISPLAY; switch_core_session_receive_message(session, &msg); diff --git a/src/switch_resample.c b/src/switch_resample.c index 136adc9694..6722d6f448 100644 --- a/src/switch_resample.c +++ b/src/switch_resample.c @@ -252,6 +252,25 @@ SWITCH_DECLARE(uint32_t) switch_merge_sln(int16_t *data, uint32_t samples, int16 return x; } + +SWITCH_DECLARE(uint32_t) switch_unmerge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples) +{ + int i; + int32_t x; + + if (samples > other_samples) { + x = other_samples; + } else { + x = samples; + } + + for (i = 0; i < x; i++) { + data[i] -= other_data[i]; + } + + return x; +} + SWITCH_DECLARE(void) switch_mux_channels(int16_t *data, switch_size_t samples, uint32_t channels) { int16_t *buf; From c204243b1bdf860a26f5b8d984a0dc4504474e79 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 20:52:50 +0000 Subject: [PATCH 189/731] tagscript: reindent --- scripts/tagscript.sh | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 1ac817cb74..91f37bceb0 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -1,26 +1,28 @@ #!/bin/bash +##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- +##### release a version of FreeSWITCH src_repo="$(pwd)" if [ ! -d .git ]; then - echo "error: must be run from within the top level of a FreeSWITCH git tree." 1>&2 - exit 1; + echo "error: must be run from within the top level of a FreeSWITCH git tree." 1>&2 + exit 1; fi showusage() { - echo "usage: ./scripts/tagscript.sh [-s] MAJOR.MINOR.MICRO[.REVISION]" 1>&2 - exit 1; + echo "usage: ./scripts/tagscript.sh [-s] MAJOR.MINOR.MICRO[.REVISION]" 1>&2 + exit 1; } while getopts "s" o; do - case "$o" in - s) opts="-s" ;; - esac + case "$o" in + s) opts="-s" ;; + esac done shift $(($OPTIND-1)) if [ -z "$1" ]; then - showusage + showusage fi ver="$1" @@ -33,26 +35,26 @@ dst_name="freeswitch-$major.$minor.$micro" dst_dir="$src_repo/../$dst_name" if [ -d "$dst_dir" ]; then - echo "error: destination directory $dst_dir already exists." 1>&2 - exit 1; + echo "error: destination directory $dst_dir already exists." 1>&2 + exit 1; fi # save local changes ret=$(git stash save "Save uncommitted changes before tagging.") if echo $ret | grep "^Saved"; then - stash_saved=1 + stash_saved=1 fi sed -e "s|\(AC_SUBST(SWITCH_VERSION_MAJOR, \[\).*\(\])\)|\1$major\2|" \ - -e "s|\(AC_SUBST(SWITCH_VERSION_MINOR, \[\).*\(\])\)|\1$minor\2|" \ - -e "s|\(AC_SUBST(SWITCH_VERSION_MICRO, \[\).*\(\])\)|\1$micro\2|" \ - -e "s|\(AC_INIT(\[freeswitch\], \[\).*\(\], BUG-REPORT-ADDRESS)\)|\1$major.$minor.$micro\2|" \ - -i configure.in + -e "s|\(AC_SUBST(SWITCH_VERSION_MINOR, \[\).*\(\])\)|\1$minor\2|" \ + -e "s|\(AC_SUBST(SWITCH_VERSION_MICRO, \[\).*\(\])\)|\1$micro\2|" \ + -e "s|\(AC_INIT(\[freeswitch\], \[\).*\(\], BUG-REPORT-ADDRESS)\)|\1$major.$minor.$micro\2|" \ + -i configure.in if [ -n "$rev" ]; then - sed -e "s|\(AC_SUBST(SWITCH_VERSION_REVISION, \[\).*\(\])\)|\1$rev\2|" \ - -e "s|#\(AC_SUBST(SWITCH_VERSION_REVISION\)|\1|" \ - -i configure.in + sed -e "s|\(AC_SUBST(SWITCH_VERSION_REVISION, \[\).*\(\])\)|\1$rev\2|" \ + -e "s|#\(AC_SUBST(SWITCH_VERSION_REVISION\)|\1|" \ + -i configure.in fi git add configure.in @@ -61,7 +63,7 @@ git tag -a ${opts} -m "freeswitch-$ver release" v$ver git clone $src_repo $dst_dir if [ -n "$stash_saved" ]; then - git stash pop + git stash pop fi cd $dst_dir @@ -87,3 +89,4 @@ server (I didn't do that for you, as you might want to review first). ---------------------------------------------------------------------- EOF +exit 0 From 20ac9757ba69b78e17eb8895dfb32144a11ce740 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 20:56:45 +0000 Subject: [PATCH 190/731] ci: wrap sanity checks --- scripts/ci/common.sh | 20 ++++++++++++-------- scripts/ci/debsrcbuilder.sh | 2 ++ scripts/ci/rpmbuilder.sh | 2 ++ scripts/ci/sounds-en-us-callie.sh | 2 ++ scripts/ci/src_tarball.sh | 2 ++ 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/scripts/ci/common.sh b/scripts/ci/common.sh index a570cd8008..5967ae8262 100755 --- a/scripts/ci/common.sh +++ b/scripts/ci/common.sh @@ -73,13 +73,17 @@ gnuize () { rm -rf .git } -if [ ! -d .git ]; then - echo "error: must be run from within the top level of a FreeSWITCH git tree." 1>&2 - exit 1; -fi +check_pwd () { + if [ ! -d .git ]; then + echo "error: must be run from within the top level of a FreeSWITCH git tree." 1>&2 + exit 1; + fi +} -if [ -z "$1" ]; then - echo "usage: $0 " 1>&2 - exit 1; -fi +check_input_ver_build () { + if [ -z "$1" ]; then + echo "usage: $0 " 1>&2 + exit 1; + fi +} diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index 3dc56e5faa..e5e429b153 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -5,6 +5,8 @@ sdir="." [ -n "${0%/*}" ] && sdir="${0%/*}" . $sdir/common.sh +check_pwd +check_input_ver_build eval $(parse_version "$1") datestamp="$(date +%Y%m%dT%H%M%SZ)" nightly="n${datestamp}" diff --git a/scripts/ci/rpmbuilder.sh b/scripts/ci/rpmbuilder.sh index 36b8b1d079..563bfca104 100755 --- a/scripts/ci/rpmbuilder.sh +++ b/scripts/ci/rpmbuilder.sh @@ -5,6 +5,8 @@ sdir="." [ -n "${0%/*}" ] && sdir="${0%/*}" . $sdir/common.sh +check_pwd +check_input_ver_build eval $(parse_version "$1") build="$2" diff --git a/scripts/ci/sounds-en-us-callie.sh b/scripts/ci/sounds-en-us-callie.sh index 39703028ca..6b3b0df0a6 100755 --- a/scripts/ci/sounds-en-us-callie.sh +++ b/scripts/ci/sounds-en-us-callie.sh @@ -5,6 +5,8 @@ sdir="." [ -n "${0%/*}" ] && sdir="${0%/*}" . $sdir/common.sh +check_pwd +check_input_ver_build eval $(parse_version "$1") build="$2" diff --git a/scripts/ci/src_tarball.sh b/scripts/ci/src_tarball.sh index 7fd48621e3..d4c3adffa7 100755 --- a/scripts/ci/src_tarball.sh +++ b/scripts/ci/src_tarball.sh @@ -5,6 +5,8 @@ sdir="." [ -n "${0%/*}" ] && sdir="${0%/*}" . $sdir/common.sh +check_pwd +check_input_ver_build eval $(parse_version "$1") dst_name="freeswitch-$cmajor.$cminor.$cmicro" From 985fad9e32813b840ebd918e1303219fdd5bbba1 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 21:34:08 +0000 Subject: [PATCH 191/731] prepare the tag script for the new release --- scripts/ci/common.sh | 10 ++++ scripts/tagscript.sh | 125 ++++++++++++++++++++++++++----------------- 2 files changed, 85 insertions(+), 50 deletions(-) diff --git a/scripts/ci/common.sh b/scripts/ci/common.sh index 5967ae8262..ef191676b3 100755 --- a/scripts/ci/common.sh +++ b/scripts/ci/common.sh @@ -37,6 +37,11 @@ parse_version () { micro="0" ver="${major}.${minor}${rev}" fi + gver="$(echo "$ver" | sed -e 's/[~_]/-/')" + grev="$(echo "$rev" | sed -e 's/[~_]/-/')" + gmajor="$major" + gminor="$minor" + gmicro="$micro" [ -n "$crev" ] && cver="${cver}.${crev}" echo "ver='$ver'" echo "major='$major'" @@ -48,6 +53,11 @@ parse_version () { echo "cminor='$cminor'" echo "cmicro='$cmicro'" echo "crev='$crev'" + echo "gver='$gver'" + echo "gmajor='$gmajor'" + echo "gminor='$gminor'" + echo "gmicro='$gmicro'" + echo "grev='$grev'" } set_fs_ver () { diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 91f37bceb0..005fab5499 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -2,20 +2,38 @@ ##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- ##### release a version of FreeSWITCH -src_repo="$(pwd)" +sdir="." +[ -n "${0%/*}" ] && sdir="${0%/*}" +. $sdir/ci/common.sh -if [ ! -d .git ]; then - echo "error: must be run from within the top level of a FreeSWITCH git tree." 1>&2 - exit 1; -fi +check_pwd showusage() { - echo "usage: ./scripts/tagscript.sh [-s] MAJOR.MINOR.MICRO[.REVISION]" 1>&2 + cat >&2 < + +where follows the format: + +1.2-alpha3 +1.2-beta3 +1.2-rc3 +1.2 +1.2.13-rc4 +1.2.13 +etc. + +I'll take care of correctly naming the tag to be consistent with +FreeSWITCH git policy from there. + +EOF exit 1; } -while getopts "s" o; do +opts="" +debug=false +while getopts "ds" o; do case "$o" in + d) debug=true ;; s) opts="-s" ;; esac done @@ -25,67 +43,74 @@ if [ -z "$1" ]; then showusage fi -ver="$1" -major=$(echo "$ver" | cut -d. -f1) -minor=$(echo "$ver" | cut -d. -f2) -micro=$(echo "$ver" | cut -d. -f3) -rev=$(echo "$ver" | cut -d. -f4) +eval $(parse_version "$1") -dst_name="freeswitch-$major.$minor.$micro" -dst_dir="$src_repo/../$dst_name" +ngrep () { grep -e "$1" >/dev/null; } -if [ -d "$dst_dir" ]; then - echo "error: destination directory $dst_dir already exists." 1>&2 - exit 1; +if ! $debug && ! (echo "$opts" | ngrep '-s'); then + cat >&2 <&2 + read r + [ -z "$r" ] && continue + if [ "$r" = yes ] || [ "$r" = y ]; then + (echo; echo "OK, I believe you."; echo) >&2 + break + else + (echo; echo "This is a bad idea then."; echo) >&2 + fi + while true; do + echo -n "Are you really really sure? (yes/no): " >&2 + read r + [ -z "$r" ] && continue + if [ "$r" = yes ] || [ "$r" = y ]; then + (echo; echo "As you wish, you've been warned."; echo) >&2 + break + else + (echo; echo "Great; go setup a GPG key and try again with -s"; echo) >&2 + exit 1 + fi + break + done + break + done fi -# save local changes +echo "Saving uncommitted changes before tagging..." >&2 ret=$(git stash save "Save uncommitted changes before tagging.") -if echo $ret | grep "^Saved"; then +if (echo "$ret" | ngrep '^Saved'); then stash_saved=1 fi -sed -e "s|\(AC_SUBST(SWITCH_VERSION_MAJOR, \[\).*\(\])\)|\1$major\2|" \ - -e "s|\(AC_SUBST(SWITCH_VERSION_MINOR, \[\).*\(\])\)|\1$minor\2|" \ - -e "s|\(AC_SUBST(SWITCH_VERSION_MICRO, \[\).*\(\])\)|\1$micro\2|" \ - -e "s|\(AC_INIT(\[freeswitch\], \[\).*\(\], BUG-REPORT-ADDRESS)\)|\1$major.$minor.$micro\2|" \ - -i configure.in - -if [ -n "$rev" ]; then - sed -e "s|\(AC_SUBST(SWITCH_VERSION_REVISION, \[\).*\(\])\)|\1$rev\2|" \ - -e "s|#\(AC_SUBST(SWITCH_VERSION_REVISION\)|\1|" \ - -i configure.in -fi +echo "Changing the version of configure.in..." >&2 +set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" +echo "Committing the new version..." >&2 git add configure.in -git commit -m "Release freeswitch-$ver" -git tag -a ${opts} -m "freeswitch-$ver release" v$ver +git commit -m "Release freeswitch-$gver" +echo "Tagging freeswitch v$gver..." >&2 +git tag -a ${opts} -m "freeswitch-$gver release" "v$gver" -git clone $src_repo $dst_dir if [ -n "$stash_saved" ]; then - git stash pop + echo "Restoring your uncommitted changes to your working directory..." >&2 + git stash pop >/dev/null fi -cd $dst_dir - -./bootstrap.sh -mv bootstrap.sh rebootstrap.sh -rm -f docs/AUTHORS -rm -f docs/COPYING -rm -f docs/ChangeLog -rm -rf .git -cd .. -tar -cvf $dst_name.tar $dst_dir -gzip -9 -c $dst_name.tar > $dst_name.tar.gz || echo "gzip not available" -bzip2 -z -k $dst_name.tar || echo "bzip2 not available" -xz -z -9 -k $dst_name.tar || echo "xz / xz-utils not available" -rm -rf $dst_name.tar $dst_dir - cat 1>&2 < Date: Mon, 7 May 2012 21:47:25 +0000 Subject: [PATCH 192/731] tagscript: refactor --- scripts/tagscript.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 005fab5499..12fafc42ff 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -44,10 +44,9 @@ if [ -z "$1" ]; then fi eval $(parse_version "$1") +ngrep () { (echo "$2" | grep -e "$1" >/dev/null); } -ngrep () { grep -e "$1" >/dev/null; } - -if ! $debug && ! (echo "$opts" | ngrep '-s'); then +if ! ($debug || ngrep '-s' "$opts"); then cat >&2 <&2 ret=$(git stash save "Save uncommitted changes before tagging.") -if (echo "$ret" | ngrep '^Saved'); then +if (ngrep '^Saved' "$ret"); then stash_saved=1 fi From 55330e0e564da82aa65b767a1dc5166450f3ca13 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 21:49:00 +0000 Subject: [PATCH 193/731] tagscript: follow our git subject line capitalization convention --- scripts/tagscript.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 12fafc42ff..faccf47081 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -92,7 +92,7 @@ set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" echo "Committing the new version..." >&2 git add configure.in -git commit -m "Release freeswitch-$gver" +git commit -m "release freeswitch-$gver" echo "Tagging freeswitch v$gver..." >&2 git tag -a ${opts} -m "freeswitch-$gver release" "v$gver" From d864e66d623c58a38c7063f038e1e6d3b1d52271 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 22:02:44 +0000 Subject: [PATCH 194/731] tagscript: add sanity checks on version number --- scripts/tagscript.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index faccf47081..4e74ebe9a5 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -45,6 +45,19 @@ fi eval $(parse_version "$1") ngrep () { (echo "$2" | grep -e "$1" >/dev/null); } +err () { echo "$1" >&2; exit 1; } + +ngrep '^[1-9]*$' "$gmajor" || \ + err "The major version '$gmajor' appears invalid." +ngrep '^[0-9]*$' "$gminor" || \ + err "The minor version '$gminor' appears invalid." +[ -z "$gmicro" ] || ngrep '^[0-9]*$' "$gmicro" || \ + err "The micro version '$gmicro' appears invalid." +[ -z "$grev" ] || ngrep '^[.-]' "$grev" || \ + err "The revision '$grev' appears invalid." + +echo "We're going to release freeswitch v$gver" >&2 +echo >&2 if ! ($debug || ngrep '-s' "$opts"); then cat >&2 < Date: Mon, 7 May 2012 22:15:59 +0000 Subject: [PATCH 195/731] tagscript: add better usage instructions and error checking --- scripts/tagscript.sh | 62 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 4e74ebe9a5..920d312d65 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -10,20 +10,34 @@ check_pwd showusage() { cat >&2 < +SYNOPSIS + $0 [-s] -where follows the format: +DESCRIPTION + Creates a new FreeSWITCH tag after performing some sanity checks. + The tag is optionally signed if '-s' is provided, but you should + really sign any public release tags, so pass '-s'. -1.2-alpha3 -1.2-beta3 -1.2-rc3 -1.2 -1.2.13-rc4 -1.2.13 -etc. + follows the format: + + 1.2-alpha3 + 1.2-beta3 + 1.2-rc3 + 1.2 + 1.2.13-rc4 + 1.2.13 + etc. -I'll take care of correctly naming the tag to be consistent with -FreeSWITCH git policy from there. + This tool will take care of correctly naming the tag to be + consistent with FreeSWITCH git policy from there. + +OPTIONS + -s + Signs the resulting tag. + + -d + Debug mode. Remove the tag after creating it and don't warn about + the lack of a signature. EOF exit 1; @@ -105,9 +119,31 @@ set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" echo "Committing the new version..." >&2 git add configure.in -git commit -m "release freeswitch-$gver" +if ! (git commit --allow-empty -m "release freeswitch-$gver"); then + cat >&2 <&2 -git tag -a ${opts} -m "freeswitch-$gver release" "v$gver" +if ! (git tag -a ${opts} -m "freeswitch-$gver release" "v$gver"); then + cat >&2 <&2 + git tag -d "v$gver" || true + git reset --hard HEAD^ || true +fi if [ -n "$stash_saved" ]; then echo "Restoring your uncommitted changes to your working directory..." >&2 From a9b997468d22f2ccc04eb0d220c18a466afe6bf0 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Mon, 7 May 2012 17:25:33 -0500 Subject: [PATCH 196/731] fix compiler warning --- src/switch_core_media_bug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/switch_core_media_bug.c b/src/switch_core_media_bug.c index a320d9a345..3d5c26b531 100644 --- a/src/switch_core_media_bug.c +++ b/src/switch_core_media_bug.c @@ -183,6 +183,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(switch_media_bug_t *b bytes = read_impl.decoded_bytes_per_packet; +#ifdef TESTINGONLY if (0 && bug->session->recur_buffer_len) { frame->datalen = bug->session->recur_buffer_len; frame->samples = bug->session->recur_buffer_len / sizeof(int16_t); @@ -191,6 +192,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(switch_media_bug_t *b memcpy(frame->data, bug->session->recur_buffer, bug->session->recur_buffer_len); return SWITCH_STATUS_SUCCESS; } +#endif if (frame->buflen < bytes) { From 581e04c4f0d89f8b6f9dbbcead1d09872ea66ca1 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 22:28:33 +0000 Subject: [PATCH 197/731] tagscript: improve formatting of commits and tags --- scripts/tagscript.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 920d312d65..30222641a6 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -119,7 +119,7 @@ set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" echo "Committing the new version..." >&2 git add configure.in -if ! (git commit --allow-empty -m "release freeswitch-$gver"); then +if ! (git commit --allow-empty -m "release FreeSWITCH $gver"); then cat >&2 <&2 -if ! (git tag -a ${opts} -m "freeswitch-$gver release" "v$gver"); then +if ! (git tag -a ${opts} -m "FreeSWITCH $gver" "v$gver"); then cat >&2 < Date: Mon, 7 May 2012 22:39:39 +0000 Subject: [PATCH 198/731] ci: fix 20ac9757ba --- scripts/ci/debsrcbuilder.sh | 2 +- scripts/ci/rpmbuilder.sh | 2 +- scripts/ci/sounds-en-us-callie.sh | 2 +- scripts/ci/src_tarball.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index e5e429b153..70aceeeee0 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -6,7 +6,7 @@ sdir="." . $sdir/common.sh check_pwd -check_input_ver_build +check_input_ver_build $@ eval $(parse_version "$1") datestamp="$(date +%Y%m%dT%H%M%SZ)" nightly="n${datestamp}" diff --git a/scripts/ci/rpmbuilder.sh b/scripts/ci/rpmbuilder.sh index 563bfca104..78c4c3ca73 100755 --- a/scripts/ci/rpmbuilder.sh +++ b/scripts/ci/rpmbuilder.sh @@ -6,7 +6,7 @@ sdir="." . $sdir/common.sh check_pwd -check_input_ver_build +check_input_ver_build $@ eval $(parse_version "$1") build="$2" diff --git a/scripts/ci/sounds-en-us-callie.sh b/scripts/ci/sounds-en-us-callie.sh index 6b3b0df0a6..32fbc0a400 100755 --- a/scripts/ci/sounds-en-us-callie.sh +++ b/scripts/ci/sounds-en-us-callie.sh @@ -6,7 +6,7 @@ sdir="." . $sdir/common.sh check_pwd -check_input_ver_build +check_input_ver_build $@ eval $(parse_version "$1") build="$2" diff --git a/scripts/ci/src_tarball.sh b/scripts/ci/src_tarball.sh index d4c3adffa7..826b8a27b7 100755 --- a/scripts/ci/src_tarball.sh +++ b/scripts/ci/src_tarball.sh @@ -6,7 +6,7 @@ sdir="." . $sdir/common.sh check_pwd -check_input_ver_build +check_input_ver_build $@ eval $(parse_version "$1") dst_name="freeswitch-$cmajor.$cminor.$cmicro" From 0553518f678fe62bff0270fb03ad8a3f42723cf6 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 22:52:48 +0000 Subject: [PATCH 199/731] ci/debian: accept the codename for which we are packaging --- debian/bootstrap.sh | 10 ++++++++++ scripts/ci/debsrcbuilder.sh | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index c13bbbb92e..2ee3bb8efc 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -788,6 +788,16 @@ genmodctl_mod () { echo } +codename="sid" +while getopts "r:" o; do + case "$o" in + r) codename="$OPTARG" ;; + esac +done +shift $(($OPTIND-1)) + +echo "Bootstrapping debian/ for ${codename}" >&2 +echo >&2 echo "Please wait, this takes a few seconds..." >&2 parse_dir=control-modules.parse diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index 70aceeeee0..4e0d5aad57 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -12,6 +12,7 @@ datestamp="$(date +%Y%m%dT%H%M%SZ)" nightly="n${datestamp}" build="b$2" distro=${3:="unstable"} +codename=${4:="sid"} fver="${ver}~${nightly}~${build}" fname="freeswitch-$fver" @@ -58,13 +59,13 @@ echo "Compressing $orig.tar with xz -6..." >&2 xz -6 $orig.tar cd $bdir -(cd debian && ./bootstrap.sh) +(cd debian && ./bootstrap.sh -c "$codename") # dch can't handle comments in control file (cd debian; \ mv control control.orig; \ grep -e '^#' -v control.orig > control) # dependency: libparse-debcontrol-perl -dch -b -v "${fver}-1" \ +dch -b -v "${fver}-1~${codename}+1" \ -M --force-distribution -D "$distro" \ "Nightly build at ${datestamp}." # dependency: fakeroot From 5c18656a9133843a5b775945d0c4e712dff4061e Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 23:32:09 +0000 Subject: [PATCH 200/731] debian: build different sets of modules based on the debian codename --- debian/bootstrap.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 2ee3bb8efc..16848e3ddd 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -30,14 +30,16 @@ avoid_mods=( event_handlers/mod_snmp formats/mod_portaudio_stream formats/mod_shout - formats/mod_vlc languages/mod_java languages/mod_managed - languages/mod_spidermonkey languages/mod_yaml sdk/autotools xml_int/mod_xml_ldap ) +avoid_mods_squeeze=( + formats/mod_vlc + languages/mod_spidermonkey +) err () { echo "$0 error: $1" >&2 @@ -54,7 +56,8 @@ xread () { } avoid_mod_filter () { - for x in "${avoid_mods[@]}"; do + local mods=("$(eval echo \${avoid_mods_$codename[@]})" "${avoid_mods[@]}") + for x in "${mods[@]}"; do [ "$1" = "$x" ] && return 1 done return 0 From bc2783effdf63309003fba0b34cd2ff4f4f67e45 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 7 May 2012 23:45:38 +0000 Subject: [PATCH 201/731] ci: fix up variadic invocation --- scripts/ci/debsrcbuilder.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index 4e0d5aad57..d693777500 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -10,9 +10,9 @@ check_input_ver_build $@ eval $(parse_version "$1") datestamp="$(date +%Y%m%dT%H%M%SZ)" nightly="n${datestamp}" -build="b$2" -distro=${3:="unstable"} -codename=${4:="sid"} +build="b${2-0}" +distro="${3-unstable}" +codename="${4-sid}" fver="${ver}~${nightly}~${build}" fname="freeswitch-$fver" From a1177a79941d2d667c6c399199c9ff2f6f1cbfb0 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 8 May 2012 00:02:56 -0500 Subject: [PATCH 202/731] release FreeSWITCH 1.2-rc1 --- configure.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.in b/configure.in index f6d2e091ef..7b76740d62 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.1.beta1], BUG-REPORT-ADDRESS) +AC_INIT([freeswitch], [1.2-rc1], BUG-REPORT-ADDRESS) AC_SUBST(SWITCH_VERSION_MAJOR, [1]) -AC_SUBST(SWITCH_VERSION_MINOR, [1]) -AC_SUBST(SWITCH_VERSION_MICRO, [beta1]) -#AC_SUBST(SWITCH_VERSION_REVISION, []) +AC_SUBST(SWITCH_VERSION_MINOR, [2]) +AC_SUBST(SWITCH_VERSION_MICRO, [0]) +AC_SUBST(SWITCH_VERSION_REVISION, [-rc1]) AC_CONFIG_FILES([src/include/switch_version.h.in:src/include/switch_version.h.template]) AC_CONFIG_FILES([.version:.version.in]) From c5b6166538cbece8727e1d45c08461f66e80f202 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 14:34:47 +0000 Subject: [PATCH 203/731] debian: fix use of bash arrays and display excludes/includes --- debian/bootstrap.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 242e2cb9c4..947388e632 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -56,16 +56,23 @@ xread () { } avoid_mod_filter () { - local mods=("$(eval echo \${avoid_mods_$codename[@]})" "${avoid_mods[@]}") + local x="avoid_mods_$codename[@]" + local -a mods=("${avoid_mods[@]}" "${!x}") for x in "${mods[@]}"; do - [ "$1" = "$x" ] && return 1 + if [ "$1" = "$x" ]; then + [ "$2" = "show" ] && echo "excluding module $x" >&2 + return 1 + fi done return 0 } modconf_filter () { - while xread line; do - [ "$1" = "$line" ] && return 0 + while xread l; do + if [ "$1" = "$l" ]; then + [ "$2" = "show" ] && echo "including module $l" >&2 + return 0 + fi done < modules.conf return 1 } @@ -78,6 +85,10 @@ mod_filter () { fi } +mod_filter_show () { + mod_filter "$1" show +} + map_fs_modules () { local filterfn="$1" percatfns="$2" permodfns="$3" for x in $mod_dir/*; do @@ -806,6 +817,7 @@ echo "Please wait, this takes a few seconds..." >&2 parse_dir=control-modules.parse map_fs_modules ':' 'genmodctl_new_cat' 'genmodctl_new_mod' >> control-modules parse_mod_control +map_modules 'mod_filter_show' '' '' (echo "# -*- mode:debian-control -*-"; echo; \ map_modules ':' 'genmodctl_cat' 'genmodctl_mod' \ ) > control-modules.gen From 1edf94b5d9624aa4d28b3c6a21d2ef15f54b0c1c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 14:43:26 +0000 Subject: [PATCH 204/731] debian: add progress output to bootstrap --- debian/bootstrap.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 947388e632..acb63dcd67 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -814,31 +814,42 @@ echo "Bootstrapping debian/ for ${codename}" >&2 echo >&2 echo "Please wait, this takes a few seconds..." >&2 +echo "Adding any new modules to control-modules..." >&2 parse_dir=control-modules.parse map_fs_modules ':' 'genmodctl_new_cat' 'genmodctl_new_mod' >> control-modules +echo "Parsing control-modules..." >&2 parse_mod_control +echo "Displaying includes/excludes..." >&2 map_modules 'mod_filter_show' '' '' +echo "Generating control-modules.gen as sanity check..." >&2 (echo "# -*- mode:debian-control -*-"; echo; \ map_modules ':' 'genmodctl_cat' 'genmodctl_mod' \ ) > control-modules.gen -print_edit_warning > modules_.conf +echo "Accumulating build dependencies from modules..." >&2 map_modules 'mod_filter' '' 'accumulate_build_depends' +echo "Generating debian/..." >&2 > control (print_edit_warning; print_source_control; print_core_control) >> control +echo "Generating debian/ (music)..." >&2 for r in 8000 16000 32000 48000; do genmusic $r; done +echo "Generating debian/ (sounds)..." >&2 for x in 'en/us/callie'; do for r in 8000 16000 32000 48000; do gensound $r $x done done +echo "Generating debian/ (conf)..." >&2 (echo "### conf"; echo) >> control map_confs 'genconf' +echo "Generating debian/ (modules)..." >&2 (echo "### modules"; echo) >> control +print_edit_warning > modules_.conf map_modules "mod_filter" \ "gencontrol_per_cat genmodules_per_cat" \ "gencontrol_per_mod geninstall_per_mod genoverrides_per_mod genmodules_per_mod" +echo "Generating additional lintian overrides..." >&2 grep -e '^Package:' control | while xread l; do m="${l#*: }" f=$m.lintian-overrides @@ -851,4 +862,5 @@ f=freeswitch.lintian-overrides [ -s $f ] || print_edit_warning >> $f print_gpl_openssl_override "freeswitch" >> $f +echo "Done bootstrapping debian/" >&2 touch .stamp-bootstrap From 024e5fdefd9bbcc9e2abe6abc170b428399ac392 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 07:41:10 -0500 Subject: [PATCH 205/731] FS-4196 --resolve --- src/include/switch_ivr.h | 9 + src/mod/event_handlers/mod_json_cdr/Makefile | 23 - .../mod_json_cdr/mod_json_cdr.c | 435 +----------------- src/switch_ivr.c | 254 ++++++++++ 4 files changed, 270 insertions(+), 451 deletions(-) diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index ef5155512c..9d3d5f2ea5 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -41,6 +41,7 @@ #define SWITCH_IVR_H #include +#include "switch_json.h" SWITCH_BEGIN_EXTERN_C struct switch_unicast_conninfo { switch_core_session_t *session; @@ -82,6 +83,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_activate_unicast(switch_core_session_ char *local_ip, switch_port_t local_port, char *remote_ip, switch_port_t remote_port, char *transport, char *flags); +/*! + \brief Generate an JSON CDR report. + \param session the session to get the data from. + \param json_cdr pointer to the json object + \return SWITCH_STATUS_SUCCESS if successful + \note on success the json object must be freed +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_generate_json_cdr(switch_core_session_t *session, cJSON **json_cdr, switch_bool_t urlencode); /*! \brief Generate an XML CDR report. diff --git a/src/mod/event_handlers/mod_json_cdr/Makefile b/src/mod/event_handlers/mod_json_cdr/Makefile index 0620c7df63..c9dfa5399e 100644 --- a/src/mod/event_handlers/mod_json_cdr/Makefile +++ b/src/mod/event_handlers/mod_json_cdr/Makefile @@ -1,27 +1,4 @@ -json-c=json-c-0.9 BASE=../../../.. - -JSON_DIR=$(switch_srcdir)/libs/$(json-c) -JSON_BUILDDIR=$(switch_builddir)/libs/$(json-c) - -JSONLA=$(JSON_BUILDDIR)/libjson.la - -LOCAL_CFLAGS=-I$(JSON_DIR) -LOCAL_LIBADD=$(JSONLA) - include $(BASE)/build/modmake.rules -$(JSON_DIR): - $(GETLIB) $(json-c).tar.gz - -$(JSON_BUILDDIR)/Makefile: $(JSON_DIR) - mkdir -p $(JSON_BUILDDIR) - cd $(JSON_BUILDDIR) && $(DEFAULT_VARS) $(JSON_DIR)/configure $(DEFAULT_ARGS) --srcdir=$(JSON_DIR) CPPFLAGS= LDFLAGS= - $(TOUCH_TARGET) - -$(JSONLA): $(JSON_BUILDDIR)/Makefile - cd $(JSON_BUILDDIR) && $(MAKE) - $(TOUCH_TARGET) - - diff --git a/src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c b/src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c index 92a51c65cb..36626461a5 100644 --- a/src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c +++ b/src/mod/event_handlers/mod_json_cdr/mod_json_cdr.c @@ -33,7 +33,6 @@ #include #include #include -#include #define MAX_URLS 20 #define MAX_ERR_DIRS 20 @@ -181,432 +180,11 @@ static switch_status_t set_json_cdr_log_dirs() return status; } -#define json_object_safe_new_string(str) json_object_new_string(str ? str : "") -#define JSON_ENSURE_SUCCESS(obj) if (is_error(obj)) { return; } -static void set_json_profile_data(struct json_object *json, switch_caller_profile_t *caller_profile) -{ - struct json_object *param = NULL; - - param = json_object_safe_new_string((char *)caller_profile->username); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "username", param); - - param = json_object_safe_new_string((char *)caller_profile->dialplan); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "dialplan", param); - - param = json_object_safe_new_string((char *)caller_profile->caller_id_name); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "caller_id_name", param); - - param = json_object_safe_new_string((char *)caller_profile->ani); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "ani", param); - - param = json_object_safe_new_string((char *)caller_profile->aniii); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "aniii", param); - - param = json_object_safe_new_string((char *)caller_profile->caller_id_number); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "caller_id_number", param); - - param = json_object_safe_new_string((char *)caller_profile->network_addr); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "network_addr", param); - - param = json_object_safe_new_string((char *)caller_profile->rdnis); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "rdnis", param); - - param = json_object_safe_new_string(caller_profile->destination_number); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "destination_number", param); - - param = json_object_safe_new_string(caller_profile->uuid); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "uuid", param); - - param = json_object_safe_new_string((char *)caller_profile->source); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "source", param); - - param = json_object_safe_new_string((char *)caller_profile->context); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "context", param); - - param = json_object_safe_new_string(caller_profile->chan_name); - JSON_ENSURE_SUCCESS(param); - json_object_object_add(json, "chan_name", param); - -} - -static void set_json_chan_vars(struct json_object *json, switch_channel_t *channel) -{ - struct json_object *variable = NULL; - switch_event_header_t *hi = switch_channel_variable_first(channel); - - if (!hi) - return; - - for (; hi; hi = hi->next) { - if (!zstr(hi->name) && !zstr(hi->value)) { - char *data = hi->value; - if (globals.encode_values == ENCODING_DEFAULT) { - switch_size_t dlen = strlen(hi->value) * 3; - - if ((data = malloc(dlen))) { - memset(data, 0, dlen); - switch_url_encode(hi->value, data, dlen); - } - } - - variable = json_object_safe_new_string(data); - if (!is_error(variable)) { - json_object_object_add(json, hi->name, variable); - } - - if (data != hi->value) { - switch_safe_free(data); - } - } - } - switch_channel_variable_last(channel); -} - - - -static switch_status_t generate_json_cdr(switch_core_session_t *session, struct json_object **json_cdr) -{ - - struct json_object *cdr = json_object_new_object(); - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_caller_profile_t *caller_profile; - struct json_object *variables, *j_main_cp, *j_caller_profile, *j_caller_extension, *j_times, *time_tag, - *j_application, *j_callflow, *j_inner_extension, *j_apps, *j_o, *j_channel_data, *j_field; - switch_app_log_t *app_log; - char tmp[512], *f; - - if (is_error(cdr)) { - return SWITCH_STATUS_FALSE; - } - - j_channel_data = json_object_new_object(); - if (is_error(j_channel_data)) { - goto error; - } - json_object_object_add(cdr, "channel_data", j_channel_data); - - - j_field = json_object_safe_new_string((char *) switch_channel_state_name(switch_channel_get_state(channel))); - json_object_object_add(j_channel_data, "state", j_field); - - j_field = json_object_safe_new_string(switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound"); - - json_object_object_add(j_channel_data, "direction", j_field); - - - switch_snprintf(tmp, sizeof(tmp), "%d", switch_channel_get_state(channel)); - j_field = json_object_new_string((char *) tmp); - json_object_object_add(j_channel_data, "state_number", j_field); - - - if ((f = switch_channel_get_flag_string(channel))) { - j_field = json_object_safe_new_string((char *) f); - json_object_object_add(j_channel_data, "flags", j_field); - free(f); - } - - if ((f = switch_channel_get_cap_string(channel))) { - j_field = json_object_safe_new_string((char *) f); - json_object_object_add(j_channel_data, "caps", j_field); - free(f); - } - - - variables = json_object_new_object(); - json_object_object_add(cdr, "variables", variables); - - if (is_error(variables)) { - goto error; - } - - set_json_chan_vars(variables, channel); - - - if ((app_log = switch_core_session_get_app_log(session))) { - switch_app_log_t *ap; - - j_apps = json_object_new_object(); - - if (is_error(j_apps)) { - goto error; - } - - json_object_object_add(cdr, "app_log", j_apps); - - for (ap = app_log; ap; ap = ap->next) { - j_application = json_object_new_object(); - - if (is_error(j_application)) { - goto error; - } - - json_object_object_add(j_application, "app_name", json_object_safe_new_string(ap->app)); - json_object_object_add(j_application, "app_data", json_object_safe_new_string(ap->arg)); - - json_object_object_add(j_apps, "application", j_application); - } - } - - - caller_profile = switch_channel_get_caller_profile(channel); - - while (caller_profile) { - - j_callflow = json_object_new_object(); - - if (is_error(j_callflow)) { - goto error; - } - - json_object_object_add(cdr, "callflow", j_callflow); - - if (!zstr(caller_profile->dialplan)) { - json_object_object_add(j_callflow, "dialplan", json_object_safe_new_string((char *)caller_profile->dialplan)); - } - - if (!zstr(caller_profile->profile_index)) { - json_object_object_add(j_callflow, "profile_index", json_object_safe_new_string((char *)caller_profile->profile_index)); - } - - if (caller_profile->caller_extension) { - switch_caller_application_t *ap; - - j_caller_extension = json_object_new_object(); - - if (is_error(j_caller_extension)) { - goto error; - } - - json_object_object_add(j_callflow, "extension", j_caller_extension); - - json_object_object_add(j_caller_extension, "name", json_object_safe_new_string(caller_profile->caller_extension->extension_name)); - json_object_object_add(j_caller_extension, "number", json_object_safe_new_string(caller_profile->caller_extension->extension_number)); - - if (caller_profile->caller_extension->current_application) { - json_object_object_add(j_caller_extension, "current_app", json_object_safe_new_string(caller_profile->caller_extension->current_application->application_name)); - } - - for (ap = caller_profile->caller_extension->applications; ap; ap = ap->next) { - j_application = json_object_new_object(); - - if (is_error(j_application)) { - goto error; - } - - - json_object_object_add(j_caller_extension, "application", j_application); - - if (ap == caller_profile->caller_extension->current_application) { - json_object_object_add(j_application, "last_executed", json_object_new_string("true")); - } - json_object_object_add(j_application, "app_name", json_object_safe_new_string(ap->application_name)); - json_object_object_add(j_application, "app_data", json_object_safe_new_string(switch_str_nil(ap->application_data))); - } - - if (caller_profile->caller_extension->children) { - switch_caller_profile_t *cp = NULL; - for (cp = caller_profile->caller_extension->children; cp; cp = cp->next) { - - if (!cp->caller_extension) { - continue; - } - - j_inner_extension = json_object_new_object(); - if (is_error(j_inner_extension)) { - goto error; - } - - json_object_object_add(j_caller_extension, "sub_extensions", j_inner_extension); - - - j_caller_extension = json_object_new_object(); - if (is_error(j_caller_extension)) { - goto error; - } - - json_object_object_add(j_inner_extension, "extension", j_caller_extension); - - json_object_object_add(j_caller_extension, "name", json_object_safe_new_string(cp->caller_extension->extension_name)); - json_object_object_add(j_caller_extension, "number", json_object_safe_new_string(cp->caller_extension->extension_number)); - - json_object_object_add(j_caller_extension, "dialplan", json_object_safe_new_string((char *)cp->dialplan)); - - if (cp->caller_extension->current_application) { - json_object_object_add(j_caller_extension, "current_app", json_object_safe_new_string(cp->caller_extension->current_application->application_name)); - } - - for (ap = cp->caller_extension->applications; ap; ap = ap->next) { - j_application = json_object_new_object(); - - if (is_error(j_application)) { - goto error; - } - json_object_object_add(j_caller_extension, "application", j_application); - - if (ap == cp->caller_extension->current_application) { - json_object_object_add(j_application, "last_executed", json_object_new_string("true")); - } - json_object_object_add(j_application, "app_name", json_object_safe_new_string(ap->application_name)); - json_object_object_add(j_application, "app_data", json_object_safe_new_string(switch_str_nil(ap->application_data))); - } - } - } - } - - j_main_cp = json_object_new_object(); - if (is_error(j_main_cp)) { - goto error; - } - - json_object_object_add(j_callflow, "caller_profile", j_main_cp); - - set_json_profile_data(j_main_cp, caller_profile); - - if (caller_profile->originator_caller_profile) { - switch_caller_profile_t *cp = NULL; - - j_o = json_object_new_object(); - if (is_error(j_o)) { - goto error; - } - - json_object_object_add(j_main_cp, "originator", j_o); - - for (cp = caller_profile->originator_caller_profile; cp; cp = cp->next) { - j_caller_profile = json_object_new_object(); - if (is_error(j_caller_profile)) { - goto error; - } - - json_object_object_add(j_o, "originator_caller_profile", j_caller_profile); - - set_json_profile_data(j_caller_profile, cp); - } - } - - if (caller_profile->originatee_caller_profile) { - switch_caller_profile_t *cp = NULL; - - j_o = json_object_new_object(); - if (is_error(j_o)) { - goto error; - } - - json_object_object_add(j_main_cp, "originatee", j_o); - - for (cp = caller_profile->originatee_caller_profile; cp; cp = cp->next) { - - j_caller_profile = json_object_new_object(); - if (is_error(j_caller_profile)) { - goto error; - } - - json_object_object_add(j_o, "originatee_caller_profile", j_caller_profile); - set_json_profile_data(j_caller_profile, cp); - } - } - - if (caller_profile->times) { - - j_times = json_object_new_object(); - if (is_error(j_times)) { - goto error; - } - - json_object_object_add(j_callflow, "times", j_times); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->created); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "created_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->profile_created); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "profile_created_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->progress); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "progress_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->progress_media); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "progress_media_time", time_tag); - - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->answered); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "answered_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->hungup); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "hangup_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->resurrected); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "resurrect_time", time_tag); - - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->transferred); - time_tag = json_object_new_string(tmp); - if (is_error(time_tag)) { - goto error; - } - json_object_object_add(j_times, "transfer_time", time_tag); - - } - - caller_profile = caller_profile->next; - } - - *json_cdr = cdr; - - return SWITCH_STATUS_SUCCESS; - - error: - - if (cdr) { - json_object_put(cdr); - } - - return SWITCH_STATUS_FALSE; -} - static switch_status_t my_on_reporting(switch_core_session_t *session) { - struct json_object *json_cdr = NULL; - const char *json_text = NULL; + cJSON *json_cdr = NULL; + char *json_text = NULL; char *path = NULL; char *curl_json_text = NULL; const char *logdir = NULL; @@ -637,12 +215,12 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) a_prefix = "a_"; - if (generate_json_cdr(session, &json_cdr) != SWITCH_STATUS_SUCCESS) { + if (switch_ivr_generate_json_cdr(session, &json_cdr, globals.encode_values == ENCODING_DEFAULT) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Generating Data!\n"); return SWITCH_STATUS_FALSE; } - json_text = json_object_to_json_string(json_cdr); + json_text = cJSON_PrintUnformatted(json_cdr); if (!json_text) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); @@ -705,6 +283,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) switch_b64_encode((unsigned char *) json_text, need_bytes / 3, (unsigned char *) json_text_escaped, need_bytes); } + switch_safe_free(json_text); json_text = json_text_escaped; if (!(curl_json_text = switch_mprintf("cdr=%s", json_text))) { @@ -861,8 +440,8 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) switch_safe_free(curl_json_text); } - json_object_put(json_cdr); - switch_safe_free(json_text_escaped); + cJSON_Delete(json_cdr); + switch_safe_free(json_text); return status; } diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 432bb9edc6..7a24eff193 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -2472,6 +2472,260 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_generate_xml_cdr(switch_core_session_ return SWITCH_STATUS_FALSE; } +static void switch_ivr_set_json_profile_data(cJSON *json, switch_caller_profile_t *caller_profile) +{ + cJSON_AddItemToObject(json, "username", cJSON_CreateString((char *)caller_profile->username)); + cJSON_AddItemToObject(json, "dialplan", cJSON_CreateString((char *)caller_profile->dialplan)); + cJSON_AddItemToObject(json, "caller_id_name", cJSON_CreateString((char *)caller_profile->caller_id_name)); + cJSON_AddItemToObject(json, "ani", cJSON_CreateString((char *)caller_profile->ani)); + cJSON_AddItemToObject(json, "aniii", cJSON_CreateString((char *)caller_profile->aniii)); + cJSON_AddItemToObject(json, "caller_id_number", cJSON_CreateString((char *)caller_profile->caller_id_number)); + cJSON_AddItemToObject(json, "network_addr", cJSON_CreateString((char *)caller_profile->network_addr)); + cJSON_AddItemToObject(json, "rdnis", cJSON_CreateString((char *)caller_profile->rdnis)); + cJSON_AddItemToObject(json, "destination_number", cJSON_CreateString(caller_profile->destination_number)); + cJSON_AddItemToObject(json, "uuid", cJSON_CreateString(caller_profile->uuid)); + cJSON_AddItemToObject(json, "source", cJSON_CreateString((char *)caller_profile->source)); + cJSON_AddItemToObject(json, "context", cJSON_CreateString((char *)caller_profile->context)); + cJSON_AddItemToObject(json, "chan_name", cJSON_CreateString(caller_profile->chan_name)); +} + +static void switch_ivr_set_json_chan_vars(cJSON *json, switch_channel_t *channel, switch_bool_t urlencode) +{ + switch_event_header_t *hi = switch_channel_variable_first(channel); + + if (!hi) + return; + + for (; hi; hi = hi->next) { + if (!zstr(hi->name) && !zstr(hi->value)) { + char *data = hi->value; + if (urlencode) { + switch_size_t dlen = strlen(hi->value) * 3; + + if ((data = malloc(dlen))) { + memset(data, 0, dlen); + switch_url_encode(hi->value, data, dlen); + } + } + + cJSON_AddItemToObject(json, hi->name, cJSON_CreateString(data)); + + if (data != hi->value) { + switch_safe_free(data); + } + } + } + switch_channel_variable_last(channel); +} + + + +SWITCH_DECLARE(switch_status_t) switch_ivr_generate_json_cdr(switch_core_session_t *session, cJSON **json_cdr, switch_bool_t urlencode) +{ + cJSON *cdr = cJSON_CreateObject(); + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_caller_profile_t *caller_profile; + cJSON *variables, *j_main_cp, *j_caller_profile, *j_caller_extension, *j_times, + *j_application, *j_callflow, *j_inner_extension, *j_apps, *j_o, *j_channel_data; + switch_app_log_t *app_log; + char tmp[512], *f; + + j_channel_data = cJSON_CreateObject(); + + cJSON_AddItemToObject(cdr, "channel_data", j_channel_data); + + cJSON_AddItemToObject(j_channel_data, "state", cJSON_CreateString((char *) switch_channel_state_name(switch_channel_get_state(channel)))); + cJSON_AddItemToObject(j_channel_data, "direction", cJSON_CreateString(switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound")); + + switch_snprintf(tmp, sizeof(tmp), "%d", switch_channel_get_state(channel)); + cJSON_AddItemToObject(j_channel_data, "state_number", cJSON_CreateString((char *) tmp)); + + if ((f = switch_channel_get_flag_string(channel))) { + cJSON_AddItemToObject(j_channel_data, "flags", cJSON_CreateString((char *) f)); + free(f); + } + + if ((f = switch_channel_get_cap_string(channel))) { + cJSON_AddItemToObject(j_channel_data, "caps", cJSON_CreateString((char *) f)); + free(f); + } + + variables = cJSON_CreateObject(); + cJSON_AddItemToObject(cdr, "variables", variables); + + switch_ivr_set_json_chan_vars(variables, channel, urlencode); + + + if ((app_log = switch_core_session_get_app_log(session))) { + switch_app_log_t *ap; + + j_apps = cJSON_CreateObject(); + + cJSON_AddItemToObject(cdr, "app_log", j_apps); + + for (ap = app_log; ap; ap = ap->next) { + j_application = cJSON_CreateObject(); + + cJSON_AddItemToObject(j_application, "app_name", cJSON_CreateString(ap->app)); + cJSON_AddItemToObject(j_application, "app_data", cJSON_CreateString(ap->arg)); + + cJSON_AddItemToObject(j_apps, "application", j_application); + } + } + + + caller_profile = switch_channel_get_caller_profile(channel); + + while (caller_profile) { + + j_callflow = cJSON_CreateObject(); + + cJSON_AddItemToObject(cdr, "callflow", j_callflow); + + if (!zstr(caller_profile->dialplan)) { + cJSON_AddItemToObject(j_callflow, "dialplan", cJSON_CreateString((char *)caller_profile->dialplan)); + } + + if (!zstr(caller_profile->profile_index)) { + cJSON_AddItemToObject(j_callflow, "profile_index", cJSON_CreateString((char *)caller_profile->profile_index)); + } + + if (caller_profile->caller_extension) { + switch_caller_application_t *ap; + + j_caller_extension = cJSON_CreateObject(); + + cJSON_AddItemToObject(j_callflow, "extension", j_caller_extension); + + cJSON_AddItemToObject(j_caller_extension, "name", cJSON_CreateString(caller_profile->caller_extension->extension_name)); + cJSON_AddItemToObject(j_caller_extension, "number", cJSON_CreateString(caller_profile->caller_extension->extension_number)); + + if (caller_profile->caller_extension->current_application) { + cJSON_AddItemToObject(j_caller_extension, "current_app", cJSON_CreateString(caller_profile->caller_extension->current_application->application_name)); + } + + for (ap = caller_profile->caller_extension->applications; ap; ap = ap->next) { + j_application = cJSON_CreateObject(); + + cJSON_AddItemToObject(j_caller_extension, "application", j_application); + + if (ap == caller_profile->caller_extension->current_application) { + cJSON_AddItemToObject(j_application, "last_executed", cJSON_CreateString("true")); + } + cJSON_AddItemToObject(j_application, "app_name", cJSON_CreateString(ap->application_name)); + cJSON_AddItemToObject(j_application, "app_data", cJSON_CreateString(switch_str_nil(ap->application_data))); + } + + if (caller_profile->caller_extension->children) { + switch_caller_profile_t *cp = NULL; + for (cp = caller_profile->caller_extension->children; cp; cp = cp->next) { + + if (!cp->caller_extension) { + continue; + } + + j_inner_extension = cJSON_CreateObject(); + cJSON_AddItemToObject(j_caller_extension, "sub_extensions", j_inner_extension); + + j_caller_extension = cJSON_CreateObject(); + cJSON_AddItemToObject(j_inner_extension, "extension", j_caller_extension); + + cJSON_AddItemToObject(j_caller_extension, "name", cJSON_CreateString(cp->caller_extension->extension_name)); + cJSON_AddItemToObject(j_caller_extension, "number", cJSON_CreateString(cp->caller_extension->extension_number)); + + cJSON_AddItemToObject(j_caller_extension, "dialplan", cJSON_CreateString((char *)cp->dialplan)); + + if (cp->caller_extension->current_application) { + cJSON_AddItemToObject(j_caller_extension, "current_app", cJSON_CreateString(cp->caller_extension->current_application->application_name)); + } + + for (ap = cp->caller_extension->applications; ap; ap = ap->next) { + j_application = cJSON_CreateObject(); + cJSON_AddItemToObject(j_caller_extension, "application", j_application); + + if (ap == cp->caller_extension->current_application) { + cJSON_AddItemToObject(j_application, "last_executed", cJSON_CreateString("true")); + } + cJSON_AddItemToObject(j_application, "app_name", cJSON_CreateString(ap->application_name)); + cJSON_AddItemToObject(j_application, "app_data", cJSON_CreateString(switch_str_nil(ap->application_data))); + } + } + } + } + + j_main_cp = cJSON_CreateObject(); + cJSON_AddItemToObject(j_callflow, "caller_profile", j_main_cp); + + switch_ivr_set_json_profile_data(j_main_cp, caller_profile); + + if (caller_profile->originator_caller_profile) { + switch_caller_profile_t *cp = NULL; + + j_o = cJSON_CreateObject(); + cJSON_AddItemToObject(j_main_cp, "originator", j_o); + + for (cp = caller_profile->originator_caller_profile; cp; cp = cp->next) { + j_caller_profile = cJSON_CreateObject(); + cJSON_AddItemToObject(j_o, "originator_caller_profile", j_caller_profile); + + switch_ivr_set_json_profile_data(j_caller_profile, cp); + } + } + + if (caller_profile->originatee_caller_profile) { + switch_caller_profile_t *cp = NULL; + + j_o = cJSON_CreateObject(); + cJSON_AddItemToObject(j_main_cp, "originatee", j_o); + + for (cp = caller_profile->originatee_caller_profile; cp; cp = cp->next) { + j_caller_profile = cJSON_CreateObject(); + cJSON_AddItemToObject(j_o, "originatee_caller_profile", j_caller_profile); + switch_ivr_set_json_profile_data(j_caller_profile, cp); + } + } + + if (caller_profile->times) { + + j_times = cJSON_CreateObject(); + cJSON_AddItemToObject(j_callflow, "times", j_times); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->created); + cJSON_AddItemToObject(j_times, "created_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->profile_created); + cJSON_AddItemToObject(j_times, "profile_created_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->progress); + cJSON_AddItemToObject(j_times, "progress_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->progress_media); + cJSON_AddItemToObject(j_times, "progress_media_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->answered); + cJSON_AddItemToObject(j_times, "answered_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->hungup); + cJSON_AddItemToObject(j_times, "hangup_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->resurrected); + cJSON_AddItemToObject(j_times, "resurrect_time", cJSON_CreateString(tmp)); + + switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, caller_profile->times->transferred); + cJSON_AddItemToObject(j_times, "transfer_time", cJSON_CreateString(tmp)); + + } + + caller_profile = caller_profile->next; + } + + *json_cdr = cdr; + + return SWITCH_STATUS_SUCCESS; + +} + + SWITCH_DECLARE(void) switch_ivr_park_session(switch_core_session_t *session) { switch_channel_t *channel = switch_core_session_get_channel(session); From 1fc57f98285d866b1f305889f060ae38018cf57f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 07:43:01 -0500 Subject: [PATCH 206/731] FS-4198 --resolve --- src/include/switch_types.h | 1 + src/switch_ivr_bridge.c | 42 ++++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 5fda9c369e..edd630ffcb 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -131,6 +131,7 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_READ_RESULT_VARIABLE "read_result" #define SWITCH_ATT_XFER_RESULT_VARIABLE "att_xfer_result" #define SWITCH_COPY_XML_CDR_VARIABLE "copy_xml_cdr" +#define SWITCH_COPY_JSON_CDR_VARIABLE "copy_json_cdr" #define SWITCH_CURRENT_APPLICATION_VARIABLE "current_application" #define SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE "proto_specific_hangup_cause" #define SWITCH_TRANSFER_HISTORY_VARIABLE "transfer_history" diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 8025c9d01c..b2cd384098 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1366,21 +1366,41 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses switch_channel_set_variable(caller_channel, SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE, switch_channel_cause2str(cause)); } - if (switch_channel_down_nosig(peer_channel) && switch_true(switch_channel_get_variable(peer_channel, SWITCH_COPY_XML_CDR_VARIABLE))) { - switch_xml_t cdr = NULL; - char *xml_text; + if (switch_channel_down_nosig(peer_channel)) { + switch_bool_t copy_xml_cdr = switch_true(switch_channel_get_variable(peer_channel, SWITCH_COPY_XML_CDR_VARIABLE)); + switch_bool_t copy_json_cdr = switch_true(switch_channel_get_variable(peer_channel, SWITCH_COPY_JSON_CDR_VARIABLE)); - switch_channel_wait_for_state(peer_channel, caller_channel, CS_DESTROY); + if (copy_xml_cdr || copy_json_cdr) { + char *cdr_text = NULL; - if (switch_ivr_generate_xml_cdr(peer_session, &cdr) == SWITCH_STATUS_SUCCESS) { - if ((xml_text = switch_xml_toxml(cdr, SWITCH_FALSE))) { - switch_channel_set_variable(caller_channel, "b_leg_cdr", xml_text); - switch_safe_free(xml_text); + switch_channel_wait_for_state(peer_channel, caller_channel, CS_DESTROY); + + if (copy_xml_cdr) { + switch_xml_t cdr = NULL; + + if (switch_ivr_generate_xml_cdr(peer_session, &cdr) == SWITCH_STATUS_SUCCESS) { + cdr_text = switch_xml_toxml(cdr, SWITCH_FALSE); + switch_xml_free(cdr); + } } - switch_xml_free(cdr); - } - } + if (copy_json_cdr) { + cJSON *cdr = NULL; + if (switch_ivr_generate_json_cdr(peer_session, &cdr, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + cdr_text = cJSON_PrintUnformatted(cdr); + cJSON_Delete(cdr); + } + } + + if (cdr_text) { + switch_channel_set_variable(caller_channel, "b_leg_cdr", cdr_text); + switch_channel_set_variable_name_printf(caller_channel, cdr_text, "b_leg_cdr_%s", switch_core_session_get_uuid(peer_session)); + switch_safe_free(cdr_text); + } + } + + } + switch_core_session_rwunlock(peer_session); } else { From 8ca2ed72b8fec56c43ce0cfee4cd98c98e37383c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 13:58:44 +0000 Subject: [PATCH 207/731] ci/debian: synchronize codename flag --- debian/bootstrap.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 16848e3ddd..242e2cb9c4 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -792,9 +792,9 @@ genmodctl_mod () { } codename="sid" -while getopts "r:" o; do +while getopts "c:" o; do case "$o" in - r) codename="$OPTARG" ;; + c) codename="$OPTARG" ;; esac done shift $(($OPTIND-1)) From eb92a4d22127e068624f813def702a5f03af980a Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 8 May 2012 10:06:35 -0500 Subject: [PATCH 208/731] small tweak to not bomb on some version numbers --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index c6e112c4b9..a752497dc8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -411,7 +411,7 @@ $(switch_builddir)/quiet_libtool: $(switch_builddir)/libtool src/include/switch_version.h: src/include/switch_version.h.in .version $(libfreeswitch_la_SOURCES) $(library_include_HEADERS) @have_version=1 ; \ force=0 ; \ - grep "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null && have_version=0 ; \ + grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null && have_version=0 ; \ test ! -f src/include/switch_version.h || grep "@SWITCH_VERSION_REVISION@" src/include/switch_version.h > /dev/null && force=1 ; \ if test $$have_version = 1 ; then \ cat src/include/switch_version.h.in > src/include/switch_version.h ; \ From 2325dfbc4af50d59cdf3a9a21b8edf573eeac81c Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 8 May 2012 10:10:21 -0500 Subject: [PATCH 209/731] Missed a grep --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index a752497dc8..c3f3a2fc28 100644 --- a/Makefile.am +++ b/Makefile.am @@ -412,7 +412,7 @@ src/include/switch_version.h: src/include/switch_version.h.in .version $(libfree @have_version=1 ; \ force=0 ; \ grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null && have_version=0 ; \ - test ! -f src/include/switch_version.h || grep "@SWITCH_VERSION_REVISION@" src/include/switch_version.h > /dev/null && force=1 ; \ + test ! -f src/include/switch_version.h || grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h > /dev/null && force=1 ; \ if test $$have_version = 1 ; then \ cat src/include/switch_version.h.in > src/include/switch_version.h ; \ touch .version ; \ From 07204a1fb51fb949cd2be8592af17cf76060c02d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 08:50:33 -0500 Subject: [PATCH 210/731] add param:confirm-blind-transfer var:confirm_blind_transfer that makes blind transfers keep the transferrer on the line until its confirmed that the call was completed or brings it back to the bridge. blind_transfer_ack app can be executed in the dp by the transferee to indicate sucess or fail or a sucessful bridge will automatically trigger a success --- src/include/switch_types.h | 2 + .../applications/mod_dptools/mod_dptools.c | 30 +++++++++ src/mod/endpoints/mod_sofia/mod_sofia.c | 24 ++++++- src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 67 +++++++++++++------ src/switch_core_session.c | 19 ++++++ src/switch_core_state_machine.c | 20 ++++++ 7 files changed, 143 insertions(+), 20 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index edd630ffcb..477aa3b877 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -887,6 +887,7 @@ typedef enum { SWITCH_MESSAGE_INDICATE_SIGNAL_DATA, SWITCH_MESSAGE_INDICATE_INFO, SWITCH_MESSAGE_INDICATE_AUDIO_DATA, + SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE, SWITCH_MESSAGE_INVALID } switch_core_session_message_types_t; @@ -1216,6 +1217,7 @@ typedef enum { CF_ZRTP_PASS, CF_CHANNEL_SWAP, CF_PICKUP, + CF_CONFIRM_BLIND_TRANSFER, /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ /* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */ CF_FLAG_MAX diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 7005a701c5..8ae6e6f221 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -4462,6 +4462,34 @@ static char *file_string_supported_formats[SWITCH_MAX_CODECS] = { 0 }; /* /FILE STRING INTERFACE */ +SWITCH_STANDARD_APP(blind_transfer_ack_function) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_bool_t val = 0; + + if (data) { + val = switch_true((char *) val); + } + + if (switch_channel_test_flag(channel, CF_CONFIRM_BLIND_TRANSFER)) { + switch_core_session_t *other_session; + const char *uuid = switch_channel_get_variable(channel, "blind_transfer_uuid"); + + switch_channel_clear_flag(channel, CF_CONFIRM_BLIND_TRANSFER); + + if (!zstr(uuid) && (other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + msg.message_id = SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE; + msg.from = __FILE__; + msg.numeric_arg = val; + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); + } + } +} + + + #define SPEAK_DESC "Speak text to a channel via the tts interface" #define DISPLACE_DESC "Displace audio from a file to the channels input" @@ -4541,6 +4569,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) SWITCH_ADD_API(api_interface, "strftime", "strftime", strftime_api_function, ""); SWITCH_ADD_API(api_interface, "presence", "presence", presence_api_function, PRESENCE_USAGE); + SWITCH_ADD_APP(app_interface, "blind_transfer_ack", "", "", blind_transfer_ack_function, "[true|false]", SAF_NONE); + SWITCH_ADD_APP(app_interface, "bind_digit_action", "bind a key sequence or regex to an action", "bind a key sequence or regex to an action", bind_digit_action_function, BIND_DIGIT_ACTION_USAGE, SAF_SUPPORT_NOMEDIA); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index a71dc4c714..620030164c 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1653,6 +1653,28 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi } } goto end; + case SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE: + { + const char *event = switch_channel_get_variable(channel, "sip_blind_transfer_event"); + const char *uuid = switch_channel_get_variable(channel, "blind_transfer_uuid"); + char *xdest; + + if (event && uuid) { + nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag;version=2.0"), + NUTAG_SUBSTATE(nua_substate_terminated), + SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), + SIPTAG_PAYLOAD_STR(msg->numeric_arg ? "SIP/2.0 200 OK\r\n" : "SIP/2.0 403 Forbidden\r\n"), + SIPTAG_EVENT_STR(event), TAG_END()); + + + if (!msg->numeric_arg) { + xdest = switch_core_session_sprintf(session, "intercept:%s", uuid); + switch_ivr_session_transfer(session, xdest, "inline", NULL); + } + } + + } + goto end; case SWITCH_MESSAGE_INDICATE_UNBRIDGE: if (switch_rtp_ready(tech_pvt->rtp_session)) { @@ -5343,7 +5365,6 @@ static switch_status_t list_profile_gateway(const char *line, const char *cursor return status; } - SWITCH_STANDARD_APP(sofia_sla_function) { private_object_t *tech_pvt; @@ -5502,6 +5523,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) SWITCH_ADD_APP(app_interface, "sofia_sla", "private sofia sla function", "private sofia sla function", sofia_sla_function, "", SAF_NONE); + SWITCH_ADD_API(api_interface, "sofia", "Sofia Controls", sofia_function, " "); SWITCH_ADD_API(api_interface, "sofia_gateway_data", "Get data from a sofia gateway", sofia_gateway_data_function, " [ivar|ovar|var] "); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index b66b29fb44..2da82ac0c2 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -264,6 +264,7 @@ typedef enum { PFLAG_PRESENCE_MAP, PFLAG_OPTIONS_RESPOND_503_ON_BUSY, PFLAG_PRESENCE_DISABLE_EARLY, + PFLAG_CONFIRM_BLIND_TRANSFER, /* No new flags below this line */ PFLAG_MAX } PFLAGS; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 26815b6f5e..f87e8581b0 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -3105,6 +3105,12 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile) } else { sofia_clear_pflag(profile, PFLAG_LOG_AUTH_FAIL); } + } else if (!strcasecmp(var, "confirm-blind-transfer")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); + } else { + sofia_clear_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); + } } else if (!strcasecmp(var, "presence-proto-lookup")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_PRESENCE_MAP); @@ -3892,6 +3898,12 @@ switch_status_t config_sofia(int reload, char *profile_name) } else { sofia_clear_pflag(profile, PFLAG_LOG_AUTH_FAIL); } + } else if (!strcasecmp(var, "confirm-blind-transfer")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); + } else { + sofia_clear_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); + } } else if (!strcasecmp(var, "presence-proto-lookup")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_PRESENCE_MAP); @@ -7093,37 +7105,54 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t if (exten) { switch_channel_t *channel = switch_core_session_get_channel(session); const char *br; + switch_core_session_t *b_session; - if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { - switch_core_session_t *b_session; + if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(br))) { - if ((b_session = switch_core_session_locate(br))) { - switch_channel_t *b_channel = switch_core_session_get_channel(b_session); - switch_channel_set_variable(channel, "transfer_fallback_extension", from->a_user); - if (!zstr(full_ref_by)) { - switch_channel_set_variable(b_channel, SOFIA_SIP_HEADER_PREFIX "Referred-By", full_ref_by); - } - if (!zstr(full_ref_to)) { - switch_channel_set_variable(b_channel, SOFIA_REFER_TO_VARIABLE, full_ref_to); - } + const char *var; + switch_channel_t *b_channel = switch_core_session_get_channel(b_session); - if (switch_true(switch_channel_get_variable(channel, "recording_follow_transfer"))) { - switch_core_media_bug_transfer_recordings(session, b_session); - } + switch_channel_set_variable(channel, "transfer_fallback_extension", from->a_user); + if (!zstr(full_ref_by)) { + switch_channel_set_variable(b_channel, SOFIA_SIP_HEADER_PREFIX "Referred-By", full_ref_by); + } - switch_ivr_session_transfer(b_session, exten, NULL, NULL); - switch_core_session_rwunlock(b_session); + if (!zstr(full_ref_to)) { + switch_channel_set_variable(b_channel, SOFIA_REFER_TO_VARIABLE, full_ref_to); + } + + if (switch_true(switch_channel_get_variable(channel, "recording_follow_transfer"))) { + switch_core_media_bug_transfer_recordings(session, b_session); } switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "BLIND_TRANSFER"); - nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag;version=2.0"), - NUTAG_SUBSTATE(nua_substate_terminated),SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), SIPTAG_PAYLOAD_STR("SIP/2.0 200 OK\r\n"), SIPTAG_EVENT_STR(etmp), TAG_END()); + + if (((var = switch_channel_get_variable(channel, "confirm_blind_transfer")) && switch_true(var)) || + sofia_test_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER)) { + switch_channel_set_state_flag(b_channel, CF_CONFIRM_BLIND_TRANSFER); + switch_channel_set_variable(channel, "sip_blind_transfer_event", etmp); + switch_channel_set_variable(b_channel, "blind_transfer_uuid", switch_core_session_get_uuid(session)); + switch_channel_set_variable(channel, "blind_transfer_uuid", switch_core_session_get_uuid(b_session)); + + switch_channel_set_variable(channel, "park_timeout", "600:blind_transfer"); + switch_channel_set_state(channel, CS_PARK); + } else { + nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag;version=2.0"), + NUTAG_SUBSTATE(nua_substate_terminated), + SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), + SIPTAG_PAYLOAD_STR("SIP/2.0 200 OK\r\n"), SIPTAG_EVENT_STR(etmp), TAG_END()); + } + + switch_ivr_session_transfer(b_session, exten, NULL, NULL); + switch_core_session_rwunlock(b_session); } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot Blind Transfer 1 Legged calls\n"); switch_channel_set_variable(channel_a, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "ATTENDED_TRANSFER_ERROR"); nua_notify(tech_pvt->nh, NUTAG_NEWSUB(1), SIPTAG_CONTENT_TYPE_STR("message/sipfrag;version=2.0"), - NUTAG_SUBSTATE(nua_substate_terminated),SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), SIPTAG_PAYLOAD_STR("SIP/2.0 403 Forbidden\r\n"), SIPTAG_EVENT_STR(etmp), TAG_END()); + NUTAG_SUBSTATE(nua_substate_terminated), + SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), + SIPTAG_PAYLOAD_STR("SIP/2.0 403 Forbidden\r\n"), SIPTAG_EVENT_STR(etmp), TAG_END()); } } diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 6551158522..56c6e0b3a4 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -640,6 +640,7 @@ static const char *message_names[] = { "SIGNAL_DATA", "INFO", "AUDIO_DATA", + "BLIND_TRANSFER_RESPONSE", "INVALID" }; @@ -722,6 +723,24 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_perform_receive_message(swit break; } } + + + if (message->message_id == SWITCH_MESSAGE_INDICATE_BRIDGE && + switch_channel_test_flag(session->channel, CF_CONFIRM_BLIND_TRANSFER)) { + switch_core_session_t *other_session; + const char *uuid = switch_channel_get_variable(session->channel, "blind_transfer_uuid"); + + switch_channel_clear_flag(session->channel, CF_CONFIRM_BLIND_TRANSFER); + + if (!zstr(uuid) && (other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + msg.message_id = SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE; + msg.from = __FILE__; + msg.numeric_arg = 1; + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); + } + } } diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 7b2e900e7f..61fa9290e5 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -188,6 +188,7 @@ static void switch_core_standard_on_routing(switch_core_session_t *session) static void switch_core_standard_on_execute(switch_core_session_t *session) { switch_caller_extension_t *extension; + const char *uuid; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Standard EXECUTE\n", switch_channel_get_name(session->channel)); @@ -222,6 +223,25 @@ static void switch_core_standard_on_execute(switch_core_session_t *session) } + if (switch_channel_ready(session->channel) && switch_channel_get_state(session->channel) == CS_EXECUTE && + switch_channel_test_flag(session->channel, CF_CONFIRM_BLIND_TRANSFER) && + (uuid = switch_channel_get_variable(session->channel, "blind_transfer_uuid"))) { + switch_core_session_t *other_session; + + if ((other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + msg.message_id = SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE; + msg.from = __FILE__; + msg.numeric_arg = 0; + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); + + switch_channel_set_variable(session->channel, "park_timeout", "10:blind_transfer"); + switch_channel_set_state(session->channel, CS_PARK); + switch_channel_clear_flag(session->channel, CF_CONFIRM_BLIND_TRANSFER); + } + } + if (switch_channel_ready(session->channel) && switch_channel_get_state(session->channel) == CS_EXECUTE) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "%s has executed the last dialplan instruction, hanging up.\n", switch_channel_get_name(session->channel)); From 1ecb6be00915107491f66f14298930317409e8e0 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 8 May 2012 11:04:01 -0500 Subject: [PATCH 211/731] release FreeSWITCH 1.2-rc2 --- configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 7b76740d62..5dbe6d9e12 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-rc1], BUG-REPORT-ADDRESS) +AC_INIT([freeswitch], [1.2-rc2], BUG-REPORT-ADDRESS) AC_SUBST(SWITCH_VERSION_MAJOR, [1]) AC_SUBST(SWITCH_VERSION_MINOR, [2]) AC_SUBST(SWITCH_VERSION_MICRO, [0]) -AC_SUBST(SWITCH_VERSION_REVISION, [-rc1]) +AC_SUBST(SWITCH_VERSION_REVISION, [-rc2]) AC_CONFIG_FILES([src/include/switch_version.h.in:src/include/switch_version.h.template]) AC_CONFIG_FILES([.version:.version.in]) From 53f1b51c1aa6a5391ac2ac97bdf780caf3907abc Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 15:53:45 +0000 Subject: [PATCH 212/731] ci: generalize version number handling a bit --- scripts/ci/common.sh | 59 ++++++++++++++++++++++++++++++------- scripts/ci/debsrcbuilder.sh | 4 +-- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/scripts/ci/common.sh b/scripts/ci/common.sh index ef191676b3..25fd27a5e2 100755 --- a/scripts/ci/common.sh +++ b/scripts/ci/common.sh @@ -4,6 +4,8 @@ src_repo="$(pwd)" tmp_dir=${TMP_DIR:="/tmp"} +zgrep () { (echo "$2" | grep -e "$1" >/dev/null); } + parse_version () { local ver="$1" major="" minor="" micro="" rev="" local next=major @@ -26,38 +28,73 @@ parse_version () { eval $next='${tmp}${x}' fi done + # The major version should never be null + if [ -z "$major" ]; then + echo "WARNING: parse_version was called with '$1' which is missing a major version number" >&2 + fi + # If someone asks for the minor or micro specificially, they + # probably expect that it won't be null. Also, vX.Y should never be + # different from vX.Y.0 (that would be crazy), so we don't lose + # meaningful generality by setting minor or micro to zero on vX or + # vX.Y style versions. + minor="${minor:-0}" + micro="${micro:-0}" + # centos-style versions (don't mess with the argument given for now) + # TODO: what is the CentOS version number policy? local cmajor cminor cmicro crev cver - cmajor=${major:="0"} - cminor=${minor:="0"} - cmicro=${micro:="0"} + cmajor="${major:-0}" + cminor="${minor:-0}" + cmicro="${micro:-0}" crev="$(echo "$rev" | sed -e 's/[._~-]//')" cver="${cmajor}.${cminor}.${cmicro}" - if [ -n "${micro}" ] && echo "$micro" | grep '^\(alpha\|beta\|rc\)' >/dev/null; then - rev="~${micro}" + [ -n "$crev" ] && cver="${cver}.${crev}" + # fix up if the revision was passed in the minor or micro number + if zgrep '^\(alpha\|beta\|rc\)' "$minor"; then + rev="-${minor}" + minor="0" + micro="0" + ver="${major}${rev}" + fi + if zgrep '^\(alpha\|beta\|rc\)' "$micro"; then + rev="-${micro}" micro="0" ver="${major}.${minor}${rev}" fi + # git-style versions + local gmajor gminor gmicro grev gver gver="$(echo "$ver" | sed -e 's/[~_]/-/')" grev="$(echo "$rev" | sed -e 's/[~_]/-/')" gmajor="$major" gminor="$minor" gmicro="$micro" - [ -n "$crev" ] && cver="${cver}.${crev}" + # debian-style versions + local dmajor dminor dmicro drev dver + dver="$(echo "$ver" | sed -e 's/[-_]/~/')" + drev="$(echo "$rev" | sed -e 's/[-_]/~/')" + dmajor="$major" + dminor="$minor" + dmicro="$micro" + # return variables echo "ver='$ver'" echo "major='$major'" echo "minor='$minor'" echo "micro='$micro'" echo "rev='$rev'" - echo "cver='$cver'" - echo "cmajor='$cmajor'" - echo "cminor='$cminor'" - echo "cmicro='$cmicro'" - echo "crev='$crev'" echo "gver='$gver'" echo "gmajor='$gmajor'" echo "gminor='$gminor'" echo "gmicro='$gmicro'" echo "grev='$grev'" + echo "dver='$dver'" + echo "dmajor='$dmajor'" + echo "dminor='$dminor'" + echo "dmicro='$dmicro'" + echo "drev='$drev'" + echo "cver='$cver'" + echo "cmajor='$cmajor'" + echo "cminor='$cminor'" + echo "cmicro='$cmicro'" + echo "crev='$crev'" } set_fs_ver () { diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index d693777500..8b06ab4794 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -14,7 +14,7 @@ build="b${2-0}" distro="${3-unstable}" codename="${4-sid}" -fver="${ver}~${nightly}~${build}" +fver="${dver}~${nightly}~${build}" fname="freeswitch-$fver" orig="freeswitch_$fver.orig" ddir=$src_repo/debbuild @@ -23,7 +23,7 @@ bdir=$src_repo/debbuild/$fname mkdir -p $ddir git clone . $bdir cd $bdir -set_fs_ver "$ver" "$major" "$minor" "$micro" "$rev" +set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" cd libs getlib () { f="${1##*/}" From ee8caf78f198d8d32ccb989ec059867c8927c73b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 15:54:33 +0000 Subject: [PATCH 213/731] ci: be more consistent about the version in configure.in --- scripts/ci/src_tarball.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/src_tarball.sh b/scripts/ci/src_tarball.sh index 826b8a27b7..0cab5f5d58 100755 --- a/scripts/ci/src_tarball.sh +++ b/scripts/ci/src_tarball.sh @@ -21,7 +21,7 @@ mkdir -p $dst_dir cp -r . $dst_dir cd $dst_dir -set_fs_ver "$cver" "$cmajor" "$cminor" "$cmicro" "$crev" +set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" gnuize cd .. ls From 42dab8396651f5c82d6da40a1dc13781e8c3d53b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 16:35:08 +0000 Subject: [PATCH 214/731] ci: add automatic mechanism for determining next version number --- build/next-release.txt | 1 + scripts/ci/debsrcbuilder.sh | 6 +++++- scripts/tagscript.sh | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 build/next-release.txt diff --git a/build/next-release.txt b/build/next-release.txt new file mode 100644 index 0000000000..996f71d3b9 --- /dev/null +++ b/build/next-release.txt @@ -0,0 +1 @@ +1.2-rc3 diff --git a/scripts/ci/debsrcbuilder.sh b/scripts/ci/debsrcbuilder.sh index 8b06ab4794..e64093d120 100755 --- a/scripts/ci/debsrcbuilder.sh +++ b/scripts/ci/debsrcbuilder.sh @@ -7,7 +7,11 @@ sdir="." check_pwd check_input_ver_build $@ -eval $(parse_version "$1") +in_ver="$1" +if [ "$in_ver" = "auto" ]; then + in_ver="$(cat build/next-release.txt)" +fi +eval $(parse_version "$in_ver") datestamp="$(date +%Y%m%dT%H%M%SZ)" nightly="n${datestamp}" build="b${2-0}" diff --git a/scripts/tagscript.sh b/scripts/tagscript.sh index 30222641a6..78253a10c5 100755 --- a/scripts/tagscript.sh +++ b/scripts/tagscript.sh @@ -114,6 +114,22 @@ if (ngrep '^Saved' "$ret"); then stash_saved=1 fi +echo "Determining next-release (release+1) version..." >&2 +if [ -n "$grev" ] && ngrep '[0-9]*$' "$grev"; then + rev_ver="$(echo "$grev" | sed -e 's/^[^0-9]*\([0-9]*\)$/\1/')" + next_rev="$((rev_ver+1))" + next_ver="${gver%%$rev_ver}${next_rev}" +elif [ -n "$grev" ]; then + next_ver="${gver}1" +elif ! [ "$gmicro" = "0" ]; then + next_ver="${gver%%$micro}$((micro+1))" +else + next_ver="${gmajor}.$((gminor+1))-rc1" +fi +echo "Setting next-release version ($next_ver)..." >&2 +echo "${next_ver}" > build/next-release.txt +git add build/next-release.txt + echo "Changing the version of configure.in..." >&2 set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" From c728efdbb987834f8d76dac51132d0a724380902 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 18:13:07 +0000 Subject: [PATCH 215/731] mod_posix_timer: comply with gcc -pedantic Thanks to Thierry Panthier for pointing this out. --- src/mod/timers/mod_posix_timer/mod_posix_timer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mod/timers/mod_posix_timer/mod_posix_timer.c b/src/mod/timers/mod_posix_timer/mod_posix_timer.c index 04d694b5f7..c170d8fa20 100644 --- a/src/mod/timers/mod_posix_timer/mod_posix_timer.c +++ b/src/mod/timers/mod_posix_timer/mod_posix_timer.c @@ -111,7 +111,9 @@ static void timer_signal_handler(int sig, siginfo_t *si, void *cu) if (val >= 0 && val <= MAX_ACTIVE_TIMERS) { uint8_t active_id = (uint8_t)val; /* notify runtime thread that timer identified by active_id has ticked */ - write(globals.timer_tick_pipe[1], &active_id, 1); + if (write(globals.timer_tick_pipe[1], &active_id, 1) == -1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error writing to pipe: %s\n", strerror(errno)); + } } } } From bb90d52df7cdda00668fc1706536d4347475e161 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 18:55:44 +0000 Subject: [PATCH 216/731] don't use bootstrap.sh -j anywhere but devel-bootstrap.sh We believe there may be a race condition in bootstrap.sh when run with -j. We know that running it without -j should be at least deterministic (whether or not correct), so we'll go with that in anticipation of releasing v1.2. --- debian/rules | 2 +- freeswitch.spec | 2 +- scripts/ci/common.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/rules b/debian/rules index 5581ffdacf..0cc293a346 100755 --- a/debian/rules +++ b/debian/rules @@ -47,7 +47,7 @@ override_dh_auto_clean: .stamp-bootstrap: @$(call show_vars) - ./bootstrap.sh -j + ./bootstrap.sh touch $@ .stamp-configure: .stamp-bootstrap diff --git a/freeswitch.spec b/freeswitch.spec index a56dd90035..470866ab2c 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -1433,7 +1433,7 @@ export ACLOCAL_FLAGS="-I /usr/share/aclocal" if test ! -f Makefile.in then - ./bootstrap.sh -j + ./bootstrap.sh fi %configure -C \ diff --git a/scripts/ci/common.sh b/scripts/ci/common.sh index 25fd27a5e2..3aa6bb3441 100755 --- a/scripts/ci/common.sh +++ b/scripts/ci/common.sh @@ -112,7 +112,7 @@ set_fs_ver () { } gnuize () { - ./bootstrap.sh -j + ./bootstrap.sh mv bootstrap.sh rebootstrap.sh rm -f docs/AUTHORS rm -f docs/COPYING From 9a802cd4d3e03102204f65d2642bd33693101dd6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 11:51:46 -0500 Subject: [PATCH 217/731] FS-4160 --- src/switch_ivr_bridge.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index b2cd384098..6a2cee0405 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1491,21 +1491,26 @@ static void cleanup_proxy_mode_b(switch_core_session_t *session) static void cleanup_proxy_mode_a(switch_core_session_t *session) { switch_core_session_t *sbsession; - switch_channel_t *channel = switch_core_session_get_channel(session); - + int done = 0; if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { - const char *sbv = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); - if (!zstr(sbv) && (sbsession = switch_core_session_locate(sbv))) { + if (switch_core_session_get_partner(session, &sbsession) == SWITCH_STATUS_SUCCESS) { switch_channel_t *sbchannel = switch_core_session_get_channel(sbsession); - /* Clear this now, otherwise will cause the one we're interested in to hang up too...*/ - switch_channel_set_variable(sbchannel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL); - switch_channel_hangup(sbchannel, SWITCH_CAUSE_ATTENDED_TRANSFER); + + if (switch_channel_test_flag(sbchannel, CF_PROXY_MODE)) { + /* Clear this now, otherwise will cause the one we're interested in to hang up too...*/ + switch_channel_set_variable(sbchannel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL); + switch_channel_hangup(sbchannel, SWITCH_CAUSE_ATTENDED_TRANSFER); + } else { + done = 1; + } switch_core_session_rwunlock(sbsession); } } + if (done) return; + switch_channel_set_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL); switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, NULL); switch_channel_set_variable(channel, SWITCH_BRIDGE_UUID_VARIABLE, NULL); From 33da6bf3b3d92193f7d363d6122db85ada3b1b18 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 8 May 2012 15:24:55 -0400 Subject: [PATCH 218/731] wait better --- bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap.sh b/bootstrap.sh index 0e0ac56fc4..d199a73226 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -457,6 +457,7 @@ bootstrap_libs() { ((libbootstrap ${i} ; bootstrap_libs_post ${i}) &) fi done + ${BGJOB} && wait } run() { From 8f8a9a8075b3f80e687c047b70b8edeab7c6e793 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 8 May 2012 15:28:48 -0400 Subject: [PATCH 219/731] wait better, you need to wait in the same function, so bging this one doesn't help --- bootstrap.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index d199a73226..b8f1dcd843 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -343,11 +343,7 @@ bootstrap_apr() { echo "Entering directory ${LIBDIR}/apr-util" cd ${LIBDIR}/apr-util - if ! ${BGJOB}; then - ./buildconf - else - ./buildconf & - fi + ./buildconf } bootstrap_libzrtp() { From 76c0201e8993c35ea05be5fda0196bd4fe785137 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 12:52:47 -0500 Subject: [PATCH 220/731] dtmf tweak --- src/mod/endpoints/mod_sofia/sofia_glue.c | 2 +- src/switch_rtp.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 6610895927..f787ac3cbb 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -3532,7 +3532,7 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f if (((val = switch_channel_get_variable(tech_pvt->channel, "rtp_digit_delay")))) { int delayi = atoi(val); if (delayi < 0) delayi = 0; - delay = (uint32_t) delay; + delay = (uint32_t) delayi; } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 72d7a8e71c..d481a17d49 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2300,6 +2300,7 @@ static void set_dtmf_delay(switch_rtp_t *rtp_session, uint32_t ms, uint32_t max_ if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) { rtp_session->max_next_write_samplecount = rtp_session->timer.samplecount + max_upsamp; rtp_session->next_write_samplecount = rtp_session->timer.samplecount + upsamp; + rtp_session->last_write_ts += upsamp; } switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Queue digit delay of %dms\n", ms); @@ -2349,7 +2350,7 @@ static void do_2833(switch_rtp_t *rtp_session, switch_core_session_t *session) } } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Send %s packet for [%c] ts=%u dur=%d/%d/%d seq=%d lw=%d\n", + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Send %s packet for [%c] ts=%u dur=%d/%d/%d seq=%d lw=%u\n", loops == 1 ? "middle" : "end", rtp_session->dtmf_data.out_digit, rtp_session->dtmf_data.timestamp_dtmf, rtp_session->dtmf_data.out_digit_sofar, @@ -4378,7 +4379,7 @@ SWITCH_DECLARE(int) switch_rtp_write_manual(switch_rtp_t *rtp_session, rtp_session->write_msg.header.seq = htons(++rtp_session->seq); rtp_session->write_msg.header.ts = htonl(ts); rtp_session->write_msg.header.pt = payload; - rtp_session->write_msg.header.m = (m && !(rtp_session->rtp_bugs & RTP_BUG_NEVER_SEND_MARKER)) ? 1 : 0; + rtp_session->write_msg.header.m = m; memcpy(rtp_session->write_msg.body, data, datalen); bytes = rtp_header_len + datalen; From 89c590cda8f732820f899bb75d60549bafb21d6e Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 19:40:43 +0000 Subject: [PATCH 221/731] bootstrap.sh: wait better Be more explicit about what we're waiting for, among other changes. This appears to fully correct the wait issues. --- bootstrap.sh | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index b8f1dcd843..5aaed673c5 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -438,10 +438,16 @@ bootstrap_libs_post() { } bootstrap_libs() { + local jobs="" for i in ${SUBDIRS}; do case "$i" in apr|fs|libzrtp) - ${BGJOB} && wait + if ${BGJOB}; then + for x in $jobs; do + wait $jobs + done + fi + jobs="" bootstrap_$i continue ;; @@ -450,10 +456,16 @@ bootstrap_libs() { if ! ${BGJOB}; then libbootstrap ${i} ; bootstrap_libs_post ${i} else - ((libbootstrap ${i} ; bootstrap_libs_post ${i}) &) + (libbootstrap ${i} ; bootstrap_libs_post ${i}) & + local x=$! + jobs="$jobs $x" fi done - ${BGJOB} && wait + if ${BGJOB}; then + for x in $jobs; do + wait $x + done + fi } run() { @@ -468,7 +480,6 @@ run() { check_libtoolize print_autotools_vers bootstrap_libs - ${BGJOB} && wait return 0 } From 9d341184672077c80fb6b06cc08fbced91ff9156 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 20:14:19 +0000 Subject: [PATCH 222/731] bootstrap.sh: wait more simply now that we've found the problem --- bootstrap.sh | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 5aaed673c5..5c9ab26f03 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -438,16 +438,10 @@ bootstrap_libs_post() { } bootstrap_libs() { - local jobs="" for i in ${SUBDIRS}; do case "$i" in apr|fs|libzrtp) - if ${BGJOB}; then - for x in $jobs; do - wait $jobs - done - fi - jobs="" + ${BGJOB} && wait bootstrap_$i continue ;; @@ -457,15 +451,9 @@ bootstrap_libs() { libbootstrap ${i} ; bootstrap_libs_post ${i} else (libbootstrap ${i} ; bootstrap_libs_post ${i}) & - local x=$! - jobs="$jobs $x" fi done - if ${BGJOB}; then - for x in $jobs; do - wait $x - done - fi + ${BGJOB} && wait } run() { From c985853cbffc641d790c9e2ed7b0c2876e852f5a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 8 May 2012 20:45:05 +0000 Subject: [PATCH 223/731] mod_posix_timer: we'll find a better way to comply with gcc -pedantic on lucid We shouldn't be logging in a signal handler. This reverts commit c728efdbb987834f8d76dac51132d0a724380902. --- src/mod/timers/mod_posix_timer/mod_posix_timer.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mod/timers/mod_posix_timer/mod_posix_timer.c b/src/mod/timers/mod_posix_timer/mod_posix_timer.c index c170d8fa20..04d694b5f7 100644 --- a/src/mod/timers/mod_posix_timer/mod_posix_timer.c +++ b/src/mod/timers/mod_posix_timer/mod_posix_timer.c @@ -111,9 +111,7 @@ static void timer_signal_handler(int sig, siginfo_t *si, void *cu) if (val >= 0 && val <= MAX_ACTIVE_TIMERS) { uint8_t active_id = (uint8_t)val; /* notify runtime thread that timer identified by active_id has ticked */ - if (write(globals.timer_tick_pipe[1], &active_id, 1) == -1) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error writing to pipe: %s\n", strerror(errno)); - } + write(globals.timer_tick_pipe[1], &active_id, 1); } } } From d82a38dfd655a29b3008bdac19048ced905d3852 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 19:25:14 -0500 Subject: [PATCH 224/731] fix missing close brace --- .../applications/mod_spandsp/mod_spandsp_modem.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c index e3f8afa89f..f1a1fdb7b0 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c @@ -230,13 +230,14 @@ switch_status_t modem_init(modem_t *modem, modem_control_handler_t control_handl #if USE_OPENPTY if (openpty(&modem->master, &modem->slave, NULL, NULL, NULL)) { - if (modem->master < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Fatal error: failed to initialize pty\n"); - status = SWITCH_STATUS_FALSE; - goto end; - } + if (modem->master < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Fatal error: failed to initialize pty\n"); + status = SWITCH_STATUS_FALSE; + goto end; + } - modem->stty = ttyname(modem->slave); + modem->stty = ttyname(modem->slave); + } #else #if WIN32 modem->slot = 4+globals.NEXT_ID++; /* need work here we start at COM4 for now*/ From f106c18f51e03fd9acda72fed1141d6cd0e15b78 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 19:33:53 -0500 Subject: [PATCH 225/731] tweak to confirm blind transfer patch --- src/include/switch_ivr.h | 1 + .../applications/mod_dptools/mod_dptools.c | 17 +------------ src/switch_core_state_machine.c | 7 ++++-- src/switch_ivr.c | 25 +++++++++++++++++++ 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index 9d3d5f2ea5..9299c584d9 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -970,6 +970,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_insert_file(switch_core_session_t *se SWITCH_DECLARE(switch_status_t) switch_ivr_create_message_reply(switch_event_t **reply, switch_event_t *message, const char *new_proto); SWITCH_DECLARE(char *) switch_ivr_check_presence_mapping(const char *exten_name, const char *domain_name); SWITCH_DECLARE(switch_status_t) switch_ivr_kill_uuid(const char *uuid, switch_call_cause_t cause); +SWITCH_DECLARE(switch_status_t) switch_ivr_blind_transfer_ack(switch_core_session_t *session, switch_bool_t success); /** @} */ diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 8ae6e6f221..b07f1a21ed 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -4464,28 +4464,13 @@ static char *file_string_supported_formats[SWITCH_MAX_CODECS] = { 0 }; SWITCH_STANDARD_APP(blind_transfer_ack_function) { - switch_channel_t *channel = switch_core_session_get_channel(session); switch_bool_t val = 0; if (data) { val = switch_true((char *) val); } - if (switch_channel_test_flag(channel, CF_CONFIRM_BLIND_TRANSFER)) { - switch_core_session_t *other_session; - const char *uuid = switch_channel_get_variable(channel, "blind_transfer_uuid"); - - switch_channel_clear_flag(channel, CF_CONFIRM_BLIND_TRANSFER); - - if (!zstr(uuid) && (other_session = switch_core_session_locate(uuid))) { - switch_core_session_message_t msg = { 0 }; - msg.message_id = SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE; - msg.from = __FILE__; - msg.numeric_arg = val; - switch_core_session_receive_message(other_session, &msg); - switch_core_session_rwunlock(other_session); - } - } + switch_ivr_blind_transfer_ack(session, val); } diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 61fa9290e5..e567daa9fb 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -174,8 +174,11 @@ static void switch_core_standard_on_routing(switch_core_session_t *session) } if (!extension) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "No Route, Aborting\n"); - switch_channel_hangup(session->channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); + + if (switch_ivr_blind_transfer_ack(session, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "No Route, Aborting\n"); + switch_channel_hangup(session->channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); + } } end: diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 7a24eff193..325a8083a2 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -3501,6 +3501,31 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_kill_uuid(const char *uuid, switch_ca } } +SWITCH_DECLARE(switch_status_t) switch_ivr_blind_transfer_ack(switch_core_session_t *session, switch_bool_t success) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_status_t status = SWITCH_STATUS_FALSE; + + if (switch_channel_test_flag(channel, CF_CONFIRM_BLIND_TRANSFER)) { + switch_core_session_t *other_session; + const char *uuid = switch_channel_get_variable(channel, "blind_transfer_uuid"); + + switch_channel_clear_flag(channel, CF_CONFIRM_BLIND_TRANSFER); + + if (!zstr(uuid) && (other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + msg.message_id = SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE; + msg.from = __FILE__; + msg.numeric_arg = success; + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); + status = SWITCH_STATUS_SUCCESS; + } + } + + return status; + +} /* For Emacs: * Local Variables: From 225eebc20dddf42d3e6cd0fc856e70c8b5446919 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 8 May 2012 19:44:39 -0500 Subject: [PATCH 226/731] take out 101 dialing --- src/mod/endpoints/mod_sofia/mod_sofia.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 620030164c..cf095386e5 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -91,10 +91,6 @@ static switch_status_t sofia_on_init(switch_core_session_t *session) sofia_set_flag(tech_pvt, TFLAG_RECOVERED); } - if (switch_channel_direction(tech_pvt->channel) == SWITCH_CALL_DIRECTION_INBOUND) { - nua_respond(tech_pvt->nh, 101, "Dialing", TAG_END()); - } - if (sofia_test_flag(tech_pvt, TFLAG_OUTBOUND) || sofia_test_flag(tech_pvt, TFLAG_RECOVERING)) { const char *var; From 0165a813d70bbefc0aaa9ede9a55251f44c0f28f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 14:10:20 +0000 Subject: [PATCH 227/731] remove questionable idiom --- scripts/ci/extras/erlangbuilder.sh | 2 +- scripts/ci/get_extra_sources.sh | 2 +- scripts/ci/rpmbuilder.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/ci/extras/erlangbuilder.sh b/scripts/ci/extras/erlangbuilder.sh index dd6fdc6803..f944e987d4 100755 --- a/scripts/ci/extras/erlangbuilder.sh +++ b/scripts/ci/extras/erlangbuilder.sh @@ -13,7 +13,7 @@ if [ -z "$1" ]; then exit 1; fi -(mkdir -p rpmbuild && cd $_ && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SOURCES SPECS) +(mkdir -p rpmbuild && cd rpmbuild && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SOURCES SPECS) cd $src_repo rpmbuild --define "_topdir %(pwd)/rpmbuild" \ diff --git a/scripts/ci/get_extra_sources.sh b/scripts/ci/get_extra_sources.sh index c0827c68eb..a22281b477 100755 --- a/scripts/ci/get_extra_sources.sh +++ b/scripts/ci/get_extra_sources.sh @@ -8,7 +8,7 @@ if [ ! -d .git ]; then exit 1; fi -(mkdir -p rpmbuild && cd $_ && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SOURCES SPECS) +(mkdir -p rpmbuild && cd rpmbuild && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SOURCES SPECS) cd $src_repo/rpmbuild/SOURCES diff --git a/scripts/ci/rpmbuilder.sh b/scripts/ci/rpmbuilder.sh index 78c4c3ca73..9842112d86 100755 --- a/scripts/ci/rpmbuilder.sh +++ b/scripts/ci/rpmbuilder.sh @@ -14,7 +14,7 @@ dst_name="freeswitch-$cmajor.$cminor.$cmicro" dst_parent="/tmp/" dst_dir="/tmp/$dst_name" -(mkdir -p rpmbuild && cd $_ && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SPECS) +(mkdir -p rpmbuild && cd rpmbuild && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SPECS) cd $src_repo From 56d3a866fc98d4ff1b5a6b049f2f4c95c42a45b3 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 14:14:15 +0000 Subject: [PATCH 228/731] ci: fixup rpmbuilder.sh --- scripts/ci/rpmbuilder.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci/rpmbuilder.sh b/scripts/ci/rpmbuilder.sh index 9842112d86..312902faf7 100755 --- a/scripts/ci/rpmbuilder.sh +++ b/scripts/ci/rpmbuilder.sh @@ -17,6 +17,7 @@ dst_dir="/tmp/$dst_name" (mkdir -p rpmbuild && cd rpmbuild && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SPECS) cd $src_repo +cp -a src_dist/* rpmbuild/SOURCES/ rpmbuild --define "VERSION_NUMBER $cver" \ --define "BUILD_NUMBER $build" \ From 4fbf8625edf107e1d6382c24c32266b9e215a0ba Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Wed, 9 May 2012 09:20:10 -0500 Subject: [PATCH 229/731] OPENZAP-183 --resolve --- libs/freetdm/src/ftdm_threadmutex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftdm_threadmutex.c b/libs/freetdm/src/ftdm_threadmutex.c index 0b63f7c0ae..302cd32e64 100644 --- a/libs/freetdm/src/ftdm_threadmutex.c +++ b/libs/freetdm/src/ftdm_threadmutex.c @@ -401,7 +401,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_wait(ftdm_interrupt_t *interrupt, int m if (interrupt->device != FTDM_INVALID_SOCKET) { num++; ints[1] = interrupt->device; - ftdm_log(FTDM_LOG_CRIT, "implement me! (Windows support for device_output_flags member!)\n", size); + ftdm_log(FTDM_LOG_CRIT, "implement me! (Windows support for device_output_flags member!)\n"); } res = WaitForMultipleObjects(num, ints, FALSE, ms >= 0 ? ms : INFINITE); switch (res) { From 849dd7376fa9602515581dbc0b339882fe0a0b1f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 14:23:03 +0000 Subject: [PATCH 230/731] ci: expect that jenkins might do this itself --- scripts/ci/rpmbuilder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/rpmbuilder.sh b/scripts/ci/rpmbuilder.sh index 312902faf7..8d633d6d80 100755 --- a/scripts/ci/rpmbuilder.sh +++ b/scripts/ci/rpmbuilder.sh @@ -17,7 +17,7 @@ dst_dir="/tmp/$dst_name" (mkdir -p rpmbuild && cd rpmbuild && mkdir -p SOURCES BUILD BUILDROOT i386 x86_64 SPECS) cd $src_repo -cp -a src_dist/* rpmbuild/SOURCES/ +cp -a src_dist/* rpmbuild/SOURCES/ || true rpmbuild --define "VERSION_NUMBER $cver" \ --define "BUILD_NUMBER $build" \ From 2a4eb84e4d97dbbd51a7d78830f7c29f53596d1c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 08:39:23 -0500 Subject: [PATCH 231/731] confirm_transfer tweak --- src/mod/applications/mod_dptools/mod_dptools.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index b07f1a21ed..7cf262acbe 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -3058,7 +3058,8 @@ SWITCH_STANDARD_APP(audio_bridge_function) } } } - if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && switch_channel_get_state(caller_channel) != CS_ROUTING) { + if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !switch_channel_test_flag(caller_channel, CF_CONFIRM_BLIND_TRANSFER) && + switch_channel_get_state(caller_channel) != CS_ROUTING) { switch_channel_hangup(caller_channel, cause); } return; From 99bac0d05b4ddabe5f441f24285aee174c4036ef Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 09:06:21 -0500 Subject: [PATCH 232/731] add video_refresh dp and uuid_video_refresh fsapi --- .../applications/mod_commands/mod_commands.c | 40 +++++++++++++++++++ .../applications/mod_dptools/mod_dptools.c | 13 ++++++ 2 files changed, 53 insertions(+) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index a812c8b994..470c7b02c9 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -3089,6 +3089,45 @@ SWITCH_STANDARD_API(uuid_send_info_function) } +#define VIDEO_REFRESH_SYNTAX "" +SWITCH_STANDARD_API(uuid_video_refresh_function) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + char *mycmd = NULL, *argv[2] = { 0 }; + int argc = 0; + + if (!zstr(cmd) && (mycmd = strdup(cmd))) { + argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 1) { + stream->write_function(stream, "-USAGE: %s\n", VIDEO_REFRESH_SYNTAX); + } else { + switch_core_session_message_t msg = { 0 }; + switch_core_session_t *lsession = NULL; + + msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ; + msg.string_array_arg[2] = argv[1]; + msg.from = __FILE__; + + if ((lsession = switch_core_session_locate(argv[0]))) { + status = switch_core_session_receive_message(lsession, &msg); + switch_core_session_rwunlock(lsession); + } + } + + if (status == SWITCH_STATUS_SUCCESS) { + stream->write_function(stream, "+OK Success\n"); + } else { + stream->write_function(stream, "-ERR Operation Failed\n"); + } + + switch_safe_free(mycmd); + + return SWITCH_STATUS_SUCCESS; +} + + #define DEBUG_AUDIO_SYNTAX " " SWITCH_STANDARD_API(uuid_debug_audio_function) { @@ -5436,6 +5475,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "uuid_hold", "hold", uuid_hold_function, HOLD_SYNTAX); SWITCH_ADD_API(commands_api_interface, "uuid_kill", "Kill Channel", kill_function, KILL_SYNTAX); SWITCH_ADD_API(commands_api_interface, "uuid_send_info", "Send info to the endpoint", uuid_send_info_function, INFO_SYNTAX); + SWITCH_ADD_API(commands_api_interface, "uuid_video_refresh", "Send video refresh.", uuid_video_refresh_function, VIDEO_REFRESH_SYNTAX); SWITCH_ADD_API(commands_api_interface, "uuid_outgoing_answer", "Answer Outgoing Channel", outgoing_answer_function, OUTGOING_ANSWER_SYNTAX); SWITCH_ADD_API(commands_api_interface, "uuid_limit", "Increase limit resource", uuid_limit_function, LIMIT_SYNTAX); SWITCH_ADD_API(commands_api_interface, "uuid_limit_release", "Release limit resource", uuid_limit_release_function, LIMIT_RELEASE_SYNTAX); diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 7cf262acbe..0e441dc731 100755 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -1185,6 +1185,17 @@ SWITCH_STANDARD_APP(redirect_function) switch_core_session_receive_message(session, &msg); } +SWITCH_STANDARD_APP(video_refresh_function) +{ + switch_core_session_message_t msg = { 0 }; + + /* Tell the channel to refresh video */ + msg.from = __FILE__; + msg.string_arg = data; + msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ; + switch_core_session_receive_message(session, &msg); +} + SWITCH_STANDARD_APP(send_info_function) { switch_core_session_message_t msg = { 0 }; @@ -4633,6 +4644,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) SWITCH_ADD_APP(app_interface, "ivr", "Run an ivr menu", "Run an ivr menu.", ivr_application_function, "", SAF_NONE); SWITCH_ADD_APP(app_interface, "redirect", "Send session redirect", "Send a redirect message to a session.", redirect_function, "", SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "video_refresh", "Send video refresh.", "Send video refresh.", video_refresh_function, "", + SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "send_info", "Send info", "Send info", send_info_function, "", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "jitterbuffer", "Send session jitterbuffer", "Send a jitterbuffer message to a session.", jitterbuffer_function, "", SAF_SUPPORT_NOMEDIA); From 13498d59f0b80daf96a0e104477cbe8399f1d968 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 17:13:21 +0000 Subject: [PATCH 233/731] debian: spidermonkey doesn't build correctly on wheezy either --- debian/bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index acb63dcd67..4c40b7eaed 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -32,13 +32,13 @@ avoid_mods=( formats/mod_shout languages/mod_java languages/mod_managed + languages/mod_spidermonkey languages/mod_yaml sdk/autotools xml_int/mod_xml_ldap ) avoid_mods_squeeze=( formats/mod_vlc - languages/mod_spidermonkey ) err () { From 5a059ef6307f4d3864d1468f01c759a7b3edc8ea Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 12:11:13 -0500 Subject: [PATCH 234/731] add autocomplete for uuid_video_refresh --- src/mod/applications/mod_commands/mod_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 470c7b02c9..0a9cac196c 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -5640,6 +5640,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) switch_console_set_complete("add uuid_simplify ::console::list_uuid"); switch_console_set_complete("add uuid_transfer ::console::list_uuid"); switch_console_set_complete("add uuid_dual_transfer ::console::list_uuid"); + switch_console_set_complete("add uuid_video_refresh ::console::list_uuid"); switch_console_set_complete("add version"); switch_console_set_complete("add uuid_warning ::console::list_uuid"); switch_console_set_complete("add ..."); From 6bb33d7683bfd8d91e0fa8dfb5a1f033cc3f48f4 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 14:05:03 -0500 Subject: [PATCH 235/731] add libscgi (SCGI Client) --- libs/libscgi/Makefile | 32 ++ libs/libscgi/protocol.txt | 101 +++++++ libs/libscgi/src/include/scgi.h | 210 +++++++++++++ libs/libscgi/src/scgi.c | 520 ++++++++++++++++++++++++++++++++ libs/libscgi/testclient.c | 39 +++ 5 files changed, 902 insertions(+) create mode 100644 libs/libscgi/Makefile create mode 100644 libs/libscgi/protocol.txt create mode 100644 libs/libscgi/src/include/scgi.h create mode 100644 libs/libscgi/src/scgi.c create mode 100644 libs/libscgi/testclient.c diff --git a/libs/libscgi/Makefile b/libs/libscgi/Makefile new file mode 100644 index 0000000000..fb59cb7848 --- /dev/null +++ b/libs/libscgi/Makefile @@ -0,0 +1,32 @@ +PWD=$(shell pwd) +INCS=-I$(PWD)/src/include +DEBUG=-g -ggdb +BASE_FLAGS=$(INCS) $(DEBUG) -fPIC +PICKY=-O2 +CFLAGS=$(BASE_FLAGS) $(PICKY) +CXXFLAGS=$(BASE_FLAGS) +MYLIB=libscgi.a +LIBS= +LDFLAGS=-L. +OBJS=src/scgi.o +SRC=src/scgi.c +HEADERS=src/include/scgi.h +SOLINK=-shared -Xlinker -x + + +all: $(MYLIB) testclient + +$(MYLIB): $(OBJS) $(HEADERS) $(SRC) + ar rcs $(MYLIB) $(OBJS) + ranlib $(MYLIB) + +%.o: %.c $(HEADERS) + $(CC) $(CC_CFLAGS) $(CFLAGS) -c $< -o $@ + +testclient: $(MYLIB) testclient.c + $(CC) $(CC_CFLAGS) $(CFLAGS) testclient.c -o testclient -lscgi $(LDFLAGS) $(LIBS) + + + +clean: + rm -f *.o src/*.o libscgi.a *~ src/*~ src/include/*~ testclient diff --git a/libs/libscgi/protocol.txt b/libs/libscgi/protocol.txt new file mode 100644 index 0000000000..34c128005f --- /dev/null +++ b/libs/libscgi/protocol.txt @@ -0,0 +1,101 @@ +SCGI: A Simple Common Gateway Interface alternative +Neil Schemenauer +2008-06-23 + +1. Introduction + + The SCGI protocol is a replacement for the Common Gateway Interface + (CGI) protocol. It is a standard for applications to interface with + HTTP servers. It is similar to FastCGI but is designed to be easier + to implement. + + In this document, a string of 8-bit bytes may be written in two + different forms: as a series of hexadecimal numbers between angle + brackets, or as a sequence of ASCII characters between double quotes. + For example, <68 65 6c 6c 6f 20 77 6f 72 6c 64 21> is a string of + length 12; it is the same as the string "hello world!". Note that + these notations are part of this document, not part of the protocol. + + +2. Protocol + + The client connects to a SCGI server over a reliable stream protocol + allowing transmission of 8-bit bytes. The client begins by sending a + request. See section 3 for the format of the request. When the SCGI + server sees the end of the request it sends back a response and closes + the connection. The format of the response is not specified by this + protocol. + + +3. Request Format + + A request consists of a number of headers and a body. The format of + the headers is: + + headers ::= header* + header ::= name NUL value NUL + name ::= notnull+ + value ::= notnull* + notnull ::= <01> | <02> | <03> | ... | + NUL = <00> + + Duplicate names are not allowed in the headers. The first header + must have the name "CONTENT_LENGTH" and a value that is a nonempty + sequence of ASCII digits giving the of the body length in decimal. + The "CONTENT_LENGTH" header must always be present, even if its + value is "0". There must also always be a header with the name + "SCGI" and a value of "1". In order to facilitate the transition + from CGI, standard CGI environment variables should be provided as + SCGI headers. + + The headers are sent encoded as a netstring. Netstring encoding is + explained in section 4. The body is sent following the headers and + its length is specified by the "CONTENT_LENGTH" header. + + +4. Netstrings + + Any string of 8-bit bytes may be encoded as [len]":"[string]",". Here + [string] is the string and [len] is a nonempty sequence of ASCII + digits giving the length of [string] in decimal. The ASCII digits are + <30> for 0, <31> for 1, and so on up through <39> for 9. Extra zeros + at the front of [len] are prohibited: [len] begins with <30> exactly + when [string] is empty. + + For example, the string "hello world!" is encoded as <31 32 3a 68 65 + 6c 6c 6f 20 77 6f 72 6c 64 21 2c>, i.e., "12:hello world!,". The empty + string is encoded as "0:,". + + [len]":"[string]"," is called a netstring. [string] is called the + interpretation of the netstring. + + +5. Example + + The web server (a SCGI client) opens a connection and sends the + concatenation of the following strings: + + "70:" + "CONTENT_LENGTH" <00> "27" <00> + "SCGI" <00> "1" <00> + "REQUEST_METHOD" <00> "POST" <00> + "REQUEST_URI" <00> "/deepthought" <00> + "," + "What is the answer to life?" + + The SCGI server sends the following response: + + "Status: 200 OK" <0d 0a> + "Content-Type: text/plain" <0d 0a> + "" <0d 0a> + "42" + + The SCGI server closes the connection. + + +6. Copyright + + This document has been placed in the public domain. + + +/* vim: set ai tw=74 et sw=4 sts=4: */ diff --git a/libs/libscgi/src/include/scgi.h b/libs/libscgi/src/include/scgi.h new file mode 100644 index 0000000000..ea8d30ade4 --- /dev/null +++ b/libs/libscgi/src/include/scgi.h @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2012-2013, Anthony Minessale II + * 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. + */ + +#ifndef _SCGI_H_ +#define _SCGI_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ +#if EMACS_BUG +} +#endif + +#ifdef _MSC_VER +#define FD_SETSIZE 8192 +#define SCGI_USE_SELECT +#else +#define SCGI_USE_POLL +#endif + + + +#ifdef SCGI_USE_POLL +#include +#endif + +#ifdef WIN32 +#include +#include +typedef SOCKET scgi_socket_t; +typedef unsigned __int64 uint64_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int8 uint8_t; +typedef __int64 int64_t; +typedef __int32 int32_t; +typedef __int16 int16_t; +typedef __int8 int8_t; +typedef intptr_t scgi_ssize_t; +typedef int scgi_filehandle_t; +#define SCGI_SOCK_INVALID INVALID_SOCKET +#define strerror_r(num, buf, size) strerror_s(buf, size, num) +#if defined(SCGI_DECLARE_STATIC) +#define SCGI_DECLARE(type) type __stdcall +#define SCGI_DECLARE_NONSTD(type) type __cdecl +#define SCGI_DECLARE_DATA +#elif defined(SCGI_EXPORTS) +#define SCGI_DECLARE(type) __declspec(dllexport) type __stdcall +#define SCGI_DECLARE_NONSTD(type) __declspec(dllexport) type __cdecl +#define SCGI_DECLARE_DATA __declspec(dllexport) +#else +#define SCGI_DECLARE(type) __declspec(dllimport) type __stdcall +#define SCGI_DECLARE_NONSTD(type) __declspec(dllimport) type __cdecl +#define SCGI_DECLARE_DATA __declspec(dllimport) +#endif +#else +#define SCGI_DECLARE(type) type +#define SCGI_DECLARE_NONSTD(type) type +#define SCGI_DECLARE_DATA +#include +#include +#include +#include +#include +#include +#include +#define SCGI_SOCK_INVALID -1 +typedef int scgi_socket_t; +typedef ssize_t scgi_ssize_t; +typedef int scgi_filehandle_t; +#endif + + +#include +#ifndef WIN32 +#include +#endif + +#include +#include +#include +#include +#ifndef WIN32 +#include +#include +#include +#include +#include +#include +#endif + +#ifdef HAVE_STRINGS_H +#include +#endif +#include + +#if (_MSC_VER >= 1400) // VC8+ +#define scgi_assert(expr) assert(expr);__analysis_assume( expr ) +#endif + +#ifndef scgi_assert +#define scgi_assert(_x) assert(_x) +#endif + +#define scgi_safe_free(_x) if (_x) free(_x); _x = NULL +#define scgi_strlen_zero(s) (!s || *(s) == '\0') +#define scgi_strlen_zero_buf(s) (*(s) == '\0') +#define end_of(_s) *(*_s == '\0' ? _s : _s + strlen(_s) - 1) + + +typedef enum { + SCGI_POLL_READ = (1 << 0), + SCGI_POLL_WRITE = (1 << 1), + SCGI_POLL_ERROR = (1 << 2) +} scgi_poll_t; + + +typedef struct scgi_param_s { + char *name; + char *value; + struct scgi_param_s *next; +} scgi_param_t; + +typedef struct scgi_handle_s { + scgi_param_t *params; + char *body; + struct sockaddr_in sockaddr; + struct hostent hostent; + char hostbuf[256]; + scgi_socket_t sock; + char err[256]; + int errnum; + int connected; + struct sockaddr_in addr; + int destroyed; +} scgi_handle_t; + + +typedef int16_t scgi_port_t; +typedef size_t scgi_size_t; + +typedef enum { + SCGI_SUCCESS, + SCGI_FAIL, + SCGI_BREAK, + SCGI_DISCONNECTED, + SCGI_GENERR +} scgi_status_t; + + + +SCGI_DECLARE(scgi_status_t) scgi_connect(scgi_handle_t *handle, const char *host, scgi_port_t port, uint32_t timeout); +SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle); +SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t flags); +SCGI_DECLARE(ssize_t) scgi_recv(scgi_handle_t *handle, unsigned char *buf, size_t buflen); +SCGI_DECLARE(scgi_status_t) scgi_send_request(scgi_handle_t *handle); +SCGI_DECLARE(scgi_status_t) scgi_add_param(scgi_handle_t *handle, const char *name, const char *value); +SCGI_DECLARE(scgi_status_t) scgi_add_body(scgi_handle_t *handle, const char *value); +SCGI_DECLARE(size_t) scgi_build_message(scgi_handle_t *handle, char **buffer); +SCGI_DECLARE(scgi_status_t) scgi_destroy_params(scgi_handle_t *handle); + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + + +#endif /* defined(_SCGI_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: + */ diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c new file mode 100644 index 0000000000..eeec39a07b --- /dev/null +++ b/libs/libscgi/src/scgi.c @@ -0,0 +1,520 @@ +/* + * Copyright (c) 2012-2013, Anthony Minessale II + * 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. + */ + +#include + +#ifndef WIN32 +#define closesocket(x) shutdown(x, 2); close(x) +#include +#include +#else +#pragma warning (disable:6386) +/* These warnings need to be ignored warning in sdk header */ +#include +#include +#ifndef errno +#define errno WSAGetLastError() +#endif +#ifndef EINTR +#define EINTR WSAEINTR +#endif +#pragma warning (default:6386) +#endif + +static scgi_status_t scgi_push_param(scgi_handle_t *handle, const char *name, const char *value); + +static int sock_setup(scgi_handle_t *handle) +{ + + if (handle->sock == SCGI_SOCK_INVALID) { + return SCGI_FAIL; + } + +#ifdef WIN32 + { + BOOL bOptVal = TRUE; + int bOptLen = sizeof(BOOL); + setsockopt(handle->sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&bOptVal, bOptLen); + } +#else + { + int x = 1; + setsockopt(handle->sock, IPPROTO_TCP, TCP_NODELAY, &x, sizeof(x)); + } +#endif + + return SCGI_SUCCESS; +} + + +SCGI_DECLARE(size_t) scgi_build_message(scgi_handle_t *handle, char **bufferp) +{ + scgi_param_t *pp; + size_t len = 0, plen = 0, ctlen = 0; + char *s, *bp; + char *buffer = NULL; + char tmp[128] = ""; + + scgi_push_param(handle, "SCGI", "1"); + + if (handle->body) { + ctlen = strlen(handle->body); + } + + snprintf(tmp, sizeof(tmp), "%ld", ctlen); + + scgi_push_param(handle, "CONTENT_LENGTH", tmp); + + + for(pp = handle->params; pp; pp = pp->next) { + plen += (strlen(pp->name) + strlen(pp->value) + 2); + } + + snprintf(tmp, sizeof(tmp), "%ld", plen + ctlen); + + len = plen + ctlen + strlen(tmp) + 2; + + buffer = malloc(len); + memset(buffer, 0, len); + + snprintf(buffer, len, "%ld:", plen); + bp = buffer + strlen(buffer); + + for(pp = handle->params; pp; pp = pp->next) { + + for (s = pp->name; s && *s; s++) { + *bp++ = *s; + } + + *bp++ = '\0'; + + for (s = pp->value; s && *s; s++) { + *bp++ = *s; + } + + *bp++ = '\0'; + } + + *bp++ = ','; + + if (handle->body) { + for (s = handle->body; s && *s; s++) { + *bp++ = *s; + } + } + + *bufferp = buffer; + + return len; +} + +SCGI_DECLARE(scgi_status_t) scgi_destroy_params(scgi_handle_t *handle) +{ + scgi_param_t *param, *pp; + + pp = handle->params; + + while(pp) { + param = pp; + pp = pp->next; + + free(param->name); + free(param->value); + free(param); + } + + handle->params = NULL; + + return SCGI_SUCCESS; +} + +SCGI_DECLARE(scgi_status_t) scgi_add_body(scgi_handle_t *handle, const char *value) +{ + handle->body = strdup(value); + + return SCGI_SUCCESS; +} + +SCGI_DECLARE(scgi_status_t) scgi_add_param(scgi_handle_t *handle, const char *name, const char *value) +{ + scgi_param_t *param, *pp; + + for(pp = handle->params; pp && pp->next; pp = pp->next) { + if (!strcasecmp(pp->name, name)) { + return SCGI_FAIL; + } + } + + param = malloc(sizeof(*param)); + memset(param, 0, sizeof(*param)); + + param->name = strdup(name); + param->value = strdup(value); + + if (!pp) { + handle->params = param; + } else { + pp->next = param; + } + + return SCGI_SUCCESS; +} + +static scgi_status_t scgi_push_param(scgi_handle_t *handle, const char *name, const char *value) +{ + scgi_param_t *param; + + param = malloc(sizeof(*param)); + memset(param, 0, sizeof(*param)); + + param->name = strdup(name); + param->value = strdup(value); + + param->next = handle->params; + handle->params = param; + + return SCGI_SUCCESS; +} + +SCGI_DECLARE(scgi_status_t) scgi_send_request(scgi_handle_t *handle) +{ + scgi_status_t status; + char *buffer = NULL; + size_t bytes = 0; + ssize_t sent = 0; + + if (handle->connected != 1) { + return SCGI_FAIL; + } + + bytes = scgi_build_message(handle, &buffer); + sent = send(handle->sock, buffer, bytes, 0); + + if (sent <= 0) { + handle->connected = -1; + } + + scgi_safe_free(buffer); + + return status; +} + + +SCGI_DECLARE(ssize_t) scgi_recv(scgi_handle_t *handle, unsigned char *buf, size_t buflen) +{ + ssize_t recvd; + + if (handle->connected != 1) { + return -1; + } + + recvd = recv(handle->sock, buf, buflen, 0); + + if (recvd == 0) { + handle->connected = -1; + } + + + return recvd; +} + +SCGI_DECLARE(scgi_status_t) scgi_connect(scgi_handle_t *handle, const char *host, scgi_port_t port, uint32_t timeout) +{ + int rval = 0; + + struct addrinfo hints = { 0 }, *result; +#ifndef WIN32 + int fd_flags = 0; +#else + WORD wVersionRequested = MAKEWORD(2, 0); + WSADATA wsaData; + int err = WSAStartup(wVersionRequested, &wsaData); + if (err != 0) { + snprintf(handle->err, sizeof(handle->err), "WSAStartup Error"); + return SCGI_FAIL; + } + +#endif + + handle->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (handle->sock == SCGI_SOCK_INVALID) { + snprintf(handle->err, sizeof(handle->err), "Socket Error"); + return SCGI_FAIL; + } + + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + if (getaddrinfo(host, NULL, &hints, &result)) { + strncpy(handle->err, "Cannot resolve host", sizeof(handle->err)); + goto fail; + } + + memcpy(&handle->sockaddr, result->ai_addr, sizeof(handle->sockaddr)); + handle->sockaddr.sin_family = AF_INET; + handle->sockaddr.sin_port = htons(port); + freeaddrinfo(result); + + if (timeout) { +#ifdef WIN32 + u_long arg = 1; + if (ioctlsocket(handle->sock, FIONBIO, &arg) == SOCKET_ERROR) { + snprintf(handle->err, sizeof(handle->err), "Socket Connection Error"); + goto fail; + } +#else + fd_flags = fcntl(handle->sock, F_GETFL, 0); + if (fcntl(handle->sock, F_SETFL, fd_flags | O_NONBLOCK)) { + snprintf(handle->err, sizeof(handle->err), "Socket Connection Error"); + goto fail; + } +#endif + } + + rval = connect(handle->sock, (struct sockaddr*)&handle->sockaddr, sizeof(handle->sockaddr)); + + if (timeout) { + int r; + + + r = scgi_wait_sock(handle->sock, timeout, SCGI_POLL_WRITE); + + if (r <= 0) { + snprintf(handle->err, sizeof(handle->err), "Connection timed out"); + goto fail; + } + + if (!(r & SCGI_POLL_WRITE)) { + snprintf(handle->err, sizeof(handle->err), "Connection timed out"); + goto fail; + } + +#ifdef WIN32 + { + u_long arg = 0; + if (ioctlsocket(handle->sock, FIONBIO, &arg) == SOCKET_ERROR) { + snprintf(handle->err, sizeof(handle->err), "Socket Connection Error"); + goto fail; + } + } +#else + fcntl(handle->sock, F_SETFL, fd_flags); +#endif + rval = 0; + } + + result = NULL; + + if (rval) { + snprintf(handle->err, sizeof(handle->err), "Socket Connection Error"); + goto fail; + } + + sock_setup(handle); + + handle->connected = 1; + + + return SCGI_SUCCESS; + + fail: + + handle->connected = 0; + scgi_disconnect(handle); + + return SCGI_FAIL; +} + + + +SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle) +{ + scgi_status_t status = SCGI_FAIL; + + if (handle->destroyed) { + return SCGI_FAIL; + } + + handle->destroyed = 1; + handle->connected = 0; + + scgi_destroy_params(handle); + scgi_safe_free(handle->body); + + if (handle->sock != SCGI_SOCK_INVALID) { + closesocket(handle->sock); + handle->sock = SCGI_SOCK_INVALID; + status = SCGI_SUCCESS; + } + + return status; +} + + +/* USE WSAPoll on vista or higher */ +#ifdef SCGI_USE_WSAPOLL +SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t flags) +{ +} +#endif + + +#ifdef SCGI_USE_SELECT +#ifdef WIN32 +#pragma warning( push ) +#pragma warning( disable : 6262 ) /* warning C6262: Function uses '98348' bytes of stack: exceeds /analyze:stacksize'16384'. Consider moving some data to heap */ +#endif +SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t flags) +{ + int s = 0, r = 0; + fd_set rfds; + fd_set wfds; + fd_set efds; + struct timeval tv; + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + +#ifndef WIN32 + /* Wouldn't you rather know?? */ + assert(sock <= FD_SETSIZE); +#endif + + if ((flags & SCGI_POLL_READ)) { + +#ifdef WIN32 +#pragma warning( push ) +#pragma warning( disable : 4127 ) + FD_SET(sock, &rfds); +#pragma warning( pop ) +#else + FD_SET(sock, &rfds); +#endif + } + + if ((flags & SCGI_POLL_WRITE)) { + +#ifdef WIN32 +#pragma warning( push ) +#pragma warning( disable : 4127 ) + FD_SET(sock, &wfds); +#pragma warning( pop ) +#else + FD_SET(sock, &wfds); +#endif + } + + if ((flags & SCGI_POLL_ERROR)) { + +#ifdef WIN32 +#pragma warning( push ) +#pragma warning( disable : 4127 ) + FD_SET(sock, &efds); +#pragma warning( pop ) +#else + FD_SET(sock, &efds); +#endif + } + + tv.tv_sec = ms / 1000; + tv.tv_usec = (ms % 1000) * ms; + + s = select(sock + 1, (flags & SCGI_POLL_READ) ? &rfds : NULL, (flags & SCGI_POLL_WRITE) ? &wfds : NULL, (flags & SCGI_POLL_ERROR) ? &efds : NULL, &tv); + + if (s < 0) { + r = s; + } else if (s > 0) { + if ((flags & SCGI_POLL_READ) && FD_ISSET(sock, &rfds)) { + r |= SCGI_POLL_READ; + } + + if ((flags & SCGI_POLL_WRITE) && FD_ISSET(sock, &wfds)) { + r |= SCGI_POLL_WRITE; + } + + if ((flags & SCGI_POLL_ERROR) && FD_ISSET(sock, &efds)) { + r |= SCGI_POLL_ERROR; + } + } + + return r; + +} +#ifdef WIN32 +#pragma warning( pop ) +#endif +#endif + +#ifdef SCGI_USE_POLL +SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t flags) +{ + struct pollfd pfds[2] = { { 0 } }; + int s = 0, r = 0; + + pfds[0].fd = sock; + + if ((flags & SCGI_POLL_READ)) { + pfds[0].events |= POLLIN; + } + + if ((flags & SCGI_POLL_WRITE)) { + pfds[0].events |= POLLOUT; + } + + if ((flags & SCGI_POLL_ERROR)) { + pfds[0].events |= POLLERR; + } + + s = poll(pfds, 1, ms); + + if (s < 0) { + r = s; + } else if (s > 0) { + if ((pfds[0].revents & POLLIN)) { + r |= SCGI_POLL_READ; + } + if ((pfds[0].revents & POLLOUT)) { + r |= SCGI_POLL_WRITE; + } + if ((pfds[0].revents & POLLERR)) { + r |= SCGI_POLL_ERROR; + } + } + + return r; + +} +#endif diff --git a/libs/libscgi/testclient.c b/libs/libscgi/testclient.c new file mode 100644 index 0000000000..c43fe237c4 --- /dev/null +++ b/libs/libscgi/testclient.c @@ -0,0 +1,39 @@ +#include + + +int main(int argc, char *argv[]) +{ + char buf[16336] = ""; + ssize_t len; + scgi_handle_t handle = { 0 }; + char *ip; + int port = 0; + + if (argc < 2) { + fprintf(stderr, "usage: testclient "); + } + + ip = argv[1]; + port = atoi(argv[2]); + + + + scgi_add_param(&handle, "REQUEST_METHOD", "POST"); + scgi_add_param(&handle, "REQUEST_URI", "/deepthought"); + scgi_add_param(&handle, "TESTING", "TRUE"); + scgi_add_param(&handle, "TESTING", "TRUE"); + scgi_add_body(&handle, "What is the answer to life?"); + + + scgi_connect(&handle, ip, port, 10000); + + scgi_send_request(&handle); + + + while((len = scgi_recv(&handle, buf, sizeof(buf))) > 0) { + printf("READ [%s]\n", buf); + } + + scgi_disconnect(&handle); + +} From d7cf0bbed0994ae480fdb10c4fe18166ed932792 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 14:06:00 -0500 Subject: [PATCH 236/731] add mod_xml_scgi (like xml_curl minus the web server direct to an application backend that supports the SCGI protocol) --- src/mod/xml_int/mod_xml_scgi/Makefile | 5 + .../conf/autoload_configs/xml_scgi.conf.xml | 12 + .../mod_xml_scgi/mod_xml_scgi.2008.vcproj | 287 +++++++++++++++ .../mod_xml_scgi/mod_xml_scgi.2010.vcxproj | 131 +++++++ src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 340 ++++++++++++++++++ .../xml_int/mod_xml_scgi/xml_scgi_server.pl | 93 +++++ 6 files changed, 868 insertions(+) create mode 100644 src/mod/xml_int/mod_xml_scgi/Makefile create mode 100644 src/mod/xml_int/mod_xml_scgi/conf/autoload_configs/xml_scgi.conf.xml create mode 100644 src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2008.vcproj create mode 100644 src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2010.vcxproj create mode 100644 src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c create mode 100644 src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl diff --git a/src/mod/xml_int/mod_xml_scgi/Makefile b/src/mod/xml_int/mod_xml_scgi/Makefile new file mode 100644 index 0000000000..2c7a91d26d --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/Makefile @@ -0,0 +1,5 @@ +BASE=../../../.. +LOCAL_SOURCES = $(BASE)/libs/libscgi/src/scgi.c +LOCAL_OBJS = $(BASE)/libs/libscgi/src/scgi.o +LOCAL_CFLAGS = -I. -I$(BASE)/libs/libscgi/src/include +include $(BASE)/build/modmake.rules diff --git a/src/mod/xml_int/mod_xml_scgi/conf/autoload_configs/xml_scgi.conf.xml b/src/mod/xml_int/mod_xml_scgi/conf/autoload_configs/xml_scgi.conf.xml new file mode 100644 index 0000000000..b9662d1638 --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/conf/autoload_configs/xml_scgi.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2008.vcproj b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2008.vcproj new file mode 100644 index 0000000000..7718059dd5 --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2008.vcproj @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2010.vcxproj b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2010.vcxproj new file mode 100644 index 0000000000..cde0e239e9 --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.2010.vcxproj @@ -0,0 +1,131 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + mod_xml_scgi + {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39} + mod_xml_scgi + Win32Proj + + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + + + + + false + + + + + + + X64 + + + + + + + false + + + MachineX64 + + + + + + + + + false + + + + + + + X64 + + + + + + + false + + + MachineX64 + + + + + + + + {202d7a4e-760d-4d0e-afa1-d7459ced30ff} + false + + + + + + diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c new file mode 100644 index 0000000000..687ec3aeb9 --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -0,0 +1,340 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2012, 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): + * + * Anthony Minessale II + * + * mod_xml_scgi.c -- SCGI XML Gateway + * + */ +#include +#include + + +SWITCH_MODULE_LOAD_FUNCTION(mod_xml_scgi_load); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_scgi_shutdown); +SWITCH_MODULE_DEFINITION(mod_xml_scgi, mod_xml_scgi_load, mod_xml_scgi_shutdown, NULL); + + +struct xml_binding { + char *host; + switch_port_t port; + char *url; + + int timeout; + switch_hash_t *vars_map; + char *bindings; + +}; + +static int GLOBAL_DEBUG = 0; + +typedef struct xml_binding xml_binding_t; + +#define XML_SCGI_MAX_BYTES 1024 * 1024 + +typedef struct hash_node { + switch_hash_t *hash; + struct hash_node *next; +} hash_node_t; + +static struct { + switch_memory_pool_t *pool; + hash_node_t *hash_root; + hash_node_t *hash_tail; +} globals; + +#define XML_SCGI_SYNTAX "[debug_on|debug_off]" +SWITCH_STANDARD_API(xml_scgi_function) +{ + if (session) { + return SWITCH_STATUS_FALSE; + } + + if (zstr(cmd)) { + goto usage; + } + + if (!strcasecmp(cmd, "debug_on")) { + GLOBAL_DEBUG = 1; + } else if (!strcasecmp(cmd, "debug_off")) { + GLOBAL_DEBUG = 0; + } else { + goto usage; + } + + stream->write_function(stream, "OK\n"); + return SWITCH_STATUS_SUCCESS; + + usage: + stream->write_function(stream, "USAGE: %s\n", XML_SCGI_SYNTAX); + return SWITCH_STATUS_SUCCESS; +} + + +static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, + void *user_data) +{ + switch_xml_t xml = NULL; + char *data = NULL; + xml_binding_t *binding = (xml_binding_t *) user_data; + char hostname[256] = ""; + char basic_data[512]; + unsigned char buf[16336] = ""; + ssize_t len = -1, bytes = 0; + scgi_handle_t handle = { 0 }; + switch_stream_handle_t stream = { 0 }; + char *txt = NULL; + + strncpy(hostname, switch_core_get_switchname(), sizeof(hostname)); + + if (!binding) { + return NULL; + } + + switch_snprintf(basic_data, sizeof(basic_data), "hostname=%s§ion=%s&tag_name=%s&key_name=%s&key_value=%s", + hostname, section, switch_str_nil(tag_name), switch_str_nil(key_name), switch_str_nil(key_value)); + + data = switch_event_build_param_string(params, basic_data, binding->vars_map); + switch_assert(data); + + scgi_add_param(&handle, "REQUEST_METHOD", "POST"); + scgi_add_param(&handle, "REQUEST_URI", binding->url); + scgi_add_body(&handle, data); + + if (scgi_connect(&handle, binding->host, binding->port, binding->timeout * 1000) == SCGI_SUCCESS) { + scgi_send_request(&handle); + + SWITCH_STANDARD_STREAM(stream); + txt = (char *) stream.data; + + while((len = scgi_recv(&handle, buf, sizeof(buf))) > 0) { + + bytes += len; + + if (bytes > XML_SCGI_MAX_BYTES) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Data too big!\n"); + len = -1; + break; + } + + stream.write_function(&stream, "%s", buf); + } + + scgi_disconnect(&handle); + } + + if (GLOBAL_DEBUG) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s\nPOST_DATA:\n%s\n\nRESPONSE:\n%s\n\n", binding->url, data, txt); + } + + if (!len) { + if (!(xml = switch_xml_parse_str(txt, strlen(txt)))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s]\n", binding->url, data); + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received error trying to fetch %s\ndata: [%s]\n", binding->url, data); + switch_safe_free(stream.data); + xml = NULL; + } + + switch_safe_free(data); + + + return xml; +} + +#define ENABLE_PARAM_VALUE "enabled" +static switch_status_t do_config(void) +{ + char *cf = "xml_scgi.conf"; + switch_xml_t cfg, xml, bindings_tag, binding_tag, param; + xml_binding_t *binding = NULL; + int x = 0; + int need_vars_map = 0; + switch_hash_t *vars_map = NULL; + + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); + return SWITCH_STATUS_TERM; + } + + if (!(bindings_tag = switch_xml_child(cfg, "bindings"))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing tag!\n"); + goto done; + } + + for (binding_tag = switch_xml_child(bindings_tag, "binding"); binding_tag; binding_tag = binding_tag->next) { + char *bname = (char *) switch_xml_attr_soft(binding_tag, "name"); + char *host = "127.0.0.1"; + char *port = "8080"; + char *bind_mask = NULL; + int timeout = 0; + + hash_node_t *hash_node; + need_vars_map = 0; + vars_map = NULL; + + for (param = switch_xml_child(binding_tag, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + + if (!strcasecmp(var, "host")) { + bind_mask = (char *) switch_xml_attr_soft(param, "bindings"); + if (val) { + host = val; + } + } else if (!strcasecmp(var, "port")) { + port = val; + } else if (!strcasecmp(var, "timeout")) { + int tmp = atoi(val); + if (tmp >= 0) { + timeout = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set a negative timeout!\n"); + } + } else if (!strcasecmp(var, "enable-post-var")) { + if (!vars_map && need_vars_map == 0) { + if (switch_core_hash_init(&vars_map, globals.pool) != SWITCH_STATUS_SUCCESS) { + need_vars_map = -1; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't init params hash!\n"); + continue; + } + need_vars_map = 1; + } + + if (vars_map && val) { + if (switch_core_hash_insert(vars_map, val, ENABLE_PARAM_VALUE) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't add %s to params hash!\n", val); + } + } + } + } + + if (!host) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Binding has no host!\n"); + if (vars_map) { + switch_core_hash_destroy(&vars_map); + } + continue; + } + + if (!(binding = switch_core_alloc(globals.pool, sizeof(*binding)))) { + if (vars_map) { + switch_core_hash_destroy(&vars_map); + } + goto done; + } + memset(binding, 0, sizeof(*binding)); + + binding->timeout = timeout; + binding->host = switch_core_strdup(globals.pool, host); + binding->port = atoi(port); + binding->vars_map = vars_map; + binding->url = switch_mprintf("scgi://%s:%s", host, port); + + if (bind_mask) { + binding->bindings = switch_core_strdup(globals.pool, bind_mask); + } + + if (vars_map) { + switch_zmalloc(hash_node, sizeof(hash_node_t)); + hash_node->hash = vars_map; + hash_node->next = NULL; + + if (!globals.hash_root) { + globals.hash_root = hash_node; + globals.hash_tail = globals.hash_root; + } + + else { + globals.hash_tail->next = hash_node; + globals.hash_tail = globals.hash_tail->next; + } + + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Binding [%s] XML Fetch Function [%s] [%s]\n", + zstr(bname) ? "N/A" : bname, binding->url, binding->bindings ? binding->bindings : "all"); + switch_xml_bind_search_function(xml_url_fetch, switch_xml_parse_section_string(binding->bindings), binding); + x++; + binding = NULL; + } + + done: + switch_xml_free(xml); + + return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; +} + +SWITCH_MODULE_LOAD_FUNCTION(mod_xml_scgi_load) +{ + switch_api_interface_t *xml_scgi_api_interface; + + /* connect my internal structure to the blank pointer passed to me */ + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + memset(&globals, 0, sizeof(globals)); + globals.pool = pool; + globals.hash_root = NULL; + globals.hash_tail = NULL; + + if (do_config() != SWITCH_STATUS_SUCCESS) { + return SWITCH_STATUS_FALSE; + } + + SWITCH_ADD_API(xml_scgi_api_interface, "xml_scgi", "XML SCGI", xml_scgi_function, XML_SCGI_SYNTAX); + switch_console_set_complete("add xml_scgi debug_on"); + switch_console_set_complete("add xml_scgi debug_off"); + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_scgi_shutdown) +{ + hash_node_t *ptr = NULL; + + while (globals.hash_root) { + ptr = globals.hash_root; + switch_core_hash_destroy(&ptr->hash); + globals.hash_root = ptr->next; + switch_safe_free(ptr); + } + + switch_xml_unbind_search_function_ptr(xml_url_fetch); + + 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/xml_int/mod_xml_scgi/xml_scgi_server.pl b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl new file mode 100644 index 0000000000..bf56c9c0c1 --- /dev/null +++ b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl @@ -0,0 +1,93 @@ +# +# Copyright (c) 2012-2013, Anthony Minessale II +# 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. +# + +### EXAMPLE SERVER SIDE FOR mod_xml_SCGI +### You will need the SCGI module from CPAN + +use SCGI; +use CGI; +use IO::Socket; +use Data::Dumper; + +my $socket = IO::Socket::INET->new(Listen => 5, ReuseAddr => 1, LocalPort => 8080) + or die "cannot bind to port 8080: $!"; + +my $scgi = SCGI->new($socket, blocking => 1); + + +my $xml = qq# + +
+ + + + + + + + + +
+
+#; + + +while (my $request = $scgi->accept) { + + # fork every new req into its own process (optional) + next unless(fork()); + my $handle = $request->connection; + + $request->read_env; + + # get the body that contains the PARAMS + read $handle, $body, $request->env->{CONTENT_LENGTH}; + + # Dump SCGI HEADERS + print Dumper $request->env; + + # Create a CGI parser on the PARAMS + my $cgi = CGI->new($body); + my %params = $cgi->Vars(); + # might be big output + print Dumper \%params; + + + ### DO something CGI-like here with %params ... I'm just going to return static xml + + # header is not necessary but optional + #print $handle "Content-Type: text/xml\n\n"; + + print $handle $xml; + +} From 5cf33770e1409c1c4719e8da3158f321a6284a5d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 9 May 2012 14:09:29 -0500 Subject: [PATCH 237/731] add conf for mod_xml_scgi --- build/modules.conf.in | 1 + conf/vanilla/autoload_configs/modules.conf.xml | 1 + conf/vanilla/autoload_configs/xml_scgi.conf.xml | 12 ++++++++++++ 3 files changed, 14 insertions(+) create mode 100644 conf/vanilla/autoload_configs/xml_scgi.conf.xml diff --git a/build/modules.conf.in b/build/modules.conf.in index 18babbfec9..98a88e0622 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -124,6 +124,7 @@ xml_int/mod_xml_cdr #xml_int/mod_xml_curl #xml_int/mod_xml_ldap xml_int/mod_xml_rpc +xml_int/mod_xml_scgi #../../libs/freetdm/mod_freetdm #../../libs/openzap/mod_openzap diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 50353ac849..5038713afe 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -16,6 +16,7 @@ + diff --git a/conf/vanilla/autoload_configs/xml_scgi.conf.xml b/conf/vanilla/autoload_configs/xml_scgi.conf.xml new file mode 100644 index 0000000000..b9662d1638 --- /dev/null +++ b/conf/vanilla/autoload_configs/xml_scgi.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + From 6c0e1f90f93db19355e6d646b56b222e54f892dc Mon Sep 17 00:00:00 2001 From: Brian West Date: Wed, 9 May 2012 17:11:03 -0500 Subject: [PATCH 238/731] tweak --- src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl index bf56c9c0c1..4be66361e5 100644 --- a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl +++ b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl @@ -89,5 +89,5 @@ while (my $request = $scgi->accept) { #print $handle "Content-Type: text/xml\n\n"; print $handle $xml; - + exit; } From 7b54701d7ce60394734edbcbe0c19cbc4813ad7d Mon Sep 17 00:00:00 2001 From: Michael S Collins Date: Wed, 9 May 2012 15:18:12 -0700 Subject: [PATCH 239/731] mod_voicemail: Improved feedback to user when chaning vm passwords. --- conf/vanilla/lang/en/vm/sounds.xml | 4 ++-- src/mod/applications/mod_voicemail/mod_voicemail.c | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/conf/vanilla/lang/en/vm/sounds.xml b/conf/vanilla/lang/en/vm/sounds.xml index ff8844ae97..fdef472a5b 100644 --- a/conf/vanilla/lang/en/vm/sounds.xml +++ b/conf/vanilla/lang/en/vm/sounds.xml @@ -29,7 +29,7 @@ - + @@ -37,7 +37,7 @@ - + diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 44bafb3ea2..2ed70ce05d 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -2197,8 +2197,7 @@ static void voicemail_check_main(switch_core_session_t *session, vm_profile_t *p if (fail) { /* add feedback for user - let him/her know that the password they tried to change to is not allowed */ - /* change the following macro to VM_CHANGE_PASS_FAIL_MACRO when new prompts have been recorded */ - switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL); + switch_ivr_phrase_macro(session, VM_CHANGE_PASS_FAIL_MACRO, NULL, NULL, NULL); } else { sql = switch_mprintf("update voicemail_prefs set password='%s' where username='%s' and domain='%s'", buf, myid, domain_name); vm_execute_sql(profile, sql, profile->mutex); From a9977a7cac8d16d1015269d26022766301eaf793 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 21:44:55 +0000 Subject: [PATCH 240/731] debian: separate out libfreeswitch1 --- debian/.gitignore | 1 + debian/bootstrap.sh | 20 ++++++++++++++++++++ debian/freeswitch.install | 1 - debian/libfreeswitch1.install | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 debian/libfreeswitch1.install diff --git a/debian/.gitignore b/debian/.gitignore index 437658053c..dc57b0b450 100644 --- a/debian/.gitignore +++ b/debian/.gitignore @@ -28,3 +28,4 @@ /freeswitch-sounds*/ /freeswitch-systemd/ /freeswitch-sysvinit/ +/libfreeswitch*/ diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 4c40b7eaed..8e26928043 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -194,6 +194,16 @@ Description: Cross-Platform Scalable Multi-Protocol Soft Switch . This package contains the FreeSWITCH core. +Package: libfreeswitch1 +Architecture: any +Depends: \${shlibs:Depends}, \${perl:Depends}, \${misc:Depends} +Recommends: +Suggests: libfreeswitch1-dbg +Description: Cross-Platform Scalable Multi-Protocol Soft Switch + $(debian_wrap "${fs_description}") + . + This package contains the FreeSWITCH core library. + Package: freeswitch-meta-bare Architecture: any Depends: \${misc:Depends}, freeswitch (= \${binary:Version}) @@ -335,6 +345,16 @@ Description: debugging symbols for FreeSWITCH . This package contains debugging symbols for FreeSWITCH. +Package: libfreeswitch1-dbg +Section: debug +Priority: extra +Architecture: any +Depends: \${misc:Depends}, libfreeswitch1 (= \${binary:Version}) +Description: debugging symbols for FreeSWITCH + $(debian_wrap "${fs_description}") + . + This package contains debugging symbols for libfreeswitch1. + Package: freeswitch-dev Section: libdevel Architecture: any diff --git a/debian/freeswitch.install b/debian/freeswitch.install index 199329cdd3..d713fe0607 100644 --- a/debian/freeswitch.install +++ b/debian/freeswitch.install @@ -1,3 +1,2 @@ /usr/bin -/usr/lib/libfreeswitch.so.* /usr/share/freeswitch/scripts diff --git a/debian/libfreeswitch1.install b/debian/libfreeswitch1.install new file mode 100644 index 0000000000..216259cdd4 --- /dev/null +++ b/debian/libfreeswitch1.install @@ -0,0 +1 @@ +/usr/lib/libfreeswitch.so.* From 52fe417d936069f538d4bf71bc1dba2bbe2f2c38 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 21:48:30 +0000 Subject: [PATCH 241/731] debian: don't put module .la files in freeswitch-dev --- debian/freeswitch-dev.install | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/freeswitch-dev.install b/debian/freeswitch-dev.install index b63cfa4530..3d92ab2480 100644 --- a/debian/freeswitch-dev.install +++ b/debian/freeswitch-dev.install @@ -1,5 +1,4 @@ /usr/include -/usr/lib/freeswitch/mod/*.la /usr/lib/libfreeswitch.so /usr/lib/*.a /usr/lib/*.la From d64c72e88d37af374e7659e3c2e9288922a81039 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 22:00:04 +0000 Subject: [PATCH 242/731] debian: don't distribute .la files with modules Debian wants rid of .la files, and these module .la files shouldn't be necessary on a Debian system. --- debian/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 8e26928043..a2e6ec7eca 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -516,7 +516,6 @@ EOF print_mod_install () { cat < Date: Wed, 9 May 2012 22:05:15 +0000 Subject: [PATCH 243/731] debian: add mod_xml_scgi --- debian/control-modules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index 922bbf119d..8ea77b00f0 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -641,3 +641,7 @@ Module: xml_int/mod_xml_rpc Description: mod_xml_rpc Adds mod_xml_rpc. +Module: xml_int/mod_xml_scgi +Description: mod_xml_scgi + Adds mod_xml_scgi. + From 4e4b0d45e2969a598aadbb4b90b8d53ff3ed6571 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 22:28:31 +0000 Subject: [PATCH 244/731] debian: reduce edit distance between control-modules and .gen --- debian/bootstrap.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index a2e6ec7eca..4757284bc9 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -841,7 +841,8 @@ parse_mod_control echo "Displaying includes/excludes..." >&2 map_modules 'mod_filter_show' '' '' echo "Generating control-modules.gen as sanity check..." >&2 -(echo "# -*- mode:debian-control -*-"; echo; \ +(echo "# -*- mode:debian-control -*-"; \ + echo "##### Author: Travis Cross "; echo; \ map_modules ':' 'genmodctl_cat' 'genmodctl_mod' \ ) > control-modules.gen From 9c6a3d76d3aea03624120e3d1f71981f1c7b7462 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 22:31:25 +0000 Subject: [PATCH 245/731] debian: rename libfreeswitch-dev package appropriately --- debian/bootstrap.sh | 2 +- debian/{freeswitch-dev.install => libfreeswitch-dev.install} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename debian/{freeswitch-dev.install => libfreeswitch-dev.install} (100%) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 4757284bc9..436ae77dca 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -355,7 +355,7 @@ Description: debugging symbols for FreeSWITCH . This package contains debugging symbols for libfreeswitch1. -Package: freeswitch-dev +Package: libfreeswitch-dev Section: libdevel Architecture: any Depends: \${misc:Depends}, freeswitch diff --git a/debian/freeswitch-dev.install b/debian/libfreeswitch-dev.install similarity index 100% rename from debian/freeswitch-dev.install rename to debian/libfreeswitch-dev.install From 7624ca0ba652060ece83dd26f6bb027af1fc6c31 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 22:49:30 +0000 Subject: [PATCH 246/731] debian: don't distribute .la file with libfreeswitch-dev Debian wants rid of .la files, and leaving this out shouldn't do any harm on a Debian system. --- debian/libfreeswitch-dev.install | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/libfreeswitch-dev.install b/debian/libfreeswitch-dev.install index 3d92ab2480..730856899c 100644 --- a/debian/libfreeswitch-dev.install +++ b/debian/libfreeswitch-dev.install @@ -1,5 +1,4 @@ /usr/include /usr/lib/libfreeswitch.so /usr/lib/*.a -/usr/lib/*.la /usr/lib/pkgconfig From 76330ec918259e61907fbc37e6b2ab2f648b6674 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 May 2012 23:20:37 +0000 Subject: [PATCH 247/731] debian: update package name for lintian override --- debian/bootstrap.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 436ae77dca..852571aeed 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -878,9 +878,9 @@ grep -e '^Package:' control | while xread l; do print_long_filename_override "$m" >> $f fi done -f=freeswitch.lintian-overrides +f=libfreeswitch1.lintian-overrides [ -s $f ] || print_edit_warning >> $f -print_gpl_openssl_override "freeswitch" >> $f +print_gpl_openssl_override "libfreeswitch1" >> $f echo "Done bootstrapping debian/" >&2 touch .stamp-bootstrap From 3ba5c72977f6f3fd26c935717842f35dd48f5ad5 Mon Sep 17 00:00:00 2001 From: Daniel Swarbrick Date: Thu, 10 May 2012 10:19:45 +0200 Subject: [PATCH 248/731] release mutex after iterating over channel vars --- .../event_handlers/mod_cdr_mongodb/mod_cdr_mongodb.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/mod/event_handlers/mod_cdr_mongodb/mod_cdr_mongodb.c b/src/mod/event_handlers/mod_cdr_mongodb/mod_cdr_mongodb.c index f2ecd35a4a..4c8aded61c 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/mod_cdr_mongodb.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/mod_cdr_mongodb.c @@ -124,11 +124,16 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) /* Channel variables */ bson_append_start_object(&cdr, "variables"); - for (hi = switch_channel_variable_first(channel); hi; hi = hi->next) { - if (!zstr(hi->name) && !zstr(hi->value)) { - bson_append_string(&cdr, hi->name, hi->value); + + if ((hi = switch_channel_variable_first(channel))) { + for (; hi; hi = hi->next) { + if (!zstr(hi->name) && !zstr(hi->value)) { + bson_append_string(&cdr, hi->name, hi->value); + } } + switch_channel_variable_last(channel); } + bson_append_finish_object(&cdr); /* variables */ From 951f15990194d637e013bc4e70ed7089a1a62bc4 Mon Sep 17 00:00:00 2001 From: Daniel Swarbrick Date: Thu, 10 May 2012 11:03:04 +0200 Subject: [PATCH 249/731] update mongo-c-driver to 0.5.2 --- .../event_handlers/mod_cdr_mongodb/Makefile | 6 +- .../mod_cdr_mongodb/driver/HISTORY.md | 30 + .../mod_cdr_mongodb/driver/README.md | 4 +- .../mod_cdr_mongodb/driver/SConstruct | 178 ------ .../mod_cdr_mongodb/driver/src/bson.c | 308 ++++++---- .../mod_cdr_mongodb/driver/src/bson.h | 241 +++++--- .../mod_cdr_mongodb/driver/src/encoding.c | 2 +- .../mod_cdr_mongodb/driver/src/encoding.h | 6 +- .../mod_cdr_mongodb/driver/src/env.h | 39 ++ .../mod_cdr_mongodb/driver/src/env_posix.c | 165 +++++ .../mod_cdr_mongodb/driver/src/env_standard.c | 168 +++++ .../mod_cdr_mongodb/driver/src/env_win32.c | 183 ++++++ .../mod_cdr_mongodb/driver/src/gridfs.c | 115 ++-- .../mod_cdr_mongodb/driver/src/gridfs.h | 64 +- .../mod_cdr_mongodb/driver/src/md5.c | 6 +- .../mod_cdr_mongodb/driver/src/md5.h | 19 +- .../mod_cdr_mongodb/driver/src/mongo.c | 576 +++++++++++++----- .../mod_cdr_mongodb/driver/src/mongo.h | 191 ++++-- .../mod_cdr_mongodb/driver/src/net.c | 98 --- .../mod_cdr_mongodb/driver/src/net.h | 57 -- .../mod_cdr_mongodb/driver/src/numbers.c | 2 +- .../mod_cdr_mongodb/driver/src/platform.h | 94 --- .../driver/src/platform/linux/net.c | 183 ------ .../driver/src/platform/linux/net.h | 51 -- 24 files changed, 1598 insertions(+), 1188 deletions(-) delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/SConstruct create mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/env.h create mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_posix.c create mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_standard.c create mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_win32.c delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.c delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.h delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform.h delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.c delete mode 100644 src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.h diff --git a/src/mod/event_handlers/mod_cdr_mongodb/Makefile b/src/mod/event_handlers/mod_cdr_mongodb/Makefile index b9e04b983d..6a412a0f66 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/Makefile +++ b/src/mod/event_handlers/mod_cdr_mongodb/Makefile @@ -2,8 +2,8 @@ include ../../../../build/modmake.rules MONGODB_DRIVER=./driver/src LOCAL_CFLAGS=-I$(MONGODB_DRIVER) -LOCAL_OBJS=$(MONGODB_DRIVER)/md5.o \ - $(MONGODB_DRIVER)/mongo.o $(MONGODB_DRIVER)/net.o \ - $(MONGODB_DRIVER)/bson.o $(MONGODB_DRIVER)/numbers.o $(MONGODB_DRIVER)/encoding.o \ +LOCAL_OBJS=$(MONGODB_DRIVER)/encoding.o $(MONGODB_DRIVER)/env_posix.o \ + $(MONGODB_DRIVER)/bson.o $(MONGODB_DRIVER)/md5.o \ + $(MONGODB_DRIVER)/mongo.o $(MONGODB_DRIVER)/numbers.o local_depend: $(LOCAL_OBJS) diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/HISTORY.md b/src/mod/event_handlers/mod_cdr_mongodb/driver/HISTORY.md index f3f0fab21d..1659192909 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/HISTORY.md +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/HISTORY.md @@ -1,5 +1,35 @@ # MongoDB C Driver History +## 0.5.2 +2012-5-4 + +* Validate collection and database names on insert. +* Validate insert limits using max BSON size. +* Support getaddrinfo and SO_RCVTIMEO and SO_SNDTIMEO on Windows. +* Store errno/WSAGetLastError() on errors. +* Various bug fixes and refactorings. +* Update error reporting docs. + +## 0.5.1 + +* Env for POSIX, WIN32, and standard C. +* Various bug fixes. + +## 0.5 +2012-3-31 + +* Separate cursor-specific errors into their own enum: mongo_cursor_error_t. +* Catch $err return on bad queries and store the result in conn->getlasterrorcode + and conn->getlasterrstr. +* On queries that return $err, set cursor->err to MONGO_CURSOR_QUERY_FAIL. +* When passing bad BSON to a cursor object, set cursor->err to MONGO_CURSOR_BSON_ERROR, + and store the specific BSON error on the conn->err field. +* Remove bson_copy_basic(). +* bson_copy() will copy finished bson objects only. +* bson_copy() returns BSON_OK on success and BSON_ERROR on failure. +* Added a Makefile for easy compile and install on Linux and OS X. +* Replica set connect fixes. + ## 0.4 THIS RELEASE INCLUDES NUMEROUS BACKWARD-BREAKING CHANGES. diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/README.md b/src/mod/event_handlers/mod_cdr_mongodb/driver/README.md index 1afe39e69c..d8c7526683 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/README.md +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/README.md @@ -12,9 +12,9 @@ Until the 1.0 release, this driver should be considered alpha. Keep in mind that # Building First check out the version you want to build. *Always build from a particular tag, since HEAD may be -a work in progress.* For example, to build version 0.4, run: +a work in progress.* For example, to build version 0.5.2, run: - git checkout v0.4 + git checkout v0.5.2 You can then build the driver with scons: diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/SConstruct b/src/mod/event_handlers/mod_cdr_mongodb/driver/SConstruct deleted file mode 100644 index d3be2d89a6..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/SConstruct +++ /dev/null @@ -1,178 +0,0 @@ -# -*- mode: python; -*- - -VERSION = "0.4" - -# --- options ---- -AddOption('--test-server', - dest='test_server', - default='127.0.0.1', - type='string', - nargs=1, - action='store', - help='IP address of server to use for testing') - -AddOption('--seed-start-port', - dest='seed_start_port', - default=30000, - type='int', - nargs=1, - action='store', - help='IP address of server to use for testing') - -AddOption('--c99', - dest='use_c99', - default=False, - action='store_true', - help='Compile with c99 (recommended for gcc)') - -AddOption('--d', - dest='optimize', - default=True, - action='store_false', - help='disable optimizations') - -AddOption('--use-platform', - dest='compile_platform', - default='GENERIC', - type='string', - nargs=1, - action='store', - help='Compile for a specific platform to take advantage ' - ' of particular system features. For the moment, this include timeouts only.' - ' Current options include LINUX, ' - ' GENERIC, and CUSTOM. If you specific CUSTOM, you must place a' - ' system-specific implementation of net.h and net.c in src/platform/custom/') - -import os, sys - -env = Environment( ENV=os.environ ) - -# ---- Docs ---- -def build_docs(env, target, source): - buildscript_path = os.path.join(os.path.abspath("docs")) - sys.path.insert(0, buildscript_path) - import buildscripts - from buildscripts import docs - docs.main() - -env.Alias("docs", [], [build_docs]) -env.AlwaysBuild("docs") - -# ---- Platforms ---- -PLATFORM_TEST_DIR = None -if "LINUX" == GetOption('compile_platform'): - env.Append( CPPFLAGS=" -D_MONGO_USE_LINUX_SYSTEM" ) - NET_LIB = "src/platform/linux/net.c" - PLATFORM_TEST_DIR = "test/platform/linux/" - PLATFORM_TESTS = [ "timeouts" ] -elif "CUSTOM" == GetOption('compile_platform'): - env.Append( CPPFLAGS=" -D_MONGO_USE_CUSTOM_SYSTEM" ) - NET_LIB = "src/platform/custom/net.c" -else: - NET_LIB = "src/net.c" - -# ---- Libraries ---- -if os.sys.platform in ["darwin", "linux2"]: - env.Append( CPPFLAGS=" -pedantic -Wall -ggdb -DMONGO_HAVE_STDINT" ) - env.Append( CPPPATH=["/opt/local/include/"] ) - env.Append( LIBPATH=["/opt/local/lib/"] ) - - if GetOption('use_c99'): - env.Append( CFLAGS=" -std=c99 " ) - env.Append( CXXDEFINES="MONGO_HAVE_STDINT" ) - else: - env.Append( CFLAGS=" -ansi " ) - - if GetOption('optimize'): - env.Append( CPPFLAGS=" -O3 " ) - # -O3 benchmarks *significantly* faster than -O2 when disabling networking -elif 'win32' == os.sys.platform: - env.Append( LIBS='ws2_32' ) - -#we shouldn't need these options in c99 mode -if not GetOption('use_c99'): - conf = Configure(env) - - if not conf.CheckType('int64_t'): - if conf.CheckType('int64_t', '#include \n'): - conf.env.Append( CPPDEFINES="MONGO_HAVE_STDINT" ) - elif conf.CheckType('int64_t', '#include \n'): - conf.env.Append( CPPDEFINES="MONGO_HAVE_UNISTD" ) - elif conf.CheckType('__int64'): - conf.env.Append( CPPDEFINES="MONGO_USE__INT64" ) - elif conf.CheckType('long long int'): - conf.env.Append( CPPDEFINES="MONGO_USE_LONG_LONG_INT" ) - else: - print "*** what is your 64 bit int type? ****" - Exit(1) - - env = conf.Finish() - -have_libjson = False -conf = Configure(env) -if conf.CheckLib('json'): - have_libjson = True -env = conf.Finish() - -if sys.byteorder == 'big': - env.Append( CPPDEFINES="MONGO_BIG_ENDIAN" ) - -env.Append( CPPPATH=["src/"] ) - -coreFiles = ["src/md5.c" ] -mFiles = [ "src/mongo.c", NET_LIB, "src/gridfs.c"] -bFiles = [ "src/bson.c", "src/numbers.c", "src/encoding.c"] -mLibFiles = coreFiles + mFiles + bFiles -bLibFiles = coreFiles + bFiles -m = env.Library( "mongoc" , mLibFiles ) -b = env.Library( "bson" , bLibFiles ) -env.Default( env.Alias( "lib" , [ m[0] , b[0] ] ) ) - -if os.sys.platform == "linux2": - env.Append( SHLINKFLAGS="-shared -Wl,-soname,libmongoc.so." + VERSION ) - env.Append( SHLINKFLAGS = "-shared -Wl,-soname,libbson.so." + VERSION ) - -dynm = env.SharedLibrary( "mongoc" , mLibFiles ) -dynb = env.SharedLibrary( "bson" , bLibFiles ) -env.Default( env.Alias( "sharedlib" , [ dynm[0] , dynb[0] ] ) ) - - - -# ---- Benchmarking ---- -benchmarkEnv = env.Clone() -benchmarkEnv.Append( CPPDEFINES=[('TEST_SERVER', r'\"%s\"'%GetOption('test_server')), -('SEED_START_PORT', r'%d'%GetOption('seed_start_port'))] ) -benchmarkEnv.Append( LIBS=[m, b] ) -benchmarkEnv.Prepend( LIBPATH=["."] ) -benchmarkEnv.Program( "benchmark" , [ "test/benchmark.c"] ) - -# ---- Tests ---- -testEnv = benchmarkEnv.Clone() -testCoreFiles = [ ] - -def run_tests( root, tests ): - for name in tests: - filename = "%s/%s.c" % (root, name) - exe = "test_" + name - test = testEnv.Program( exe , testCoreFiles + [filename] ) - test_alias = testEnv.Alias('test', [test], test[0].abspath + ' 2> ' + os.path.devnull) - AlwaysBuild(test_alias) - -tests = Split("sizes resize endian_swap bson bson_subobject simple update errors " -"count_delete auth gridfs validate examples helpers oid functions cursors replica_set") - -# Run standard tests -run_tests("test", tests) - -# Run platform tests -if not PLATFORM_TEST_DIR is None: - run_tests( PLATFORM_TEST_DIR, PLATFORM_TESTS ) - -if have_libjson: - tests.append('json') - testEnv.Append( LIBS=["json"] ) - -# special case for cpptest -test = testEnv.Program( 'test_cpp' , testCoreFiles + ['test/cpptest.cpp'] ) -test_alias = testEnv.Alias('test', [test], test[0].abspath + ' 2> '+ os.path.devnull) -AlwaysBuild(test_alias) diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.c index 349f42284c..26d17d8696 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.c @@ -33,7 +33,11 @@ static const int zero = 0; void *( *bson_malloc_func )( size_t ) = malloc; void *( *bson_realloc_func )( void *, size_t ) = realloc; void ( *bson_free )( void * ) = free; +#ifdef R_SAFETY_NET +bson_printf_func bson_printf; +#else bson_printf_func bson_printf = printf; +#endif bson_fprintf_func bson_fprintf = fprintf; bson_sprintf_func bson_sprintf = sprintf; @@ -48,33 +52,32 @@ static int ( *oid_inc_func )( void ) = NULL; READING ------------------------------ */ -bson *bson_empty( bson *obj ) { +MONGO_EXPORT bson* bson_create() { + return (bson*)bson_malloc(sizeof(bson)); +} + +MONGO_EXPORT void bson_dispose(bson* b) { + bson_free(b); +} + +MONGO_EXPORT bson *bson_empty( bson *obj ) { static char *data = "\005\0\0\0\0"; bson_init_data( obj, data ); obj->finished = 1; obj->err = 0; + obj->errstr = NULL; obj->stackPos = 0; return obj; } -void bson_copy_basic( bson *out, const bson *in ) { - if ( !out ) return; +MONGO_EXPORT int bson_copy( bson *out, const bson *in ) { + if ( !out ) return BSON_ERROR; + if ( !in->finished ) return BSON_ERROR; bson_init_size( out, bson_size( in ) ); memcpy( out->data, in->data, bson_size( in ) ); -} + out->finished = 1; -void bson_copy( bson *out, const bson *in ) { - int i; - - if ( !out ) return; - bson_copy_basic( out, in ); - out->cur = out->data + ( in->cur - in->data ); - out->dataSize = in->dataSize; - out->finished = in->finished; - out->stackPos = in->stackPos; - out->err = in->err; - for( i=0; istackPos; i++ ) - out->stack[i] = in->stack[i]; + return BSON_OK; } int bson_init_data( bson *b, char *data ) { @@ -82,6 +85,12 @@ int bson_init_data( bson *b, char *data ) { return BSON_OK; } +int bson_init_finished_data( bson *b, char *data ) { + bson_init_data( b, data ); + b->finished = 1; + return BSON_OK; +} + static void _bson_reset( bson *b ) { b->finished = 0; b->stackPos = 0; @@ -89,7 +98,7 @@ static void _bson_reset( bson *b ) { b->errstr = NULL; } -int bson_size( const bson *b ) { +MONGO_EXPORT int bson_size( const bson *b ) { int i; if ( ! b || ! b->data ) return 0; @@ -97,7 +106,12 @@ int bson_size( const bson *b ) { return i; } -const char *bson_data( bson *b ) { +MONGO_EXPORT int bson_buffer_size( const bson *b ) { + return (b->cur - b->data + 1); +} + + +MONGO_EXPORT const char *bson_data( const bson *b ) { return (const char *)b->data; } @@ -146,14 +160,14 @@ static char hexbyte( char hex ) { } } -void bson_oid_from_string( bson_oid_t *oid, const char *str ) { +MONGO_EXPORT void bson_oid_from_string( bson_oid_t *oid, const char *str ) { int i; for ( i=0; i<12; i++ ) { oid->bytes[i] = ( hexbyte( str[2*i] ) << 4 ) | hexbyte( str[2*i + 1] ); } } -void bson_oid_to_string( const bson_oid_t *oid, char *str ) { +MONGO_EXPORT void bson_oid_to_string( const bson_oid_t *oid, char *str ) { static const char hex[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; int i; for ( i=0; i<12; i++ ) { @@ -163,15 +177,15 @@ void bson_oid_to_string( const bson_oid_t *oid, char *str ) { str[24] = '\0'; } -void bson_set_oid_fuzz( int ( *func )( void ) ) { +MONGO_EXPORT void bson_set_oid_fuzz( int ( *func )( void ) ) { oid_fuzz_func = func; } -void bson_set_oid_inc( int ( *func )( void ) ) { +MONGO_EXPORT void bson_set_oid_inc( int ( *func )( void ) ) { oid_inc_func = func; } -void bson_oid_gen( bson_oid_t *oid ) { +MONGO_EXPORT void bson_oid_gen( bson_oid_t *oid ) { static int incr = 0; static int fuzz = 0; int i; @@ -196,18 +210,18 @@ void bson_oid_gen( bson_oid_t *oid ) { bson_big_endian32( &oid->ints[2], &i ); } -time_t bson_oid_generated_time( bson_oid_t *oid ) { +MONGO_EXPORT time_t bson_oid_generated_time( bson_oid_t *oid ) { time_t out; bson_big_endian32( &out, &oid->ints[0] ); return out; } -void bson_print( bson *b ) { +MONGO_EXPORT void bson_print( const bson *b ) { bson_print_raw( b->data , 0 ); } -void bson_print_raw( const char *data , int depth ) { +MONGO_EXPORT void bson_print_raw( const char *data , int depth ) { bson_iterator i; const char *key; int temp; @@ -223,69 +237,69 @@ void bson_print_raw( const char *data , int depth ) { key = bson_iterator_key( &i ); for ( temp=0; temp<=depth; temp++ ) - printf( "\t" ); + bson_printf( "\t" ); bson_printf( "%s : %d \t " , key , t ); switch ( t ) { case BSON_DOUBLE: - printf( "%f" , bson_iterator_double( &i ) ); + bson_printf( "%f" , bson_iterator_double( &i ) ); break; case BSON_STRING: - printf( "%s" , bson_iterator_string( &i ) ); + bson_printf( "%s" , bson_iterator_string( &i ) ); break; case BSON_SYMBOL: - printf( "SYMBOL: %s" , bson_iterator_string( &i ) ); + bson_printf( "SYMBOL: %s" , bson_iterator_string( &i ) ); break; case BSON_OID: bson_oid_to_string( bson_iterator_oid( &i ), oidhex ); - printf( "%s" , oidhex ); + bson_printf( "%s" , oidhex ); break; case BSON_BOOL: - printf( "%s" , bson_iterator_bool( &i ) ? "true" : "false" ); + bson_printf( "%s" , bson_iterator_bool( &i ) ? "true" : "false" ); break; case BSON_DATE: - printf( "%ld" , ( long int )bson_iterator_date( &i ) ); + bson_printf( "%ld" , ( long int )bson_iterator_date( &i ) ); break; case BSON_BINDATA: - printf( "BSON_BINDATA" ); + bson_printf( "BSON_BINDATA" ); break; case BSON_UNDEFINED: - printf( "BSON_UNDEFINED" ); + bson_printf( "BSON_UNDEFINED" ); break; case BSON_NULL: - printf( "BSON_NULL" ); + bson_printf( "BSON_NULL" ); break; case BSON_REGEX: - printf( "BSON_REGEX: %s", bson_iterator_regex( &i ) ); + bson_printf( "BSON_REGEX: %s", bson_iterator_regex( &i ) ); break; case BSON_CODE: - printf( "BSON_CODE: %s", bson_iterator_code( &i ) ); + bson_printf( "BSON_CODE: %s", bson_iterator_code( &i ) ); break; case BSON_CODEWSCOPE: - printf( "BSON_CODE_W_SCOPE: %s", bson_iterator_code( &i ) ); + bson_printf( "BSON_CODE_W_SCOPE: %s", bson_iterator_code( &i ) ); bson_init( &scope ); bson_iterator_code_scope( &i, &scope ); - printf( "\n\t SCOPE: " ); + bson_printf( "\n\t SCOPE: " ); bson_print( &scope ); break; case BSON_INT: - printf( "%d" , bson_iterator_int( &i ) ); + bson_printf( "%d" , bson_iterator_int( &i ) ); break; case BSON_LONG: - printf( "%lld" , ( long long int )bson_iterator_long( &i ) ); + bson_printf( "%lld" , ( uint64_t )bson_iterator_long( &i ) ); break; case BSON_TIMESTAMP: ts = bson_iterator_timestamp( &i ); - printf( "i: %d, t: %d", ts.i, ts.t ); + bson_printf( "i: %d, t: %d", ts.i, ts.t ); break; case BSON_OBJECT: case BSON_ARRAY: - printf( "\n" ); + bson_printf( "\n" ); bson_print_raw( bson_iterator_value( &i ) , depth + 1 ); break; default: bson_errprintf( "can't print type : %d\n" , t ); } - printf( "\n" ); + bson_printf( "\n" ); } } @@ -293,17 +307,25 @@ void bson_print_raw( const char *data , int depth ) { ITERATOR ------------------------------ */ -void bson_iterator_init( bson_iterator *i, const bson *b ) { +MONGO_EXPORT bson_iterator* bson_iterator_create() { + return (bson_iterator*)malloc(sizeof(bson_iterator*)); +} + +MONGO_EXPORT void bson_iterator_dispose(bson_iterator* i) { + free(i); +} + +MONGO_EXPORT void bson_iterator_init( bson_iterator *i, const bson *b ) { i->cur = b->data + 4; i->first = 1; } -void bson_iterator_from_buffer( bson_iterator *i, const char *buffer ) { +MONGO_EXPORT void bson_iterator_from_buffer( bson_iterator *i, const char *buffer ) { i->cur = buffer + 4; i->first = 1; } -bson_type bson_find( bson_iterator *it, const bson *obj, const char *name ) { +MONGO_EXPORT bson_type bson_find( bson_iterator *it, const bson *obj, const char *name ) { bson_iterator_init( it, (bson *)obj ); while( bson_iterator_next( it ) ) { if ( strcmp( name, bson_iterator_key( it ) ) == 0 ) @@ -312,11 +334,11 @@ bson_type bson_find( bson_iterator *it, const bson *obj, const char *name ) { return bson_iterator_type( it ); } -bson_bool_t bson_iterator_more( const bson_iterator *i ) { +MONGO_EXPORT bson_bool_t bson_iterator_more( const bson_iterator *i ) { return *( i->cur ); } -bson_type bson_iterator_next( bson_iterator *i ) { +MONGO_EXPORT bson_type bson_iterator_next( bson_iterator *i ) { int ds; if ( i->first ) { @@ -384,15 +406,15 @@ bson_type bson_iterator_next( bson_iterator *i ) { return ( bson_type )( *i->cur ); } -bson_type bson_iterator_type( const bson_iterator *i ) { +MONGO_EXPORT bson_type bson_iterator_type( const bson_iterator *i ) { return ( bson_type )i->cur[0]; } -const char *bson_iterator_key( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_key( const bson_iterator *i ) { return i->cur + 1; } -const char *bson_iterator_value( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_value( const bson_iterator *i ) { const char *t = i->cur + 1; t += strlen( t ) + 1; return t; @@ -422,11 +444,11 @@ bson_bool_t bson_iterator_bool_raw( const bson_iterator *i ) { return bson_iterator_value( i )[0]; } -bson_oid_t *bson_iterator_oid( const bson_iterator *i ) { +MONGO_EXPORT bson_oid_t *bson_iterator_oid( const bson_iterator *i ) { return ( bson_oid_t * )bson_iterator_value( i ); } -int bson_iterator_int( const bson_iterator *i ) { +MONGO_EXPORT int bson_iterator_int( const bson_iterator *i ) { switch ( bson_iterator_type( i ) ) { case BSON_INT: return bson_iterator_int_raw( i ); @@ -439,7 +461,7 @@ int bson_iterator_int( const bson_iterator *i ) { } } -double bson_iterator_double( const bson_iterator *i ) { +MONGO_EXPORT double bson_iterator_double( const bson_iterator *i ) { switch ( bson_iterator_type( i ) ) { case BSON_INT: return bson_iterator_int_raw( i ); @@ -452,7 +474,7 @@ double bson_iterator_double( const bson_iterator *i ) { } } -int64_t bson_iterator_long( const bson_iterator *i ) { +MONGO_EXPORT int64_t bson_iterator_long( const bson_iterator *i ) { switch ( bson_iterator_type( i ) ) { case BSON_INT: return bson_iterator_int_raw( i ); @@ -465,14 +487,29 @@ int64_t bson_iterator_long( const bson_iterator *i ) { } } -bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i ) { +MONGO_EXPORT bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i ) { bson_timestamp_t ts; bson_little_endian32( &( ts.i ), bson_iterator_value( i ) ); bson_little_endian32( &( ts.t ), bson_iterator_value( i ) + 4 ); return ts; } -bson_bool_t bson_iterator_bool( const bson_iterator *i ) { + +MONGO_EXPORT int bson_iterator_timestamp_time( const bson_iterator *i ) { + int time; + bson_little_endian32( &time, bson_iterator_value( i ) + 4 ); + return time; +} + + +MONGO_EXPORT int bson_iterator_timestamp_increment( const bson_iterator *i ) { + int increment; + bson_little_endian32( &increment, bson_iterator_value( i ) ); + return increment; +} + + +MONGO_EXPORT bson_bool_t bson_iterator_bool( const bson_iterator *i ) { switch ( bson_iterator_type( i ) ) { case BSON_BOOL: return bson_iterator_bool_raw( i ); @@ -490,15 +527,21 @@ bson_bool_t bson_iterator_bool( const bson_iterator *i ) { } } -const char *bson_iterator_string( const bson_iterator *i ) { - return bson_iterator_value( i ) + 4; +MONGO_EXPORT const char *bson_iterator_string( const bson_iterator *i ) { + switch ( bson_iterator_type( i ) ) { + case BSON_STRING: + case BSON_SYMBOL: + return bson_iterator_value( i ) + 4; + default: + return ""; + } } int bson_iterator_string_len( const bson_iterator *i ) { return bson_iterator_int_raw( i ); } -const char *bson_iterator_code( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_code( const bson_iterator *i ) { switch ( bson_iterator_type( i ) ) { case BSON_STRING: case BSON_CODE: @@ -510,57 +553,59 @@ const char *bson_iterator_code( const bson_iterator *i ) { } } -void bson_iterator_code_scope( const bson_iterator *i, bson *scope ) { +MONGO_EXPORT void bson_iterator_code_scope( const bson_iterator *i, bson *scope ) { if ( bson_iterator_type( i ) == BSON_CODEWSCOPE ) { int code_len; bson_little_endian32( &code_len, bson_iterator_value( i )+4 ); bson_init_data( scope, ( void * )( bson_iterator_value( i )+8+code_len ) ); + _bson_reset( scope ); + scope->finished = 1; } else { bson_empty( scope ); } } -bson_date_t bson_iterator_date( const bson_iterator *i ) { +MONGO_EXPORT bson_date_t bson_iterator_date( const bson_iterator *i ) { return bson_iterator_long_raw( i ); } -time_t bson_iterator_time_t( const bson_iterator *i ) { +MONGO_EXPORT time_t bson_iterator_time_t( const bson_iterator *i ) { return bson_iterator_date( i ) / 1000; } -int bson_iterator_bin_len( const bson_iterator *i ) { +MONGO_EXPORT int bson_iterator_bin_len( const bson_iterator *i ) { return ( bson_iterator_bin_type( i ) == BSON_BIN_BINARY_OLD ) ? bson_iterator_int_raw( i ) - 4 : bson_iterator_int_raw( i ); } -char bson_iterator_bin_type( const bson_iterator *i ) { +MONGO_EXPORT char bson_iterator_bin_type( const bson_iterator *i ) { return bson_iterator_value( i )[4]; } -const char *bson_iterator_bin_data( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_bin_data( const bson_iterator *i ) { return ( bson_iterator_bin_type( i ) == BSON_BIN_BINARY_OLD ) ? bson_iterator_value( i ) + 9 : bson_iterator_value( i ) + 5; } -const char *bson_iterator_regex( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_regex( const bson_iterator *i ) { return bson_iterator_value( i ); } -const char *bson_iterator_regex_opts( const bson_iterator *i ) { +MONGO_EXPORT const char *bson_iterator_regex_opts( const bson_iterator *i ) { const char *p = bson_iterator_value( i ); return p + strlen( p ) + 1; } -void bson_iterator_subobject( const bson_iterator *i, bson *sub ) { +MONGO_EXPORT void bson_iterator_subobject( const bson_iterator *i, bson *sub ) { bson_init_data( sub, ( char * )bson_iterator_value( i ) ); _bson_reset( sub ); sub->finished = 1; } -void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub ) { +MONGO_EXPORT void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub ) { bson_iterator_from_buffer( sub, bson_iterator_value( i ) ); } @@ -578,7 +623,7 @@ static void _bson_init_size( bson *b, int size ) { _bson_reset( b ); } -void bson_init( bson *b ) { +MONGO_EXPORT void bson_init( bson *b ) { _bson_init_size( b, initialBufferSize ); } @@ -635,7 +680,7 @@ int bson_ensure_space( bson *b, const int bytesNeeded ) { return BSON_OK; } -int bson_finish( bson *b ) { +MONGO_EXPORT int bson_finish( bson *b ) { int i; if( b->err & BSON_NOT_UTF8 ) @@ -652,12 +697,14 @@ int bson_finish( bson *b ) { return BSON_OK; } -void bson_destroy( bson *b ) { - bson_free( b->data ); - b->err = 0; - b->data = 0; - b->cur = 0; - b->finished = 1; +MONGO_EXPORT void bson_destroy( bson *b ) { + if (b) { + bson_free( b->data ); + b->err = 0; + b->data = 0; + b->cur = 0; + b->finished = 1; + } } static int bson_append_estart( bson *b, int type, const char *name, const int dataSize ) { @@ -686,41 +733,41 @@ static int bson_append_estart( bson *b, int type, const char *name, const int da BUILDING TYPES ------------------------------ */ -int bson_append_int( bson *b, const char *name, const int i ) { +MONGO_EXPORT int bson_append_int( bson *b, const char *name, const int i ) { if ( bson_append_estart( b, BSON_INT, name, 4 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &i ); return BSON_OK; } -int bson_append_long( bson *b, const char *name, const int64_t i ) { +MONGO_EXPORT int bson_append_long( bson *b, const char *name, const int64_t i ) { if ( bson_append_estart( b , BSON_LONG, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append64( b , &i ); return BSON_OK; } -int bson_append_double( bson *b, const char *name, const double d ) { +MONGO_EXPORT int bson_append_double( bson *b, const char *name, const double d ) { if ( bson_append_estart( b, BSON_DOUBLE, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append64( b , &d ); return BSON_OK; } -int bson_append_bool( bson *b, const char *name, const bson_bool_t i ) { +MONGO_EXPORT int bson_append_bool( bson *b, const char *name, const bson_bool_t i ) { if ( bson_append_estart( b, BSON_BOOL, name, 1 ) == BSON_ERROR ) return BSON_ERROR; bson_append_byte( b , i != 0 ); return BSON_OK; } -int bson_append_null( bson *b, const char *name ) { +MONGO_EXPORT int bson_append_null( bson *b, const char *name ) { if ( bson_append_estart( b , BSON_NULL, name, 0 ) == BSON_ERROR ) return BSON_ERROR; return BSON_OK; } -int bson_append_undefined( bson *b, const char *name ) { +MONGO_EXPORT int bson_append_undefined( bson *b, const char *name ) { if ( bson_append_estart( b, BSON_UNDEFINED, name, 0 ) == BSON_ERROR ) return BSON_ERROR; return BSON_OK; @@ -741,31 +788,31 @@ int bson_append_string_base( bson *b, const char *name, return BSON_OK; } -int bson_append_string( bson *b, const char *name, const char *value ) { +MONGO_EXPORT int bson_append_string( bson *b, const char *name, const char *value ) { return bson_append_string_base( b, name, value, strlen ( value ), BSON_STRING ); } -int bson_append_symbol( bson *b, const char *name, const char *value ) { +MONGO_EXPORT int bson_append_symbol( bson *b, const char *name, const char *value ) { return bson_append_string_base( b, name, value, strlen ( value ), BSON_SYMBOL ); } -int bson_append_code( bson *b, const char *name, const char *value ) { +MONGO_EXPORT int bson_append_code( bson *b, const char *name, const char *value ) { return bson_append_string_base( b, name, value, strlen ( value ), BSON_CODE ); } -int bson_append_string_n( bson *b, const char *name, const char *value, int len ) { +MONGO_EXPORT int bson_append_string_n( bson *b, const char *name, const char *value, int len ) { return bson_append_string_base( b, name, value, len, BSON_STRING ); } -int bson_append_symbol_n( bson *b, const char *name, const char *value, int len ) { +MONGO_EXPORT int bson_append_symbol_n( bson *b, const char *name, const char *value, int len ) { return bson_append_string_base( b, name, value, len, BSON_SYMBOL ); } -int bson_append_code_n( bson *b, const char *name, const char *value, int len ) { +MONGO_EXPORT int bson_append_code_n( bson *b, const char *name, const char *value, int len ) { return bson_append_string_base( b, name, value, len, BSON_CODE ); } -int bson_append_code_w_scope_n( bson *b, const char *name, +MONGO_EXPORT int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int len, const bson *scope ) { int sl = len + 1; @@ -779,11 +826,11 @@ int bson_append_code_w_scope_n( bson *b, const char *name, return BSON_OK; } -int bson_append_code_w_scope( bson *b, const char *name, const char *code, const bson *scope ) { +MONGO_EXPORT int bson_append_code_w_scope( bson *b, const char *name, const char *code, const bson *scope ) { return bson_append_code_w_scope_n( b, name, code, strlen ( code ), scope ); } -int bson_append_binary( bson *b, const char *name, char type, const char *str, int len ) { +MONGO_EXPORT int bson_append_binary( bson *b, const char *name, char type, const char *str, int len ) { if ( type == BSON_BIN_BINARY_OLD ) { int subtwolen = len + 4; if ( bson_append_estart( b, BSON_BINDATA, name, 4+1+4+len ) == BSON_ERROR ) @@ -802,20 +849,20 @@ int bson_append_binary( bson *b, const char *name, char type, const char *str, i return BSON_OK; } -int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ) { +MONGO_EXPORT int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ) { if ( bson_append_estart( b, BSON_OID, name, 12 ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , oid , 12 ); return BSON_OK; } -int bson_append_new_oid( bson *b, const char *name ) { +MONGO_EXPORT int bson_append_new_oid( bson *b, const char *name ) { bson_oid_t oid; bson_oid_gen( &oid ); return bson_append_oid( b, name, &oid ); } -int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ) { +MONGO_EXPORT int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ) { const int plen = strlen( pattern )+1; const int olen = strlen( opts )+1; if ( bson_append_estart( b, BSON_REGEX, name, plen + olen ) == BSON_ERROR ) @@ -827,14 +874,14 @@ int bson_append_regex( bson *b, const char *name, const char *pattern, const cha return BSON_OK; } -int bson_append_bson( bson *b, const char *name, const bson *bson ) { +MONGO_EXPORT int bson_append_bson( bson *b, const char *name, const bson *bson ) { if ( bson_append_estart( b, BSON_OBJECT, name, bson_size( bson ) ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , bson->data , bson_size( bson ) ); return BSON_OK; } -int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem ) { +MONGO_EXPORT int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem ) { bson_iterator next = *elem; int size; @@ -854,7 +901,7 @@ int bson_append_element( bson *b, const char *name_or_null, const bson_iterator return BSON_OK; } -int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ) { +MONGO_EXPORT int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ) { if ( bson_append_estart( b, BSON_TIMESTAMP, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &( ts->i ) ); @@ -863,31 +910,39 @@ int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ) { return BSON_OK; } -int bson_append_date( bson *b, const char *name, bson_date_t millis ) { +MONGO_EXPORT int bson_append_timestamp2( bson *b, const char *name, int time, int increment ) { + if ( bson_append_estart( b, BSON_TIMESTAMP, name, 8 ) == BSON_ERROR ) return BSON_ERROR; + + bson_append32( b , &increment ); + bson_append32( b , &time ); + return BSON_OK; +} + +MONGO_EXPORT int bson_append_date( bson *b, const char *name, bson_date_t millis ) { if ( bson_append_estart( b, BSON_DATE, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append64( b , &millis ); return BSON_OK; } -int bson_append_time_t( bson *b, const char *name, time_t secs ) { +MONGO_EXPORT int bson_append_time_t( bson *b, const char *name, time_t secs ) { return bson_append_date( b, name, ( bson_date_t )secs * 1000 ); } -int bson_append_start_object( bson *b, const char *name ) { +MONGO_EXPORT int bson_append_start_object( bson *b, const char *name ) { if ( bson_append_estart( b, BSON_OBJECT, name, 5 ) == BSON_ERROR ) return BSON_ERROR; b->stack[ b->stackPos++ ] = b->cur - b->data; bson_append32( b , &zero ); return BSON_OK; } -int bson_append_start_array( bson *b, const char *name ) { +MONGO_EXPORT int bson_append_start_array( bson *b, const char *name ) { if ( bson_append_estart( b, BSON_ARRAY, name, 5 ) == BSON_ERROR ) return BSON_ERROR; b->stack[ b->stackPos++ ] = b->cur - b->data; bson_append32( b , &zero ); return BSON_OK; } -int bson_append_finish_object( bson *b ) { +MONGO_EXPORT int bson_append_finish_object( bson *b ) { char *start; int i; if ( bson_ensure_space( b, 1 ) == BSON_ERROR ) return BSON_ERROR; @@ -900,22 +955,25 @@ int bson_append_finish_object( bson *b ) { return BSON_OK; } -int bson_append_finish_array( bson *b ) { - return bson_append_finish_object( b ); +MONGO_EXPORT double bson_int64_to_double( int64_t i64 ) { + return (double)i64; } +MONGO_EXPORT int bson_append_finish_array( bson *b ) { + return bson_append_finish_object( b ); +} /* Error handling and allocators. */ static bson_err_handler err_handler = NULL; -bson_err_handler set_bson_err_handler( bson_err_handler func ) { +MONGO_EXPORT bson_err_handler set_bson_err_handler( bson_err_handler func ) { bson_err_handler old = err_handler; err_handler = func; return old; } -void *bson_malloc( int size ) { +MONGO_EXPORT void *bson_malloc( int size ) { void *p; p = bson_malloc_func( size ); bson_fatal_msg( !!p, "malloc() failed" ); @@ -933,7 +991,9 @@ int _bson_errprintf( const char *format, ... ) { va_list ap; int ret; va_start( ap, format ); +#ifndef R_SAFETY_NET ret = vfprintf( stderr, format, ap ); +#endif va_end( ap ); return ret; @@ -961,9 +1021,10 @@ void bson_fatal_msg( int ok , const char *msg ) { if ( err_handler ) { err_handler( msg ); } - +#ifndef R_SAFETY_NET bson_errprintf( "error: %s\n" , msg ); exit( -5 ); +#endif } @@ -976,3 +1037,28 @@ void bson_numstr( char *str, int i ) { else bson_sprintf( str,"%d", i ); } + +MONGO_EXPORT void bson_swap_endian64( void *outp, const void *inp ) { + const char *in = ( const char * )inp; + char *out = ( char * )outp; + + out[0] = in[7]; + out[1] = in[6]; + out[2] = in[5]; + out[3] = in[4]; + out[4] = in[3]; + out[5] = in[2]; + out[6] = in[1]; + out[7] = in[0]; + +} + +MONGO_EXPORT void bson_swap_endian32( void *outp, const void *inp ) { + const char *in = ( const char * )inp; + char *out = ( char * )outp; + + out[0] = in[3]; + out[1] = in[2]; + out[2] = in[1]; + out[3] = in[0]; +} diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.h index 2e385b9160..b83d1ca9c9 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.h +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/bson.h @@ -3,7 +3,7 @@ * @brief BSON Declarations */ -/* Copyright 2009-2011 10gen Inc. +/* Copyright 2009-2012 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,16 +18,63 @@ * limitations under the License. */ -#ifndef _BSON_H_ -#define _BSON_H_ +#ifndef BSON_H_ +#define BSON_H_ -#include "platform.h" #include #include #include #include #include +#ifdef __GNUC__ + #define MONGO_INLINE static __inline__ + #define MONGO_EXPORT +#else + #define MONGO_INLINE static + #ifdef MONGO_STATIC_BUILD + #define MONGO_EXPORT + #elif defined(MONGO_DLL_BUILD) + #define MONGO_EXPORT __declspec(dllexport) + #else + #define MONGO_EXPORT __declspec(dllimport) + #endif +#endif + +#ifdef __cplusplus +#define MONGO_EXTERN_C_START extern "C" { +#define MONGO_EXTERN_C_END } +#else +#define MONGO_EXTERN_C_START +#define MONGO_EXTERN_C_END +#endif + +#if defined(MONGO_HAVE_STDINT) || __STDC_VERSION__ >= 199901L +#include +#elif defined(MONGO_HAVE_UNISTD) +#include +#elif defined(MONGO_USE__INT64) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#elif defined(MONGO_USE_LONG_LONG_INT) +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#else +#error Must compile with c99 or define MONGO_HAVE_STDINT, MONGO_HAVE_UNISTD, MONGO_USE__INT64, or MONGO_USE_LONG_INT. +#endif + +#ifdef MONGO_BIG_ENDIAN +#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) ) +#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) ) +#define bson_big_endian64(out, in) ( memcpy(out, in, 8) ) +#define bson_big_endian32(out, in) ( memcpy(out, in, 4) ) +#else +#define bson_little_endian64(out, in) ( memcpy(out, in, 8) ) +#define bson_little_endian32(out, in) ( memcpy(out, in, 4) ) +#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) ) +#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) ) +#endif + MONGO_EXTERN_C_START #define BSON_OK 0 @@ -84,12 +131,12 @@ typedef struct { } bson_iterator; typedef struct { - char *data; - char *cur; - int dataSize; - bson_bool_t finished; - int stack[32]; - int stackPos; + char *data; /**< Pointer to a block of data in this BSON object. */ + char *cur; /**< Pointer to the current position. */ + int dataSize; /**< The number of bytes allocated to char *data. */ + bson_bool_t finished; /**< When finished, the BSON object can no longer be modified. */ + int stack[32]; /**< A stack used to keep track of nested BSON elements. */ + int stackPos; /**< Index of current stack position. */ int err; /**< Bitfield representing errors or warnings on this buffer */ char *errstr; /**< A string representation of the most recent error or warning. */ } bson; @@ -112,6 +159,9 @@ typedef struct { READING ------------------------------ */ +MONGO_EXPORT bson* bson_create(); +MONGO_EXPORT void bson_dispose(bson* b); + /** * Size of a BSON object. * @@ -119,21 +169,22 @@ typedef struct { * * @return the size. */ -int bson_size( const bson *b ); +MONGO_EXPORT int bson_size( const bson *b ); +MONGO_EXPORT int bson_buffer_size( const bson *b ); /** * Print a string representation of a BSON object. * * @param b the BSON object to print. */ -void bson_print( bson *b ); +MONGO_EXPORT void bson_print( const bson *b ); /** * Return a pointer to the raw buffer stored by this bson object. * * @param b a BSON object */ -const char *bson_data( bson *b ); +MONGO_EXPORT const char *bson_data( const bson *b ); /** * Print a string representation of a BSON object. @@ -141,7 +192,7 @@ const char *bson_data( bson *b ); * @param bson the raw data to print. * @param depth the depth to recurse the object.x */ -void bson_print_raw( const char *bson , int depth ); +MONGO_EXPORT void bson_print_raw( const char *bson , int depth ); /** * Advance a bson_iterator to the named field. @@ -152,15 +203,18 @@ void bson_print_raw( const char *bson , int depth ); * * @return the type of the found object or BSON_EOO if it is not found. */ -bson_type bson_find( bson_iterator *it, const bson *obj, const char *name ); +MONGO_EXPORT bson_type bson_find( bson_iterator *it, const bson *obj, const char *name ); + +MONGO_EXPORT bson_iterator* bson_iterator_create(); +MONGO_EXPORT void bson_iterator_dispose(bson_iterator*); /** * Initialize a bson_iterator. * * @param i the bson_iterator to initialize. * @param bson the BSON object to associate with the iterator. */ -void bson_iterator_init( bson_iterator *i , const bson *b ); +MONGO_EXPORT void bson_iterator_init( bson_iterator *i , const bson *b ); /** * Initialize a bson iterator from a const char* buffer. Note @@ -169,7 +223,7 @@ void bson_iterator_init( bson_iterator *i , const bson *b ); * @param i the bson_iterator to initialize. * @param buffer the buffer to point to. */ -void bson_iterator_from_buffer( bson_iterator *i, const char *buffer ); +MONGO_EXPORT void bson_iterator_from_buffer( bson_iterator *i, const char *buffer ); /* more returns true for eoo. best to loop with bson_iterator_next(&it) */ /** @@ -179,7 +233,7 @@ void bson_iterator_from_buffer( bson_iterator *i, const char *buffer ); * * @return returns true if there is more data. */ -bson_bool_t bson_iterator_more( const bson_iterator *i ); +MONGO_EXPORT bson_bool_t bson_iterator_more( const bson_iterator *i ); /** * Point the iterator at the next BSON object. @@ -188,7 +242,7 @@ bson_bool_t bson_iterator_more( const bson_iterator *i ); * * @return the type of the next BSON object. */ -bson_type bson_iterator_next( bson_iterator *i ); +MONGO_EXPORT bson_type bson_iterator_next( bson_iterator *i ); /** * Get the type of the BSON object currently pointed to by the iterator. @@ -197,7 +251,7 @@ bson_type bson_iterator_next( bson_iterator *i ); * * @return the type of the current BSON object. */ -bson_type bson_iterator_type( const bson_iterator *i ); +MONGO_EXPORT bson_type bson_iterator_type( const bson_iterator *i ); /** * Get the key of the BSON object currently pointed to by the iterator. @@ -206,7 +260,7 @@ bson_type bson_iterator_type( const bson_iterator *i ); * * @return the key of the current BSON object. */ -const char *bson_iterator_key( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_key( const bson_iterator *i ); /** * Get the value of the BSON object currently pointed to by the iterator. @@ -215,7 +269,7 @@ const char *bson_iterator_key( const bson_iterator *i ); * * @return the value of the current BSON object. */ -const char *bson_iterator_value( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_value( const bson_iterator *i ); /* these convert to the right type (return 0 if non-numeric) */ /** @@ -226,7 +280,7 @@ const char *bson_iterator_value( const bson_iterator *i ); * * @return the value of the current BSON object. */ -double bson_iterator_double( const bson_iterator *i ); +MONGO_EXPORT double bson_iterator_double( const bson_iterator *i ); /** * Get the int value of the BSON object currently pointed to by the iterator. @@ -235,7 +289,7 @@ double bson_iterator_double( const bson_iterator *i ); * * @return the value of the current BSON object. */ -int bson_iterator_int( const bson_iterator *i ); +MONGO_EXPORT int bson_iterator_int( const bson_iterator *i ); /** * Get the long value of the BSON object currently pointed to by the iterator. @@ -244,7 +298,7 @@ int bson_iterator_int( const bson_iterator *i ); * * @return the value of the current BSON object. */ -int64_t bson_iterator_long( const bson_iterator *i ); +MONGO_EXPORT int64_t bson_iterator_long( const bson_iterator *i ); /* return the bson timestamp as a whole or in parts */ /** @@ -255,7 +309,9 @@ int64_t bson_iterator_long( const bson_iterator *i ); * * @return the value of the current BSON object. */ -bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i ); +MONGO_EXPORT bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i ); +MONGO_EXPORT int bson_iterator_timestamp_time( const bson_iterator *i ); +MONGO_EXPORT int bson_iterator_timestamp_increment( const bson_iterator *i ); /** * Get the boolean value of the BSON object currently pointed to by @@ -267,7 +323,7 @@ bson_timestamp_t bson_iterator_timestamp( const bson_iterator *i ); */ /* false: boolean false, 0 in any type, or null */ /* true: anything else (even empty strings and objects) */ -bson_bool_t bson_iterator_bool( const bson_iterator *i ); +MONGO_EXPORT bson_bool_t bson_iterator_bool( const bson_iterator *i ); /** * Get the double value of the BSON object currently pointed to by the @@ -318,7 +374,7 @@ bson_bool_t bson_iterator_bool_raw( const bson_iterator *i ); * * @return the value of the current BSON object. */ -bson_oid_t *bson_iterator_oid( const bson_iterator *i ); +MONGO_EXPORT bson_oid_t *bson_iterator_oid( const bson_iterator *i ); /** * Get the string value of the BSON object currently pointed to by the @@ -329,7 +385,7 @@ bson_oid_t *bson_iterator_oid( const bson_iterator *i ); * @return the value of the current BSON object. */ /* these can also be used with bson_code and bson_symbol*/ -const char *bson_iterator_string( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_string( const bson_iterator *i ); /** * Get the string length of the BSON object currently pointed to by the @@ -352,7 +408,7 @@ int bson_iterator_string_len( const bson_iterator *i ); */ /* works with bson_code, bson_codewscope, and BSON_STRING */ /* returns NULL for everything else */ -const char *bson_iterator_code( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_code( const bson_iterator *i ); /** * Calls bson_empty on scope if not a bson_codewscope @@ -361,7 +417,7 @@ const char *bson_iterator_code( const bson_iterator *i ); * @param scope the bson scope. */ /* calls bson_empty on scope if not a bson_codewscope */ -void bson_iterator_code_scope( const bson_iterator *i, bson *scope ); +MONGO_EXPORT void bson_iterator_code_scope( const bson_iterator *i, bson *scope ); /** * Get the date value of the BSON object currently pointed to by the @@ -372,7 +428,7 @@ void bson_iterator_code_scope( const bson_iterator *i, bson *scope ); * @return the date value of the current BSON object. */ /* both of these only work with bson_date */ -bson_date_t bson_iterator_date( const bson_iterator *i ); +MONGO_EXPORT bson_date_t bson_iterator_date( const bson_iterator *i ); /** * Get the time value of the BSON object currently pointed to by the @@ -382,7 +438,7 @@ bson_date_t bson_iterator_date( const bson_iterator *i ); * * @return the time value of the current BSON object. */ -time_t bson_iterator_time_t( const bson_iterator *i ); +MONGO_EXPORT time_t bson_iterator_time_t( const bson_iterator *i ); /** * Get the length of the BSON binary object currently pointed to by the @@ -392,7 +448,7 @@ time_t bson_iterator_time_t( const bson_iterator *i ); * * @return the length of the current BSON binary object. */ -int bson_iterator_bin_len( const bson_iterator *i ); +MONGO_EXPORT int bson_iterator_bin_len( const bson_iterator *i ); /** * Get the type of the BSON binary object currently pointed to by the @@ -402,7 +458,7 @@ int bson_iterator_bin_len( const bson_iterator *i ); * * @return the type of the current BSON binary object. */ -char bson_iterator_bin_type( const bson_iterator *i ); +MONGO_EXPORT char bson_iterator_bin_type( const bson_iterator *i ); /** * Get the value of the BSON binary object currently pointed to by the @@ -412,7 +468,7 @@ char bson_iterator_bin_type( const bson_iterator *i ); * * @return the value of the current BSON binary object. */ -const char *bson_iterator_bin_data( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_bin_data( const bson_iterator *i ); /** * Get the value of the BSON regex object currently pointed to by the @@ -422,7 +478,7 @@ const char *bson_iterator_bin_data( const bson_iterator *i ); * * @return the value of the current BSON regex object. */ -const char *bson_iterator_regex( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_regex( const bson_iterator *i ); /** * Get the options of the BSON regex object currently pointed to by the @@ -432,7 +488,7 @@ const char *bson_iterator_regex( const bson_iterator *i ); * * @return the options of the current BSON regex object. */ -const char *bson_iterator_regex_opts( const bson_iterator *i ); +MONGO_EXPORT const char *bson_iterator_regex_opts( const bson_iterator *i ); /* these work with BSON_OBJECT and BSON_ARRAY */ /** @@ -442,7 +498,7 @@ const char *bson_iterator_regex_opts( const bson_iterator *i ); * @param i the bson_iterator. * @param sub the BSON subobject destination. */ -void bson_iterator_subobject( const bson_iterator *i, bson *sub ); +MONGO_EXPORT void bson_iterator_subobject( const bson_iterator *i, bson *sub ); /** * Get a bson_iterator that on the BSON subobject. @@ -450,7 +506,7 @@ void bson_iterator_subobject( const bson_iterator *i, bson *sub ); * @param i the bson_iterator. * @param sub the iterator to point at the BSON subobject. */ -void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub ); +MONGO_EXPORT void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub ); /* str must be at least 24 hex chars + null byte */ /** @@ -459,7 +515,7 @@ void bson_iterator_subiterator( const bson_iterator *i, bson_iterator *sub ); * @param oid the bson_oid_t destination. * @param str a null terminated string comprised of at least 24 hex chars. */ -void bson_oid_from_string( bson_oid_t *oid, const char *str ); +MONGO_EXPORT void bson_oid_from_string( bson_oid_t *oid, const char *str ); /** * Create a string representation of the bson_oid_t. @@ -467,14 +523,14 @@ void bson_oid_from_string( bson_oid_t *oid, const char *str ); * @param oid the bson_oid_t source. * @param str the string representation destination. */ -void bson_oid_to_string( const bson_oid_t *oid, char *str ); +MONGO_EXPORT void bson_oid_to_string( const bson_oid_t *oid, char *str ); /** * Create a bson_oid object. * * @param oid the destination for the newly created bson_oid_t. */ -void bson_oid_gen( bson_oid_t *oid ); +MONGO_EXPORT void bson_oid_gen( bson_oid_t *oid ); /** * Set a function to be used to generate the second four bytes @@ -482,7 +538,7 @@ void bson_oid_gen( bson_oid_t *oid ); * * @param func a pointer to a function that returns an int. */ -void bson_set_oid_fuzz( int ( *func )( void ) ); +MONGO_EXPORT void bson_set_oid_fuzz( int ( *func )( void ) ); /** * Set a function to be used to generate the incrementing part @@ -491,14 +547,14 @@ void bson_set_oid_fuzz( int ( *func )( void ) ); * * @param func a pointer to a function that returns an int. */ -void bson_set_oid_inc( int ( *func )( void ) ); +MONGO_EXPORT void bson_set_oid_inc( int ( *func )( void ) ); /** * Get the time a bson_oid_t was created. * * @param oid the bson_oid_t. */ -time_t bson_oid_generated_time( bson_oid_t *oid ); /* Gives the time the OID was created */ +MONGO_EXPORT time_t bson_oid_generated_time( bson_oid_t *oid ); /* Gives the time the OID was created */ /* ---------------------------- BUILDING @@ -512,7 +568,7 @@ time_t bson_oid_generated_time( bson_oid_t *oid ); /* Gives the time the OID was * @note When finished, you must pass the bson object to * bson_destroy( ). */ -void bson_init( bson *b ); +MONGO_EXPORT void bson_init( bson *b ); /** * Initialize a BSON object, and point its data @@ -524,6 +580,7 @@ void bson_init( bson *b ); * @return BSON_OK or BSON_ERROR. */ int bson_init_data( bson *b , char *data ); +int bson_init_finished_data( bson *b, char *data ) ; /** * Initialize a BSON object, and set its @@ -555,7 +612,7 @@ int bson_ensure_space( bson *b, const int bytesNeeded ); * @return the standard error code. To deallocate memory, * call bson_destroy on the bson object. */ -int bson_finish( bson *b ); +MONGO_EXPORT int bson_finish( bson *b ); /** * Destroy a bson object. @@ -563,7 +620,7 @@ int bson_finish( bson *b ); * @param b the bson object to destroy. * */ -void bson_destroy( bson *b ); +MONGO_EXPORT void bson_destroy( bson *b ); /** * Returns a pointer to a static empty BSON object. @@ -573,23 +630,17 @@ void bson_destroy( bson *b ); * @return the empty initialized BSON object. */ /* returns pointer to static empty bson object */ -bson *bson_empty( bson *obj ); - -/** - * Copy BSON data only from one object to another. - * - * @param out the copy destination BSON object. - * @param in the copy source BSON object. - */ -void bson_copy_basic( bson *out, const bson *in ); +MONGO_EXPORT bson *bson_empty( bson *obj ); /** * Make a complete copy of the a BSON object. + * The source bson object must be in a finished + * state; otherwise, the copy will fail. * * @param out the copy destination BSON object. * @param in the copy source BSON object. */ -void bson_copy( bson *out, const bson *in ); /* puts data in new buffer. NOOP if out==NULL */ +MONGO_EXPORT int bson_copy( bson *out, const bson *in ); /* puts data in new buffer. NOOP if out==NULL */ /** * Append a previously created bson_oid_t to a bson object. @@ -600,7 +651,7 @@ void bson_copy( bson *out, const bson *in ); /* puts data in new buffer. NOOP if * * @return BSON_OK or BSON_ERROR. */ -int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ); +MONGO_EXPORT int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ); /** * Append a bson_oid_t to a bson. @@ -610,7 +661,7 @@ int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_new_oid( bson *b, const char *name ); +MONGO_EXPORT int bson_append_new_oid( bson *b, const char *name ); /** * Append an int to a bson. @@ -621,7 +672,7 @@ int bson_append_new_oid( bson *b, const char *name ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_int( bson *b, const char *name, const int i ); +MONGO_EXPORT int bson_append_int( bson *b, const char *name, const int i ); /** * Append an long to a bson. @@ -632,7 +683,7 @@ int bson_append_int( bson *b, const char *name, const int i ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_long( bson *b, const char *name, const int64_t i ); +MONGO_EXPORT int bson_append_long( bson *b, const char *name, const int64_t i ); /** * Append an double to a bson. @@ -643,7 +694,7 @@ int bson_append_long( bson *b, const char *name, const int64_t i ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_double( bson *b, const char *name, const double d ); +MONGO_EXPORT int bson_append_double( bson *b, const char *name, const double d ); /** * Append a string to a bson. @@ -654,7 +705,7 @@ int bson_append_double( bson *b, const char *name, const double d ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_string( bson *b, const char *name, const char *str ); +MONGO_EXPORT int bson_append_string( bson *b, const char *name, const char *str ); /** * Append len bytes of a string to a bson. @@ -666,7 +717,7 @@ int bson_append_string( bson *b, const char *name, const char *str ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_string_n( bson *b, const char *name, const char *str, int len ); +MONGO_EXPORT int bson_append_string_n( bson *b, const char *name, const char *str, int len ); /** * Append a symbol to a bson. @@ -677,7 +728,7 @@ int bson_append_string_n( bson *b, const char *name, const char *str, int len ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_symbol( bson *b, const char *name, const char *str ); +MONGO_EXPORT int bson_append_symbol( bson *b, const char *name, const char *str ); /** * Append len bytes of a symbol to a bson. @@ -689,7 +740,7 @@ int bson_append_symbol( bson *b, const char *name, const char *str ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_symbol_n( bson *b, const char *name, const char *str, int len ); +MONGO_EXPORT int bson_append_symbol_n( bson *b, const char *name, const char *str, int len ); /** * Append code to a bson. @@ -701,7 +752,7 @@ int bson_append_symbol_n( bson *b, const char *name, const char *str, int len ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_code( bson *b, const char *name, const char *str ); +MONGO_EXPORT int bson_append_code( bson *b, const char *name, const char *str ); /** * Append len bytes of code to a bson. @@ -713,7 +764,7 @@ int bson_append_code( bson *b, const char *name, const char *str ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_code_n( bson *b, const char *name, const char *str, int len ); +MONGO_EXPORT int bson_append_code_n( bson *b, const char *name, const char *str, int len ); /** * Append code to a bson with scope. @@ -725,7 +776,7 @@ int bson_append_code_n( bson *b, const char *name, const char *str, int len ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_code_w_scope( bson *b, const char *name, const char *code, const bson *scope ); +MONGO_EXPORT int bson_append_code_w_scope( bson *b, const char *name, const char *code, const bson *scope ); /** * Append len bytes of code to a bson with scope. @@ -738,7 +789,7 @@ int bson_append_code_w_scope( bson *b, const char *name, const char *code, const * * @return BSON_OK or BSON_ERROR. */ -int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int size, const bson *scope ); +MONGO_EXPORT int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int size, const bson *scope ); /** * Append binary data to a bson. @@ -751,7 +802,7 @@ int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int * * @return BSON_OK or BSON_ERROR. */ -int bson_append_binary( bson *b, const char *name, char type, const char *str, int len ); +MONGO_EXPORT int bson_append_binary( bson *b, const char *name, char type, const char *str, int len ); /** * Append a bson_bool_t to a bson. @@ -762,7 +813,7 @@ int bson_append_binary( bson *b, const char *name, char type, const char *str, i * * @return BSON_OK or BSON_ERROR. */ -int bson_append_bool( bson *b, const char *name, const bson_bool_t v ); +MONGO_EXPORT int bson_append_bool( bson *b, const char *name, const bson_bool_t v ); /** * Append a null value to a bson. @@ -772,7 +823,7 @@ int bson_append_bool( bson *b, const char *name, const bson_bool_t v ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_null( bson *b, const char *name ); +MONGO_EXPORT int bson_append_null( bson *b, const char *name ); /** * Append an undefined value to a bson. @@ -782,7 +833,7 @@ int bson_append_null( bson *b, const char *name ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_undefined( bson *b, const char *name ); +MONGO_EXPORT int bson_append_undefined( bson *b, const char *name ); /** * Append a regex value to a bson. @@ -794,7 +845,7 @@ int bson_append_undefined( bson *b, const char *name ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ); +MONGO_EXPORT int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ); /** * Append bson data to a bson. @@ -805,7 +856,7 @@ int bson_append_regex( bson *b, const char *name, const char *pattern, const cha * * @return BSON_OK or BSON_ERROR. */ -int bson_append_bson( bson *b, const char *name, const bson *bson ); +MONGO_EXPORT int bson_append_bson( bson *b, const char *name, const bson *bson ); /** * Append a BSON element to a bson from the current point of an iterator. @@ -816,7 +867,7 @@ int bson_append_bson( bson *b, const char *name, const bson *bson ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem ); +MONGO_EXPORT int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem ); /** * Append a bson_timestamp_t value to a bson. @@ -827,7 +878,8 @@ int bson_append_element( bson *b, const char *name_or_null, const bson_iterator * * @return BSON_OK or BSON_ERROR. */ -int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ); +MONGO_EXPORT int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ); +MONGO_EXPORT int bson_append_timestamp2( bson *b, const char *name, int time, int increment ); /* these both append a bson_date */ /** @@ -839,7 +891,7 @@ int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_date( bson *b, const char *name, bson_date_t millis ); +MONGO_EXPORT int bson_append_date( bson *b, const char *name, bson_date_t millis ); /** * Append a time_t value to a bson. @@ -850,7 +902,7 @@ int bson_append_date( bson *b, const char *name, bson_date_t millis ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_time_t( bson *b, const char *name, time_t secs ); +MONGO_EXPORT int bson_append_time_t( bson *b, const char *name, time_t secs ); /** * Start appending a new object to a bson. @@ -860,7 +912,7 @@ int bson_append_time_t( bson *b, const char *name, time_t secs ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_start_object( bson *b, const char *name ); +MONGO_EXPORT int bson_append_start_object( bson *b, const char *name ); /** * Start appending a new array to a bson. @@ -870,7 +922,7 @@ int bson_append_start_object( bson *b, const char *name ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_start_array( bson *b, const char *name ); +MONGO_EXPORT int bson_append_start_array( bson *b, const char *name ); /** * Finish appending a new object or array to a bson. @@ -879,7 +931,7 @@ int bson_append_start_array( bson *b, const char *name ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_finish_object( bson *b ); +MONGO_EXPORT int bson_append_finish_object( bson *b ); /** * Finish appending a new object or array to a bson. This @@ -889,13 +941,13 @@ int bson_append_finish_object( bson *b ); * * @return BSON_OK or BSON_ERROR. */ -int bson_append_finish_array( bson *b ); +MONGO_EXPORT int bson_append_finish_array( bson *b ); void bson_numstr( char *str, int i ); void bson_incnumstr( char *str ); -/* Error handling and stadard library function over-riding. */ +/* Error handling and standard library function over-riding. */ /* -------------------------------------------------------- */ /* bson_err_handlers shouldn't return!!! */ @@ -912,7 +964,6 @@ extern void ( *bson_free )( void * ); extern bson_printf_func bson_printf; extern bson_fprintf_func bson_fprintf; extern bson_sprintf_func bson_sprintf; - extern bson_printf_func bson_errprintf; /** @@ -924,7 +975,7 @@ extern bson_printf_func bson_errprintf; * * @sa malloc(3) */ -void *bson_malloc( int size ); +MONGO_EXPORT void *bson_malloc( int size ); /** * Changes the size of allocated memory and checks return value, @@ -946,7 +997,7 @@ void *bson_realloc( void *ptr, int size ); * * @return the old error handling function, or NULL. */ -bson_err_handler set_bson_err_handler( bson_err_handler func ); +MONGO_EXPORT bson_err_handler set_bson_err_handler( bson_err_handler func ); /* does nothing if ok != 0 */ /** @@ -971,5 +1022,15 @@ void bson_fatal_msg( int ok, const char *msg ); */ void bson_builder_error( bson *b ); +/** + * Cast an int64_t to double. This is necessary for embedding in + * certain environments. + * + */ +MONGO_EXPORT double bson_int64_to_double( int64_t i64 ); + +MONGO_EXPORT void bson_swap_endian32( void *outp, const void *inp ); +MONGO_EXPORT void bson_swap_endian64( void *outp, const void *inp ); + MONGO_EXTERN_C_END #endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.c index 8d2da1502f..00ecf18c92 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.c @@ -1,5 +1,5 @@ /* - * Copyright 2009-2011 10gen, Inc. + * Copyright 2009-2012 10gen, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.h index a2a07c6d5d..f13c31ee89 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.h +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/encoding.h @@ -1,5 +1,5 @@ /* - * Copyright 2009-2011 10gen, Inc. + * Copyright 2009-2012 10gen, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef _BSON_ENCODING_H_ -#define _BSON_ENCODING_H_ +#ifndef BSON_ENCODING_H_ +#define BSON_ENCODING_H_ MONGO_EXTERN_C_START diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env.h new file mode 100644 index 0000000000..463ee32f79 --- /dev/null +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env.h @@ -0,0 +1,39 @@ +/** @file env.h */ + +/* Copyright 2009-2012 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Header for generic net.h */ +#ifndef MONGO_ENV_H_ +#define MONGO_ENV_H_ + +#include "mongo.h" + +MONGO_EXTERN_C_START + +/* This is a no-op in the generic implementation. */ +int mongo_env_set_socket_op_timeout( mongo *conn, int millis ); +int mongo_env_read_socket( mongo *conn, void *buf, int len ); +int mongo_env_write_socket( mongo *conn, const void *buf, int len ); +int mongo_env_socket_connect( mongo *conn, const char *host, int port ); + +/* Initialize socket services */ +MONGO_EXPORT int mongo_env_sock_init( void ); + +/* Close a socket */ +MONGO_EXPORT int mongo_env_close_socket( int socket ); + +MONGO_EXTERN_C_END +#endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_posix.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_posix.c new file mode 100644 index 0000000000..f1020ca80d --- /dev/null +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_posix.c @@ -0,0 +1,165 @@ +/* env_posix.c */ + +/* Copyright 2009-2012 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Networking and other niceties for POSIX systems. */ +#include "env.h" +#include "mongo.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NI_MAXSERV +# define NI_MAXSERV 32 +#endif + +int mongo_env_close_socket( int socket ) { + return close( socket ); +} + +int mongo_env_sock_init( void ) { + return 0; +} + +int mongo_env_write_socket( mongo *conn, const void *buf, int len ) { + const char *cbuf = buf; +#ifdef __APPLE__ + int flags = 0; +#else + int flags = MSG_NOSIGNAL; +#endif + + while ( len ) { + int sent = send( conn->sock, cbuf, len, flags ); + if ( sent == -1 ) { + if (errno == EPIPE) + conn->connected = 0; + __mongo_set_error( conn, MONGO_IO_ERROR, strerror( errno ), errno ); + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +int mongo_env_read_socket( mongo *conn, void *buf, int len ) { + char *cbuf = buf; + while ( len ) { + int sent = recv( conn->sock, cbuf, len, 0 ); + if ( sent == 0 || sent == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, strerror( errno ), errno ); + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +int mongo_env_set_socket_op_timeout( mongo *conn, int millis ) { + struct timeval tv; + tv.tv_sec = millis / 1000; + tv.tv_usec = ( millis % 1000 ) * 1000; + + if ( setsockopt( conn->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof( tv ) ) == -1 ) { + conn->err = MONGO_IO_ERROR; + __mongo_set_error( conn, MONGO_IO_ERROR, "setsockopt SO_RCVTIMEO failed.", errno ); + return MONGO_ERROR; + } + + if ( setsockopt( conn->sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof( tv ) ) == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, "setsockopt SO_SNDTIMEO failed.", errno ); + return MONGO_ERROR; + } + + return MONGO_OK; +} + +int mongo_env_socket_connect( mongo *conn, const char *host, int port ) { + char port_str[NI_MAXSERV]; + int status; + + struct addrinfo ai_hints; + struct addrinfo *ai_list = NULL; + struct addrinfo *ai_ptr = NULL; + + conn->sock = 0; + conn->connected = 0; + sprintf(port_str,"%d",port); + + bson_sprintf( port_str, "%d", port ); + + memset( &ai_hints, 0, sizeof( ai_hints ) ); +#ifdef AI_ADDRCONFIG + ai_hints.ai_flags = AI_ADDRCONFIG; +#endif + ai_hints.ai_family = AF_UNSPEC; + ai_hints.ai_socktype = SOCK_STREAM; + + status = getaddrinfo( host, port_str, &ai_hints, &ai_list ); + if ( status != 0 ) { + bson_errprintf( "getaddrinfo failed: %s", gai_strerror( status ) ); + conn->err = MONGO_CONN_ADDR_FAIL; + return MONGO_ERROR; + } + + for ( ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next ) { + conn->sock = socket( ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol ); + if ( conn->sock < 0 ) { + conn->sock = 0; + continue; + } + + status = connect( conn->sock, ai_ptr->ai_addr, ai_ptr->ai_addrlen ); + if ( status != 0 ) { + mongo_env_close_socket( conn->sock ); + conn->sock = 0; + continue; + } + + if ( ai_ptr->ai_protocol == IPPROTO_TCP ) { + int flag = 1; + + setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, + ( void * ) &flag, sizeof( flag ) ); + if ( conn->op_timeout_ms > 0 ) + mongo_env_set_socket_op_timeout( conn, conn->op_timeout_ms ); + } + + conn->connected = 1; + break; + } + + freeaddrinfo( ai_list ); + + if ( ! conn->connected ) { + conn->err = MONGO_CONN_FAIL; + return MONGO_ERROR; + } + + return MONGO_OK; +} diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_standard.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_standard.c new file mode 100644 index 0000000000..36fa9f65c4 --- /dev/null +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_standard.c @@ -0,0 +1,168 @@ +/* env_standard.c */ + +/* Copyright 2009-2012 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Vanilla networking designed to work on all systems. */ +#include "env.h" +#include +#include + +#ifdef _WIN32 + #ifdef _MSC_VER + #include // send,recv,socklen_t etc + #include // addrinfo + #else + #include + #include + typedef int socklen_t; + #endif +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#ifndef NI_MAXSERV +# define NI_MAXSERV 32 +#endif + +int mongo_env_close_socket( int socket ) { +#ifdef _WIN32 + return closesocket( socket ); +#else + return close( socket ); +#endif +} + +int mongo_env_write_socket( mongo *conn, const void *buf, int len ) { + const char *cbuf = buf; +#ifdef _WIN32 + int flags = 0; +#else +#ifdef __APPLE__ + int flags = 0; +#else + int flags = MSG_NOSIGNAL; +#endif +#endif + + while ( len ) { + int sent = send( conn->sock, cbuf, len, flags ); + if ( sent == -1 ) { + if (errno == EPIPE) + conn->connected = 0; + conn->err = MONGO_IO_ERROR; + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +int mongo_env_read_socket( mongo *conn, void *buf, int len ) { + char *cbuf = buf; + while ( len ) { + int sent = recv( conn->sock, cbuf, len, 0 ); + if ( sent == 0 || sent == -1 ) { + conn->err = MONGO_IO_ERROR; + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +/* This is a no-op in the generic implementation. */ +int mongo_env_set_socket_op_timeout( mongo *conn, int millis ) { + return MONGO_OK; +} + +int mongo_env_socket_connect( mongo *conn, const char *host, int port ) { + struct sockaddr_in sa; + socklen_t addressSize; + int flag = 1; + + if ( ( conn->sock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { + conn->sock = 0; + conn->err = MONGO_CONN_NO_SOCKET; + return MONGO_ERROR; + } + + memset( sa.sin_zero , 0 , sizeof( sa.sin_zero ) ); + sa.sin_family = AF_INET; + sa.sin_port = htons( port ); + sa.sin_addr.s_addr = inet_addr( host ); + addressSize = sizeof( sa ); + + if ( connect( conn->sock, ( struct sockaddr * )&sa, addressSize ) == -1 ) { + mongo_env_close_socket( conn->sock ); + conn->connected = 0; + conn->sock = 0; + conn->err = MONGO_CONN_FAIL; + return MONGO_ERROR; + } + + setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, ( char * ) &flag, sizeof( flag ) ); + + if( conn->op_timeout_ms > 0 ) + mongo_env_set_socket_op_timeout( conn, conn->op_timeout_ms ); + + conn->connected = 1; + + return MONGO_OK; +} + +MONGO_EXPORT int mongo_env_sock_init( void ) { + +#if defined(_WIN32) + WSADATA wsaData; + WORD wVers; +#elif defined(SIGPIPE) + struct sigaction act; +#endif + + static int called_once; + static int retval; + if (called_once) return retval; + called_once = 1; + +#if defined(_WIN32) + wVers = MAKEWORD(1, 1); + retval = (WSAStartup(wVers, &wsaData) == 0); +#elif defined(MACINTOSH) + GUSISetup(GUSIwithInternetSockets); + retval = 1; +#elif defined(SIGPIPE) + retval = 1; + if (sigaction(SIGPIPE, (struct sigaction *)NULL, &act) < 0) + retval = 0; + else if (act.sa_handler == SIG_DFL) { + act.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &act, (struct sigaction *)NULL) < 0) + retval = 0; + } +#endif + return retval; +} diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_win32.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_win32.c new file mode 100644 index 0000000000..0b301cea61 --- /dev/null +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/env_win32.c @@ -0,0 +1,183 @@ +/* env_win32.c */ + +/* Copyright 2009-2012 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Networking and other niceties for WIN32. */ +#include "env.h" +#include "mongo.h" +#include + +#ifdef _MSC_VER +#include // send,recv,socklen_t etc +#include // addrinfo +#else +#include +#include +typedef int socklen_t; +#endif + +#ifndef NI_MAXSERV +# define NI_MAXSERV 32 +#endif + +static void mongo_clear_errors( mongo *conn ) { + conn->err = 0; + memset( conn->errstr, 0, MONGO_ERR_LEN ); +} + +int mongo_env_close_socket( int socket ) { + return closesocket( socket ); +} + +int mongo_env_write_socket( mongo *conn, const void *buf, int len ) { + const char *cbuf = buf; + int flags = 0; + + while ( len ) { + int sent = send( conn->sock, cbuf, len, flags ); + if ( sent == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, NULL, WSAGetLastError() ); + conn->connected = 0; + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +int mongo_env_read_socket( mongo *conn, void *buf, int len ) { + char *cbuf = buf; + + while ( len ) { + int sent = recv( conn->sock, cbuf, len, 0 ); + if ( sent == 0 || sent == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, NULL, WSAGetLastError() ); + return MONGO_ERROR; + } + cbuf += sent; + len -= sent; + } + + return MONGO_OK; +} + +int mongo_env_set_socket_op_timeout( mongo *conn, int millis ) { + if ( setsockopt( conn->sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&millis, + sizeof( millis ) ) == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, "setsockopt SO_RCVTIMEO failed.", + WSAGetLastError() ); + return MONGO_ERROR; + } + + if ( setsockopt( conn->sock, SOL_SOCKET, SO_SNDTIMEO, (const char *)&millis, + sizeof( millis ) ) == -1 ) { + __mongo_set_error( conn, MONGO_IO_ERROR, "setsockopt SO_SNDTIMEO failed.", + WSAGetLastError() ); + return MONGO_ERROR; + } + + return MONGO_OK; +} + +int mongo_env_socket_connect( mongo *conn, const char *host, int port ) { + char port_str[NI_MAXSERV]; + char errstr[MONGO_ERR_LEN]; + int status; + + struct addrinfo ai_hints; + struct addrinfo *ai_list = NULL; + struct addrinfo *ai_ptr = NULL; + + conn->sock = 0; + conn->connected = 0; + + bson_sprintf( port_str, "%d", port ); + + memset( &ai_hints, 0, sizeof( ai_hints ) ); + ai_hints.ai_family = AF_UNSPEC; + ai_hints.ai_socktype = SOCK_STREAM; + ai_hints.ai_protocol = IPPROTO_TCP; + + status = getaddrinfo( host, port_str, &ai_hints, &ai_list ); + if ( status != 0 ) { + bson_sprintf( errstr, "getaddrinfo failed with error %d", status ); + __mongo_set_error( conn, MONGO_CONN_ADDR_FAIL, errstr, WSAGetLastError() ); + return MONGO_ERROR; + } + + for ( ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next ) { + conn->sock = socket( ai_ptr->ai_family, ai_ptr->ai_socktype, + ai_ptr->ai_protocol ); + + if ( conn->sock < 0 ) { + __mongo_set_error( conn, MONGO_SOCKET_ERROR, "socket() failed", + WSAGetLastError() ); + conn->sock = 0; + continue; + } + + status = connect( conn->sock, ai_ptr->ai_addr, ai_ptr->ai_addrlen ); + if ( status != 0 ) { + __mongo_set_error( conn, MONGO_SOCKET_ERROR, "connect() failed", + WSAGetLastError() ); + mongo_env_close_socket( conn->sock ); + conn->sock = 0; + continue; + } + + if ( ai_ptr->ai_protocol == IPPROTO_TCP ) { + int flag = 1; + + setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, + ( void * ) &flag, sizeof( flag ) ); + + if ( conn->op_timeout_ms > 0 ) + mongo_env_set_socket_op_timeout( conn, conn->op_timeout_ms ); + } + + conn->connected = 1; + break; + } + + freeaddrinfo( ai_list ); + + if ( ! conn->connected ) { + conn->err = MONGO_CONN_FAIL; + return MONGO_ERROR; + } + else { + mongo_clear_errors( conn ); + return MONGO_OK; + } +} + +MONGO_EXPORT int mongo_env_sock_init( void ) { + + WSADATA wsaData; + WORD wVers; + static int called_once; + static int retval; + + if (called_once) return retval; + + called_once = 1; + wVers = MAKEWORD(1, 1); + retval = (WSAStartup(wVers, &wsaData) == 0); + + return retval; +} diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/gridfs.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/gridfs.c index f51b397d3f..9b2d1455ef 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/gridfs.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/gridfs.c @@ -1,6 +1,6 @@ /* gridfs.c */ -/* Copyright 2009-2011 10gen Inc. +/* Copyright 2009-2012 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,27 @@ #include #include +MONGO_EXPORT gridfs* gridfs_create() { + return (gridfs*)bson_malloc(sizeof(gridfs)); +} + +MONGO_EXPORT void gridfs_dispose(gridfs* gfs) { + free(gfs); +} + +MONGO_EXPORT gridfile* gridfile_create() { + return (gridfile*)bson_malloc(sizeof(gridfile)); +} + +MONGO_EXPORT void gridfile_dispose(gridfile* gf) { + free(gf); +} + +MONGO_EXPORT void gridfile_get_descriptor(gridfile* gf, bson* out) { + *out = *gf->meta; +} + + static bson *chunk_new( bson_oid_t id, int chunkNumber, const char *data, int len ) { bson *b = bson_malloc( sizeof( bson ) ); @@ -104,7 +125,7 @@ int gridfs_init( mongo *client, const char *dbname, const char *prefix, return MONGO_OK; } -void gridfs_destroy( gridfs *gfs ) { +MONGO_EXPORT void gridfs_destroy( gridfs *gfs ) { if ( gfs == NULL ) return; if ( gfs->dbname ) bson_free( ( char * )gfs->dbname ); if ( gfs->prefix ) bson_free( ( char * )gfs->prefix ); @@ -120,14 +141,17 @@ static int gridfs_insert_file( gridfs *gfs, const char *name, bson res; bson_iterator it; int result; + int64_t d; /* Check run md5 */ bson_init( &command ); bson_append_oid( &command, "filemd5", &id ); bson_append_string( &command, "root", gfs->prefix ); bson_finish( &command ); - assert( mongo_run_command( gfs->client, gfs->dbname, &command, &res ) == MONGO_OK ); + result = mongo_run_command( gfs->client, gfs->dbname, &command, &res ); bson_destroy( &command ); + if (result != MONGO_OK) + return result; /* Create and insert BSON for file metadata */ bson_init( &ret ); @@ -137,7 +161,8 @@ static int gridfs_insert_file( gridfs *gfs, const char *name, } bson_append_long( &ret, "length", length ); bson_append_int( &ret, "chunkSize", DEFAULT_CHUNK_SIZE ); - bson_append_date( &ret, "uploadDate", ( bson_date_t )1000*time( NULL ) ); + d = ( bson_date_t )1000*time( NULL ); + bson_append_date( &ret, "uploadDate", d); bson_find( &it, &res, "md5" ); bson_append_string( &ret, "md5", bson_iterator_string( &it ) ); bson_destroy( &res ); @@ -151,7 +176,7 @@ static int gridfs_insert_file( gridfs *gfs, const char *name, return result; } -int gridfs_store_buffer( gridfs *gfs, const char *data, +MONGO_EXPORT int gridfs_store_buffer( gridfs *gfs, const char *data, gridfs_offset length, const char *remotename, const char *contenttype ) { @@ -163,7 +188,7 @@ int gridfs_store_buffer( gridfs *gfs, const char *data, bson *oChunk; /* Large files Assertion */ - assert( length <= 0xffffffff ); + /* assert( length <= 0xffffffff ); */ /* Generate and append an oid*/ bson_oid_gen( &id ); @@ -183,7 +208,7 @@ int gridfs_store_buffer( gridfs *gfs, const char *data, return gridfs_insert_file( gfs, remotename, id, length, contenttype ); } -void gridfile_writer_init( gridfile *gfile, gridfs *gfs, +MONGO_EXPORT void gridfile_writer_init( gridfile *gfile, gridfs *gfs, const char *remote_name, const char *content_type ) { gfile->gfs = gfs; @@ -200,7 +225,7 @@ void gridfile_writer_init( gridfile *gfile, gridfs *gfs, strcpy( ( char * )gfile->content_type, content_type ); } -void gridfile_write_buffer( gridfile *gfile, const char *data, +MONGO_EXPORT void gridfile_write_buffer( gridfile *gfile, const char *data, gridfs_offset length ) { int bytes_left = 0; @@ -221,14 +246,13 @@ void gridfile_write_buffer( gridfile *gfile, const char *data, gfile->pending_len += length; } else { /* At least one chunk of data to write */ + chunks_to_write = to_write / DEFAULT_CHUNK_SIZE; + bytes_left = to_write % DEFAULT_CHUNK_SIZE; /* If there's a pending chunk to be written, we need to combine * the buffer provided up to DEFAULT_CHUNK_SIZE. */ if ( gfile->pending_len > 0 ) { - chunks_to_write = to_write / DEFAULT_CHUNK_SIZE; - bytes_left = to_write % DEFAULT_CHUNK_SIZE; - data_partial_len = DEFAULT_CHUNK_SIZE - gfile->pending_len; buffer = ( char * )bson_malloc( DEFAULT_CHUNK_SIZE ); memcpy( buffer, gfile->pending_data, gfile->pending_len ); @@ -270,7 +294,7 @@ void gridfile_write_buffer( gridfile *gfile, const char *data, } } -int gridfile_writer_done( gridfile *gfile ) { +MONGO_EXPORT int gridfile_writer_done( gridfile *gfile ) { /* write any remaining pending chunk data. * pending data will always take up less than one chunk */ @@ -307,8 +331,11 @@ int gridfs_store_file( gridfs *gfs, const char *filename, /* Open the file and the correct stream */ if ( strcmp( filename, "-" ) == 0 ) fd = stdin; - else fd = fopen( filename, "rb" ); - assert( fd != NULL ); /* No such file */ + else { + fd = fopen( filename, "rb" ); + if (fd == NULL) + return MONGO_ERROR; + } /* Generate and append an oid*/ bson_oid_gen( &id ); @@ -339,7 +366,7 @@ int gridfs_store_file( gridfs *gfs, const char *filename, return gridfs_insert_file( gfs, remotename, id, length, contenttype ); } -void gridfs_remove_filename( gridfs *gfs, const char *filename ) { +MONGO_EXPORT void gridfs_remove_filename( gridfs *gfs, const char *filename ) { bson query; mongo_cursor *files; bson file; @@ -433,7 +460,7 @@ int gridfile_init( gridfs *gfs, bson *meta, gridfile *gfile ) return MONGO_OK; } -void gridfile_destroy( gridfile *gfile ) +MONGO_EXPORT void gridfile_destroy( gridfile *gfile ) { bson_destroy( gfile->meta ); @@ -444,21 +471,21 @@ bson_bool_t gridfile_exists( gridfile *gfile ) { return ( bson_bool_t )( gfile != NULL || gfile->meta == NULL ); } -const char *gridfile_get_filename( gridfile *gfile ) { +MONGO_EXPORT const char *gridfile_get_filename( gridfile *gfile ) { bson_iterator it; bson_find( &it, gfile->meta, "filename" ); return bson_iterator_string( &it ); } -int gridfile_get_chunksize( gridfile *gfile ) { +MONGO_EXPORT int gridfile_get_chunksize( gridfile *gfile ) { bson_iterator it; bson_find( &it, gfile->meta, "chunkSize" ); return bson_iterator_int( &it ); } -gridfs_offset gridfile_get_contentlength( gridfile *gfile ) { +MONGO_EXPORT gridfs_offset gridfile_get_contentlength( gridfile *gfile ) { bson_iterator it; bson_find( &it, gfile->meta, "length" ); @@ -469,7 +496,7 @@ gridfs_offset gridfile_get_contentlength( gridfile *gfile ) { return ( gridfs_offset )bson_iterator_long( &it ); } -const char *gridfile_get_contenttype( gridfile *gfile ) { +MONGO_EXPORT const char *gridfile_get_contenttype( gridfile *gfile ) { bson_iterator it; if ( bson_find( &it, gfile->meta, "contentType" ) ) @@ -477,14 +504,14 @@ const char *gridfile_get_contenttype( gridfile *gfile ) { else return NULL; } -bson_date_t gridfile_get_uploaddate( gridfile *gfile ) { +MONGO_EXPORT bson_date_t gridfile_get_uploaddate( gridfile *gfile ) { bson_iterator it; bson_find( &it, gfile->meta, "uploadDate" ); return bson_iterator_date( &it ); } -const char *gridfile_get_md5( gridfile *gfile ) { +MONGO_EXPORT const char *gridfile_get_md5( gridfile *gfile ) { bson_iterator it; bson_find( &it, gfile->meta, "md5" ); @@ -505,20 +532,16 @@ bson_bool_t gridfile_get_boolean( gridfile *gfile, const char *name ) { return bson_iterator_bool( &it ); } -bson gridfile_get_metadata( gridfile *gfile ) { - bson sub; +MONGO_EXPORT void gridfile_get_metadata( gridfile *gfile, bson* out ) { bson_iterator it; - if ( bson_find( &it, gfile->meta, "metadata" ) ) { - bson_iterator_subobject( &it, &sub ); - return sub; - } else { - bson_empty( &sub ); - return sub; - } + if ( bson_find( &it, gfile->meta, "metadata" ) ) + bson_iterator_subobject( &it, out ); + else + bson_empty( out ); } -int gridfile_get_numchunks( gridfile *gfile ) { +MONGO_EXPORT int gridfile_get_numchunks( gridfile *gfile ) { bson_iterator it; gridfs_offset length; gridfs_offset chunkSize; @@ -539,11 +562,12 @@ int gridfile_get_numchunks( gridfile *gfile ) { : ( int )( numchunks ); } -bson gridfile_get_chunk( gridfile *gfile, int n ) { +MONGO_EXPORT void gridfile_get_chunk( gridfile *gfile, int n, bson* out ) { bson query; - bson out; + bson_iterator it; bson_oid_t id; + int result; bson_init( &query ); bson_find( &it, gfile->meta, "_id" ); @@ -552,15 +576,18 @@ bson gridfile_get_chunk( gridfile *gfile, int n ) { bson_append_int( &query, "n", n ); bson_finish( &query ); - assert( mongo_find_one( gfile->gfs->client, - gfile->gfs->chunks_ns, - &query, NULL, &out ) == MONGO_OK ); - + result = (mongo_find_one(gfile->gfs->client, + gfile->gfs->chunks_ns, + &query, NULL, out ) == MONGO_OK ); bson_destroy( &query ); - return out; + if (!result) { + bson empty; + bson_empty(&empty); + bson_copy(out, &empty); + } } -mongo_cursor *gridfile_get_chunks( gridfile *gfile, int start, int size ) { +MONGO_EXPORT mongo_cursor *gridfile_get_chunks( gridfile *gfile, int start, int size ) { bson_iterator it; bson_oid_t id; bson gte; @@ -613,18 +640,18 @@ gridfs_offset gridfile_write_file( gridfile *gfile, FILE *stream ) { const int num = gridfile_get_numchunks( gfile ); for ( i=0; i Length of pending_data buffer */ } gridfile; +MONGO_EXPORT gridfs* gridfs_create(); +MONGO_EXPORT void gridfs_dispose(gridfs* gfs); +MONGO_EXPORT gridfile* gridfile_create(); +MONGO_EXPORT void gridfile_dispose(gridfile* gf); +MONGO_EXPORT void gridfile_get_descriptor(gridfile* gf, bson* out); + /** * Initializes a GridFS object * @param client - db connection @@ -60,7 +66,7 @@ typedef struct { * * @return - MONGO_OK or MONGO_ERROR. */ -int gridfs_init( mongo *client, const char *dbname, +MONGO_EXPORT int gridfs_init( mongo *client, const char *dbname, const char *prefix, gridfs *gfs ); /** @@ -69,7 +75,7 @@ int gridfs_init( mongo *client, const char *dbname, * * @param gfs a grid */ -void gridfs_destroy( gridfs *gfs ); +MONGO_EXPORT void gridfs_destroy( gridfs *gfs ); /** * Initializes a gridfile for writing incrementally with gridfs_write_buffer. @@ -77,7 +83,7 @@ void gridfs_destroy( gridfs *gfs ); * When done, you must call gridfs_writer_done to save the file metadata. * */ -void gridfile_writer_init( gridfile *gfile, gridfs *gfs, const char *remote_name, +MONGO_EXPORT void gridfile_writer_init( gridfile *gfile, gridfs *gfs, const char *remote_name, const char *content_type ); /** @@ -86,7 +92,7 @@ void gridfile_writer_init( gridfile *gfile, gridfs *gfs, const char *remote_name * stream to a GridFS file. When finished, be sure to call gridfs_writer_done. * */ -void gridfile_write_buffer( gridfile *gfile, const char *data, +MONGO_EXPORT void gridfile_write_buffer( gridfile *gfile, const char *data, gridfs_offset length ); /** @@ -96,7 +102,7 @@ void gridfile_write_buffer( gridfile *gfile, const char *data, * * @return - MONGO_OK or MONGO_ERROR. */ -int gridfile_writer_done( gridfile *gfile ); +MONGO_EXPORT int gridfile_writer_done( gridfile *gfile ); /** * Store a buffer as a GridFS file. @@ -108,7 +114,7 @@ int gridfile_writer_done( gridfile *gfile ); * * @return - MONGO_OK or MONGO_ERROR. */ -int gridfs_store_buffer( gridfs *gfs, const char *data, gridfs_offset length, +MONGO_EXPORT int gridfs_store_buffer( gridfs *gfs, const char *data, gridfs_offset length, const char *remotename, const char *contenttype ); @@ -121,7 +127,7 @@ int gridfs_store_buffer( gridfs *gfs, const char *data, gridfs_offset length, * * @return - MONGO_OK or MONGO_ERROR. */ -int gridfs_store_file( gridfs *gfs, const char *filename, +MONGO_EXPORT int gridfs_store_file( gridfs *gfs, const char *filename, const char *remotename, const char *contenttype ); /** @@ -129,7 +135,7 @@ int gridfs_store_file( gridfs *gfs, const char *filename, * @param gfs - the working GridFS * @param filename - the filename of the file/s to be removed */ -void gridfs_remove_filename( gridfs *gfs, const char *filename ); +MONGO_EXPORT void gridfs_remove_filename( gridfs *gfs, const char *filename ); /** * Find the first file matching the provided query within the @@ -141,7 +147,7 @@ void gridfs_remove_filename( gridfs *gfs, const char *filename ); * * @return MONGO_OK if successful, MONGO_ERROR otherwise */ -int gridfs_find_query( gridfs *gfs, bson *query, gridfile *gfile ); +MONGO_EXPORT int gridfs_find_query( gridfs *gfs, bson *query, gridfile *gfile ); /** * Find the first file referenced by filename within the GridFS @@ -152,7 +158,7 @@ int gridfs_find_query( gridfs *gfs, bson *query, gridfile *gfile ); * * @return MONGO_OK or MONGO_ERROR. */ -int gridfs_find_filename( gridfs *gfs, const char *filename, gridfile *gfile ); +MONGO_EXPORT int gridfs_find_filename( gridfs *gfs, const char *filename, gridfile *gfile ); /** * Initializes a GridFile containing the GridFS and file bson @@ -162,20 +168,20 @@ int gridfs_find_filename( gridfs *gfs, const char *filename, gridfile *gfile ); * * @return - MONGO_OK or MONGO_ERROR. */ -int gridfile_init( gridfs *gfs, bson *meta, gridfile *gfile ); +MONGO_EXPORT int gridfile_init( gridfs *gfs, bson *meta, gridfile *gfile ); /** * Destroys the GridFile * * @param oGridFIle - the GridFile being destroyed */ -void gridfile_destroy( gridfile *gfile ); +MONGO_EXPORT void gridfile_destroy( gridfile *gfile ); /** * Returns whether or not the GridFile exists * @param gfile - the GridFile being examined */ -bson_bool_t gridfile_exists( gridfile *gfile ); +MONGO_EXPORT bson_bool_t gridfile_exists( gridfile *gfile ); /** * Returns the filename of GridFile @@ -183,7 +189,7 @@ bson_bool_t gridfile_exists( gridfile *gfile ); * * @return - the filename of the Gridfile */ -const char *gridfile_get_filename( gridfile *gfile ); +MONGO_EXPORT const char *gridfile_get_filename( gridfile *gfile ); /** * Returns the size of the chunks of the GridFile @@ -191,7 +197,7 @@ const char *gridfile_get_filename( gridfile *gfile ); * * @return - the size of the chunks of the Gridfile */ -int gridfile_get_chunksize( gridfile *gfile ); +MONGO_EXPORT int gridfile_get_chunksize( gridfile *gfile ); /** * Returns the length of GridFile's data @@ -200,7 +206,7 @@ int gridfile_get_chunksize( gridfile *gfile ); * * @return - the length of the Gridfile's data */ -gridfs_offset gridfile_get_contentlength( gridfile *gfile ); +MONGO_EXPORT gridfs_offset gridfile_get_contentlength( gridfile *gfile ); /** * Returns the MIME type of the GridFile @@ -210,7 +216,7 @@ gridfs_offset gridfile_get_contentlength( gridfile *gfile ); * @return - the MIME type of the Gridfile * (NULL if no type specified) */ -const char *gridfile_get_contenttype( gridfile *gfile ); +MONGO_EXPORT const char *gridfile_get_contenttype( gridfile *gfile ); /** * Returns the upload date of GridFile @@ -219,7 +225,7 @@ const char *gridfile_get_contenttype( gridfile *gfile ); * * @return - the upload date of the Gridfile */ -bson_date_t gridfile_get_uploaddate( gridfile *gfile ); +MONGO_EXPORT bson_date_t gridfile_get_uploaddate( gridfile *gfile ); /** * Returns the MD5 of GridFile @@ -228,7 +234,7 @@ bson_date_t gridfile_get_uploaddate( gridfile *gfile ); * * @return - the MD5 of the Gridfile */ -const char *gridfile_get_md5( gridfile *gfile ); +MONGO_EXPORT const char *gridfile_get_md5( gridfile *gfile ); /** * Returns the field in GridFile specified by name @@ -260,7 +266,7 @@ bson_bool_t gridfile_get_boolean( gridfile *gfile, * @return - the metadata of the Gridfile in a bson object * (an empty bson is returned if none exists) */ -bson gridfile_get_metadata( gridfile *gfile ); +MONGO_EXPORT void gridfile_get_metadata( gridfile *gfile, bson* out ); /** * Returns the number of chunks in the GridFile @@ -268,7 +274,7 @@ bson gridfile_get_metadata( gridfile *gfile ); * * @return - the number of chunks in the Gridfile */ -int gridfile_get_numchunks( gridfile *gfile ); +MONGO_EXPORT int gridfile_get_numchunks( gridfile *gfile ); /** * Returns chunk n of GridFile @@ -276,7 +282,7 @@ int gridfile_get_numchunks( gridfile *gfile ); * * @return - the nth chunk of the Gridfile */ -bson gridfile_get_chunk( gridfile *gfile, int n ); +MONGO_EXPORT void gridfile_get_chunk( gridfile *gfile, int n, bson* out ); /** * Returns a mongo_cursor of *size* chunks starting with chunk *start* @@ -287,7 +293,7 @@ bson gridfile_get_chunk( gridfile *gfile, int n ); * * @return - mongo_cursor of the chunks (must be destroyed after use) */ -mongo_cursor *gridfile_get_chunks( gridfile *gfile, int start, int size ); +MONGO_EXPORT mongo_cursor *gridfile_get_chunks( gridfile *gfile, int start, int size ); /** * Writes the GridFile to a stream @@ -295,7 +301,7 @@ mongo_cursor *gridfile_get_chunks( gridfile *gfile, int start, int size ); * @param gfile - the working GridFile * @param stream - the file stream to write to */ -gridfs_offset gridfile_write_file( gridfile *gfile, FILE *stream ); +MONGO_EXPORT gridfs_offset gridfile_write_file( gridfile *gfile, FILE *stream ); /** * Reads length bytes from the GridFile to a buffer @@ -309,7 +315,7 @@ gridfs_offset gridfile_write_file( gridfile *gfile, FILE *stream ); * * @return - the number of bytes read */ -gridfs_offset gridfile_read( gridfile *gfile, gridfs_offset size, char *buf ); +MONGO_EXPORT gridfs_offset gridfile_read( gridfile *gfile, gridfs_offset size, char *buf ); /** * Updates the position in the file @@ -321,6 +327,6 @@ gridfs_offset gridfile_read( gridfile *gfile, gridfs_offset size, char *buf ); * * @return - resulting offset location */ -gridfs_offset gridfile_seek( gridfile *gfile, gridfs_offset offset ); +MONGO_EXPORT gridfs_offset gridfile_seek( gridfile *gfile, gridfs_offset offset ); #endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.c index d1c1e3ab0b..68edd29513 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.c @@ -309,7 +309,7 @@ mongo_md5_process(mongo_md5_state_t *pms, const mongo_md5_byte_t *data /*[64]*/) pms->abcd[3] += d; } -void +MONGO_EXPORT void mongo_md5_init(mongo_md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; @@ -319,7 +319,7 @@ mongo_md5_init(mongo_md5_state_t *pms) pms->abcd[3] = 0x10325476; } -void +MONGO_EXPORT void mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbytes) { const mongo_md5_byte_t *p = data; @@ -357,7 +357,7 @@ mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbyte memcpy(pms->buf, p, left); } -void +MONGO_EXPORT void mongo_md5_finish(mongo_md5_state_t *pms, mongo_md5_byte_t digest[16]) { static const mongo_md5_byte_t pad[64] = { diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.h index 540da3a584..342b6a7307 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.h +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/md5.h @@ -47,8 +47,8 @@ 1999-05-03 lpd Original version. */ -#ifndef md5_INCLUDED -# define md5_INCLUDED +#ifndef MONGO_MD5_H_ +#define MONGO_MD5_H_ /* * This package supports both compile-time and run-time determination of CPU @@ -59,6 +59,7 @@ * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ +#include "bson.h" typedef unsigned char mongo_md5_byte_t; /* 8-bit byte */ typedef unsigned int mongo_md5_word_t; /* 32-bit word */ @@ -75,17 +76,17 @@ extern "C" { #endif - /* Initialize the algorithm. */ - void mongo_md5_init(mongo_md5_state_t *pms); +/* Initialize the algorithm. */ +MONGO_EXPORT void mongo_md5_init(mongo_md5_state_t *pms); - /* Append a string to the message. */ - void mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbytes); +/* Append a string to the message. */ +MONGO_EXPORT void mongo_md5_append(mongo_md5_state_t *pms, const mongo_md5_byte_t *data, int nbytes); - /* Finish the message and return the digest. */ - void mongo_md5_finish(mongo_md5_state_t *pms, mongo_md5_byte_t digest[16]); +/* Finish the message and return the digest. */ +MONGO_EXPORT void mongo_md5_finish(mongo_md5_state_t *pms, mongo_md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif -#endif /* md5_INCLUDED */ +#endif /* MONGO_MD5_H_ */ diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.c index 2090e74312..eb16392297 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.c @@ -1,6 +1,6 @@ /* mongo.c */ -/* Copyright 2009-2011 10gen Inc. +/* Copyright 2009-2012 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,19 +17,235 @@ #include "mongo.h" #include "md5.h" +#include "env.h" #include #include #include #include -#ifdef _USE_LINUX_SYSTEM -#include "platform/linux/net.h" -#elif defined _USE_CUSTOM_SYSTEM -#include "platform/custom/net.h" -#else -#include "net.h" -#endif +MONGO_EXPORT mongo* mongo_create() { + return (mongo*)bson_malloc(sizeof(mongo)); +} + + +MONGO_EXPORT void mongo_dispose(mongo* conn) { + free(conn); +} + +MONGO_EXPORT int mongo_get_err(mongo* conn) { + return conn->err; +} + + +MONGO_EXPORT int mongo_is_connected(mongo* conn) { + return conn->connected != 0; +} + + +MONGO_EXPORT int mongo_get_op_timeout(mongo* conn) { + return conn->op_timeout_ms; +} + + +const char* _get_host_port(mongo_host_port* hp) { + static char _hp[sizeof(hp->host)+12]; + bson_sprintf(_hp, "%s:%d", hp->host, hp->port); + return _hp; +} + + +MONGO_EXPORT const char* mongo_get_primary(mongo* conn) { + mongo* conn_ = (mongo*)conn; + return _get_host_port(conn_->primary); +} + + +MONGO_EXPORT int mongo_get_socket(mongo* conn) { + mongo* conn_ = (mongo*)conn; + return conn_->sock; +} + + +MONGO_EXPORT int mongo_get_host_count(mongo* conn) { + mongo_replset* r = conn->replset; + mongo_host_port* hp; + int count = 0; + if (!r) return 0; + for (hp = r->hosts; hp; hp = hp->next) + ++count; + return count; +} + + +MONGO_EXPORT const char* mongo_get_host(mongo* conn, int i) { + mongo_replset* r = conn->replset; + mongo_host_port* hp; + int count = 0; + if (!r) return 0; + for (hp = r->hosts; hp; hp = hp->next) { + if (count == i) + return _get_host_port(hp); + ++count; + } + return 0; +} + + +MONGO_EXPORT mongo_cursor* mongo_cursor_create() { + return (mongo_cursor*)bson_malloc(sizeof(mongo_cursor)); +} + + +MONGO_EXPORT void mongo_cursor_dispose(mongo_cursor* cursor) { + free(cursor); +} + + +MONGO_EXPORT int mongo_get_server_err(mongo* conn) { + return conn->lasterrcode; +} + + +MONGO_EXPORT const char* mongo_get_server_err_string(mongo* conn) { + return conn->lasterrstr; +} + +MONGO_EXPORT void __mongo_set_error( mongo *conn, mongo_error_t err, const char *str, + int errcode ) { + int errstr_size, str_size; + + conn->err = err; + conn->errcode = errcode; + + if( str ) { + str_size = strlen( str ) + 1; + errstr_size = str_size > MONGO_ERR_LEN ? MONGO_ERR_LEN : str_size; + memcpy( conn->errstr, str, errstr_size ); + conn->errstr[errstr_size] = '\0'; + } +} + +MONGO_EXPORT void mongo_clear_errors( mongo *conn ) { + conn->err = 0; + conn->errcode = 0; + conn->lasterrcode = 0; + memset( conn->errstr, 0, MONGO_ERR_LEN ); + memset( conn->lasterrstr, 0, MONGO_ERR_LEN ); +} + +MONGO_EXPORT int mongo_validate_ns( mongo *conn, const char *ns ) { + char *last = NULL; + char *current = NULL; + const char *db_name = ns; + char *collection_name = NULL; + char errmsg[64]; + int ns_len = 0; + + /* If the first character is a '.', fail. */ + if( *ns == '.' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, "ns cannot start with a '.'.", 0 ); + return MONGO_ERROR; + } + + /* Find the division between database and collection names. */ + for( current = (char *)ns; *current != '\0'; current++ ) { + if( *current == '.' ) { + current++; + break; + } + } + + /* Fail because the ns doesn't contain a '.' + * or the collection part starts with a dot. */ + if( *current == '\0' || *current == '.' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, "ns cannot start with a '.'.", 0 ); + return MONGO_ERROR; + } + + /* Fail if collection length is 0. */ + if( *(current + 1) == '\0' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, "Collection name missing.", 0 ); + return MONGO_ERROR; + } + + + /* Point to the beginning of the collection name. */ + collection_name = current; + + /* Ensure that the database name is greater than one char.*/ + if( collection_name - 1 == db_name ) { + __mongo_set_error( conn, MONGO_NS_INVALID, "Database name missing.", 0 ); + return MONGO_ERROR; + } + + /* Go back and validate the database name. */ + for( current = (char *)db_name; *current != '.'; current++ ) { + switch( *current ) { + case ' ': + case '$': + case '/': + case '\\': + __mongo_set_error( conn, MONGO_NS_INVALID, + "Database name may not contain ' ', '$', '/', or '\\'", 0 ); + return MONGO_ERROR; + default: + break; + } + + ns_len++; + } + + /* Add one to the length for the '.' character. */ + ns_len++; + + /* Now validate the collection name. */ + for( current = collection_name; *current != '\0'; current++ ) { + + /* Cannot have two consecutive dots. */ + if( last && *last == '.' && *current == '.' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, + "Collection may not contain two consecutive '.'", 0 ); + return MONGO_ERROR; + } + + /* Cannot contain a '$' */ + if( *current == '$' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, + "Collection may not contain '$'", 0 ); + return MONGO_ERROR; + } + + last = current; + ns_len++; + } + + if( ns_len > 128 ) { + bson_sprintf( errmsg, "Namespace too long; has %d but must <= 128.", + ns_len ); + __mongo_set_error( conn, MONGO_NS_INVALID, errmsg, 0 ); + return MONGO_ERROR; + } + + /* Cannot end with a '.' */ + if( *(current - 1) == '.' ) { + __mongo_set_error( conn, MONGO_NS_INVALID, + "Collection may not end with '.'", 0 ); + return MONGO_ERROR; + } + + return MONGO_OK; +} + +static void mongo_set_last_error( mongo *conn, bson_iterator *it, bson *obj ) { + int result_len = bson_iterator_string_len( it ); + const char *result_string = bson_iterator_string( it ); + int len = result_len < MONGO_ERR_LEN ? result_len : MONGO_ERR_LEN; + memcpy( conn->lasterrstr, result_string, len ); + + if( bson_find( it, obj, "code" ) != BSON_NULL ) + conn->lasterrcode = bson_iterator_int( it ); +} static const int ZERO = 0; static const int ONE = 1; @@ -57,13 +273,13 @@ int mongo_message_send( mongo *conn, mongo_message *mm ) { bson_little_endian32( &head.responseTo, &mm->head.responseTo ); bson_little_endian32( &head.op, &mm->head.op ); - res = mongo_write_socket( conn, &head, sizeof( head ) ); + res = mongo_env_write_socket( conn, &head, sizeof( head ) ); if( res != MONGO_OK ) { bson_free( mm ); return res; } - res = mongo_write_socket( conn, &mm->data, mm->head.len - sizeof( head ) ); + res = mongo_env_write_socket( conn, &mm->data, mm->head.len - sizeof( head ) ); if( res != MONGO_OK ) { bson_free( mm ); return res; @@ -80,8 +296,8 @@ int mongo_read_response( mongo *conn, mongo_reply **reply ) { unsigned int len; int res; - mongo_read_socket( conn, &head, sizeof( head ) ); - mongo_read_socket( conn, &fields, sizeof( fields ) ); + mongo_env_read_socket( conn, &head, sizeof( head ) ); + mongo_env_read_socket( conn, &fields, sizeof( fields ) ); bson_little_endian32( &len, &head.len ); @@ -100,7 +316,7 @@ int mongo_read_response( mongo *conn, mongo_reply **reply ) { bson_little_endian32( &out->fields.start, &fields.start ); bson_little_endian32( &out->fields.num, &fields.num ); - res = mongo_read_socket( conn, &out->objs, len-sizeof( head )-sizeof( fields ) ); + res = mongo_env_read_socket( conn, &out->objs, len-sizeof( head )-sizeof( fields ) ); if( res != MONGO_OK ) { bson_free( out ); return res; @@ -133,12 +349,17 @@ static int mongo_check_is_master( mongo *conn ) { bson out; bson_iterator it; bson_bool_t ismaster = 0; + int max_bson_size = MONGO_DEFAULT_MAX_BSON_SIZE; out.data = NULL; if ( mongo_simple_int_command( conn, "admin", "ismaster", 1, &out ) == MONGO_OK ) { if( bson_find( &it, &out, "ismaster" ) ) ismaster = bson_iterator_bool( &it ); + if( bson_find( &it, &out, "maxBsonObjectSize" ) ) { + max_bson_size = bson_iterator_int( &it ); + } + conn->max_bson_size = max_bson_size; } else { return MONGO_ERROR; } @@ -153,25 +374,25 @@ static int mongo_check_is_master( mongo *conn ) { } } -void mongo_init( mongo *conn ) { - conn->replset = NULL; - conn->err = 0; - conn->errstr = NULL; - conn->lasterrcode = 0; - conn->lasterrstr = NULL; - - conn->conn_timeout_ms = 0; - conn->op_timeout_ms = 0; +MONGO_EXPORT void mongo_init_sockets( void ) { + mongo_env_sock_init(); } -int mongo_connect( mongo *conn , const char *host, int port ) { + +MONGO_EXPORT void mongo_init( mongo *conn ) { + memset( conn, 0, sizeof( mongo ) ); + conn->max_bson_size = MONGO_DEFAULT_MAX_BSON_SIZE; +} + +MONGO_EXPORT int mongo_connect( mongo *conn , const char *host, int port ) { + mongo_init( conn ); + conn->primary = bson_malloc( sizeof( mongo_host_port ) ); strncpy( conn->primary->host, host, strlen( host ) + 1 ); conn->primary->port = port; conn->primary->next = NULL; - mongo_init( conn ); - if( mongo_socket_connect( conn, host, port ) != MONGO_OK ) + if( mongo_env_socket_connect( conn, host, port ) != MONGO_OK ) return MONGO_ERROR; if( mongo_check_is_master( conn ) != MONGO_OK ) @@ -180,7 +401,7 @@ int mongo_connect( mongo *conn , const char *host, int port ) { return MONGO_OK; } -void mongo_replset_init( mongo *conn, const char *name ) { +MONGO_EXPORT void mongo_replset_init( mongo *conn, const char *name ) { mongo_init( conn ); conn->replset = bson_malloc( sizeof( mongo_replset ) ); @@ -222,7 +443,7 @@ static void mongo_replset_free_list( mongo_host_port **list ) { *list = NULL; } -void mongo_replset_add_seed( mongo *conn, const char *host, int port ) { +MONGO_EXPORT void mongo_replset_add_seed( mongo *conn, const char *host, int port ) { mongo_replset_add_node( &conn->replset->seeds, host, port ); } @@ -291,7 +512,7 @@ static void mongo_replset_check_seed( mongo *conn ) { bson_destroy( &out ); bson_destroy( &hosts ); - mongo_close_socket( conn->sock ); + mongo_env_close_socket( conn->sock ); conn->sock = 0; conn->connected = 0; @@ -306,6 +527,7 @@ static int mongo_replset_check_host( mongo *conn ) { bson_iterator it; bson_bool_t ismaster = 0; const char *set_name; + int max_bson_size = MONGO_DEFAULT_MAX_BSON_SIZE; out.data = NULL; @@ -313,6 +535,10 @@ static int mongo_replset_check_host( mongo *conn ) { if( bson_find( &it, &out, "ismaster" ) ) ismaster = bson_iterator_bool( &it ); + if( bson_find( &it, &out, "maxBsonObjectSize" ) ) + max_bson_size = bson_iterator_int( &it ); + conn->max_bson_size = max_bson_size; + if( bson_find( &it, &out, "setName" ) ) { set_name = bson_iterator_string( &it ); if( strcmp( set_name, conn->replset->name ) != 0 ) { @@ -328,13 +554,13 @@ static int mongo_replset_check_host( mongo *conn ) { if( ismaster ) { conn->replset->primary_connected = 1; } else { - mongo_close_socket( conn->sock ); + mongo_env_close_socket( conn->sock ); } return MONGO_OK; } -int mongo_replset_connect( mongo *conn ) { +MONGO_EXPORT int mongo_replset_connect( mongo *conn ) { int res = 0; mongo_host_port *node; @@ -347,15 +573,12 @@ int mongo_replset_connect( mongo *conn ) { */ node = conn->replset->seeds; while( node != NULL ) { - res = mongo_socket_connect( conn, ( const char * )&node->host, node->port ); - if( res != MONGO_OK ) - return MONGO_ERROR; - - mongo_replset_check_seed( conn ); - - if( conn->replset->hosts ) - break; - + res = mongo_env_socket_connect( conn, ( const char * )&node->host, node->port ); + if( res == MONGO_OK ) { + mongo_replset_check_seed( conn ); + if( conn->replset->hosts ) + break; + } node = node->next; } @@ -367,19 +590,22 @@ int mongo_replset_connect( mongo *conn ) { node = conn->replset->hosts; while( node != NULL ) { - res = mongo_socket_connect( conn, ( const char * )&node->host, node->port ); + res = mongo_env_socket_connect( conn, ( const char * )&node->host, node->port ); if( res == MONGO_OK ) { if( mongo_replset_check_host( conn ) != MONGO_OK ) return MONGO_ERROR; /* Primary found, so return. */ - else if( conn->replset->primary_connected ) + else if( conn->replset->primary_connected ) { + strncpy( conn->primary->host, node->host, strlen( node->host ) + 1 ); + conn->primary->port = node->port; return MONGO_OK; + } /* No primary, so close the connection. */ else { - mongo_close_socket( conn->sock ); + mongo_env_close_socket( conn->sock ); conn->sock = 0; conn->connected = 0; } @@ -394,15 +620,15 @@ int mongo_replset_connect( mongo *conn ) { return MONGO_ERROR; } -int mongo_set_op_timeout( mongo *conn, int millis ) { +MONGO_EXPORT int mongo_set_op_timeout( mongo *conn, int millis ) { conn->op_timeout_ms = millis; if( conn->sock && conn->connected ) - mongo_set_socket_op_timeout( conn, millis ); + mongo_env_set_socket_op_timeout( conn, millis ); return MONGO_OK; } -int mongo_reconnect( mongo *conn ) { +MONGO_EXPORT int mongo_reconnect( mongo *conn ) { int res; mongo_disconnect( conn ); @@ -413,10 +639,10 @@ int mongo_reconnect( mongo *conn ) { res = mongo_replset_connect( conn ); return res; } else - return mongo_socket_connect( conn, conn->primary->host, conn->primary->port ); + return mongo_env_socket_connect( conn, conn->primary->host, conn->primary->port ); } -int mongo_check_connection( mongo *conn ) { +MONGO_EXPORT int mongo_check_connection( mongo *conn ) { if( ! conn->connected ) return MONGO_ERROR; @@ -426,7 +652,7 @@ int mongo_check_connection( mongo *conn ) { return MONGO_ERROR; } -void mongo_disconnect( mongo *conn ) { +MONGO_EXPORT void mongo_disconnect( mongo *conn ) { if( ! conn->connected ) return; @@ -436,13 +662,13 @@ void mongo_disconnect( mongo *conn ) { conn->replset->hosts = NULL; } - mongo_close_socket( conn->sock ); + mongo_env_close_socket( conn->sock ); conn->sock = 0; conn->connected = 0; } -void mongo_destroy( mongo *conn ) { +MONGO_EXPORT void mongo_destroy( mongo *conn ) { mongo_disconnect( conn ); if( conn->replset ) { @@ -454,17 +680,20 @@ void mongo_destroy( mongo *conn ) { } bson_free( conn->primary ); - bson_free( conn->errstr ); - bson_free( conn->lasterrstr ); - conn->err = 0; - conn->errstr = NULL; - conn->lasterrcode = 0; - conn->lasterrstr = NULL; + mongo_clear_errors( conn ); } /* Determine whether this BSON object is valid for the given operation. */ -static int mongo_bson_valid( mongo *conn, bson *bson, int write ) { +static int mongo_bson_valid( mongo *conn, const bson *bson, int write ) { + int size; + + size = bson_size( bson ); + if( size > conn->max_bson_size ) { + conn->err = MONGO_BSON_TOO_LARGE; + return MONGO_ERROR; + } + if( ! bson->finished ) { conn->err = MONGO_BSON_NOT_FINISHED; return MONGO_ERROR; @@ -486,20 +715,21 @@ static int mongo_bson_valid( mongo *conn, bson *bson, int write ) { } conn->err = 0; - conn->errstr = NULL; return MONGO_OK; } /* Determine whether this BSON object is valid for the given operation. */ -static int mongo_cursor_bson_valid( mongo_cursor *cursor, bson *bson ) { +static int mongo_cursor_bson_valid( mongo_cursor *cursor, const bson *bson ) { if( ! bson->finished ) { - cursor->err = MONGO_BSON_NOT_FINISHED; + cursor->err = MONGO_CURSOR_BSON_ERROR; + cursor->conn->err = MONGO_BSON_NOT_FINISHED; return MONGO_ERROR; } if( bson->err & BSON_NOT_UTF8 ) { - cursor->err = MONGO_BSON_INVALID; + cursor->err = MONGO_CURSOR_BSON_ERROR; + cursor->conn->err = MONGO_BSON_INVALID; return MONGO_ERROR; } @@ -508,13 +738,17 @@ static int mongo_cursor_bson_valid( mongo_cursor *cursor, bson *bson ) { /* MongoDB CRUD API */ -int mongo_insert_batch( mongo *conn, const char *ns, - bson **bsons, int count ) { +MONGO_EXPORT int mongo_insert_batch( mongo *conn, const char *ns, + const bson **bsons, int count ) { - int size = 16 + 4 + strlen( ns ) + 1; - int i; mongo_message *mm; + int i; char *data; + int overhead = 16 + 4 + strlen( ns ) + 1; + int size = overhead; + + if( mongo_validate_ns( conn, ns ) != MONGO_OK ) + return MONGO_ERROR; for( i=0; i conn->max_bson_size ) { + conn->err = MONGO_BSON_TOO_LARGE; + return MONGO_ERROR; + } + mm = mongo_message_create( size , 0 , 0 , MONGO_OP_INSERT ); data = &mm->data; @@ -535,11 +774,14 @@ int mongo_insert_batch( mongo *conn, const char *ns, return mongo_message_send( conn, mm ); } -int mongo_insert( mongo *conn , const char *ns , bson *bson ) { +MONGO_EXPORT int mongo_insert( mongo *conn , const char *ns , const bson *bson ) { char *data; mongo_message *mm; + if( mongo_validate_ns( conn, ns ) != MONGO_OK ) + return MONGO_ERROR; + /* Make sure that BSON is valid for insert. */ if( mongo_bson_valid( conn, bson, 1 ) != MONGO_OK ) { return MONGO_ERROR; @@ -559,7 +801,7 @@ int mongo_insert( mongo *conn , const char *ns , bson *bson ) { return mongo_message_send( conn, mm ); } -int mongo_update( mongo *conn, const char *ns, const bson *cond, +MONGO_EXPORT int mongo_update( mongo *conn, const char *ns, const bson *cond, const bson *op, int flags ) { char *data; @@ -590,14 +832,9 @@ int mongo_update( mongo *conn, const char *ns, const bson *cond, return mongo_message_send( conn, mm ); } -int mongo_remove( mongo *conn, const char *ns, const bson *cond ) { +MONGO_EXPORT int mongo_remove( mongo *conn, const char *ns, const bson *cond ) { char *data; - mongo_message *mm = mongo_message_create( 16 /* header */ - + 4 /* ZERO */ - + strlen( ns ) + 1 - + 4 /* ZERO */ - + bson_size( cond ) - , 0 , 0 , MONGO_OP_DELETE ); + mongo_message *mm; /* Make sure that the BSON is valid UTF-8. * TODO: decide whether to check cond as well. @@ -606,6 +843,13 @@ int mongo_remove( mongo *conn, const char *ns, const bson *cond ) { return MONGO_ERROR; } + mm = mongo_message_create( 16 /* header */ + + 4 /* ZERO */ + + strlen( ns ) + 1 + + 4 /* ZERO */ + + bson_size( cond ) + , 0 , 0 , MONGO_OP_DELETE ); + data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, ns, strlen( ns ) + 1 ); @@ -621,6 +865,11 @@ static int mongo_cursor_op_query( mongo_cursor *cursor ) { bson empty; char *data; mongo_message *mm; + bson temp; + bson_iterator it; + + /* Clear any errors. */ + mongo_clear_errors( cursor->conn ); /* Set up default values for query and fields, if necessary. */ if( ! cursor->query ) @@ -662,6 +911,15 @@ static int mongo_cursor_op_query( mongo_cursor *cursor ) { return MONGO_ERROR; } + if( cursor->reply->fields.num == 1 ) { + bson_init_data( &temp, &cursor->reply->objs ); + if( bson_find( &it, &temp, "$err" ) ) { + mongo_set_last_error( cursor->conn, &it, &temp ); + cursor->err = MONGO_CURSOR_QUERY_FAIL; + return MONGO_ERROR; + } + } + cursor->seen += cursor->reply->fields.num; cursor->flags |= MONGO_CURSOR_QUERY_SENT; return MONGO_OK; @@ -719,8 +977,8 @@ static int mongo_cursor_get_more( mongo_cursor *cursor ) { } } -mongo_cursor *mongo_find( mongo *conn, const char *ns, bson *query, - bson *fields, int limit, int skip, int options ) { +MONGO_EXPORT mongo_cursor *mongo_find( mongo *conn, const char *ns, const bson *query, + const bson *fields, int limit, int skip, int options ) { mongo_cursor *cursor = ( mongo_cursor * )bson_malloc( sizeof( mongo_cursor ) ); mongo_cursor_init( cursor, conn, ns ); @@ -740,13 +998,20 @@ mongo_cursor *mongo_find( mongo *conn, const char *ns, bson *query, } } -int mongo_find_one( mongo *conn, const char *ns, bson *query, - bson *fields, bson *out ) { +MONGO_EXPORT int mongo_find_one( mongo *conn, const char *ns, const bson *query, + const bson *fields, bson *out ) { - mongo_cursor *cursor = mongo_find( conn, ns, query, fields, 1, 0, 0 ); + mongo_cursor cursor[1]; + mongo_cursor_init( cursor, conn, ns ); + mongo_cursor_set_query( cursor, query ); + mongo_cursor_set_fields( cursor, fields ); + mongo_cursor_set_limit( cursor, 1 ); - if ( cursor && mongo_cursor_next( cursor ) == MONGO_OK ) { - bson_copy_basic( out, &cursor->current ); + if ( mongo_cursor_next( cursor ) == MONGO_OK ) { + bson_init_size( out, bson_size( (bson *)&cursor->current ) ); + memcpy( out->data, cursor->current.data, + bson_size( (bson *)&cursor->current ) ); + out->finished = 1; mongo_cursor_destroy( cursor ); return MONGO_OK; } else { @@ -755,56 +1020,49 @@ int mongo_find_one( mongo *conn, const char *ns, bson *query, } } -void mongo_cursor_init( mongo_cursor *cursor, mongo *conn, const char *ns ) { +MONGO_EXPORT void mongo_cursor_init( mongo_cursor *cursor, mongo *conn, const char *ns ) { + memset( cursor, 0, sizeof( mongo_cursor ) ); cursor->conn = conn; cursor->ns = ( const char * )bson_malloc( strlen( ns ) + 1 ); strncpy( ( char * )cursor->ns, ns, strlen( ns ) + 1 ); cursor->current.data = NULL; - cursor->reply = NULL; - cursor->flags = 0; - cursor->seen = 0; - cursor->err = 0; - cursor->options = 0; - cursor->query = NULL; - cursor->fields = NULL; - cursor->skip = 0; - cursor->limit = 0; } -void mongo_cursor_set_query( mongo_cursor *cursor, bson *query ) { +MONGO_EXPORT void mongo_cursor_set_query( mongo_cursor *cursor, const bson *query ) { cursor->query = query; } -void mongo_cursor_set_fields( mongo_cursor *cursor, bson *fields ) { +MONGO_EXPORT void mongo_cursor_set_fields( mongo_cursor *cursor, const bson *fields ) { cursor->fields = fields; } -void mongo_cursor_set_skip( mongo_cursor *cursor, int skip ) { +MONGO_EXPORT void mongo_cursor_set_skip( mongo_cursor *cursor, int skip ) { cursor->skip = skip; } -void mongo_cursor_set_limit( mongo_cursor *cursor, int limit ) { +MONGO_EXPORT void mongo_cursor_set_limit( mongo_cursor *cursor, int limit ) { cursor->limit = limit; } -void mongo_cursor_set_options( mongo_cursor *cursor, int options ) { +MONGO_EXPORT void mongo_cursor_set_options( mongo_cursor *cursor, int options ) { cursor->options = options; } -const char *mongo_cursor_data( mongo_cursor *cursor ) { +MONGO_EXPORT const char *mongo_cursor_data( mongo_cursor *cursor ) { return cursor->current.data; } -const bson *mongo_cursor_bson( mongo_cursor *cursor ) { +MONGO_EXPORT const bson *mongo_cursor_bson( mongo_cursor *cursor ) { return (const bson *)&(cursor->current); } -int mongo_cursor_next( mongo_cursor *cursor ) { +MONGO_EXPORT int mongo_cursor_next( mongo_cursor *cursor ) { char *next_object; char *message_end; if( ! ( cursor->flags & MONGO_CURSOR_QUERY_SENT ) ) - mongo_cursor_op_query( cursor ); + if( mongo_cursor_op_query( cursor ) != MONGO_OK ) + return MONGO_ERROR; if( !cursor->reply ) return MONGO_ERROR; @@ -826,7 +1084,7 @@ int mongo_cursor_next( mongo_cursor *cursor ) { /* first */ if ( cursor->current.data == NULL ) { - bson_init_data( &cursor->current, &cursor->reply->objs ); + bson_init_finished_data( &cursor->current, &cursor->reply->objs ); return MONGO_OK; } @@ -843,15 +1101,15 @@ int mongo_cursor_next( mongo_cursor *cursor ) { return MONGO_ERROR; } - bson_init_data( &cursor->current, &cursor->reply->objs ); + bson_init_finished_data( &cursor->current, &cursor->reply->objs ); } else { - bson_init_data( &cursor->current, next_object ); + bson_init_finished_data( &cursor->current, next_object ); } return MONGO_OK; } -int mongo_cursor_destroy( mongo_cursor *cursor ) { +MONGO_EXPORT int mongo_cursor_destroy( mongo_cursor *cursor ) { int result = MONGO_OK; if ( !cursor ) return result; @@ -883,7 +1141,7 @@ int mongo_cursor_destroy( mongo_cursor *cursor ) { /* MongoDB Helper Functions */ -int mongo_create_index( mongo *conn, const char *ns, bson *key, int options, bson *out ) { +MONGO_EXPORT int mongo_create_index( mongo *conn, const char *ns, const bson *key, int options, bson *out ) { bson b; bson_iterator it; char name[255] = {'_'}; @@ -933,10 +1191,10 @@ bson_bool_t mongo_create_simple_index( mongo *conn, const char *ns, const char * return success; } -int64_t mongo_count( mongo *conn, const char *db, const char *ns, bson *query ) { +MONGO_EXPORT double mongo_count( mongo *conn, const char *db, const char *ns, const bson *query ) { bson cmd; bson out = {NULL, 0}; - int64_t count = -1; + double count = -1; bson_init( &cmd ); bson_append_string( &cmd, "count", ns ); @@ -947,7 +1205,7 @@ int64_t mongo_count( mongo *conn, const char *db, const char *ns, bson *query ) if( mongo_run_command( conn, db, &cmd, &out ) == MONGO_OK ) { bson_iterator it; if( bson_find( &it, &out, "n" ) ) - count = bson_iterator_long( &it ); + count = bson_iterator_double( &it ); bson_destroy( &cmd ); bson_destroy( &out ); return count; @@ -958,38 +1216,51 @@ int64_t mongo_count( mongo *conn, const char *db, const char *ns, bson *query ) } } -int mongo_run_command( mongo *conn, const char *db, bson *command, +MONGO_EXPORT int mongo_run_command( mongo *conn, const char *db, const bson *command, bson *out ) { + bson response = {NULL, 0}; bson fields; int sl = strlen( db ); char *ns = bson_malloc( sl + 5 + 1 ); /* ".$cmd" + nul */ - int res; + int res, success = 0; strcpy( ns, db ); strcpy( ns+sl, ".$cmd" ); - res = mongo_find_one( conn, ns, command, bson_empty( &fields ), out ); + res = mongo_find_one( conn, ns, command, bson_empty( &fields ), &response ); bson_free( ns ); - return res; + + if( res != MONGO_OK ) + return MONGO_ERROR; + else { + bson_iterator it; + if( bson_find( &it, &response, "ok" ) ) + success = bson_iterator_bool( &it ); + + if( !success ) { + conn->err = MONGO_COMMAND_FAILED; + return MONGO_ERROR; + } else { + if( out ) + *out = response; + return MONGO_OK; + } + } } -int mongo_simple_int_command( mongo *conn, const char *db, +MONGO_EXPORT int mongo_simple_int_command( mongo *conn, const char *db, const char *cmdstr, int arg, bson *realout ) { bson out = {NULL, 0}; bson cmd; - bson_bool_t success = 0; + int result; bson_init( &cmd ); bson_append_int( &cmd, cmdstr, arg ); bson_finish( &cmd ); - if( mongo_run_command( conn, db, &cmd, &out ) == MONGO_OK ) { - bson_iterator it; - if( bson_find( &it, &out, "ok" ) ) - success = bson_iterator_bool( &it ); - } + result = mongo_run_command( conn, db, &cmd, &out ); bson_destroy( &cmd ); @@ -998,30 +1269,21 @@ int mongo_simple_int_command( mongo *conn, const char *db, else bson_destroy( &out ); - if( success ) - return MONGO_OK; - else { - conn->err = MONGO_COMMAND_FAILED; - return MONGO_ERROR; - } + return result; } -int mongo_simple_str_command( mongo *conn, const char *db, +MONGO_EXPORT int mongo_simple_str_command( mongo *conn, const char *db, const char *cmdstr, const char *arg, bson *realout ) { bson out = {NULL, 0}; - int success = 0; + int result; bson cmd; bson_init( &cmd ); bson_append_string( &cmd, cmdstr, arg ); bson_finish( &cmd ); - if( mongo_run_command( conn, db, &cmd, &out ) == MONGO_OK ) { - bson_iterator it; - if( bson_find( &it, &out, "ok" ) ) - success = bson_iterator_bool( &it ); - } + result = mongo_run_command( conn, db, &cmd, &out ); bson_destroy( &cmd ); @@ -1030,21 +1292,18 @@ int mongo_simple_str_command( mongo *conn, const char *db, else bson_destroy( &out ); - if( success ) - return MONGO_OK; - else - return MONGO_ERROR; + return result; } -int mongo_cmd_drop_db( mongo *conn, const char *db ) { +MONGO_EXPORT int mongo_cmd_drop_db( mongo *conn, const char *db ) { return mongo_simple_int_command( conn, db, "dropDatabase", 1, NULL ); } -int mongo_cmd_drop_collection( mongo *conn, const char *db, const char *collection, bson *out ) { +MONGO_EXPORT int mongo_cmd_drop_collection( mongo *conn, const char *db, const char *collection, bson *out ) { return mongo_simple_str_command( conn, db, "drop", collection, out ); } -void mongo_cmd_reset_error( mongo *conn, const char *db ) { +MONGO_EXPORT void mongo_cmd_reset_error( mongo *conn, const char *db ) { mongo_simple_int_command( conn, db, "reseterror", 1, NULL ); } @@ -1055,23 +1314,13 @@ static int mongo_cmd_get_error_helper( mongo *conn, const char *db, bson_bool_t haserror = 0; /* Reset last error codes. */ - conn->lasterrcode = 0; - bson_free( conn->lasterrstr ); - conn->lasterrstr = NULL; + mongo_clear_errors( conn ); /* If there's an error, store its code and string in the connection object. */ if( mongo_simple_int_command( conn, db, cmdtype, 1, &out ) == MONGO_OK ) { bson_iterator it; haserror = ( bson_find( &it, &out, "err" ) != BSON_NULL ); - if( haserror ) { - conn->lasterrstr = ( char * )bson_malloc( bson_iterator_string_len( &it ) ); - if( conn->lasterrstr ) { - strcpy( conn->lasterrstr, bson_iterator_string( &it ) ); - } - - if( bson_find( &it, &out, "code" ) != BSON_NULL ) - conn->lasterrcode = bson_iterator_int( &it ); - } + if( haserror ) mongo_set_last_error( conn, &it, &out ); } if( realout ) @@ -1085,15 +1334,15 @@ static int mongo_cmd_get_error_helper( mongo *conn, const char *db, return MONGO_OK; } -int mongo_cmd_get_prev_error( mongo *conn, const char *db, bson *out ) { +MONGO_EXPORT int mongo_cmd_get_prev_error( mongo *conn, const char *db, bson *out ) { return mongo_cmd_get_error_helper( conn, db, out, "getpreverror" ); } -int mongo_cmd_get_last_error( mongo *conn, const char *db, bson *out ) { +MONGO_EXPORT int mongo_cmd_get_last_error( mongo *conn, const char *db, bson *out ) { return mongo_cmd_get_error_helper( conn, db, out, "getlasterror" ); } -bson_bool_t mongo_cmd_ismaster( mongo *conn, bson *realout ) { +MONGO_EXPORT bson_bool_t mongo_cmd_ismaster( mongo *conn, bson *realout ) { bson out = {NULL,0}; bson_bool_t ismaster = 0; @@ -1133,7 +1382,7 @@ static void mongo_pass_digest( const char *user, const char *pass, char hex_dige digest2hex( digest, hex_digest ); } -int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const char *pass ) { +MONGO_EXPORT int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const char *pass ) { bson user_obj; bson pass_obj; char hex_digest[33]; @@ -1164,12 +1413,12 @@ int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const cha return res; } -bson_bool_t mongo_cmd_authenticate( mongo *conn, const char *db, const char *user, const char *pass ) { +MONGO_EXPORT bson_bool_t mongo_cmd_authenticate( mongo *conn, const char *db, const char *user, const char *pass ) { bson from_db; bson cmd; bson out; const char *nonce; - bson_bool_t success = 0; + int result; mongo_md5_state_t st; mongo_md5_byte_t digest[16]; @@ -1200,18 +1449,11 @@ bson_bool_t mongo_cmd_authenticate( mongo *conn, const char *db, const char *use bson_finish( &cmd ); bson_destroy( &from_db ); - /*bson_init( &from_db ); */ - if( mongo_run_command( conn, db, &cmd, &out ) == MONGO_OK ) { - bson_iterator it; - if( bson_find( &it, &out, "ok" ) ) - success = bson_iterator_bool( &it ); - } + + result = mongo_run_command( conn, db, &cmd, &out ); bson_destroy( &from_db ); bson_destroy( &cmd ); - if( success ) - return MONGO_OK; - else - return MONGO_ERROR; + return result; } diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.h index 6f86174101..dd4c4b4f40 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.h +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/mongo.h @@ -3,7 +3,7 @@ * @brief Main MongoDB Declarations */ -/* Copyright 2009-2011 10gen Inc. +/* Copyright 2009-2012 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,26 @@ * limitations under the License. */ -#ifndef _MONGO_H_ -#define _MONGO_H_ +#ifndef MONGO_H_ +#define MONGO_H_ #include "bson.h" MONGO_EXTERN_C_START #define MONGO_MAJOR 0 -#define MONGO_MINOR 4 -#define MONGO_PATCH 0 +#define MONGO_MINOR 5 +#define MONGO_PATCH 2 #define MONGO_OK 0 #define MONGO_ERROR -1 #define MONGO_DEFAULT_PORT 27017 +#define MONGO_DEFAULT_MAX_BSON_SIZE 4 * 1024 * 1024 + +#define MONGO_ERR_LEN 128 + typedef enum mongo_error_t { MONGO_CONN_SUCCESS = 0, /**< Connection success! */ MONGO_CONN_NO_SOCKET, /**< Could not create a socket. */ @@ -43,15 +47,25 @@ typedef enum mongo_error_t { MONGO_CONN_BAD_SET_NAME, /**< Given rs name doesn't match this replica set. */ MONGO_CONN_NO_PRIMARY, /**< Can't find primary in replica set. Connection closed. */ - MONGO_IO_ERROR, /**< An error occurred while reading or writing on socket. */ + MONGO_IO_ERROR, /**< An error occurred while reading or writing on the socket. */ + MONGO_SOCKET_ERROR, /**< Other socket error. */ MONGO_READ_SIZE_ERROR, /**< The response is not the expected length. */ MONGO_COMMAND_FAILED, /**< The command returned with 'ok' value of 0. */ + MONGO_NS_INVALID, /**< The name for the ns (database or collection) is invalid. */ + MONGO_BSON_INVALID, /**< BSON not valid for the specified op. */ + MONGO_BSON_NOT_FINISHED, /**< BSON object has not been finished. */ + MONGO_BSON_TOO_LARGE /**< BSON object exceeds max BSON size. */ +} mongo_error_t; + +typedef enum mongo_cursor_error_t { MONGO_CURSOR_EXHAUSTED, /**< The cursor has no more results. */ MONGO_CURSOR_INVALID, /**< The cursor has timed out or is not recognized. */ MONGO_CURSOR_PENDING, /**< Tailable cursor still alive but no data. */ - MONGO_BSON_INVALID, /**< BSON not valid for the specified op. */ - MONGO_BSON_NOT_FINISHED /**< BSON object has not been finished. */ -} mongo_error_t; + MONGO_CURSOR_QUERY_FAIL, /**< The server returned an '$err' object, indicating query failure. + See conn->lasterrcode and conn->lasterrstr for details. */ + MONGO_CURSOR_BSON_ERROR /**< Something is wrong with the BSON provided. See conn->err + for details. */ +} mongo_cursor_error_t; enum mongo_cursor_flags { MONGO_CURSOR_MUST_FREE = 1, /**< mongo_cursor_destroy should free cursor. */ @@ -137,12 +151,14 @@ typedef struct mongo { int flags; /**< Flags on this connection object. */ int conn_timeout_ms; /**< Connection timeout in milliseconds. */ int op_timeout_ms; /**< Read and write timeout in milliseconds. */ + int max_bson_size; /**< Largest BSON object allowed on this connection. */ bson_bool_t connected; /**< Connection status. */ - mongo_error_t err; /**< Most recent driver error code. */ - char *errstr; /**< String version of most recent driver error code. */ - int lasterrcode; /**< getlasterror given by the server on calls. */ - char *lasterrstr; /**< getlasterror string generated by server. */ + mongo_error_t err; /**< Most recent driver error code. */ + int errcode; /**< Most recent errno or WSAGetLastError(). */ + char errstr[MONGO_ERR_LEN]; /**< String version of error. */ + int lasterrcode; /**< getlasterror code from the server. */ + char lasterrstr[MONGO_ERR_LEN]; /**< getlasterror string from the server. */ } mongo; typedef struct { @@ -152,9 +168,9 @@ typedef struct { int flags; /**< Flags used internally by this drivers. */ int seen; /**< Number returned so far. */ bson current; /**< This cursor's current bson object. */ - mongo_error_t err; /**< Errors on this cursor. */ - bson *query; /**< Bitfield containing cursor options. */ - bson *fields; /**< Bitfield containing cursor options. */ + mongo_cursor_error_t err; /**< Errors on this cursor. */ + const bson *query; /**< Bitfield containing cursor options. */ + const bson *fields;/**< Bitfield containing cursor options. */ int options; /**< Bitfield containing cursor options. */ int limit; /**< Bitfield containing cursor options. */ int skip; /**< Bitfield containing cursor options. */ @@ -162,9 +178,44 @@ typedef struct { /* Connection API */ -/** Initialize a new mongo connection object. If not created - * with mongo_new, you must initialize each mongo - * object using this function. +MONGO_EXPORT mongo* mongo_create(); +MONGO_EXPORT void mongo_dispose(mongo* conn); +MONGO_EXPORT int mongo_get_err(mongo* conn); +MONGO_EXPORT int mongo_is_connected(mongo* conn); +MONGO_EXPORT int mongo_get_op_timeout(mongo* conn); +MONGO_EXPORT const char* mongo_get_primary(mongo* conn); +MONGO_EXPORT int mongo_get_socket(mongo* conn) ; +MONGO_EXPORT int mongo_get_host_count(mongo* conn); +MONGO_EXPORT const char* mongo_get_host(mongo* conn, int i); +MONGO_EXPORT mongo_cursor* mongo_cursor_create(); +MONGO_EXPORT void mongo_cursor_dispose(mongo_cursor* cursor); +MONGO_EXPORT int mongo_get_server_err(mongo* conn); +MONGO_EXPORT const char* mongo_get_server_err_string(mongo* conn); + +/** + * Set an error this mongo connection object. Mostly for internal use. + * + * @param conn a mongo connection object. + * @param err a driver error code of mongo_error_t. + * @param errstr a string version of the error. + * @param errorcode Currently errno or WSAGetLastError(). + */ +MONGO_EXPORT void __mongo_set_error( mongo *conn, mongo_error_t err, + const char *errstr, int errorcode ); +/** + * Clear all errors stored on this mongo connection object. + * + * @param conn a mongo connection object. + */ +MONGO_EXPORT void mongo_clear_errors( mongo *conn ); + +/** Initialize sockets for Windows. + */ +MONGO_EXPORT void mongo_init_sockets(); + +/** + * Initialize a new mongo connection object. You must initialize each mongo + * object using this function. * * @note When finished, you must pass this object to * mongo_destroy( ). @@ -172,7 +223,7 @@ typedef struct { * @param conn a mongo connection object allocated on the stack * or heap. */ -void mongo_init( mongo *conn ); +MONGO_EXPORT void mongo_init( mongo *conn ); /** * Connect to a single MongoDB server. @@ -182,9 +233,9 @@ void mongo_init( mongo *conn ); * @param port the port to connect to. * * @return MONGO_OK or MONGO_ERROR on failure. On failure, a constant of type - * mongo_conn_return_t will be set on the conn->err field. + * mongo_error_t will be set on the conn->err field. */ -int mongo_connect( mongo *conn , const char *host, int port ); +MONGO_EXPORT int mongo_connect( mongo *conn , const char *host, int port ); /** * Set up this connection object for connecting to a replica set. @@ -193,7 +244,7 @@ int mongo_connect( mongo *conn , const char *host, int port ); * @param conn a mongo object. * @param name the name of the replica set to connect to. * */ -void mongo_replset_init( mongo *conn, const char *name ); +MONGO_EXPORT void mongo_replset_init( mongo *conn, const char *name ); /** * Add a seed node to the replica set connection object. @@ -204,7 +255,7 @@ void mongo_replset_init( mongo *conn, const char *name ); * @param host a numerical network address or a network hostname. * @param port the port to connect to. */ -void mongo_replset_add_seed( mongo *conn, const char *host, int port ); +MONGO_EXPORT void mongo_replset_add_seed( mongo *conn, const char *host, int port ); /** * Utility function for converting a host-port string to a mongo_host_port. @@ -215,6 +266,17 @@ void mongo_replset_add_seed( mongo *conn, const char *host, int port ); */ void mongo_parse_host( const char *host_string, mongo_host_port *host_port ); +/** + * Utility function for validation database and collection names. + * + * @param conn a mongo object. + * + * @return MONGO_OK or MONGO_ERROR on failure. On failure, a constant of type + * mongo_conn_return_t will be set on the conn->err field. + * + */ +MONGO_EXPORT int mongo_validate_ns( mongo *conn, const char *ns ); + /** * Connect to a replica set. * @@ -226,7 +288,7 @@ void mongo_parse_host( const char *host_string, mongo_host_port *host_port ); * @return MONGO_OK or MONGO_ERROR on failure. On failure, a constant of type * mongo_conn_return_t will be set on the conn->err field. */ -int mongo_replset_connect( mongo *conn ); +MONGO_EXPORT int mongo_replset_connect( mongo *conn ); /** Set a timeout for operations on this connection. This * is a platform-specific feature, and only work on *nix @@ -238,7 +300,7 @@ int mongo_replset_connect( mongo *conn ); * @return MONGO_OK. On error, return MONGO_ERROR and * set the conn->err field. */ -int mongo_set_op_timeout( mongo *conn, int millis ); +MONGO_EXPORT int mongo_set_op_timeout( mongo *conn, int millis ); /** * Ensure that this connection is healthy by performing @@ -248,7 +310,7 @@ int mongo_set_op_timeout( mongo *conn, int millis ); * * @return MONGO_OK if connected; otherwise, MONGO_ERROR. */ -int mongo_check_connection( mongo *conn ); +MONGO_EXPORT int mongo_check_connection( mongo *conn ); /** * Try reconnecting to the server using the existing connection settings. @@ -261,7 +323,7 @@ int mongo_check_connection( mongo *conn ); * @return MONGO_OK or MONGO_ERROR and * set the conn->err field. */ -int mongo_reconnect( mongo *conn ); +MONGO_EXPORT int mongo_reconnect( mongo *conn ); /** * Close the current connection to the server. After calling @@ -270,7 +332,7 @@ int mongo_reconnect( mongo *conn ); * * @param conn a mongo object. */ -void mongo_disconnect( mongo *conn ); +MONGO_EXPORT void mongo_disconnect( mongo *conn ); /** * Close any existing connection to the server and free all allocated @@ -280,7 +342,7 @@ void mongo_disconnect( mongo *conn ); * * @param conn a mongo object. */ -void mongo_destroy( mongo *conn ); +MONGO_EXPORT void mongo_destroy( mongo *conn ); /** * Insert a BSON document into a MongoDB server. This function @@ -295,7 +357,7 @@ void mongo_destroy( mongo *conn ); * field is MONGO_BSON_INVALID, check the err field * on the bson struct for the reason. */ -int mongo_insert( mongo *conn, const char *ns, bson *data ); +MONGO_EXPORT int mongo_insert( mongo *conn, const char *ns, const bson *data ); /** * Insert a batch of BSON documents into a MongoDB server. This function @@ -309,8 +371,8 @@ int mongo_insert( mongo *conn, const char *ns, bson *data ); * @return MONGO_OK or MONGO_ERROR. * */ -int mongo_insert_batch( mongo *conn , const char *ns , - bson **data , int num ); +MONGO_EXPORT int mongo_insert_batch( mongo *conn , const char *ns , + const bson **data , int num ); /** * Update a document in a MongoDB server. @@ -324,7 +386,7 @@ int mongo_insert_batch( mongo *conn , const char *ns , * @return MONGO_OK or MONGO_ERROR with error stored in conn object. * */ -int mongo_update( mongo *conn, const char *ns, const bson *cond, +MONGO_EXPORT int mongo_update( mongo *conn, const char *ns, const bson *cond, const bson *op, int flags ); /** @@ -336,7 +398,7 @@ int mongo_update( mongo *conn, const char *ns, const bson *cond, * * @return MONGO_OK or MONGO_ERROR with error stored in conn object. */ -int mongo_remove( mongo *conn, const char *ns, const bson *cond ); +MONGO_EXPORT int mongo_remove( mongo *conn, const char *ns, const bson *cond ); /** * Find documents in a MongoDB server. @@ -353,8 +415,8 @@ int mongo_remove( mongo *conn, const char *ns, const bson *cond ); * an error has occurred. For finer-grained error checking, * use the cursor builder API instead. */ -mongo_cursor *mongo_find( mongo *conn, const char *ns, bson *query, - bson *fields, int limit, int skip, int options ); +MONGO_EXPORT mongo_cursor *mongo_find( mongo *conn, const char *ns, const bson *query, + const bson *fields, int limit, int skip, int options ); /** * Initalize a new cursor object. @@ -363,7 +425,7 @@ mongo_cursor *mongo_find( mongo *conn, const char *ns, bson *query, * @param ns the namespace, represented as the the database * name and collection name separated by a dot. e.g., "test.users" */ -void mongo_cursor_init( mongo_cursor *cursor, mongo *conn, const char *ns ); +MONGO_EXPORT void mongo_cursor_init( mongo_cursor *cursor, mongo *conn, const char *ns ); /** * Set the bson object specifying this cursor's query spec. If @@ -376,7 +438,7 @@ void mongo_cursor_init( mongo_cursor *cursor, mongo *conn, const char *ns ); * $query, $orderby, $hint, and/or $explain. See * http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol for details. */ -void mongo_cursor_set_query( mongo_cursor *cursor, bson *query ); +MONGO_EXPORT void mongo_cursor_set_query( mongo_cursor *cursor, const bson *query ); /** * Set the fields to return for this cursor. If you want to return @@ -386,7 +448,7 @@ void mongo_cursor_set_query( mongo_cursor *cursor, bson *query ); * @param fields a bson object representing the fields to return. * See http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields. */ -void mongo_cursor_set_fields( mongo_cursor *cursor, bson *fields ); +MONGO_EXPORT void mongo_cursor_set_fields( mongo_cursor *cursor, const bson *fields ); /** * Set the number of documents to skip. @@ -394,7 +456,7 @@ void mongo_cursor_set_fields( mongo_cursor *cursor, bson *fields ); * @param cursor * @param skip */ -void mongo_cursor_set_skip( mongo_cursor *cursor, int skip ); +MONGO_EXPORT void mongo_cursor_set_skip( mongo_cursor *cursor, int skip ); /** * Set the number of documents to return. @@ -402,7 +464,7 @@ void mongo_cursor_set_skip( mongo_cursor *cursor, int skip ); * @param cursor * @param limit */ -void mongo_cursor_set_limit( mongo_cursor *cursor, int limit ); +MONGO_EXPORT void mongo_cursor_set_limit( mongo_cursor *cursor, int limit ); /** * Set any of the available query options (e.g., MONGO_TAILABLE). @@ -411,7 +473,7 @@ void mongo_cursor_set_limit( mongo_cursor *cursor, int limit ); * @param options a bitfield storing query options. See * mongo_cursor_bitfield_t for available constants. */ -void mongo_cursor_set_options( mongo_cursor *cursor, int options ); +MONGO_EXPORT void mongo_cursor_set_options( mongo_cursor *cursor, int options ); /** * Return the current BSON object data as a const char*. This is useful @@ -419,7 +481,7 @@ void mongo_cursor_set_options( mongo_cursor *cursor, int options ); * * @param cursor */ -const char *mongo_cursor_data( mongo_cursor *cursor ); +MONGO_EXPORT const char *mongo_cursor_data( mongo_cursor *cursor ); /** * Return the current BSON object data as a const char*. This is useful @@ -427,7 +489,7 @@ const char *mongo_cursor_data( mongo_cursor *cursor ); * * @param cursor */ -const bson *mongo_cursor_bson( mongo_cursor *cursor ); +MONGO_EXPORT const bson *mongo_cursor_bson( mongo_cursor *cursor ); /** * Iterate the cursor, returning the next item. When successful, @@ -438,7 +500,7 @@ const bson *mongo_cursor_bson( mongo_cursor *cursor ); * @return MONGO_OK. On error, returns MONGO_ERROR and sets * cursor->err with a value of mongo_error_t. */ -int mongo_cursor_next( mongo_cursor *cursor ); +MONGO_EXPORT int mongo_cursor_next( mongo_cursor *cursor ); /** * Destroy a cursor object. When finished with a cursor, you @@ -449,7 +511,7 @@ int mongo_cursor_next( mongo_cursor *cursor ); * @return MONGO_OK or an error code. On error, check cursor->conn->err * for errors. */ -int mongo_cursor_destroy( mongo_cursor *cursor ); +MONGO_EXPORT int mongo_cursor_destroy( mongo_cursor *cursor ); /** * Find a single document in a MongoDB server. @@ -462,8 +524,8 @@ int mongo_cursor_destroy( mongo_cursor *cursor ); * */ /* out can be NULL if you don't care about results. useful for commands */ -bson_bool_t mongo_find_one( mongo *conn, const char *ns, bson *query, - bson *fields, bson *out ); +MONGO_EXPORT int mongo_find_one( mongo *conn, const char *ns, const bson *query, + const bson *fields, bson *out ); /* MongoDB Helper Functions */ @@ -478,8 +540,8 @@ bson_bool_t mongo_find_one( mongo *conn, const char *ns, bson *query, * @return the number of matching documents. If the command fails, * MONGO_ERROR is returned. */ -int64_t mongo_count( mongo *conn, const char *db, const char *coll, - bson *query ); +MONGO_EXPORT double mongo_count( mongo *conn, const char *db, const char *coll, + const bson *query ); /** * Create a compouned index. @@ -494,7 +556,7 @@ int64_t mongo_count( mongo *conn, const char *db, const char *coll, * * @return MONGO_OK if index is created successfully; otherwise, MONGO_ERROR. */ -int mongo_create_index( mongo *conn, const char *ns, bson *key, int options, bson *out ); +MONGO_EXPORT int mongo_create_index( mongo *conn, const char *ns, const bson *key, int options, bson *out ); /** * Create an index with a single key. @@ -521,9 +583,9 @@ bson_bool_t mongo_create_simple_index( mongo *conn, const char *ns, const char * * @param command the BSON command to run. * @param out the BSON result of the command. * - * @return true if the command ran without error. + * @return MONGO_OK if the command ran without error. */ -bson_bool_t mongo_run_command( mongo *conn, const char *db, bson *command, bson *out ); +MONGO_EXPORT int mongo_run_command( mongo *conn, const char *db, const bson *command, bson *out ); /** * Run a command that accepts a simple string key and integer value. @@ -537,7 +599,7 @@ bson_bool_t mongo_run_command( mongo *conn, const char *db, bson *command, bson * @return MONGO_OK or an error code. * */ -int mongo_simple_int_command( mongo *conn, const char *db, +MONGO_EXPORT int mongo_simple_int_command( mongo *conn, const char *db, const char *cmd, int arg, bson *out ); /** @@ -552,7 +614,7 @@ int mongo_simple_int_command( mongo *conn, const char *db, * @return true if the command ran without error. * */ -bson_bool_t mongo_simple_str_command( mongo *conn, const char *db, const char *cmd, const char *arg, bson *out ); +MONGO_EXPORT int mongo_simple_str_command( mongo *conn, const char *db, const char *cmd, const char *arg, bson *out ); /** * Drop a database. @@ -562,7 +624,7 @@ bson_bool_t mongo_simple_str_command( mongo *conn, const char *db, const char *c * * @return MONGO_OK or an error code. */ -int mongo_cmd_drop_db( mongo *conn, const char *db ); +MONGO_EXPORT int mongo_cmd_drop_db( mongo *conn, const char *db ); /** * Drop a collection. @@ -574,7 +636,7 @@ int mongo_cmd_drop_db( mongo *conn, const char *db ); * * @return true if the collection drop was successful. */ -bson_bool_t mongo_cmd_drop_collection( mongo *conn, const char *db, const char *collection, bson *out ); +MONGO_EXPORT int mongo_cmd_drop_collection( mongo *conn, const char *db, const char *collection, bson *out ); /** * Add a database user. @@ -586,7 +648,7 @@ bson_bool_t mongo_cmd_drop_collection( mongo *conn, const char *db, const char * * * @return MONGO_OK or MONGO_ERROR. */ -int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const char *pass ); +MONGO_EXPORT int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const char *pass ); /** * Authenticate a user. @@ -598,7 +660,7 @@ int mongo_cmd_add_user( mongo *conn, const char *db, const char *user, const cha * * @return MONGO_OK on sucess and MONGO_ERROR on failure. */ -int mongo_cmd_authenticate( mongo *conn, const char *db, const char *user, const char *pass ); +MONGO_EXPORT int mongo_cmd_authenticate( mongo *conn, const char *db, const char *user, const char *pass ); /** * Check if the current server is a master. @@ -609,7 +671,7 @@ int mongo_cmd_authenticate( mongo *conn, const char *db, const char *user, const * @return true if the server is a master. */ /* return value is master status */ -bson_bool_t mongo_cmd_ismaster( mongo *conn, bson *out ); +MONGO_EXPORT bson_bool_t mongo_cmd_ismaster( mongo *conn, bson *out ); /** * Get the error for the last command with the current connection. @@ -621,7 +683,7 @@ bson_bool_t mongo_cmd_ismaster( mongo *conn, bson *out ); * @return MONGO_OK if no error and MONGO_ERROR on error. On error, check the values * of conn->lasterrcode and conn->lasterrstr for the error status. */ -int mongo_cmd_get_last_error( mongo *conn, const char *db, bson *out ); +MONGO_EXPORT int mongo_cmd_get_last_error( mongo *conn, const char *db, bson *out ); /** * Get the most recent error with the current connection. @@ -633,7 +695,7 @@ int mongo_cmd_get_last_error( mongo *conn, const char *db, bson *out ); * @return MONGO_OK if no error and MONGO_ERROR on error. On error, check the values * of conn->lasterrcode and conn->lasterrstr for the error status. */ -int mongo_cmd_get_prev_error( mongo *conn, const char *db, bson *out ); +MONGO_EXPORT int mongo_cmd_get_prev_error( mongo *conn, const char *db, bson *out ); /** * Reset the error state for the connection. @@ -641,7 +703,8 @@ int mongo_cmd_get_prev_error( mongo *conn, const char *db, bson *out ); * @param conn a mongo object. * @param db the name of the database. */ -void mongo_cmd_reset_error( mongo *conn, const char *db ); +MONGO_EXPORT void mongo_cmd_reset_error( mongo *conn, const char *db ); + MONGO_EXTERN_C_END diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.c deleted file mode 100644 index 5c8ad9ba5e..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.c +++ /dev/null @@ -1,98 +0,0 @@ -/* net.c */ - -/* Copyright 2009-2011 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Implementation for generic version of net.h */ -#include "net.h" -#include - -int mongo_write_socket( mongo *conn, const void *buf, int len ) { - const char *cbuf = buf; - while ( len ) { - int sent = send( conn->sock, cbuf, len, 0 ); - if ( sent == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - cbuf += sent; - len -= sent; - } - - return MONGO_OK; -} - -int mongo_read_socket( mongo *conn, void *buf, int len ) { - char *cbuf = buf; - while ( len ) { - int sent = recv( conn->sock, cbuf, len, 0 ); - if ( sent == 0 || sent == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - cbuf += sent; - len -= sent; - } - - return MONGO_OK; -} - -/* This is a no-op in the generic implementation. */ -int mongo_set_socket_op_timeout( mongo *conn, int millis ) { - return MONGO_OK; -} - -static int mongo_create_socket( mongo *conn ) { - int fd; - - if( ( fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) { - conn->err = MONGO_CONN_NO_SOCKET; - return MONGO_ERROR; - } - conn->sock = fd; - - return MONGO_OK; -} - -int mongo_socket_connect( mongo *conn, const char *host, int port ) { - struct sockaddr_in sa; - socklen_t addressSize; - int flag = 1; - - if( mongo_create_socket( conn ) != MONGO_OK ) - return MONGO_ERROR; - - memset( sa.sin_zero , 0 , sizeof( sa.sin_zero ) ); - sa.sin_family = AF_INET; - sa.sin_port = htons( port ); - sa.sin_addr.s_addr = inet_addr( host ); - addressSize = sizeof( sa ); - - if ( connect( conn->sock, ( struct sockaddr * )&sa, addressSize ) == -1 ) { - mongo_close_socket( conn->sock ); - conn->connected = 0; - conn->sock = 0; - conn->err = MONGO_CONN_FAIL; - return MONGO_ERROR; - } - - setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, ( char * ) &flag, sizeof( flag ) ); - if( conn->op_timeout_ms > 0 ) - mongo_set_socket_op_timeout( conn, conn->op_timeout_ms ); - - conn->connected = 1; - - return MONGO_OK; -} diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.h deleted file mode 100644 index 49190877c8..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/net.h +++ /dev/null @@ -1,57 +0,0 @@ -/** @file net.h */ - -/* Copyright 2009-2011 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Header for generic net.h */ -#ifndef _MONGO_NET_H_ -#define _MONGO_NET_H_ - -#include "mongo.h" - -#ifdef _WIN32 -#include -#include -#define mongo_close_socket(sock) ( closesocket(sock) ) -typedef int socklen_t; -#else -#include -#include -#include -#include -#include -#include -#include -#define mongo_close_socket(sock) ( close(sock) ) -#endif - -#ifndef _WIN32 -#include -#endif - -#if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || _POSIX_C_SOURCE >= 1 -#define _MONGO_USE_GETADDRINFO -#endif - -MONGO_EXTERN_C_START - -/* This is a no-op in the generic implementation. */ -int mongo_set_socket_op_timeout( mongo *conn, int millis ); -int mongo_read_socket( mongo *conn, void *buf, int len ); -int mongo_write_socket( mongo *conn, const void *buf, int len ); -int mongo_socket_connect( mongo *conn, const char *host, int port ); - -MONGO_EXTERN_C_END -#endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/numbers.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/numbers.c index a63e3d73f9..b3032d5ee3 100644 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/numbers.c +++ b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/numbers.c @@ -1,4 +1,4 @@ -/* Copyright 2009-2011 10gen Inc. +/* Copyright 2009-2012 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform.h deleted file mode 100644 index 4a96af77e3..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform.h +++ /dev/null @@ -1,94 +0,0 @@ -/** @file platform.h */ - -/** Copyright 2009-2011 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* all platform-specific ifdefs should go here */ - -#ifndef _PLATFORM_HACKS_H_ -#define _PLATFORM_HACKS_H_ - -#ifdef __GNUC__ -#define MONGO_INLINE static __inline__ -#else -#define MONGO_INLINE static -#endif - -#ifdef __cplusplus -#define MONGO_EXTERN_C_START extern "C" { -#define MONGO_EXTERN_C_END } -#else -#define MONGO_EXTERN_C_START -#define MONGO_EXTERN_C_END -#endif - - -#if defined(MONGO_HAVE_STDINT) || __STDC_VERSION__ >= 199901L -#include -#elif defined(MONGO_HAVE_UNISTD) -#include -#elif defined(MONGO_USE__INT64) -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#elif defined(MONGO_USE_LONG_LONG_INT) -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#else -#error must have a 64bit int type -#endif - -/* big endian is only used for OID generation. little is used everywhere else */ -#ifdef MONGO_BIG_ENDIAN -#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) ) -#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) ) -#define bson_big_endian64(out, in) ( memcpy(out, in, 8) ) -#define bson_big_endian32(out, in) ( memcpy(out, in, 4) ) -#else -#define bson_little_endian64(out, in) ( memcpy(out, in, 8) ) -#define bson_little_endian32(out, in) ( memcpy(out, in, 4) ) -#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) ) -#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) ) -#endif - -MONGO_EXTERN_C_START - -MONGO_INLINE void bson_swap_endian64( void *outp, const void *inp ) { - const char *in = ( const char * )inp; - char *out = ( char * )outp; - - out[0] = in[7]; - out[1] = in[6]; - out[2] = in[5]; - out[3] = in[4]; - out[4] = in[3]; - out[5] = in[2]; - out[6] = in[1]; - out[7] = in[0]; - -} -MONGO_INLINE void bson_swap_endian32( void *outp, const void *inp ) { - const char *in = ( const char * )inp; - char *out = ( char * )outp; - - out[0] = in[3]; - out[1] = in[2]; - out[2] = in[1]; - out[3] = in[0]; -} - -MONGO_EXTERN_C_END - -#endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.c b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.c deleted file mode 100644 index b2f7c22898..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.c +++ /dev/null @@ -1,183 +0,0 @@ -/* net.c */ - -/* Copyright 2009-2011 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Implementation for Linux version of net.h */ -#include "net.h" -#include - -int mongo_write_socket( mongo *conn, const void *buf, int len ) { - const char *cbuf = buf; - while ( len ) { - int sent = send( conn->sock, cbuf, len, 0 ); - if ( sent == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - cbuf += sent; - len -= sent; - } - - return MONGO_OK; -} - -int mongo_read_socket( mongo *conn, void *buf, int len ) { - char *cbuf = buf; - while ( len ) { - int sent = recv( conn->sock, cbuf, len, 0 ); - if ( sent == 0 || sent == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - cbuf += sent; - len -= sent; - } - - return MONGO_OK; -} - -static int mongo_create_socket( mongo *conn ) { - int fd; - - if( ( fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) { - conn->err = MONGO_CONN_NO_SOCKET; - return MONGO_ERROR; - } - conn->sock = fd; - - return MONGO_OK; -} - -static int mongo_set_blocking_status( mongo *conn ) { - int flags; - int blocking; - - blocking = ( conn->conn_timeout_ms == 0 ); - if( blocking ) - return MONGO_OK; - else { - if( ( flags = fcntl( conn->sock, F_GETFL ) ) == -1 ) { - conn->err = MONGO_IO_ERROR; - mongo_close_socket( conn->sock ); - return MONGO_ERROR; - } - - flags |= O_NONBLOCK; - - if( ( flags = fcntl( conn->sock, F_SETFL, flags ) ) == -1 ) { - conn->err = MONGO_IO_ERROR; - mongo_close_socket( conn->sock ); - return MONGO_ERROR; - } - } - - return MONGO_OK; -} - -int mongo_set_socket_op_timeout( mongo *conn, int millis ) { - struct timeval tv; - tv.tv_sec = millis / 1000; - tv.tv_usec = ( millis % 1000 ) * 1000; - - if ( setsockopt( conn->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof( tv ) ) == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - - if ( setsockopt( conn->sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof( tv ) ) == -1 ) { - conn->err = MONGO_IO_ERROR; - return MONGO_ERROR; - } - - return MONGO_OK; -} - -#ifdef _MONGO_USE_GETADDRINFO -int mongo_socket_connect( mongo *conn, const char *host, int port ) { - - struct addrinfo *addrs = NULL; - struct addrinfo hints; - int flag = 1; - char port_str[12]; - int ret; - - conn->sock = 0; - conn->connected = 0; - - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - - sprintf( port_str, "%d", port ); - - if( mongo_create_socket( conn ) != MONGO_OK ) - return MONGO_ERROR; - - if( getaddrinfo( host, port_str, &hints, &addrs ) != 0 ) { - bson_errprintf( "getaddrinfo failed: %s", gai_strerror( ret ) ); - conn->err = MONGO_CONN_ADDR_FAIL; - return MONGO_ERROR; - } - - if ( connect( conn->sock, addrs->ai_addr, addrs->ai_addrlen ) == -1 ) { - mongo_close_socket( conn->sock ); - freeaddrinfo( addrs ); - conn->err = MONGO_CONN_FAIL; - return MONGO_ERROR; - } - - setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, ( char * )&flag, sizeof( flag ) ); - if( conn->op_timeout_ms > 0 ) - mongo_set_socket_op_timeout( conn, conn->op_timeout_ms ); - - conn->connected = 1; - freeaddrinfo( addrs ); - - return MONGO_OK; -} -#else -int mongo_socket_connect( mongo *conn, const char *host, int port ) { - struct sockaddr_in sa; - socklen_t addressSize; - int flag = 1; - - if( mongo_create_socket( conn ) != MONGO_OK ) - return MONGO_ERROR; - - memset( sa.sin_zero , 0 , sizeof( sa.sin_zero ) ); - sa.sin_family = AF_INET; - sa.sin_port = htons( port ); - sa.sin_addr.s_addr = inet_addr( host ); - addressSize = sizeof( sa ); - - if ( connect( conn->sock, ( struct sockaddr * )&sa, addressSize ) == -1 ) { - mongo_close_socket( conn->sock ); - conn->connected = 0; - conn->sock = 0; - conn->err = MONGO_CONN_FAIL; - return MONGO_ERROR; - } - - setsockopt( conn->sock, IPPROTO_TCP, TCP_NODELAY, ( char * ) &flag, sizeof( flag ) ); - - if( conn->op_timeout_ms > 0 ) - mongo_set_socket_op_timeout( conn, conn->op_timeout_ms ); - - conn->connected = 1; - - return MONGO_OK; -} -#endif diff --git a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.h b/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.h deleted file mode 100644 index 054247c1e8..0000000000 --- a/src/mod/event_handlers/mod_cdr_mongodb/driver/src/platform/linux/net.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file net.h - * @brief Networking. - */ - -/* Copyright 2009-2011 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Header for Linux net.h */ -#ifndef _MONGO_NET_H_ -#define _MONGO_NET_H_ - -#include "mongo.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define mongo_close_socket(sock) ( close(sock) ) - -#if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || _POSIX_C_SOURCE >= 1 -#define _MONGO_USE_GETADDRINFO -#endif - -MONGO_EXTERN_C_START - -int mongo_set_socket_op_timeout( mongo *conn, int millis ); -int mongo_read_socket( mongo *conn, void *buf, int len ); -int mongo_write_socket( mongo *conn, const void *buf, int len ); -int mongo_socket_connect( mongo *conn, const char *host, int port ); - -MONGO_EXTERN_C_END -#endif From 576fbb97ad6c934270f62bb9c70ed3f237b3ba3f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 07:10:19 -0500 Subject: [PATCH 250/731] tweak --- src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl index 4be66361e5..2c7575f64c 100644 --- a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl +++ b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl @@ -65,7 +65,7 @@ my $xml = qq# while (my $request = $scgi->accept) { # fork every new req into its own process (optional) - next unless(fork()); + next unless(my $pid = fork()); my $handle = $request->connection; $request->read_env; @@ -89,5 +89,5 @@ while (my $request = $scgi->accept) { #print $handle "Content-Type: text/xml\n\n"; print $handle $xml; - exit; + exit if (!$pid); } From f917cbe29b5a9589c5019ae40b0339e721d285f9 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 08:23:23 -0500 Subject: [PATCH 251/731] add server side to scgi --- libs/libscgi/Makefile | 7 +- libs/libscgi/src/include/scgi.h | 7 +- libs/libscgi/src/scgi.c | 184 ++++++++++++++++++++++++++++++++ libs/libscgi/testclient.c | 3 +- libs/libscgi/testserver.c | 42 ++++++++ 5 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 libs/libscgi/testserver.c diff --git a/libs/libscgi/Makefile b/libs/libscgi/Makefile index fb59cb7848..88b5b4e73c 100644 --- a/libs/libscgi/Makefile +++ b/libs/libscgi/Makefile @@ -14,7 +14,7 @@ HEADERS=src/include/scgi.h SOLINK=-shared -Xlinker -x -all: $(MYLIB) testclient +all: $(MYLIB) testclient testserver $(MYLIB): $(OBJS) $(HEADERS) $(SRC) ar rcs $(MYLIB) $(OBJS) @@ -26,7 +26,10 @@ $(MYLIB): $(OBJS) $(HEADERS) $(SRC) testclient: $(MYLIB) testclient.c $(CC) $(CC_CFLAGS) $(CFLAGS) testclient.c -o testclient -lscgi $(LDFLAGS) $(LIBS) +testserver: $(MYLIB) testserver.c + $(CC) $(CC_CFLAGS) $(CFLAGS) testserver.c -o testserver -lscgi $(LDFLAGS) $(LIBS) + clean: - rm -f *.o src/*.o libscgi.a *~ src/*~ src/include/*~ testclient + rm -f *.o src/*.o libscgi.a *~ src/*~ src/include/*~ testclient testserver diff --git a/libs/libscgi/src/include/scgi.h b/libs/libscgi/src/include/scgi.h index ea8d30ade4..29abcf0271 100644 --- a/libs/libscgi/src/include/scgi.h +++ b/libs/libscgi/src/include/scgi.h @@ -138,7 +138,7 @@ typedef int scgi_filehandle_t; #define scgi_strlen_zero(s) (!s || *(s) == '\0') #define scgi_strlen_zero_buf(s) (*(s) == '\0') #define end_of(_s) *(*_s == '\0' ? _s : _s + strlen(_s) - 1) - +#define end_of_p(_s) (*_s == '\0' ? _s : _s + strlen(_s) - 1) typedef enum { SCGI_POLL_READ = (1 << 0), @@ -179,7 +179,7 @@ typedef enum { SCGI_GENERR } scgi_status_t; - +typedef void (*scgi_listen_callback_t)(scgi_socket_t server_sock, scgi_socket_t client_sock, struct sockaddr_in *addr); SCGI_DECLARE(scgi_status_t) scgi_connect(scgi_handle_t *handle, const char *host, scgi_port_t port, uint32_t timeout); SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle); @@ -190,6 +190,9 @@ SCGI_DECLARE(scgi_status_t) scgi_add_param(scgi_handle_t *handle, const char *na SCGI_DECLARE(scgi_status_t) scgi_add_body(scgi_handle_t *handle, const char *value); SCGI_DECLARE(size_t) scgi_build_message(scgi_handle_t *handle, char **buffer); SCGI_DECLARE(scgi_status_t) scgi_destroy_params(scgi_handle_t *handle); +SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi_listen_callback_t callback); +SCGI_DECLARE(const char *) scgi_get_body(scgi_handle_t *handle); +SCGI_DECLARE(const char *) scgi_get_param(scgi_handle_t *handle, const char *name); #ifdef __cplusplus } diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index eeec39a07b..74cd5cae38 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -165,6 +165,11 @@ SCGI_DECLARE(scgi_status_t) scgi_add_body(scgi_handle_t *handle, const char *val return SCGI_SUCCESS; } +SCGI_DECLARE(const char *) scgi_get_body(scgi_handle_t *handle) +{ + return handle->body; +} + SCGI_DECLARE(scgi_status_t) scgi_add_param(scgi_handle_t *handle, const char *name, const char *value) { scgi_param_t *param, *pp; @@ -190,6 +195,19 @@ SCGI_DECLARE(scgi_status_t) scgi_add_param(scgi_handle_t *handle, const char *na return SCGI_SUCCESS; } +SCGI_DECLARE(const char *) scgi_get_param(scgi_handle_t *handle, const char *name) +{ + scgi_param_t *pp; + + for(pp = handle->params; pp; pp = pp->next) { + if (!strcasecmp(pp->name, name)) { + return pp->value; + } + } + + return NULL; +} + static scgi_status_t scgi_push_param(scgi_handle_t *handle, const char *name, const char *value) { scgi_param_t *param; @@ -518,3 +536,169 @@ SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t fl } #endif + +static int scgi_socket_reuseaddr(scgi_socket_t socket) +{ +#ifdef WIN32 + BOOL reuse_addr = TRUE; + return setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse_addr, sizeof(reuse_addr)); +#else + int reuse_addr = 1; + return setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr)); +#endif +} + +SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi_listen_callback_t callback) +{ + scgi_socket_t server_sock = SCGI_SOCK_INVALID; + struct sockaddr_in addr; + scgi_status_t status = SCGI_SUCCESS; + + if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { + return SCGI_FAIL; + } + + scgi_socket_reuseaddr(server_sock); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(port); + + if (bind(server_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + status = SCGI_FAIL; + goto end; + } + + if (listen(server_sock, 10000) < 0) { + status = SCGI_FAIL; + goto end; + } + + for (;;) { + int client_sock; + struct sockaddr_in echoClntAddr; +#ifdef WIN32 + int clntLen; +#else + unsigned int clntLen; +#endif + + clntLen = sizeof(echoClntAddr); + + if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == SCGI_SOCK_INVALID) { + status = SCGI_FAIL; + goto end; + } + + callback(server_sock, client_sock, &echoClntAddr); + } + + end: + + if (server_sock != SCGI_SOCK_INVALID) { + closesocket(server_sock); + server_sock = SCGI_SOCK_INVALID; + } + + return status; + +} + +#define next_str(_e, _s) _s = _e; while(*_s) _s++; _s++ + +SCGI_DECLARE(scgi_status_t) scgi_parse(scgi_socket_t sock, scgi_handle_t *handle) +{ + char sbuf[128] = ""; + char *p = sbuf, *e, *end; + ssize_t r = 0; + scgi_status_t status = SCGI_FAIL; + ssize_t bytes = 0; + char *headers = NULL; + int loops = 0; + ssize_t clen = 0; + char *body = NULL; + char comma = 0; + + handle->sock = sock; + handle->connected = 1; + sock_setup(handle); + + + for(;;) { + + if ((r = recv(sock, p, 1, 0)) < 1) { + break; + } + + if (*p == ':') { + *p = '\0'; + break; + } + p++; + } + + if (r <= 0) goto end; + + bytes = atoi(sbuf); + + if (bytes <= 0) goto end; + + headers = malloc(bytes); + r = recv(sock, headers, bytes, 0); + if (r <= 0) goto end; + + r = recv(sock, &comma, 1, 0); + if (r <= 0 || comma != ',') goto end; + + + p = headers; + end = p + bytes; + e = NULL; + + while(p < end) { + next_str(p, e); + + if (!e) break; + + if (!loops++) { + if (!strcasecmp(p, "CONTENT_LENGTH") && e) { + clen = atoi(e); + if (clen) { + body = malloc(clen+1); + r = recv(sock, body, clen, 0); + *(body + clen) = '\0'; + if (r <= 0) goto end; + scgi_add_body(handle, body); + scgi_safe_free(body); + } + + status = SCGI_SUCCESS; + + } else { + goto end; + } + } + + scgi_add_param(handle, p, e); + next_str(e, p); + } + + end: + + scgi_safe_free(headers); + + return status; +} + + +/* 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/libs/libscgi/testclient.c b/libs/libscgi/testclient.c index c43fe237c4..9b9078691c 100644 --- a/libs/libscgi/testclient.c +++ b/libs/libscgi/testclient.c @@ -10,7 +10,8 @@ int main(int argc, char *argv[]) int port = 0; if (argc < 2) { - fprintf(stderr, "usage: testclient "); + fprintf(stderr, "usage: testclient \n"); + exit(-1); } ip = argv[1]; diff --git a/libs/libscgi/testserver.c b/libs/libscgi/testserver.c new file mode 100644 index 0000000000..7cb6e32a03 --- /dev/null +++ b/libs/libscgi/testserver.c @@ -0,0 +1,42 @@ +#include + +static void callback(scgi_socket_t server_sock, scgi_socket_t client_sock, struct sockaddr_in *addr) +{ + scgi_handle_t handle = { 0 }; + + if (scgi_parse(client_sock, &handle) == SCGI_SUCCESS) { + scgi_param_t *pp; + + for(pp = handle.params; pp; pp = pp->next) { + printf("HEADER: [%s] VALUE: [%s]\n", pp->name, pp->value); + } + + if (handle.body) { + printf("\n\nBODY:\n%s\n\n", handle.body); + } + + } + + scgi_disconnect(&handle); + +} + +int main(int argc, char *argv[]) +{ + char *ip; + int port = 0; + + if (argc < 2) { + fprintf(stderr, "usage: testserver \n"); + exit(-1); + } + + ip = argv[1]; + port = atoi(argv[2]); + + + scgi_listen(ip, port, callback); + + + +} From 154678b6c228e7d46f526123f5f605351e6b7ab1 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Thu, 10 May 2012 10:27:16 -0500 Subject: [PATCH 252/731] tweak for config change --- freeswitch.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/freeswitch.spec b/freeswitch.spec index 470866ab2c..de228a06bf 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -1756,6 +1756,7 @@ fi %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/xml_cdr.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/xml_curl.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/xml_rpc.conf.xml +%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/xml_scgi.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/zeroconf.conf.xml ###################################################################################################################### # Chatplans From e0db68d20be1a1e2d03c1e1d84182aece058776a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 09:48:33 -0500 Subject: [PATCH 253/731] add string to url --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 687ec3aeb9..f2dbc61ee9 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -252,7 +252,7 @@ static switch_status_t do_config(void) binding->host = switch_core_strdup(globals.pool, host); binding->port = atoi(port); binding->vars_map = vars_map; - binding->url = switch_mprintf("scgi://%s:%s", host, port); + binding->url = switch_mprintf("scgi://%s:%s/%s", host, port, bname); if (bind_mask) { binding->bindings = switch_core_strdup(globals.pool, bind_mask); From 68021e862f146875f2fb6c45fb2de58b8e8d537d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 09:48:42 -0500 Subject: [PATCH 254/731] send silence on smaller sleeps --- src/switch_ivr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 325a8083a2..e4fc807596 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -170,7 +170,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, SWITCH_IVR_VERIFY_SILENCE_DIVISOR(sval); } - if (ms > 100 && sval) { + if (ms > 10 && sval) { switch_core_session_get_read_impl(session, &imp); if (switch_core_codec_init(&codec, From 787d81db320c8a34182570ad845efae2c7783eef Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 10:57:29 -0500 Subject: [PATCH 255/731] fix bsd build issue --- src/include/switch_platform.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/include/switch_platform.h b/src/include/switch_platform.h index 3d1efe425d..a011850748 100644 --- a/src/include/switch_platform.h +++ b/src/include/switch_platform.h @@ -258,8 +258,12 @@ typedef intptr_t switch_ssize_t; #endif #ifndef TIME_T_FMT +#if defined(__FreeBSD__) && SIZEOF_VOIDP == 4 +#define TIME_T_FMT "d" +#else #define TIME_T_FMT "ld" #endif +#endif #endif From aedbd06b99fb11030c498219f8e44370d7574fde Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 11:01:30 -0500 Subject: [PATCH 256/731] fix warning --- libs/libscgi/src/scgi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index 74cd5cae38..d1675d246f 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -226,7 +226,7 @@ static scgi_status_t scgi_push_param(scgi_handle_t *handle, const char *name, co SCGI_DECLARE(scgi_status_t) scgi_send_request(scgi_handle_t *handle) { - scgi_status_t status; + scgi_status_t status = SCGI_SUCCESS; char *buffer = NULL; size_t bytes = 0; ssize_t sent = 0; From cc36ff4800cd1df074a59eef4313b583f3d9f23f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 10 May 2012 17:19:06 +0000 Subject: [PATCH 257/731] debian: override gpl/openssl warning on freeswitch package --- debian/bootstrap.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 852571aeed..12dbde8e6d 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -878,9 +878,11 @@ grep -e '^Package:' control | while xread l; do print_long_filename_override "$m" >> $f fi done -f=libfreeswitch1.lintian-overrides -[ -s $f ] || print_edit_warning >> $f -print_gpl_openssl_override "libfreeswitch1" >> $f +for p in freeswitch libfreeswitch1; do + f=$p.lintian-overrides + [ -s $f ] || print_edit_warning >> $f + print_gpl_openssl_override "$p" >> $f +done echo "Done bootstrapping debian/" >&2 touch .stamp-bootstrap From adf313d0c32c2b0be38b7e513765f90200ec15a1 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 10 May 2012 17:24:37 +0000 Subject: [PATCH 258/731] debian: override warnings about closing an ITP bug --- debian/bootstrap.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 12dbde8e6d..7ac9b15e9e 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -541,6 +541,15 @@ ${p}: possible-gpl-code-linked-with-openssl EOF } +print_itp_override () { + local p="$1" + cat <&2 grep -e '^Package:' control | while xread l; do m="${l#*: }" f=$m.lintian-overrides - if [ ! -s $f ] || ! grep -e 'package-has-long-file-name' $f >/dev/null; then - [ -s $f ] || print_edit_warning >> $f + [ -s $f ] || print_edit_warning >> $f + if ! grep -e 'package-has-long-file-name' $f >/dev/null; then print_long_filename_override "$m" >> $f fi + if ! grep -e 'new-package-should-close-itp-bug' $f >/dev/null; then + print_itp_override "$m" >> $f + fi done for p in freeswitch libfreeswitch1; do f=$p.lintian-overrides From 62190e58367c7c1ce5334335cbf6b6e3ddfaff81 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 10 May 2012 18:25:30 +0000 Subject: [PATCH 259/731] debian: libfreeswitch1 shouldn't build-depend on perl:Depends --- debian/bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 7ac9b15e9e..52391ba438 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -196,7 +196,7 @@ Description: Cross-Platform Scalable Multi-Protocol Soft Switch Package: libfreeswitch1 Architecture: any -Depends: \${shlibs:Depends}, \${perl:Depends}, \${misc:Depends} +Depends: \${shlibs:Depends}, \${misc:Depends} Recommends: Suggests: libfreeswitch1-dbg Description: Cross-Platform Scalable Multi-Protocol Soft Switch From 9b265bdf8b9a22a5c60288d9e587fcf7b93f9b3a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 10 May 2012 18:47:02 +0000 Subject: [PATCH 260/731] debian: freeswitch depends on libfreeswitch1 --- debian/bootstrap.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 52391ba438..f7ecd14876 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -186,7 +186,8 @@ print_core_control () { cat < Date: Thu, 10 May 2012 18:53:55 +0000 Subject: [PATCH 261/731] debian: don't package the SWF slim player We're not including the source code or build tools for the version of the player we're distributing, so it fails The Debian Free Software Guidelines (DFSG). --- debian/bootstrap.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index f7ecd14876..bc5ab0b62f 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -210,7 +210,6 @@ Architecture: any Depends: \${misc:Depends}, freeswitch (= \${binary:Version}) Recommends: freeswitch-doc (= \${binary:Version}), - freeswitch-htdocs-slim (= \${binary:Version}), freeswitch-mod-commands (= \${binary:Version}), freeswitch-init (= \${binary:Version}), freeswitch-music (= \${binary:Version}), @@ -404,14 +403,6 @@ Description: FreeSWITCH systemd configuration ## misc -Package: freeswitch-htdocs-slim -Architecture: all -Depends: \${misc:Depends} -Description: FreeSWITCH htdocs slim player - $(debian_wrap "${fs_description}") - . - This package contains the slim SWF player for FreeSWITCH. - ## sounds Package: freeswitch-music From e54ab070f443f31369e99c79dae69d6607f21642 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 12:15:25 -0500 Subject: [PATCH 262/731] put presence-data in events --- src/include/switch_event.h | 2 ++ src/switch_channel.c | 33 +++++++++++++++++++++++++++++++++ src/switch_core_sqldb.c | 2 +- src/switch_event.c | 27 +++++++++++++++++++++++++++ src/switch_ivr_bridge.c | 38 +++++++++++++++++++++++++++++--------- 5 files changed, 92 insertions(+), 10 deletions(-) diff --git a/src/include/switch_event.h b/src/include/switch_event.h index dd5991bf07..5909c0e0c0 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -402,6 +402,8 @@ SWITCH_DECLARE(void) switch_event_deliver(switch_event_t **event); SWITCH_DECLARE(char *) switch_event_build_param_string(switch_event_t *event, const char *prefix, switch_hash_t *vars_map); SWITCH_DECLARE(int) switch_event_check_permission_list(switch_event_t *list, const char *name); +SWITCH_DECLARE(void) switch_event_add_presence_data_cols(switch_channel_t *channel, switch_event_t *event, const char *prefix); + ///\} SWITCH_END_EXTERN_C diff --git a/src/switch_channel.c b/src/switch_channel.c index 3c4262b0a9..20734d04f4 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1160,6 +1160,38 @@ SWITCH_DECLARE(uint32_t) switch_channel_del_variable_prefix(switch_channel_t *ch return r; } + +SWITCH_DECLARE(void) switch_channel_set_presence_data_vals(switch_channel_t *channel, const char *presence_data_cols) +{ + if (!zstr(presence_data_cols)) { + char *cols[128] = { 0 }; + char header_name[128] = ""; + int col_count = 0, i = 0; + char *data_copy = NULL; + + if (zstr(presence_data_cols)) { + presence_data_cols = switch_channel_get_variable_dup(channel, "presence_data_cols", SWITCH_FALSE, -1); + if (zstr(presence_data_cols)) { + return; + } + } + + data_copy = strdup(presence_data_cols); + + col_count = switch_split(data_copy, ':', cols); + + for (i = 0; i < col_count; i++) { + const char *val = NULL; + switch_snprintf(header_name, sizeof(header_name), "PD-%s", cols[i]); + val = switch_channel_get_variable(channel, cols[i]); + switch_channel_set_profile_var(channel, header_name, val); + } + + switch_safe_free(data_copy); + } +} + + SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_var_check(switch_channel_t *channel, const char *varname, const char *value, switch_bool_t var_check) { @@ -2192,6 +2224,7 @@ SWITCH_DECLARE(void) switch_channel_event_set_basic_data(switch_channel_t *chann if ((v = switch_channel_get_variable(channel, "presence_data_cols"))) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Presence-Data-Cols", v); + switch_event_add_presence_data_cols(channel, event, "PD-"); } if ((v = switch_channel_get_variable(channel, "call_uuid"))) { diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index d6c64758aa..5c59d96962 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -1171,7 +1171,7 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread, static char *parse_presence_data_cols(switch_event_t *event) { - char *cols[25] = { 0 }; + char *cols[128] = { 0 }; int col_count = 0; char *data_copy; switch_stream_handle_t stream = { 0 }; diff --git a/src/switch_event.c b/src/switch_event.c index bce57b79ee..fa864526c8 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -2399,7 +2399,34 @@ SWITCH_DECLARE(int) switch_event_check_permission_list(switch_event_t *list, con return r; } +SWITCH_DECLARE(void) switch_event_add_presence_data_cols(switch_channel_t *channel, switch_event_t *event, const char *prefix) +{ + const char *data; + if (!prefix) prefix = ""; + + if ((data = switch_channel_get_variable(channel, "presence_data_cols"))) { + char *cols[128] = { 0 }; + char header_name[128] = ""; + int col_count = 0, i = 0; + char *data_copy = NULL; + + data_copy = strdup(data); + + col_count = switch_split(data_copy, ':', cols); + + for (i = 0; i < col_count; i++) { + const char *val = NULL; + switch_snprintf(header_name, sizeof(header_name), "%s%s", prefix, cols[i]); + + val = switch_channel_get_variable(channel, cols[i]); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, header_name, val); + } + + switch_safe_free(data_copy); + } + +} /* For Emacs: diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 6a2cee0405..3d9758f62b 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -968,9 +968,16 @@ static switch_status_t signal_bridge_on_hibernate(switch_core_session_t *session if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_BRIDGE) == SWITCH_STATUS_SUCCESS) { + switch_core_session_t *other_session; + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", msg.string_arg); switch_channel_event_set_data(channel, event); + if ((other_session = switch_core_session_locate(msg.string_arg))) { + switch_channel_t *other_channel = switch_core_session_get_channel(other_session); + switch_event_add_presence_data_cols(other_channel, event, "Bridge-B-PD-"); + switch_core_session_rwunlock(other_session); + } switch_event_fire(&event); } } @@ -1052,16 +1059,27 @@ static switch_status_t signal_bridge_on_hangup(switch_core_session_t *session) } } - switch_core_session_rwunlock(other_session); - } + if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { + switch_channel_clear_flag_recursive(channel, CF_BRIDGE_ORIGINATOR); + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", uuid); + switch_event_add_presence_data_cols(other_channel, event, "Bridge-B-PD-"); + switch_channel_event_set_data(channel, event); + switch_event_fire(&event); + } + } - if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { - switch_channel_clear_flag_recursive(channel, CF_BRIDGE_ORIGINATOR); - if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", uuid); - switch_channel_event_set_data(channel, event); - switch_event_fire(&event); + switch_core_session_rwunlock(other_session); + } else { + if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { + switch_channel_clear_flag_recursive(channel, CF_BRIDGE_ORIGINATOR); + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", uuid); + switch_channel_event_set_data(channel, event); + switch_event_fire(&event); + } } } @@ -1242,6 +1260,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", switch_core_session_get_uuid(peer_session)); switch_channel_event_set_data(caller_channel, event); + switch_event_add_presence_data_cols(peer_channel, event, "Bridge-B-PD-"); switch_event_fire(&event); br = 1; } @@ -1425,6 +1444,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-A-Unique-ID", switch_core_session_get_uuid(session)); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridge-B-Unique-ID", switch_core_session_get_uuid(peer_session)); switch_channel_event_set_data(caller_channel, event); + switch_event_add_presence_data_cols(peer_channel, event, "Bridge-B-PD-"); switch_event_fire(&event); } From 704427337696b19c1eb2e46dc42b9c667d2c6408 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 12:23:00 -0500 Subject: [PATCH 263/731] not worth it.... --- .../event_handlers/mod_event_socket/mod_event_socket.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index b56c094872..d71a6fa70e 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -1356,16 +1356,16 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, if (switch_test_flag(listener, LFLAG_LINGER)) { char disco_buf[512] = ""; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(listener->session), SWITCH_LOG_DEBUG, "%s Socket Linger %"TIME_T_FMT"\n", - switch_channel_get_name(channel), listener->linger_timeout); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(listener->session), SWITCH_LOG_DEBUG, "%s Socket Linger %d\n", + switch_channel_get_name(channel), (int)listener->linger_timeout); switch_snprintf(disco_buf, sizeof(disco_buf), "Content-Type: text/disconnect-notice\n" "Controlled-Session-UUID: %s\n" "Content-Disposition: linger\n" "Channel-Name: %s\n" - "Linger-Time: %"TIME_T_FMT"\n" + "Linger-Time: %d\n" "Content-Length: 0\n\n", - switch_core_session_get_uuid(listener->session), switch_channel_get_name(channel), listener->linger_timeout); + switch_core_session_get_uuid(listener->session), switch_channel_get_name(channel), (int)listener->linger_timeout); if (listener->linger_timeout != (time_t) -1) { From 702cc9d49f158bd3a8ecf2cadf0acda6540c273d Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Thu, 10 May 2012 16:23:55 -0500 Subject: [PATCH 264/731] --resolve 4201 fix up the spec file to make sure /var/lib/freeswitch has the correct perms --- freeswitch.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/freeswitch.spec b/freeswitch.spec index de228a06bf..889dae9007 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -1593,6 +1593,7 @@ fi #################################### Basic Directory Structure ####################################################### # %dir %attr(0750, freeswitch, daemon) %{sysconfdir} +%dir %attr(0750, freeswitch, daemon) %{LOCALSTATEDIR} %dir %attr(0750, freeswitch, daemon) %{DBDIR} %dir %attr(0750, freeswitch, daemon) %{GRAMMARDIR} %dir %attr(0750, freeswitch, daemon) %{HTDOCSDIR} From dbafc38b3e5797c0096fc65a4f81d9b0e483272c Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Wed, 9 May 2012 10:49:11 +0200 Subject: [PATCH 265/731] skypopen: sk balances gives you how many credits you have, no more errors --- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index f489cc613a..08d815a7b1 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -2533,9 +2533,7 @@ SWITCH_STANDARD_API(sk_function) globals.SKYPOPEN_INTERFACES[tmp_i].message + 30); } } - } - - if (!strcasecmp(argv[0], "list")) { + } else if (!strcasecmp(argv[0], "list")) { int i; unsigned int ib = 0; unsigned int ib_failed = 0; From aba8e073a4f94ed95baad9388b5639f19051b605 Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Thu, 10 May 2012 23:04:58 +0200 Subject: [PATCH 266/731] skypopen: don't whine in debug when skypeout to pstn --- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 08d815a7b1..25539fa81e 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -879,7 +879,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch switch_sleep(1000); //XXX don't like this try++; if (try < 5) { - DEBUGA_SKYPE("skypopen_audio_read going back to read\n", SKYPOPEN_P_LOG); + //DEBUGA_SKYPE("skypopen_audio_read going back to read\n", SKYPOPEN_P_LOG); goto read; } DEBUGA_SKYPE("READ BUFFER EMPTY, skypopen_audio_read Silence\n", SKYPOPEN_P_LOG); From b008f8c9d59f8238316d18bdb5a8529c8ae50ccf Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 00:35:17 +0000 Subject: [PATCH 267/731] debian: attribution --- debian/rules | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/rules b/debian/rules index 0cc293a346..98b31607f4 100755 --- a/debian/rules +++ b/debian/rules @@ -1,5 +1,7 @@ #!/usr/bin/make -f # -*- mode:makefile -*- +##### Author: Travis Cross + #export DH_VERBOSE=1 FS_CFLAGS?=-ggdb3 -O2 From 383130f855759fbaba88311efac6870125f62344 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 02:03:58 +0000 Subject: [PATCH 268/731] debian: remove remnants of slimplayer as we're now packaging this under contrib --- debian/.gitignore | 1 - debian/freeswitch-htdocs-slim.install | 3 --- 2 files changed, 4 deletions(-) delete mode 100644 debian/freeswitch-htdocs-slim.install diff --git a/debian/.gitignore b/debian/.gitignore index dc57b0b450..a5ce34d6b9 100644 --- a/debian/.gitignore +++ b/debian/.gitignore @@ -20,7 +20,6 @@ /freeswitch-dbg/ /freeswitch-dev/ /freeswitch-doc/ -/freeswitch-htdocs-slim*/ /freeswitch-init*/ /freeswitch-meta*/ /freeswitch-mod-*/ diff --git a/debian/freeswitch-htdocs-slim.install b/debian/freeswitch-htdocs-slim.install deleted file mode 100644 index 0975415a85..0000000000 --- a/debian/freeswitch-htdocs-slim.install +++ /dev/null @@ -1,3 +0,0 @@ -/usr/share/freeswitch/htdocs/license.txt -/usr/share/freeswitch/htdocs/slim.swf -/usr/share/freeswitch/htdocs/slimtest.htm From f9653fbd38e569289181076bd1d9dc25ed2bba52 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 10 May 2012 22:34:37 -0500 Subject: [PATCH 269/731] FS-4204 --resolve --- src/include/switch_core.h | 2 +- src/mod/endpoints/mod_sofia/mod_sofia.c | 12 +++++ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 56 ++++++++++++++++++------ src/mod/endpoints/mod_sofia/sofia_glue.c | 4 ++ src/switch_core_media_bug.c | 22 +++++++++- src/switch_ivr_bridge.c | 2 + 7 files changed, 83 insertions(+), 16 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 91cff21d67..624d491e1d 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -141,7 +141,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_pop(switch_core_session_t SWITCH_DECLARE(switch_status_t) switch_core_media_bug_exec_all(switch_core_session_t *orig_session, const char *function, switch_media_bug_exec_cb_t cb, void *user_data); - +SWITCH_DECLARE(uint32_t) switch_core_media_bug_count(switch_core_session_t *orig_session, const char *function); /*! \brief Add a media bug to the session \param session the session to add the bug to diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index cf095386e5..164d0e76ff 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -5375,11 +5375,23 @@ SWITCH_STANDARD_APP(sofia_sla_function) if (bargee_session == session) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "BARGE: %s (cannot barge on myself)\n", (char *) data); } else { + switch_channel_t *channel; + if (switch_core_session_check_interface(bargee_session, sofia_endpoint_interface)) { tech_pvt = switch_core_session_get_private(bargee_session); + sofia_clear_flag(tech_pvt, TFLAG_SLA_BARGING); sofia_set_flag(tech_pvt, TFLAG_SLA_BARGE); switch_ivr_transfer_variable(bargee_session, session, SWITCH_SIGNAL_BOND_VARIABLE); } + + if (switch_core_session_check_interface(session, sofia_endpoint_interface)) { + tech_pvt = switch_core_session_get_private(session); + sofia_set_flag(tech_pvt, TFLAG_SLA_BARGING); + } + + channel = switch_core_session_get_channel(session); + switch_channel_set_variable(channel, "sip_barging_uuid", (char *)data); + } switch_core_session_rwunlock(bargee_session); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 2da82ac0c2..65755500a9 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -334,6 +334,7 @@ typedef enum { TFLAG_CAPTURE, TFLAG_REINVITED, TFLAG_SLA_BARGE, + TFLAG_SLA_BARGING, /* No new flags below this line */ TFLAG_MAX } TFLAGS; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index f87e8581b0..820118c585 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -599,6 +599,23 @@ void sofia_handle_sip_i_bye(switch_core_session_t *session, int status, status = 200; phrase = "OK"; + if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGING)) { + const char *bargee_uuid = switch_channel_get_variable(channel, "sip_barging_uuid"); + switch_core_session_t *bargee_session; + uint32_t ttl = 0; + + if ((bargee_session = switch_core_session_locate(bargee_uuid))) { + //switch_channel_t *bargee_channel = switch_core_session_get_channel(bargee_session); + if ((ttl = switch_core_media_bug_count(bargee_session, "eavesdrop")) == 1) { + if (switch_core_session_check_interface(bargee_session, sofia_endpoint_interface)) { + private_object_t *bargee_tech_pvt = switch_core_session_get_private(bargee_session); + sofia_clear_flag(bargee_tech_pvt, TFLAG_SLA_BARGE); + } + } + switch_core_session_rwunlock(bargee_session); + } + } + if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE)) { switch_core_session_t *new_session, *other_session; const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE); @@ -8419,9 +8436,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ if ((b_session = switch_core_session_locate(b_private->uuid))) { switch_channel_t *b_channel = switch_core_session_get_channel(b_session); - const char *uuid; - const char *app = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_VARIABLE); - const char *data = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE); + const char *bridge_uuid; switch_caller_profile_t *orig_cp; const char *sent_name, *sent_number; orig_cp = switch_channel_get_caller_profile(b_channel); @@ -8446,24 +8461,37 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Setting NAT mode based on %s\n", is_nat); } + tech_pvt->caller_profile->dialplan = "inline"; - if (app && data && !strcasecmp(app, "conference")) { - tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,conference:%s+flags{dist-dtmf}", data); - tech_pvt->caller_profile->dialplan = "inline"; - } else { - if (!(uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE))) { - uuid = switch_core_session_get_uuid(b_session); - } + bridge_uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE); - if (uuid) { - uuid = switch_core_session_strdup(b_session, uuid); + if (call_info) { + if (!zstr(bridge_uuid) && switch_channel_test_flag(b_channel, CF_LEG_HOLDING)) { + tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, + "answer,intercept:%s", bridge_uuid); + } else { tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,sofia_sla:%s", b_private->uuid); + } + } else { + if (!zstr(bridge_uuid)) { + switch_channel_mark_hold(b_channel, SWITCH_FALSE); + tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,intercept:%s", bridge_uuid); + } else { + const char *b_app = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_VARIABLE); + const char *b_data = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE); + + if (b_data && b_app) { + tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,%s:%s", b_app, b_data); + } else if (b_app) { + tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, "answer,%s", b_app); + } + - - tech_pvt->caller_profile->dialplan = "inline"; + switch_channel_hangup(b_channel, SWITCH_CAUSE_ATTENDED_TRANSFER); } } + switch_core_session_rwunlock(b_session); } } diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index f787ac3cbb..2039116b41 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -4061,6 +4061,10 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly) { int changed = 0; + if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE) || sofia_test_flag(tech_pvt, TFLAG_SLA_BARGING)) { + return 0; + } + if (sendonly && switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED)) { if (!sofia_test_flag(tech_pvt, TFLAG_SIP_HOLD)) { const char *stream; diff --git a/src/switch_core_media_bug.c b/src/switch_core_media_bug.c index 3d5c26b531..8b466b111e 100644 --- a/src/switch_core_media_bug.c +++ b/src/switch_core_media_bug.c @@ -600,6 +600,24 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_pop(switch_core_session_t return SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(uint32_t) switch_core_media_bug_count(switch_core_session_t *orig_session, const char *function) +{ + switch_media_bug_t *bp; + uint32_t x = 0; + + if (orig_session->bugs) { + switch_thread_rwlock_rdlock(orig_session->bug_rwlock); + for (bp = orig_session->bugs; bp; bp = bp->next) { + if (!switch_test_flag(bp, SMBF_PRUNE) && !switch_test_flag(bp, SMBF_LOCK) && !strcmp(bp->function, function)) { + x++; + } + } + switch_thread_rwlock_unlock(orig_session->bug_rwlock); + } + + return x; +} + SWITCH_DECLARE(switch_status_t) switch_core_media_bug_exec_all(switch_core_session_t *orig_session, const char *function, switch_media_bug_exec_cb_t cb, void *user_data) { @@ -629,7 +647,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_bug_enumerate(switch_core_sess stream->write_function(stream, "\n"); if (session->bugs) { - switch_thread_rwlock_wrlock(session->bug_rwlock); + switch_thread_rwlock_rdlock(session->bug_rwlock); for (bp = session->bugs; bp; bp = bp->next) { int thread_locked = (bp->thread_id && bp->thread_id == switch_thread_self()); stream->write_function(stream, @@ -778,6 +796,8 @@ SWITCH_DECLARE(uint32_t) switch_core_media_bug_prune(switch_core_session_t *sess switch_thread_rwlock_unlock(session->bug_rwlock); if (bp) { + switch_clear_flag(bp, SMBF_LOCK); + bp->thread_id = 0; switch_core_media_bug_close(&bp); ttl++; goto top; diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 3d9758f62b..d8b548b048 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -228,6 +228,8 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) } } + switch_channel_clear_flag(chan_a, CF_INTERCEPT); + switch_channel_clear_flag(chan_a, CF_INTERCEPTED); switch_channel_set_flag(chan_a, CF_BRIDGED); From 495dd7e5e2dc377aa756fa0a28d02073c1c8be13 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 03:14:40 +0000 Subject: [PATCH 270/731] debian: stop if we hit any errors in util.sh --- debian/util.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/util.sh b/debian/util.sh index e8dc26448f..cb69823c7c 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -2,6 +2,8 @@ ##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- ##### Author: Travis Cross +set -e + ddir="." [ -n "${0%/*}" ] && ddir="${0%/*}" From 417c3c29fca98b6d52a8372fa92907a76833d35d Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 04:37:54 +0000 Subject: [PATCH 271/731] debian: clean up after bootstrapping --- debian/bootstrap.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index bc5ab0b62f..1ded03cc12 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -888,5 +888,10 @@ for p in freeswitch libfreeswitch1; do print_gpl_openssl_override "$p" >> $f done +echo "Cleaning up..." >&2 +rm -f control-modules.preparse +rm -rf control-modules.parse +diff control-modules control-modules.gen >/dev/null && rm -f control-modules.gen + echo "Done bootstrapping debian/" >&2 touch .stamp-bootstrap From 18de24477802f0c9f2dff91b1b205d18e65fbe62 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 03:13:39 +0000 Subject: [PATCH 272/731] debian: add a utility to create the .orig.tar.* file --- debian/util.sh | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/debian/util.sh b/debian/util.sh index cb69823c7c..e5e561a26d 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -72,10 +72,112 @@ install_build_depends () { touch $ddir/.stamp-build-depends } +cwget () { + local url="$1" f="${1##*/}" + echo "fetching: $url to $f" >&2 + if [ -n "$FS_FILES_DIR" ]; then + if ! [ -s "$FS_FILES_DIR/$f" ]; then + (cd $FS_FILES_DIR && wget -N "$url") + fi + cp -a $FS_FILES_DIR/$f . + else + wget -N "$url" + fi +} + +getlib () { + local sd="$1" url="$2" f="${2##*/}" + (cd $sd/libs \ + && cwget "$url" \ + && tar -xv --no-same-owner --no-same-permissions -f "$f" \ + && rm -f "$f" \ + && mkdir -p $f) +} + +getsound () { + local sd="$1" url="$2" f="${2##*/}" + (cd $sd \ + && cwget "$url") +} + +getlibs () { + local sd="$1" + # get pinned libraries + getlib $sd http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz + getlib $sd http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2 + getlib $sd http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz + getlib $sd http://download.zeromq.org/zeromq-2.1.9.tar.gz \ + || getlib $sd http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz + getlib $sd http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz + # get sounds and music + for x in 8000 16000 32000 48000; do + getsound $sd http://files.freeswitch.org/freeswitch-sounds-en-us-callie-$x-1.0.18.tar.gz + getsound $sd http://files.freeswitch.org/freeswitch-sounds-music-$x-1.0.8.tar.gz + done + # cleanup mongo + ( + cd $sd/libs/mongo-cxx-driver-v1.8 + rm -rf config.log .sconf_temp *Test *Example + find . -name "*.o" -exec rm -f {} \; + ) +} + +get_current_version () { + cat $ddir/changelog \ + | grep -e '^freeswitch ' \ + | awk '{print $2}' \ + | sed -e 's/[()]//g' -e 's/-.*//' +} + +create_orig () { + . $ddir/../scripts/ci/common.sh + local xz_level="6" + while getopts 'dZ:' o; do + case "$o" in + d) set -vx;; + Z) xz_level="$OPTARG";; + esac + done + shift $(($OPTIND-1)) + eval $(parse_version "$(get_current_version)") + local destdir="$1" n=freeswitch + local d=${n}-${dver} f=${n}_${dver} + local sd=${ddir}/sdeb/$d + [ -n "$destdir" ] || destdir=$ddir/../../ + mkdir -p $sd + tar -c -C $ddir/../ \ + --exclude=.git \ + --exclude=debian \ + --exclude=freeswitch.xcodeproj \ + --exclude=fscomm \ + --exclude=htdocs \ + --exclude=w32 \ + --exclude=web \ + -vf - . | tar -x -C $sd -vf - + (cd $sd && set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev") + getlibs $sd + tar -c -C $ddir/sdeb -vf $ddir/sdeb/$f.orig.tar $d + xz -${xz_level}v $ddir/sdeb/$f.orig.tar + mv $ddir/sdeb/$f.orig.tar.xz $destdir + rm -rf $ddir/sdeb +} + cmd="$1" shift case "$cmd" in create-dbg-pkgs) create_dbg_pkgs ;; + create-orig) create_orig "$@" ;; list-build-depends) list_build_depends ;; install-build-depends) install_build_depends ;; esac From 8d366f7f984d73f2d5ab6054364bdfcdf1933ff3 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 04:48:21 +0000 Subject: [PATCH 273/731] debian: add a utility for creating the source package --- debian/util.sh | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index e5e561a26d..e67b96df79 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -140,18 +140,10 @@ get_current_version () { | sed -e 's/[()]//g' -e 's/-.*//' } -create_orig () { +_create_orig () { . $ddir/../scripts/ci/common.sh - local xz_level="6" - while getopts 'dZ:' o; do - case "$o" in - d) set -vx;; - Z) xz_level="$OPTARG";; - esac - done - shift $(($OPTIND-1)) eval $(parse_version "$(get_current_version)") - local destdir="$1" n=freeswitch + local destdir="$1" xz_level="$2" n=freeswitch local d=${n}-${dver} f=${n}_${dver} local sd=${ddir}/sdeb/$d [ -n "$destdir" ] || destdir=$ddir/../../ @@ -173,10 +165,48 @@ create_orig () { rm -rf $ddir/sdeb } +create_orig () { + local xz_level="6" + while getopts 'dZ:' o; do + case "$o" in + d) set -vx;; + Z) xz_level="$OPTARG";; + esac + done + shift $(($OPTIND-1)) + _create_orig "$1" "$xz_level" +} + +create_dsc () { + . $ddir/../scripts/ci/common.sh + local xz_level="6" + while getopts 'dZ:' o; do + case "$o" in + d) set -vx;; + Z) xz_level="$OPTARG";; + esac + done + shift $(($OPTIND-1)) + eval $(parse_version "$(get_current_version)") + local destdir="$1" n=freeswitch + local d=${n}-${dver} f=${n}_${dver} + [ -n "$destdir" ] || destdir=$ddir/../../ + [ -f $destdir/$f.orig.tar.xz ] \ + || _create_orig "$1" "${xz_level}" + ( + ddir=$(pwd)/$ddir + cd $destdir + mkdir -p $f + cp -a $ddir $f + dpkg-source -b -i.* -Zxz -z9 $f + ) +} + cmd="$1" shift case "$cmd" in create-dbg-pkgs) create_dbg_pkgs ;; + create-dsc) create_dsc "$@" ;; create-orig) create_orig "$@" ;; list-build-depends) list_build_depends ;; install-build-depends) install_build_depends ;; From 193512e9ea290d8a5e5a4ce9941e8f0c6cba56d4 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 11 May 2012 06:23:18 +0000 Subject: [PATCH 274/731] debian: mirror dpkg-source parameter choice --- debian/util.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index e67b96df79..be7f2f1cc0 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -167,10 +167,10 @@ _create_orig () { create_orig () { local xz_level="6" - while getopts 'dZ:' o; do + while getopts 'dz:' o; do case "$o" in d) set -vx;; - Z) xz_level="$OPTARG";; + z) xz_level="$OPTARG";; esac done shift $(($OPTIND-1)) @@ -180,10 +180,10 @@ create_orig () { create_dsc () { . $ddir/../scripts/ci/common.sh local xz_level="6" - while getopts 'dZ:' o; do + while getopts 'dz:' o; do case "$o" in d) set -vx;; - Z) xz_level="$OPTARG";; + z) xz_level="$OPTARG";; esac done shift $(($OPTIND-1)) From 03bfc941a1dea7381db54928421ad567eaae0a44 Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Fri, 11 May 2012 08:08:11 +0200 Subject: [PATCH 275/731] gsmopen: not check for CKPD when receiving SMS --- src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index 2294ee4aee..fc59687958 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -1199,7 +1199,7 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us /* we're not in a call, neither calling */ res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CKPD=\"EEE\""); if (res) { - ERRORA("AT+CKPD=\"EEE\" (cellphone screen back to user) do not got OK from the phone\n", GSMOPEN_P_LOG); + DEBUGA_GSMOPEN("AT+CKPD=\"EEE\" (cellphone screen back to user) do not got OK from the phone\n", GSMOPEN_P_LOG); } } } //unread_msg_id From f3b1809a63f70c0da611b7dacf48e49c329b43c6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 11 May 2012 10:20:45 -0500 Subject: [PATCH 276/731] tweak to standby mode --- src/mod/endpoints/mod_sofia/sofia.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 820118c585..26fc3e2668 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1711,11 +1711,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread /* While we're running, or there is a pending sql statment that we haven't appended to sqlbuf yet, because of a lack of buffer space */ while ((mod_sofia_globals.running == 1 && sofia_test_pflag(profile, PFLAG_RUNNING)) || sql) { - if (sofia_test_pflag(profile, PFLAG_STANDBY)) { - switch_yield(1000000); - continue; - } - if (sofia_test_pflag(profile, PFLAG_SQL_IN_TRANS)) { /* Do we have enough statements or is the timeout expired */ while (sql || (sofia_test_pflag(profile, PFLAG_RUNNING) && mod_sofia_globals.running == 1 && @@ -1812,18 +1807,21 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread } } - if (++ireg_loops >= IREG_SECONDS) { - time_t now = switch_epoch_time_now(NULL); - sofia_reg_check_expire(profile, now, 0); - ireg_loops = 0; - } - if (++gateway_loops >= GATEWAY_SECONDS) { - sofia_reg_check_gateway(profile, switch_epoch_time_now(NULL)); - gateway_loops = 0; - } + if (!sofia_test_pflag(profile, PFLAG_STANDBY)) { + if (++ireg_loops >= IREG_SECONDS) { + time_t now = switch_epoch_time_now(NULL); + sofia_reg_check_expire(profile, now, 0); + ireg_loops = 0; + } + + if (++gateway_loops >= GATEWAY_SECONDS) { + sofia_reg_check_gateway(profile, switch_epoch_time_now(NULL)); + gateway_loops = 0; + } - sofia_sub_check_gateway(profile, time(NULL)); + sofia_sub_check_gateway(profile, time(NULL)); + } last_check = switch_micro_time_now(); } From afdfb9a6e16d0b15236cfd38439c1c0a1d6e5a3a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 11 May 2012 12:46:32 -0500 Subject: [PATCH 277/731] fix missed error condition --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index f2dbc61ee9..87fed74571 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -143,6 +143,11 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con } scgi_disconnect(&handle); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s Connection Failed: [%s]\n", binding->url, handle.err); + switch_safe_free(data); + switch_safe_free(stream.data); + return NULL; } if (GLOBAL_DEBUG) { From bbd9aa237edb57ca5ebc8b7ad85509505999062e Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 11 May 2012 13:06:35 -0500 Subject: [PATCH 278/731] another tweak --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 33 +++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 87fed74571..66833b110e 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -143,30 +143,39 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con } scgi_disconnect(&handle); + + if (len < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s Connection Read Failed: [%s]\n", binding->url, handle.err); + goto end; + } + } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s Connection Failed: [%s]\n", binding->url, handle.err); - switch_safe_free(data); - switch_safe_free(stream.data); - return NULL; + goto end; } if (GLOBAL_DEBUG) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s\nPOST_DATA:\n%s\n\nRESPONSE:\n%s\n\n", binding->url, data, txt); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s\nPOST_DATA:\n%s\n\nRESPONSE:-----\n%s\n-----\n", binding->url, data, txt); } - if (!len) { - if (!(xml = switch_xml_parse_str(txt, strlen(txt)))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s]\n", binding->url, data); + if (bytes) { + if ((xml = switch_xml_parse_str(txt, strlen(txt)))) { + txt = NULL; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s] RESPONSE[%s]\n", + binding->url, data, switch_str_nil(txt)); } } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received error trying to fetch %s\ndata: [%s]\n", binding->url, data); - switch_safe_free(stream.data); - xml = NULL; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received error trying to fetch %s\ndata: [%s] RESPONSE [%s]\n", + binding->url, data, switch_str_nil(txt)); } + + + end: switch_safe_free(data); - - + switch_safe_free(txt); + return xml; } From dd1ae3307cffe054c3f34883235e2a90ec16564b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 11 May 2012 13:12:44 -0500 Subject: [PATCH 279/731] another tweak --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 66833b110e..722dd8c9a1 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -159,7 +159,7 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con } if (bytes) { - if ((xml = switch_xml_parse_str(txt, strlen(txt)))) { + if ((xml = switch_xml_parse_str_dynamic(txt, FALSE))) { txt = NULL; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s] RESPONSE[%s]\n", From 0b43b32b42854cd53005c40c6d0717d566a01281 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 11 May 2012 13:34:42 -0500 Subject: [PATCH 280/731] Wrong week to quit sniffing glue --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 722dd8c9a1..97b6bdcf0a 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -140,6 +140,7 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con } stream.write_function(&stream, "%s", buf); + txt = (char *) stream.data; } scgi_disconnect(&handle); @@ -154,17 +155,21 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con goto end; } + + if (GLOBAL_DEBUG) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s\nPOST_DATA:\n%s\n\nRESPONSE:-----\n%s\n-----\n", binding->url, data, txt); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s\nPOST_DATA:\n%s\n\nRESPONSE:\n-----\n%s\n-----\n", + binding->url, data, switch_str_nil(txt)); } - if (bytes) { - if ((xml = switch_xml_parse_str_dynamic(txt, FALSE))) { - txt = NULL; - } else { + + + if (bytes && txt) { + if (!(xml = switch_xml_parse_str_dynamic(txt, FALSE))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s] RESPONSE[%s]\n", binding->url, data, switch_str_nil(txt)); } + txt = NULL; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received error trying to fetch %s\ndata: [%s] RESPONSE [%s]\n", binding->url, data, switch_str_nil(txt)); From 2bd84705343c14048ec7c0d402fa2fe4e3640755 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 02:39:49 +0000 Subject: [PATCH 281/731] debian: trust shlibs:Depends to do its thing --- debian/control-modules | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/debian/control-modules b/debian/control-modules index 8ea77b00f0..c74f49bf0a 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -133,9 +133,6 @@ Description: MongoDB This module provides an interface to MongoDB. Build-Depends: scons, libboost-dev, libboost-system-dev, libboost-date-time-dev, libboost-thread-dev, libboost-filesystem-dev -Depends: libicu44, libboost-system1.42.0, libboost-date-time1.42.0, - libboost-serialization1.42.0, libboost-thread1.42.0, - libboost-filesystem1.42.0 Module: applications/mod_mp4 Description: MP4 video support @@ -317,7 +314,6 @@ Module: codecs/mod_speex Description: mod_speex Adds mod_speex. Build-Depends: libogg-dev -Depends: libogg0 Module: codecs/mod_theora Description: mod_theora @@ -353,7 +349,6 @@ Module: endpoints/mod_alsa Description: mod_alsa Adds mod_alsa. Build-Depends: libasound2-dev -Depends: libasound2 Module: endpoints/mod_dingaling Description: mod_dingaling @@ -399,7 +394,6 @@ Module: endpoints/mod_skypopen Description: mod_skypopen Adds mod_skypopen. Build-Depends: libx11-dev -Depends: libpthread-stubs0 Module: endpoints/mod_sofia Description: mod_sofia @@ -423,7 +417,6 @@ Module: event_handlers/mod_cdr_pg_csv Description: mod_cdr_pg_csv Adds mod_cdr_pg_csv. Build-Depends: libpq-dev -Depends: libpq5 Module: event_handlers/mod_cdr_sqlite Description: mod_cdr_sqlite @@ -483,8 +476,6 @@ Module: formats/mod_shout Description: mod_shout Adds mod_shout. Build-Depends: libogg-dev, libvorbis-dev -Depends: libogg0, libvorbis0a, libvorbisenc2, libvorbisfile3, - libvorbisidec1 Module: formats/mod_sndfile Description: mod_sndfile @@ -498,7 +489,6 @@ Module: formats/mod_vlc Description: VLC streaming This module provides VLC streaming. Build-Depends: libvlc-dev (>= 2.0.0) -Depends: libvlc5 Distro-Conflicts: squeeze ## mod/languages @@ -519,7 +509,6 @@ Module: languages/mod_perl Description: mod_perl Adds mod_perl. Build-Depends: libperl-dev -Depends: libperl5.10 Module: languages/mod_python Description: mod_python @@ -635,7 +624,6 @@ Module: xml_int/mod_xml_ldap Description: mod_xml_ldap Adds mod_xml_ldap. Build-Depends: libsasl2-dev -Depends: libsasl2-modules Module: xml_int/mod_xml_rpc Description: mod_xml_rpc From 31703ab6a4f5b7ef0b2667f55676da3306dcca0a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 04:38:56 +0000 Subject: [PATCH 282/731] debian: add support for per-distribution build-depends --- debian/bootstrap.sh | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 1ded03cc12..984c90b442 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -6,6 +6,7 @@ mod_dir="../src/mod" conf_dir="../conf" fs_description="FreeSWITCH is a scalable open source cross-platform telephony platform designed to route and interconnect popular communication protocols using audio, video, text or any other form of media." mod_build_depends="." +supported_distros="squeeze wheezy sid" avoid_mods=( applications/mod_fax applications/mod_ladspa @@ -123,6 +124,11 @@ map_modules () { description="" long_description="" build_depends="" depends="" recommends="" suggests="" distro_conflicts="" + distro_vars="" + for x in $supported_distros; do + distro_vars="$distro_vars build_depends_$x" + eval build_depends_$x="" + done . $y [ -n "$description" ] || description="$module_name" [ -n "$long_description" ] || description="Adds ${module_name}." @@ -131,7 +137,7 @@ map_modules () { module module_name module_path \ description long_description \ build_depends depends recommends suggests \ - distro_conflicts + distro_conflicts $distro_vars done unset category category_path done @@ -695,11 +701,17 @@ gensound () { } accumulate_build_depends () { - if [ -n "$build_depends" ]; then + local x="" + if [ -n "$(eval echo \$build_depends_$codename)" ]; then + x="$(eval echo \$build_depends_$codename)" + else + x="${build_depends}" + fi + if [ -n "$x" ]; then if [ ! "$mod_build_depends" = "." ]; then - mod_build_depends="${mod_build_depends}, ${build_depends}" + mod_build_depends="${mod_build_depends}, ${x}" else - mod_build_depends="${build_depends}" + mod_build_depends="${x}" fi fi } @@ -815,6 +827,10 @@ genmodctl_mod () { echo " $v" done [ -n "$build_depends" ] && debian_wrap "Build-Depends: $build_depends" + for x in $supported_distros; do + [ -n "$(eval echo \$build_depends_$x)" ] \ + && debian_wrap "Build-Depends-$x: $(eval echo \$build_depends_$x)" + done [ -n "$depends" ] && debian_wrap "Depends: $depends" [ -n "$reccomends" ] && debian_wrap "Recommends: $recommends" [ -n "$suggests" ] && debian_wrap "Suggests: $suggests" From 65a29d68f9ba74de1116b0f5d6854cf50cc3657a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 02:49:15 +0000 Subject: [PATCH 283/731] debian: add some module build dependencies Thanks to Steven Ayre for an initial list. I've made some modifications and corrections. FS-4202 --resolve --- debian/control-modules | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index c74f49bf0a..a1b1178aaf 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -357,6 +357,7 @@ Description: mod_dingaling Module: endpoints/mod_gsmopen Description: mod_gsmopen Adds mod_gsmopen. +Build-Depends: libx11-dev Module: endpoints/mod_h323 Description: mod_h323 @@ -425,10 +426,12 @@ Description: mod_cdr_sqlite Module: event_handlers/mod_erlang_event Description: mod_erlang_event Adds mod_erlang_event. +Build-Depends: erlang-dev Module: event_handlers/mod_event_multicast Description: mod_event_multicast Adds mod_event_multicast. +Build-Depends: libssl-dev Module: event_handlers/mod_event_socket Description: mod_event_socket @@ -453,6 +456,7 @@ Description: mod_radius_cdr Module: event_handlers/mod_snmp Description: mod_snmp Adds mod_snmp. +Build-Depends: libsnmp-dev ## mod/formats @@ -496,6 +500,7 @@ Distro-Conflicts: squeeze Module: languages/mod_java Description: mod_java Adds mod_java. +Build-Depends: default-jdk Module: languages/mod_lua Description: mod_lua @@ -504,6 +509,7 @@ Description: mod_lua Module: languages/mod_managed Description: mod_managed Adds mod_managed. +Build-Depends: libmono-2.0-dev Module: languages/mod_perl Description: mod_perl @@ -513,10 +519,12 @@ Build-Depends: libperl-dev Module: languages/mod_python Description: mod_python Adds mod_python. +Build-Depends: python-dev Module: languages/mod_spidermonkey Description: mod_spidermonkey Adds mod_spidermonkey. +Build-Depends: unixodbc-dev Module: languages/mod_yaml Description: mod_yaml From 3e2194873d78584ce95f8938934486b923cfd4fa Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 18:10:52 +0000 Subject: [PATCH 284/731] debian: enable mod_snmp --- debian/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 984c90b442..deeaca1ff8 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -28,7 +28,6 @@ avoid_mods=( endpoints/mod_portaudio endpoints/mod_reference endpoints/mod_unicall - event_handlers/mod_snmp formats/mod_portaudio_stream formats/mod_shout languages/mod_java From 7061ff3b842f3ce107fca812ed12bc721ac7e1f2 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 05:06:14 +0000 Subject: [PATCH 285/731] debian: mod_java depends on gcj-jdk for a symlink to jni.h See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=371060 --- debian/control-modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control-modules b/debian/control-modules index a1b1178aaf..2d068aab0b 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -500,7 +500,7 @@ Distro-Conflicts: squeeze Module: languages/mod_java Description: mod_java Adds mod_java. -Build-Depends: default-jdk +Build-Depends: default-jdk, gcj-jdk Module: languages/mod_lua Description: mod_lua From 3eec3d79be24f03606b7ccab30f7d3c3745dcc14 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 18:11:09 +0000 Subject: [PATCH 286/731] debian: enable mod_java --- debian/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index deeaca1ff8..518d88beca 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -30,7 +30,6 @@ avoid_mods=( endpoints/mod_unicall formats/mod_portaudio_stream formats/mod_shout - languages/mod_java languages/mod_managed languages/mod_spidermonkey languages/mod_yaml From e44bdd11f443cd56fb7f8e6600d31957af1b870c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 18:11:28 +0000 Subject: [PATCH 287/731] debian: enable mod_managed except on squeeze mod_managed needs mono 2.8 or greater, and squeeze has only mono 2.6. --- debian/bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 518d88beca..33af6fb2e3 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -30,7 +30,6 @@ avoid_mods=( endpoints/mod_unicall formats/mod_portaudio_stream formats/mod_shout - languages/mod_managed languages/mod_spidermonkey languages/mod_yaml sdk/autotools @@ -38,6 +37,7 @@ avoid_mods=( ) avoid_mods_squeeze=( formats/mod_vlc + languages/mod_managed ) err () { From ee653e58614b123708e4527ddaa28b7a6e3faf04 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 07:20:29 +0000 Subject: [PATCH 288/731] debian: use libjpeg62-dev rather than libjpeg8-dev Some modules such as mod_h323 pull in libjpeg62-dev which creates a dependency conflict if we try to use libjpeg8-dev for the core. --- debian/bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 33af6fb2e3..cd72d4c983 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -168,7 +168,7 @@ Build-Depends: wget, pkg-config, # configure options libssl-dev, unixodbc-dev, - libncurses5-dev, libjpeg8-dev, + libncurses5-dev, libjpeg62-dev, python-dev, erlang-dev, # documentation doxygen, From 5e83530a20876bd8f5a0c61ff69c781f6b37725c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 05:49:58 +0000 Subject: [PATCH 289/731] debian: add build-depends and suggests for mod_ladspa --- debian/control-modules | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index 2d068aab0b..7a29134f5d 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -114,6 +114,8 @@ Description: HTTP GET with caching Module: applications/mod_ladspa Description: LADSPA This module provides an API for accessing LADSPA plugins. +Build-Depends: ladspa-sdk +Suggests: tap-plugins, swh-plugins, autotalent Module: applications/mod_lcr Description: LCR From df19f49fd8501c235ee7aec396990296bc1d507c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 06:24:40 +0000 Subject: [PATCH 290/731] debian: enable mod_ladspa --- debian/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index cd72d4c983..39a19847f7 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -9,7 +9,6 @@ mod_build_depends="." supported_distros="squeeze wheezy sid" avoid_mods=( applications/mod_fax - applications/mod_ladspa applications/mod_limit applications/mod_mongo applications/mod_mp4 From 832d00f3daabb69a375e091409f2cac977e9c322 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 06:54:38 +0000 Subject: [PATCH 291/731] debian: add build-depends for mod_yaml --- debian/control-modules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control-modules b/debian/control-modules index 7a29134f5d..62ca64699e 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -531,6 +531,7 @@ Build-Depends: unixodbc-dev Module: languages/mod_yaml Description: mod_yaml Adds mod_yaml. +Build-Depends: libyaml-dev ## mod/loggers From d113dbd27af8d972523ab09a361bed12e4af9920 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 07:06:46 +0000 Subject: [PATCH 292/731] debian: enable mod_yaml --- debian/bootstrap.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 39a19847f7..3ff20088d3 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -30,7 +30,6 @@ avoid_mods=( formats/mod_portaudio_stream formats/mod_shout languages/mod_spidermonkey - languages/mod_yaml sdk/autotools xml_int/mod_xml_ldap ) From fb749c611f5b068f1fec50c1e631cb7db734dd65 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 05:41:25 +0000 Subject: [PATCH 293/731] debian: enable mod_portaudio and mod_portaudio_stream --- debian/bootstrap.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 3ff20088d3..2fc8b72f66 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -24,10 +24,8 @@ avoid_mods=( endpoints/mod_h323 endpoints/mod_khomp endpoints/mod_opal - endpoints/mod_portaudio endpoints/mod_reference endpoints/mod_unicall - formats/mod_portaudio_stream formats/mod_shout languages/mod_spidermonkey sdk/autotools From 0f50f044f3bb3598e865483c69d6dfa4de788783 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 06:47:21 +0000 Subject: [PATCH 294/731] debian: add build-depends for mod_h323 --- debian/control-modules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control-modules b/debian/control-modules index 62ca64699e..8038771e3b 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -364,6 +364,7 @@ Build-Depends: libx11-dev Module: endpoints/mod_h323 Description: mod_h323 Adds mod_h323. +Build-Depends: libopenh323-dev, libpt-dev Module: endpoints/mod_khomp Description: mod_khomp From ed42f37212bb9dfcf855c71d7aa52c3b65859871 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 06:34:54 +0000 Subject: [PATCH 295/731] debian: add build-depends and section for mod_mp4 This needs a package from debian-multimedia.org, so it needs to go in contrib/ and we can't build it as part of this source package. --- debian/control-modules | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index 8038771e3b..55f73c4532 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -139,6 +139,8 @@ Build-Depends: scons, libboost-dev, libboost-system-dev, Module: applications/mod_mp4 Description: MP4 video support This module adds support for MP4 video playback. +Build-Depends: libmp4v2-dev +Section: contrib/comm Module: applications/mod_nibblebill Description: Nibblebill From b19b6498db6f789e6e78c751ae68588bcc9c4bc4 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 06:37:27 +0000 Subject: [PATCH 296/731] debian: add build-depends for mod_osp --- debian/control-modules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control-modules b/debian/control-modules index 55f73c4532..1255b8ef40 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -150,6 +150,7 @@ Description: Nibblebill Module: applications/mod_osp Description: Open Settlement Protocol This module adds support for the Open Settlement Protocol (OSP). +Build-Depends: libosptk3-dev Module: applications/mod_rad_auth Description: RADIUS AA From c77d9a18dd4c54ab367bc1099926346bbfd42a39 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 18:53:00 +0000 Subject: [PATCH 297/731] spelling fix --- libs/libg722_1/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/libg722_1/README b/libs/libg722_1/README index 424c281581..865accacde 100644 --- a/libs/libg722_1/README +++ b/libs/libg722_1/README @@ -18,7 +18,7 @@ a separate process, and your application communicates with it through pipes or sockets. This implementation of G.722.1 is adapted from the reference source code -provided by Polycom. Polycom has given its concent for this library to be +provided by Polycom. Polycom has given its consent for this library to be distributed as source code, either on its own or as part of a larger package which they have licenced under their royalty free licencing scheme. From a7151174e29da4e07f4d5cb3696734fd4053c92a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 19:58:48 +0000 Subject: [PATCH 298/731] debian: support per-module section headers --- debian/bootstrap.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 2fc8b72f66..dcee07d3d0 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -115,7 +115,7 @@ map_modules () { module=${y##*/} module_path=$y $filterfn $category/$module || continue module="" category="" module_name="" - description="" long_description="" + section="" description="" long_description="" build_depends="" depends="" recommends="" suggests="" distro_conflicts="" distro_vars="" @@ -129,7 +129,7 @@ map_modules () { for f in $permodfns; do $f; done unset \ module module_name module_path \ - description long_description \ + section description long_description \ build_depends depends recommends suggests \ distro_conflicts $distro_vars done @@ -477,8 +477,10 @@ EOF } print_mod_control () { + local m_section="${section-comm}" cat < Date: Sat, 12 May 2012 19:51:16 +0000 Subject: [PATCH 299/731] debian: put mod_siren in non-free Despite the relatively-generous patent grant from Polycom, the requirement to execute further agreements to use the code and patents means this module fails the DFSG. We'll need to exclude this code from the source package as well. --- debian/control-modules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control-modules b/debian/control-modules index 1255b8ef40..fbcca77a9f 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -310,6 +310,7 @@ Description: mod_silk Module: codecs/mod_siren Description: mod_siren Adds mod_siren. +Section: non-free/comm Module: codecs/mod_skel_codec Description: mod_skel_codec From 243f950c2a36ac22591d19b0fb0bb399d8c70d65 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 19:57:25 +0000 Subject: [PATCH 300/731] debian: rearrange section headers --- debian/control-modules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control-modules b/debian/control-modules index fbcca77a9f..a82d163107 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -137,10 +137,10 @@ Build-Depends: scons, libboost-dev, libboost-system-dev, libboost-date-time-dev, libboost-thread-dev, libboost-filesystem-dev Module: applications/mod_mp4 +Section: contrib/comm Description: MP4 video support This module adds support for MP4 video playback. Build-Depends: libmp4v2-dev -Section: contrib/comm Module: applications/mod_nibblebill Description: Nibblebill @@ -308,9 +308,9 @@ Description: mod_silk Adds mod_silk. Module: codecs/mod_siren +Section: non-free/comm Description: mod_siren Adds mod_siren. -Section: non-free/comm Module: codecs/mod_skel_codec Description: mod_skel_codec From e84686943fc3ab093c1b18363c82b7a15e8c8caf Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 21:30:53 +0000 Subject: [PATCH 301/731] debian: put mod_ilbc in non-free The iLBC library in our tree is non-free software. Google has purchased Global IP Sound and released a newer version of this library as part of WebRTC as free software, but we need to upgrade to take advantage of this more favorable licensing. Until we do that, we also need to remove libs/ilbc from the Debian source packaging. --- debian/control-modules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control-modules b/debian/control-modules index a82d163107..3e066ac8b0 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -284,6 +284,7 @@ Description: mod_h26x Adds mod_h26x. Module: codecs/mod_ilbc +Section: non-free/comm Description: mod_ilbc Adds mod_ilbc. From 566123cc50c54bd24a3c5d6d439f526b325f0fa4 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sat, 12 May 2012 21:57:57 +0000 Subject: [PATCH 302/731] debian: mod_managed needs mono-gmcs to build --- debian/control-modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control-modules b/debian/control-modules index 3e066ac8b0..2327495663 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -517,7 +517,7 @@ Description: mod_lua Module: languages/mod_managed Description: mod_managed Adds mod_managed. -Build-Depends: libmono-2.0-dev +Build-Depends: libmono-2.0-dev, mono-gmcs Module: languages/mod_perl Description: mod_perl From 916624c58bdfbee2a41b41040e5f543a398913b5 Mon Sep 17 00:00:00 2001 From: William King Date: Sun, 13 May 2012 10:33:19 -0700 Subject: [PATCH 303/731] Adding mod_vlc as a commented out option into modules.conf. --- build/modules.conf.in | 1 + 1 file changed, 1 insertion(+) diff --git a/build/modules.conf.in b/build/modules.conf.in index 98a88e0622..31aea530fb 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -96,6 +96,7 @@ formats/mod_native_file #formats/mod_shout formats/mod_sndfile formats/mod_tone_stream +#formats/mod_vlc #languages/mod_java languages/mod_lua #languages/mod_managed From 3bc4aa39fe7505e9253e3e6a42dc556c7f28a4d9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 13 May 2012 05:59:03 +0000 Subject: [PATCH 304/731] debian: handle copyright information for pocketsphinx Debian expects all copyright information to be in one place, so we copy the license details to debian/copyright and remove the COPYING files when we install components. --- debian/copyright | 38 ++++++++++++++++++++++++++++++++++++++ debian/rules | 1 + 2 files changed, 39 insertions(+) diff --git a/debian/copyright b/debian/copyright index 658614828f..732b2b7d0c 100644 --- a/debian/copyright +++ b/debian/copyright @@ -23,3 +23,41 @@ License: MPL for the specific language governing rights and limitations under the License. +Files: libs/pocketsphinx* +Copyright: 2010 Carnegie Mellon University + /* ==================================================================== + * Copyright (c) 1999-2010 Carnegie Mellon University. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * This work was supported in part by funding from the Defense Advanced + * Research Projects Agency and the National Science Foundation of the + * United States of America, and the CMU Sphinx Speech Consortium. + * + * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND + * ANY EXPRESSED 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 CARNEGIE MELLON UNIVERSITY + * NOR ITS EMPLOYEES 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. + * + * ==================================================================== + * + */ + diff --git a/debian/rules b/debian/rules index 98b31607f4..60c5210940 100755 --- a/debian/rules +++ b/debian/rules @@ -93,6 +93,7 @@ override_dh_auto_install: -$(FS_INSTALL_SOUNDS) && DESTDIR=debian/tmp make cd-sounds-install cd-moh-install mkdir -p debian/tmp/lib/systemd/system install -m0644 debian/freeswitch-systemd.freeswitch.service debian/tmp/lib/systemd/system/freeswitch.service + rm -f debian/tmp/usr/share/freeswitch/grammar/model/communicator/COPYING override_dh_installinit: dh_installinit -pfreeswitch-sysvinit --name=freeswitch From 117582adcac5b514df6e24d8b4130c514ca466bb Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 13 May 2012 20:53:58 +0000 Subject: [PATCH 305/731] debian: match empty as well as unset section variable --- debian/bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index dcee07d3d0..0c2ee5d10a 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -477,7 +477,7 @@ EOF } print_mod_control () { - local m_section="${section-comm}" + local m_section="${section:-comm}" cat < Date: Sun, 13 May 2012 18:27:51 +0200 Subject: [PATCH 306/731] gsmopen: mod_sms tweak --- src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index d75dd5e6c4..d1443afc50 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -2978,6 +2978,7 @@ int sms_incoming(private_t *tech_pvt) DEBUGA_GSMOPEN("received SMS on interface %s: DATE=%s, SENDER=%s, BODY=%s|\n", GSMOPEN_P_LOG, tech_pvt->name, tech_pvt->sms_date, tech_pvt->sms_sender, tech_pvt->sms_body); +#ifdef NOTDEF if (!zstr(tech_pvt->session_uuid_str)) { session = switch_core_session_locate(tech_pvt->session_uuid_str); } @@ -2993,7 +2994,6 @@ int sms_incoming(private_t *tech_pvt) //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "chatname", tech_pvt->chatmessages[which].chatname); //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "id", tech_pvt->chatmessages[which].id); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subject", "SIMPLE MESSAGE"); -/* mod_sms begin */ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to", tech_pvt->name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_proto", GSMOPEN_CHAT_PROTO); @@ -3002,10 +3002,7 @@ int sms_incoming(private_t *tech_pvt) //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_full", "from_full"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_user", tech_pvt->name); //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_host", "to_host"); -/* mod_sms end */ switch_event_add_body(event, "%s\n", tech_pvt->sms_body); - //switch_core_chat_send(GSMOPEN_CHAT_PROTO, event); /* mod_sms */ - switch_core_chat_send("GLOBAL", event); /* mod_sms */ if (session) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "during-call", "true"); if (switch_core_session_queue_event(session, &event) != SWITCH_STATUS_SUCCESS) { @@ -3052,6 +3049,38 @@ int sms_incoming(private_t *tech_pvt) if (session) { switch_core_session_rwunlock(session); } +#endif //NOTDEF + /* mod_sms begin */ + if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", GSMOPEN_CHAT_PROTO); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", tech_pvt->name); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->chatmessages[which].from_dispname); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from", tech_pvt->sms_sender); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "date", tech_pvt->sms_date); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "datacodingscheme", tech_pvt->sms_datacodingscheme); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "servicecentreaddress", tech_pvt->sms_servicecentreaddress); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "messagetype", "%d", tech_pvt->sms_messagetype); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "chatname", tech_pvt->chatmessages[which].chatname); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "id", tech_pvt->chatmessages[which].id); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subject", "SIMPLE MESSAGE"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to", tech_pvt->name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hint", tech_pvt->name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_proto", GSMOPEN_CHAT_PROTO); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_user", tech_pvt->sms_sender); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_host", "from_host"); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "from_full", "from_full"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_user", tech_pvt->name); + //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_host", "to_host"); + switch_event_add_body(event, "%s\n", tech_pvt->sms_body); + //switch_core_chat_send("GLOBAL", event); /* mod_sms */ + switch_core_chat_send("GLOBAL", event); /* mod_sms */ + } else { + + ERRORA("cannot create event on interface %s. WHY?????\n", GSMOPEN_P_LOG, tech_pvt->name); + } + /* mod_sms end */ + + //memset(&tech_pvt->chatmessages[which], '\0', sizeof(&tech_pvt->chatmessages[which]) ); //memset(tech_pvt->sms_message, '\0', sizeof(tech_pvt->sms_message)); return 0; From eb93a14eb36791a8b69fb77e849122ee3f6041eb Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Mon, 14 May 2012 01:39:10 +0200 Subject: [PATCH 307/731] gsmopen: correctly sends SMSs in GSM7 or UCS2. Let's check SMS receiving --- .../mod_gsmopen/gsmopen_protocol.cpp | 160 ++++++------------ 1 file changed, 51 insertions(+), 109 deletions(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index fc59687958..af89b8dfa4 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -367,7 +367,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) if (res) { DEBUGA_GSMOPEN("AT+CMGF? failed, continue\n", GSMOPEN_P_LOG); } -#ifndef WANT_GSMLIB res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=1"); if (res) { ERRORA("Error setting SMS sending mode to TEXT on the cellphone, let's hope is TEXT by default. Continuing\n", GSMOPEN_P_LOG); @@ -402,7 +401,6 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) WARNINGA("AT+CSMP do not got OK from the phone, continuing\n", GSMOPEN_P_LOG); } } -#else // WANT_GSMLIB res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0"); if (res) { @@ -410,6 +408,7 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) } tech_pvt->sms_pdu_not_supported = 0; tech_pvt->no_ucs2 = 1; +#ifdef NOTDEF //GSMLIB? XXX if (tech_pvt->no_ucs2) { res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"GSM\""); if (res) { @@ -421,7 +420,7 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) WARNINGA("AT+CSMP do not got OK from the phone, continuing\n", GSMOPEN_P_LOG); } } -#endif // WANT_GSMLIB +#endif// NOTDEF //GSMLIB? XXX #ifdef NOTDEF //GSMLIB? XXX @@ -1666,7 +1665,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us } else { -#ifdef WANT_GSMLIB try { char content2[1000]; SMSMessageRef sms; @@ -1719,7 +1717,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us } -#endif // WANT_GSMLIB @@ -2731,117 +2728,70 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) char pdu2[16000]; memset(pdu2, '\0', sizeof(pdu2)); int pdulenght = 0; + string pdu; PUSHA_UNLOCKA(&tech_pvt->controldev_lock); LOKKA(tech_pvt->controldev_lock); -#ifndef WANT_GSMLIB - err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=1"); - if (err) { - ERRORA("AT+CMGF=1 (set message sending to TEXT (as opposed to PDU) do not got OK from the phone\n", GSMOPEN_P_LOG); - } -#else // WANT_GSMLIB - err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0"); - if (err) { - ERRORA("AT+CMGF=0 (set message sending to TEXT (as opposed to PDU) do not got OK from the phone\n", GSMOPEN_P_LOG); - } -#endif // WANT_GSMLIB - - if (tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0) { -#ifdef WANT_GSMLIB try { - SMSMessageRef smsMessage; +int bad_8859=0; memset(mesg_test, '\0', sizeof(mesg_test)); sprintf(mesg_test, ":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8 //sprintf(mesg_test,":) ciao belè èéàòìù"); //text=mesg_test; - utf8_to_iso_8859_1(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand)); - smsMessage = new SMSSubmitMessage(smscommand, dest); - string pdu = smsMessage->encode(); - strncpy(pdu2, pdu.c_str(), sizeof(pdu2) - 1); - memset(smscommand, '\0', sizeof(smscommand)); - pdulenght = pdu.length() / 2 - 1; - sprintf(smscommand, "AT+CMGS=%d", pdulenght); - -#ifdef NOTDEF - - ***9. How to support unicode ? You need 6 steps : 1. set datacodingschema to DCS_SIXTEEN_BIT_ALPHABET 2. set your locale correctly, for example - , my locale, china.setlocale(LC_ALL, "chs"); - - 3. translate MBCS(multiple byte character set) string to unicode string.wchar_t wstr[1000]; - memset(wstr, 0, 2000); - mbstowcs(wstr, data.c_str(), data.length()); - - 4. get unicode string length.int wcs_len = wcslen(wstr); - - 5. change unicode string to net order.for (int i = 0; i < wcs_len; i++) - wstr[i] = htons(wstr[i]); - - 6. put unicode string into pdu.char content2[1000]; - SMSMessageRef sms; - //MessageType messagetype; - //Address servicecentreaddress; - //Timestamp servicecentretimestamp; - //Address sender_recipient_address; - - sms = SMSMessage::decode(tech_pvt->line_array.result[i]); // dataCodingScheme = 8 , text=ciao 123 belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大 - - DEBUGA_GSMOPEN("SMS=\n%s\n", GSMOPEN_P_LOG, sms->toString().c_str()); - - memset(content2, '\0', sizeof(content2)); - if (sms->dataCodingScheme().getAlphabet() == DCS_DEFAULT_ALPHABET) { - iso_8859_1_to_utf8(tech_pvt, (char *) sms->userData().c_str(), content2, sizeof(content2)); - } else if (sms->dataCodingScheme().getAlphabet() == DCS_SIXTEEN_BIT_ALPHABET) { - ucs2_to_utf8(tech_pvt, (char *) bufToHex((unsigned char *) sms->userData().data(), sms->userData().length()).c_str(), content2, - sizeof(content2)); + bad_8859 = utf8_to_iso_8859_1(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand)); + if(!bad_8859){ + err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0"); + if (err) { + ERRORA("AT+CMGF=0 (set message sending to PDU (as opposed to TEXT) do not got OK from the phone\n", GSMOPEN_P_LOG); + } + SMSMessageRef smsMessage; + smsMessage = new SMSSubmitMessage(smscommand, dest); + //string pdu = smsMessage->encode(); + pdu = smsMessage->encode(); + strncpy(pdu2, pdu.c_str(), sizeof(pdu2) - 1); + memset(smscommand, '\0', sizeof(smscommand)); + pdulenght = pdu.length() / 2 - 1; + sprintf(smscommand, "AT+CMGS=%d", pdulenght); } else { - ERRORA("dataCodingScheme not supported=%d\n", GSMOPEN_P_LOG, sms->dataCodingScheme().getAlphabet()); + int ok; + UNLOCKA(tech_pvt->controldev_lock); + POPPA_UNLOCKA(&tech_pvt->controldev_lock); + + tech_pvt->no_ucs2 = 0; + tech_pvt->sms_pdu_not_supported =1; + ok= gsmopen_sendsms(tech_pvt, dest, text); + tech_pvt->no_ucs2 = 1; + tech_pvt->sms_pdu_not_supported =0; + + return ok; } - DEBUGA_GSMOPEN("dataCodingScheme=%d\n", GSMOPEN_P_LOG, sms->dataCodingScheme().getAlphabet()); - DEBUGA_GSMOPEN("dataCodingScheme=%s\n", GSMOPEN_P_LOG, sms->dataCodingScheme().toString().c_str()); - DEBUGA_GSMOPEN("address=%s\n", GSMOPEN_P_LOG, sms->address().toString().c_str()); - DEBUGA_GSMOPEN("serviceCentreAddress=%s\n", GSMOPEN_P_LOG, sms->serviceCentreAddress().toString().c_str()); - DEBUGA_GSMOPEN("serviceCentreTimestamp=%s\n", GSMOPEN_P_LOG, sms->serviceCentreTimestamp().toString().c_str()); - DEBUGA_GSMOPEN("messageType=%d\n", GSMOPEN_P_LOG, sms->messageType()); - DEBUGA_GSMOPEN("userData= |||%s|||\n", GSMOPEN_P_LOG, content2); - - memset(sms_body, '\0', sizeof(sms_body)); - strncpy(sms_body, content2, sizeof(sms_body)); - DEBUGA_GSMOPEN("body=%s\n", GSMOPEN_P_LOG, sms_body); - strncpy(tech_pvt->sms_body, sms_body, sizeof(tech_pvt->sms_body)); - strncpy(tech_pvt->sms_sender, sms->address().toString().c_str(), sizeof(tech_pvt->sms_sender)); - strncpy(tech_pvt->sms_date, sms->serviceCentreTimestamp().toString().c_str(), sizeof(tech_pvt->sms_date)); - strncpy(tech_pvt->sms_datacodingscheme, sms->dataCodingScheme().toString().c_str(), sizeof(tech_pvt->sms_datacodingscheme)); - strncpy(tech_pvt->sms_servicecentreaddress, sms->serviceCentreAddress().toString().c_str(), sizeof(tech_pvt->sms_servicecentreaddress)); - tech_pvt->sms_messagetype = sms->messageType(); - //messagetype = sms->messageType(); - //servicecentreaddress = sms->serviceCentreAddress(); - //servicecentretimestamp = sms->serviceCentreTimestamp(); - //sender_recipient_address = sms->address(); -#endif // NOTDEF } catch(GsmException & ge) { ERRORA("GsmException= |||%s|||\n", GSMOPEN_P_LOG, ge.what()); } -#else // WANT_GSMLIB - ERRORA("tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0 && no WANT_GSMLIB\n", GSMOPEN_P_LOG); - return RESULT_FAILURE; -#endif // WANT_GSMLIB } else { char dest2[1048]; + err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=1"); + if (err) { + ERRORA("AT+CMGF=1 (set message sending to TEXT (as opposed to PDU) do not got OK from the phone\n", GSMOPEN_P_LOG); + } + +/* err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"UCS2\""); if (err) { ERRORA("AT+CSCS=\"UCS2\" (set TE messages to ucs2) do not got OK from the phone\n", GSMOPEN_P_LOG); } +*/ memset(dest2, '\0', sizeof(dest2)); utf8_to_ucs2(tech_pvt, dest, strlen(dest), dest2, sizeof(dest2)); @@ -2854,7 +2804,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) goto uscita; } err = gsmopen_serial_AT_expect(tech_pvt, "> ", 0, 1); // wait 1.1s for the prompt, no crlf -#if 1 if (err) { DEBUGA_GSMOPEN ("Error or timeout getting prompt '> ' for sending sms directly to the remote party. BTW, seems that we cannot do that with Motorola c350, so we'll write to cellphone memory, then send from memory\n", @@ -2879,24 +2828,23 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) goto uscita; } } -#endif -#ifndef WANT_GSMLIB - memset(mesg_test, '\0', sizeof(mesg_test)); - sprintf(mesg_test, ":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8 - //text=mesg_test; + if (tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0) { + memset(smscommand, '\0', sizeof(smscommand)); + sprintf(smscommand, "%s", pdu2); + }else{ + memset(mesg_test, '\0', sizeof(mesg_test)); + sprintf(mesg_test, ":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8 + //text=mesg_test; + + memset(smscommand, '\0', sizeof(smscommand)); + if (tech_pvt->no_ucs2) { + sprintf(smscommand, "%s", text); + } else { + utf8_to_ucs2(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand)); + } - memset(smscommand, '\0', sizeof(smscommand)); - if (tech_pvt->no_ucs2) { - sprintf(smscommand, "%s", text); - } else { - utf8_to_ucs2(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand)); } -#else // WANT_GSMLIB - - memset(smscommand, '\0', sizeof(smscommand)); - sprintf(smscommand, "%s", pdu2); -#endif // WANT_GSMLIB smscommand[strlen(smscommand)] = 0x1A; DEBUGA_GSMOPEN("smscommand len is: %d, text is:|||%s|||\n", GSMOPEN_P_LOG, (int) strlen(smscommand), smscommand); @@ -2923,7 +2871,7 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) ERRORA("Error de-activating echo from modem\n", GSMOPEN_P_LOG); } } - uscita: +uscita: gsmopen_sleep(1000); if (tech_pvt->at_cmgw[0]) { @@ -2948,12 +2896,6 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) UNLOCKA(tech_pvt->controldev_lock); POPPA_UNLOCKA(&tech_pvt->controldev_lock); } -#ifdef NOTDEF - err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0"); - if (err) { - DEBUGA_GSMOPEN("AT+CMGF=0 (set message sending to PDU (as opposed to TEXT) do not got OK from the phone, continuing\n", GSMOPEN_P_LOG); - } -#endif // NOTDEF DEBUGA_GSMOPEN("FINISH\n", GSMOPEN_P_LOG); if (failed) From 8a1508d669e41a4b2831233057780bb130080035 Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Mon, 14 May 2012 01:55:45 +0200 Subject: [PATCH 308/731] gsmopen: correctly receives SMSs in GSM7 and UCS2 --- src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index af89b8dfa4..5e5cadd9b6 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -1180,10 +1180,12 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us if (res) { ERRORA("AT+CMGR (read SMS) do not got OK from the phone, message sent was:|||%s|||\n", GSMOPEN_P_LOG, at_command); } - res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"GSM\""); +/* + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"CIAPALO1\""); if (res) { - ERRORA("AT+CSCS=\"GSM\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); + ERRORA("AT+CSCS=\"CIAPALO1\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); } +*/ memset(at_command, 0, sizeof(at_command)); sprintf(at_command, "AT+CMGD=%d", tech_pvt->unread_sms_msg_id); /* delete the message */ tech_pvt->unread_sms_msg_id = 0; @@ -2399,7 +2401,7 @@ int utf8_to_iso_8859_1(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, c iconv_res = iconv(iconv_format, &inbuf, &inbytesleft, &outbuf, &outbytesleft); #endif // WIN32 if (iconv_res == (size_t) -1) { - ERRORA("error: %s %d\n", GSMOPEN_P_LOG, strerror(errno), errno); + DEBUGA_GSMOPEN("cannot translate in iso_8859_1 error: %s %d\n", GSMOPEN_P_LOG, strerror(errno), errno); return -1; } DEBUGA_GSMOPEN @@ -3038,9 +3040,9 @@ int gsmopen_serial_getstatus_AT(private_t *tech_pvt) if (res) { ERRORA("AT+CMGR (read SMS) do not got OK from the phone, message sent was:|||%s|||\n", GSMOPEN_P_LOG, at_command); } - res = gsmopen_serial_write_AT_ack(p, "AT+CSCS=\"GSM\""); + res = gsmopen_serial_write_AT_ack(p, "AT+CSCS=\"CIAPALO2\""); if (res) { - ERRORA("AT+CSCS=\"GSM\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); + ERRORA("AT+CSCS=\"CIAPALO2\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); } memset(at_command, 0, sizeof(at_command)); sprintf(at_command, "AT+CMGD=%d", p->unread_sms_msg_id); /* delete the message */ From 44fd0de8ff14a4641971e740547f5bf3d3bede13 Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Mon, 14 May 2012 01:59:33 +0200 Subject: [PATCH 309/731] gsmopen: indented --- .../mod_gsmopen/gsmopen_protocol.cpp | 20 +++++++++---------- src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index 5e5cadd9b6..391dade93a 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -420,7 +420,7 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) WARNINGA("AT+CSMP do not got OK from the phone, continuing\n", GSMOPEN_P_LOG); } } -#endif// NOTDEF //GSMLIB? XXX +#endif // NOTDEF //GSMLIB? XXX #ifdef NOTDEF //GSMLIB? XXX @@ -2737,7 +2737,7 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text) if (tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0) { try { -int bad_8859=0; + int bad_8859 = 0; memset(mesg_test, '\0', sizeof(mesg_test)); sprintf(mesg_test, ":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8 @@ -2745,7 +2745,7 @@ int bad_8859=0; //text=mesg_test; bad_8859 = utf8_to_iso_8859_1(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand)); - if(!bad_8859){ + if (!bad_8859) { err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0"); if (err) { ERRORA("AT+CMGF=0 (set message sending to PDU (as opposed to TEXT) do not got OK from the phone\n", GSMOPEN_P_LOG); @@ -2765,10 +2765,10 @@ int bad_8859=0; POPPA_UNLOCKA(&tech_pvt->controldev_lock); tech_pvt->no_ucs2 = 0; - tech_pvt->sms_pdu_not_supported =1; - ok= gsmopen_sendsms(tech_pvt, dest, text); + tech_pvt->sms_pdu_not_supported = 1; + ok = gsmopen_sendsms(tech_pvt, dest, text); tech_pvt->no_ucs2 = 1; - tech_pvt->sms_pdu_not_supported =0; + tech_pvt->sms_pdu_not_supported = 0; return ok; } @@ -2834,7 +2834,7 @@ int bad_8859=0; if (tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0) { memset(smscommand, '\0', sizeof(smscommand)); sprintf(smscommand, "%s", pdu2); - }else{ + } else { memset(mesg_test, '\0', sizeof(mesg_test)); sprintf(mesg_test, ":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8 //text=mesg_test; @@ -2873,7 +2873,7 @@ int bad_8859=0; ERRORA("Error de-activating echo from modem\n", GSMOPEN_P_LOG); } } -uscita: + uscita: gsmopen_sleep(1000); if (tech_pvt->at_cmgw[0]) { @@ -3040,9 +3040,9 @@ int gsmopen_serial_getstatus_AT(private_t *tech_pvt) if (res) { ERRORA("AT+CMGR (read SMS) do not got OK from the phone, message sent was:|||%s|||\n", GSMOPEN_P_LOG, at_command); } - res = gsmopen_serial_write_AT_ack(p, "AT+CSCS=\"CIAPALO2\""); + res = gsmopen_serial_write_AT_ack(p, "AT+CSCS=\"GSM\""); if (res) { - ERRORA("AT+CSCS=\"CIAPALO2\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); + ERRORA("AT+CSCS=\"GSM\" (set TE messages to GSM) do not got OK from the phone\n", GSMOPEN_P_LOG); } memset(at_command, 0, sizeof(at_command)); sprintf(at_command, "AT+CMGD=%d", p->unread_sms_msg_id); /* delete the message */ diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index d1443afc50..f48d299e0a 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -3073,7 +3073,7 @@ int sms_incoming(private_t *tech_pvt) //switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to_host", "to_host"); switch_event_add_body(event, "%s\n", tech_pvt->sms_body); //switch_core_chat_send("GLOBAL", event); /* mod_sms */ - switch_core_chat_send("GLOBAL", event); /* mod_sms */ + switch_core_chat_send("GLOBAL", event); /* mod_sms */ } else { ERRORA("cannot create event on interface %s. WHY?????\n", GSMOPEN_P_LOG, tech_pvt->name); From 172e4a3041e821a2531b79ed0e5b4fbe2d4bf25c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 06:58:33 -0500 Subject: [PATCH 310/731] FS-4183 here is a start, it still needs some work but here are the basic components, initially I am using the algorithim we use to generate artifical silence (static) and using one of those values to sleep a certian number of microseconds plus the cumulative bytes of events but i bet there is still some predictability in there so it needs some more --- build/modules.conf.in | 1 + .../vanilla/autoload_configs/modules.conf.xml | 1 + src/mod/applications/mod_random/mod_random.c | 234 ++++++++++++++++++ 3 files changed, 236 insertions(+) create mode 100644 src/mod/applications/mod_random/mod_random.c diff --git a/build/modules.conf.in b/build/modules.conf.in index 31aea530fb..534c1f0ec2 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -42,6 +42,7 @@ applications/mod_valet_parking #applications/mod_vmd applications/mod_voicemail #applications/mod_voicemail_ivr +#applications/mod_random #asr_tts/mod_cepstral #asr_tts/mod_flite #asr_tts/mod_pocketsphinx diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 5038713afe..266b32204a 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -63,6 +63,7 @@ + diff --git a/src/mod/applications/mod_random/mod_random.c b/src/mod/applications/mod_random/mod_random.c new file mode 100644 index 0000000000..08f1a8723e --- /dev/null +++ b/src/mod/applications/mod_random/mod_random.c @@ -0,0 +1,234 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2012, 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): + * + * Anthony Minessale II + * Neal Horman + * + * + * mod_random.c -- entropy source module + * + */ +#include + +/* Prototypes */ +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_random_shutdown); +SWITCH_MODULE_RUNTIME_FUNCTION(mod_random_runtime); +SWITCH_MODULE_LOAD_FUNCTION(mod_random_load); + +SWITCH_MODULE_DEFINITION(mod_random, mod_random_load, mod_random_shutdown, mod_random_runtime); + +static int RUNNING = 0; +static const char *random_device_files[] = { "/dev/hwrandom", "/dev/random", NULL }; +const char *random_device_file = NULL; + +static void event_handler(switch_event_t *event); + + +SWITCH_MODULE_LOAD_FUNCTION(mod_random_load) +{ + +#ifdef WIN32 + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s missing window support\n", modname); + return SWITCH_STATUS_NOTIMPL; +#endif + + int i = 0; + + + for(i = 0 ;random_device_files[i]; i++) { + if (switch_file_exists(random_device_files[i], pool) == SWITCH_STATUS_SUCCESS) { + random_device_file = random_device_files[i]; + break; + } + } + + + if (!random_device_file) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s can't locate a random device file\n", modname); + return SWITCH_STATUS_FALSE; + } + + + if ((switch_event_bind(modname, SWITCH_EVENT_ALL, NULL, event_handler, NULL) != SWITCH_STATUS_SUCCESS)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n"); + return SWITCH_STATUS_TERM; + } + + /* connect my internal structure to the blank pointer passed to me */ + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + RUNNING = 1; + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_random_shutdown) +{ + + switch_event_unbind_callback(event_handler); + + RUNNING = 0; + + return SWITCH_STATUS_SUCCESS; +} + +#if WIN32 +SWITCH_MODULE_RUNTIME_FUNCTION(mod_random_runtime) +{ + RUNNING = 0; + return SWITCH_STATUS_TERM; +} +#else + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +typedef struct { + int count; + int size; + unsigned char *data; +} entropy_t; + + +static int random_add_entropy(int fd, void *buf, size_t size) +{ + entropy_t e = { 0 }; + int r = 0; + + e.count = size * 8; + e.size = size; + e.data = (unsigned char *) buf; + + if (ioctl(fd, RNDADDENTROPY, &e) != 0) { + r = 1; + } + + return r; +} + +static int rng_read(int fd, void *buf, size_t size) +{ + size_t off = 0; + ssize_t r; + unsigned char *bp = (unsigned char *) buf; + + while (size > 0) { + do { + r = read(fd, bp + off, size); + } while ((r == -1) && (errno == EINTR)); + + if (r <= 0) { + break; + } + + off += r; + size -= r; + } + + return size; +} + +static int rfd = 0; + +static void event_handler(switch_event_t *event) +{ + char *buf; + + if (switch_event_serialize(event, &buf, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + random_add_entropy(rfd, buf, strlen(buf)); + free(buf); + } + +} + +SWITCH_MODULE_RUNTIME_FUNCTION(mod_random_runtime) +{ + + unsigned char data[1024] = {0}; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s Thread starting using random_device_file %s\n", modname, random_device_file); + + if ((rfd = open(random_device_file, O_RDWR)) < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s Error opening random_device_file %s\n", modname, random_device_file); + RUNNING = 0; + } + + rng_read(rfd, data, 4); + + while(RUNNING) { + int16_t data[64]; + int i = 0; + int len = sizeof(data) / 2; + + switch_generate_sln_silence(data, len, 1); + random_add_entropy(rfd, data, len); + + while(i < len && !data[i]) i++; + + if (i < len) { + switch_yield(abs(data[i]) * 1000); + } + + } + + if (rfd > -1) { + close(rfd); + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s Thread ending\n", modname); + + return SWITCH_STATUS_TERM; +} + +#endif + + +/* 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 e7b482184451ade9f1ecfff6f80049d9c3a7e8bf Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 07:13:26 -0500 Subject: [PATCH 311/731] clean up forking code in example --- src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl index 2c7575f64c..0f4af275bc 100644 --- a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl +++ b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl @@ -61,11 +61,17 @@ my $xml = qq# #; +$SIG{CHLD} = "IGNORE"; while (my $request = $scgi->accept) { - # fork every new req into its own process (optional) - next unless(my $pid = fork()); + my $pid = fork(); + + if ($pid) { + $request->close(); + next; + } + my $handle = $request->connection; $request->read_env; @@ -89,5 +95,9 @@ while (my $request = $scgi->accept) { #print $handle "Content-Type: text/xml\n\n"; print $handle $xml; - exit if (!$pid); + + exit unless $pid; } + + + From c3c559e4f75f39e537ee5cc0fc6e2f989e62b712 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 14 May 2012 15:52:11 +0000 Subject: [PATCH 312/731] debian: add mod_random --- debian/control-modules | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index 2327495663..e229b86fc7 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -156,6 +156,11 @@ Module: applications/mod_rad_auth Description: RADIUS AA This module implements RADIUS Authentication and Authorization. +Module: applications/mod_random +Description: Entropy extraction + This module extracts entropy from FreeSWITCH and feeds it into + /dev/random. + Module: applications/mod_redis Description: Redis limit backend This module provides a mechanism to use Redis as a backend data From ec0f4c9f6ce20fa35ac49affe8620947de2a1725 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 09:47:35 -0500 Subject: [PATCH 313/731] FS-4218 --resolve --- libs/libscgi/src/scgi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index d1675d246f..f50b5b8d88 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -91,7 +91,7 @@ SCGI_DECLARE(size_t) scgi_build_message(scgi_handle_t *handle, char **bufferp) ctlen = strlen(handle->body); } - snprintf(tmp, sizeof(tmp), "%ld", ctlen); + snprintf(tmp, sizeof(tmp), "%d", (int)ctlen); scgi_push_param(handle, "CONTENT_LENGTH", tmp); @@ -100,14 +100,14 @@ SCGI_DECLARE(size_t) scgi_build_message(scgi_handle_t *handle, char **bufferp) plen += (strlen(pp->name) + strlen(pp->value) + 2); } - snprintf(tmp, sizeof(tmp), "%ld", plen + ctlen); + snprintf(tmp, sizeof(tmp), "%d", (int) (plen + ctlen)); len = plen + ctlen + strlen(tmp) + 2; buffer = malloc(len); memset(buffer, 0, len); - snprintf(buffer, len, "%ld:", plen); + snprintf(buffer, len, "%d:", (int)plen); bp = buffer + strlen(buffer); for(pp = handle->params; pp; pp = pp->next) { From 5b3b77071b3483181da41f3a0b0dcccede0bc975 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 10:03:35 -0500 Subject: [PATCH 314/731] make sure bargers use the same codec as bargee to avoid transcoding delay --- src/include/private/switch_core_pvt.h | 1 + src/include/switch_core.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 25 +++++++++++++++++++++++-- src/switch_core_codec.c | 11 +++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 95e66f2f6d..0005008252 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -120,6 +120,7 @@ struct switch_core_session { switch_codec_t *video_write_codec; switch_codec_implementation_t read_impl; + switch_codec_implementation_t real_read_impl; switch_codec_implementation_t write_impl; switch_codec_implementation_t video_read_impl; switch_codec_implementation_t video_write_impl; diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 624d491e1d..522ebec1f8 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1500,6 +1500,7 @@ SWITCH_DECLARE(void) switch_core_session_unlock_codec_read(_In_ switch_core_sess SWITCH_DECLARE(switch_status_t) switch_core_session_get_read_impl(switch_core_session_t *session, switch_codec_implementation_t *impp); +SWITCH_DECLARE(switch_status_t) switch_core_session_get_real_read_impl(switch_core_session_t *session, switch_codec_implementation_t *impp); SWITCH_DECLARE(switch_status_t) switch_core_session_get_write_impl(switch_core_session_t *session, switch_codec_implementation_t *impp); SWITCH_DECLARE(switch_status_t) switch_core_session_get_video_read_impl(switch_core_session_t *session, switch_codec_implementation_t *impp); SWITCH_DECLARE(switch_status_t) switch_core_session_get_video_write_impl(switch_core_session_t *session, switch_codec_implementation_t *impp); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 26fc3e2668..441da03052 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -8464,12 +8464,33 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ bridge_uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE); if (call_info) { + const char *olu; + switch_core_session_t *os; + switch_codec_implementation_t read_impl = { 0 }; + char *codec_str = ""; + + if (!zstr(bridge_uuid) && switch_channel_test_flag(b_channel, CF_LEG_HOLDING)) { + olu = bridge_uuid; + } else { + olu = b_private->uuid; + } + + if ((os = switch_core_session_locate(olu))) { + switch_core_session_get_real_read_impl(os, &read_impl); + switch_core_session_rwunlock(os); + + codec_str = switch_core_session_sprintf(session, "set:absolute_codec_string=%s@%di,", read_impl.iananame, + read_impl.microseconds_per_packet / 1000); + } + + + if (!zstr(bridge_uuid) && switch_channel_test_flag(b_channel, CF_LEG_HOLDING)) { tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,intercept:%s", bridge_uuid); + "%sanswer,intercept:%s", codec_str, bridge_uuid); } else { tech_pvt->caller_profile->destination_number = switch_core_sprintf(tech_pvt->caller_profile->pool, - "answer,sofia_sla:%s", b_private->uuid); + "%sanswer,sofia_sla:%s", codec_str, b_private->uuid); } } else { if (!zstr(bridge_uuid)) { diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 28439c1b60..6ea47fcf13 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -206,6 +206,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_read_codec(switch_core_s session->read_codec = session->real_read_codec = codec; if (codec->implementation) { session->read_impl = *codec->implementation; + session->real_read_impl = *codec->implementation; } else { memset(&session->read_impl, 0, sizeof(session->read_impl)); } @@ -319,6 +320,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_read_impl(switch_core_se return SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(switch_status_t) switch_core_session_get_real_read_impl(switch_core_session_t *session, switch_codec_implementation_t *impp) +{ + if (session->real_read_impl.codec_id) { + *impp = session->real_read_impl; + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; +} + SWITCH_DECLARE(switch_status_t) switch_core_session_get_write_impl(switch_core_session_t *session, switch_codec_implementation_t *impp) { if (session->write_impl.codec_id) { From 4670a770cf86a23ee33c9cf0784040ad7cde8c98 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 11:06:36 -0500 Subject: [PATCH 315/731] fix sofia interaction with presence api command --- src/mod/endpoints/mod_sofia/sofia_presence.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index c4eb565f85..5965c54cd8 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -1112,6 +1112,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) "sip_user='%q' and sip_host='%q'", rpid, status, mod_sofia_globals.hostname, profile->name, euser, host); sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE); + proto = SOFIA_CHAT_PROTO; } if (zstr(uuid)) { From 5b38c22e9dc61a84badfdf5ee28ecec75e07eba5 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Mon, 14 May 2012 13:36:11 -0500 Subject: [PATCH 316/731] lets kick the auto test with a small change here that doesnt really matter --- freeswitch.spec | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/freeswitch.spec b/freeswitch.spec index 889dae9007..f4e3399715 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -15,13 +15,13 @@ # This file and all modifications and additions to the pristine package are under the same license as the package itself. # # Contributor(s): Mike Jerris -# Brian West -# Raul Fragoso -# Rupa Shomaker -# Marc Olivier Chouinard -# Raymond Chandler -# Anthony Minessale II -# +# Brian West +# Anthony Minessale II +# Raul Fragoso +# Rupa Shomaker +# Marc Olivier Chouinard +# Raymond Chandler +# Ken Rice # # Maintainer(s): Ken Rice # From 1eae27942e0a41eb3c0298b6f70f761b54501163 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 13:07:35 -0500 Subject: [PATCH 317/731] addition to 5b3b77071b3483181da41f3a0b0dcccede0bc975 --- src/switch_core_codec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 6ea47fcf13..e7fa3f3fe7 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -114,6 +114,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_real_read_codec(switch_c changed_read_codec = 1; if (codec->implementation) { session->read_impl = *codec->implementation; + session->real_read_impl = *codec->implementation; } else { memset(&session->read_impl, 0, sizeof(session->read_impl)); } @@ -136,7 +137,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_real_read_codec(switch_c session->read_codec = codec; changed_read_codec = 1; if (codec->implementation) { - session->read_impl = *codec->implementation; + session->read_impl = *codec->implementation; + session->real_read_impl = *codec->implementation; } else { memset(&session->read_impl, 0, sizeof(session->read_impl)); } From 18b88710d04d4be06a82dec5bb388d8bcf70f058 Mon Sep 17 00:00:00 2001 From: Michael S Collins Date: Mon, 14 May 2012 16:23:37 -0700 Subject: [PATCH 318/731] Update ChangeLog through Dec 31... 1.2 on horizon --- docs/ChangeLog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/ChangeLog b/docs/ChangeLog index 6f92097c5f..65588c761a 100644 --- a/docs/ChangeLog +++ b/docs/ChangeLog @@ -1,3 +1,18 @@ +freeswitch (1.2.0) + config: add screen_confirm macro to lang/en/ivr/sounds.xml (r:9ea3ce66) + config: support for --with-logfilesdir, --with-dbdir, --with-htdocsdir, --with-soundsdir, --with-grammardir, --with-scriptdir and --with-recordin + gsdir (r:7ae3f5b7/FS-302) + core: Add RECORD_STEREO_SWAP to reverse the record channels (r:d5042f2c/FS-3069) + core: api_on_startup (r:e164b76c) + mod_conference: Add auto-record filename to conference_recording channel variable and ability to pull filename from API (r:b9295fd5/FS-1573) + mod_conference: Convenience feature in mod_conference: apply sub cmds to non_moderator members (r:04295ac9/FS-3249) + mod_conference: New conference commands: get and set (r:ab5f3f28/FS-3254) + mod_commands: allow system API command to capture output from the executed command (r:d7a37e97) + mod_posix_timer: New timer module mod_posix_timer (r:9d7e9e67/FS-3731) + mod_sofia: Add presence-privacy parameter to exclude extension numbers from the distributed presence string (r:c6633fa3/FS-849) + mod_spandsp: Add T31 modem support to mod_spandsp - similar to iaxmodem only wired into FS. Also merge configs into single spandsp.conf.xml --see in tree example-- (r:d91f67d0) + mod_valet_parking: add orbit feature to valet_parking similar to mod_fifo (r:09725e2b) + freeswitch (1.0.7) build: Add mod_silk to windows build From 0a5a057c46e35d740e82549de53607e9ded4fa5b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 14 May 2012 17:50:55 -0500 Subject: [PATCH 319/731] add inbound-reg-in-new-thread sofia param to launch a new thread to process each new inbound register when using heavier backends --- src/mod/endpoints/mod_sofia/mod_sofia.h | 2 + src/mod/endpoints/mod_sofia/sofia.c | 61 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 65755500a9..b96ff52011 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -151,6 +151,7 @@ typedef struct sofia_dispatch_event_s { sofia_profile_t *profile; int save; switch_core_session_t *session; + switch_memory_pool_t *pool; } sofia_dispatch_event_t; struct sofia_private { @@ -265,6 +266,7 @@ typedef enum { PFLAG_OPTIONS_RESPOND_503_ON_BUSY, PFLAG_PRESENCE_DISABLE_EARLY, PFLAG_CONFIRM_BLIND_TRANSFER, + PFLAG_THREAD_PER_REG, /* No new flags below this line */ PFLAG_MAX } PFLAGS; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 441da03052..df28e346ae 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1282,6 +1282,48 @@ static void our_sofia_event_callback(nua_event_t event, } } +void *SWITCH_THREAD_FUNC sofia_msg_thread_run_once(switch_thread_t *thread, void *obj) +{ + sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) obj; + switch_memory_pool_t *pool = NULL; + + if (de) { + pool = de->pool; + de->pool = NULL; + sofia_process_dispatch_event(&de); + } + + if (pool) { + switch_core_destroy_memory_pool(&pool); + } + + return NULL; +} + +void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) +{ + sofia_dispatch_event_t *de = *dep; + switch_threadattr_t *thd_attr = NULL; + switch_memory_pool_t *pool; + switch_thread_t *thread; + + switch_core_new_memory_pool(&pool); + + + *dep = NULL; + de->pool = pool; + + switch_threadattr_create(&thd_attr, de->pool); + switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); + switch_thread_create(&thread, + thd_attr, + sofia_msg_thread_run_once, + de, + de->pool); + + +} + void sofia_process_dispatch_event(sofia_dispatch_event_t **dep) { sofia_dispatch_event_t *de = *dep; @@ -1387,6 +1429,13 @@ static void sofia_queue_message(sofia_dispatch_event_t *de) return; } + + if (de->profile && sofia_test_pflag(de->profile, PFLAG_THREAD_PER_REG) && de->data->e_event == nua_i_register) { + sofia_process_dispatch_event_in_thread(&de); + return; + } + + again: for (idx = 0; idx < mod_sofia_globals.msg_queue_len; idx++) { @@ -3251,6 +3300,12 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile) } else { sofia_clear_pflag(profile, PFLAG_CALLID_AS_UUID); } + } else if (!strcasecmp(var, "inbound-reg-in-new-thread")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_THREAD_PER_REG); + } else { + sofia_clear_pflag(profile, PFLAG_THREAD_PER_REG); + } } else if (!strcasecmp(var, "rtp-autoflush-during-bridge")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_RTP_AUTOFLUSH_DURING_BRIDGE); @@ -4102,6 +4157,12 @@ switch_status_t config_sofia(int reload, char *profile_name) sofia_clear_pflag(profile, PFLAG_MESSAGE_QUERY_ON_REGISTER); sofia_clear_pflag(profile, PFLAG_MESSAGE_QUERY_ON_FIRST_REGISTER); } + } else if (!strcasecmp(var, "inbound-reg-in-new-thread")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_THREAD_PER_REG); + } else { + sofia_clear_pflag(profile, PFLAG_THREAD_PER_REG); + } } else if (!strcasecmp(var, "inbound-use-callid-as-uuid")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_CALLID_AS_UUID); From efc6f16cef7ffda7d12cb8e85b3588b56c231d82 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 May 2012 05:04:44 +0000 Subject: [PATCH 320/731] build: add convenience script to set version in configure.in --- build/set-fs-version.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 build/set-fs-version.sh diff --git a/build/set-fs-version.sh b/build/set-fs-version.sh new file mode 100755 index 0000000000..6743b58b5f --- /dev/null +++ b/build/set-fs-version.sh @@ -0,0 +1,16 @@ +#!/bin/sh +##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- + +sdir="." +[ -n "${0%/*}" ] && sdir="${0%/*}" +. $sdir/../scripts/ci/common.sh + +check_pwd +check_input_ver_build $@ +in_ver="$1" +if [ "$in_ver" = "auto" ]; then + in_ver="$(cat build/next-release.txt)" +fi +eval $(parse_version "$in_ver") +set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev" + From fbcb1c7ae2a8e165b8b524994108d2c3de0b3419 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 May 2012 07:18:50 +0000 Subject: [PATCH 321/731] debian: don't install scripts/ with freeswitch Some modules like mod_java drop files in there during install that should be installed with the module rather than with FS. --- debian/freeswitch.install | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/freeswitch.install b/debian/freeswitch.install index d713fe0607..415f082dd9 100644 --- a/debian/freeswitch.install +++ b/debian/freeswitch.install @@ -1,2 +1 @@ /usr/bin -/usr/share/freeswitch/scripts From fcaf88845245786cb64729f6e38cc0acbcdc98a4 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 May 2012 07:19:51 +0000 Subject: [PATCH 322/731] debian: install freeswitch.jar with mod_java --- debian/freeswitch-mod-java.install.tmpl | 1 + 1 file changed, 1 insertion(+) create mode 100644 debian/freeswitch-mod-java.install.tmpl diff --git a/debian/freeswitch-mod-java.install.tmpl b/debian/freeswitch-mod-java.install.tmpl new file mode 100644 index 0000000000..b176da4348 --- /dev/null +++ b/debian/freeswitch-mod-java.install.tmpl @@ -0,0 +1 @@ +/usr/share/freeswitch/scripts/freeswitch.jar From a7c85c804a3e079c74ef415275483606e4a69fea Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Tue, 15 May 2012 09:18:02 -0500 Subject: [PATCH 323/731] FS-4219 --resolve --- libs/win32/util.vbs | 103 +++++++++++--------------------------------- 1 file changed, 25 insertions(+), 78 deletions(-) diff --git a/libs/win32/util.vbs b/libs/win32/util.vbs index ace3fd6998..29a7be5715 100644 --- a/libs/win32/util.vbs +++ b/libs/win32/util.vbs @@ -270,88 +270,35 @@ Sub CreateVersion(tmpFolder, VersionDir, includebase, includedest) strVerMicro = FindVersionStringInConfigure(VersionDir & "configure.in", "SWITCH_VERSION_MICRO") strVerRev = FindVersionStringInConfigure(VersionDir & "configure.in", "SWITCH_VERSION_REVISION") - If Right(tmpFolder, 1) <> "\" Then tmpFolder = tmpFolder & "\" End If - If Not FSO.FileExists(tmpFolder & "fs_svnversion.exe") Then - Wget ToolsBase & "fs_svnversion.exe", tmpFolder - End If - - If Not FSO.FileExists(tmpFolder & "libdb44.dll") Then - Wget ToolsBase & "libdb44.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libsvn_diff-1.dll") Then - Wget ToolsBase & "libsvn_diff-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libsvn_subr-1.dll") Then - Wget ToolsBase & "libsvn_subr-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libsvn_wc-1.dll") Then - Wget ToolsBase & "libsvn_wc-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "intl3_svn.dll") Then - Wget ToolsBase & "intl3_svn.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libapr-1.dll") Then - Wget ToolsBase & "libapr-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libaprutil-1.dll") Then - Wget ToolsBase & "libaprutil-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libapriconv-1.dll") Then - Wget ToolsBase & "libapriconv-1.dll", tmpFolder - End If - If Not FSO.FileExists(tmpFolder & "libsvn_delta-1.dll") Then - Wget ToolsBase & "libsvn_delta-1.dll", tmpFolder - End If - - Dim sLastFile - Const OverwriteIfExist = -1 - Const ForReading = 1 - - if strVerRev = "" Then - if FSO.FolderExists(VersionDir & ".svn") Then - VersionCmd="fs_svnversion " & quote & VersionDir & "." & quote & " -n" - Set MyFile = fso.CreateTextFile(tmpFolder & "tmpVersion.Bat", True) - MyFile.WriteLine("@" & "cd " & quote & tmpFolder & quote ) - MyFile.WriteLine("@" & VersionCmd) - MyFile.Close - Set oExec = WshShell.Exec("cmd /C " & quote & tmpFolder & "tmpVersion.Bat" & quote) - Do - strFromProc = OExec.StdOut.ReadLine() - VERSION="svn-" & strFromProc - Loop While Not OExec.StdOut.atEndOfStream - sLastVersion = "" - Set sLastFile = FSO.OpenTextFile(tmpFolder & "lastversion", ForReading, true, OpenAsASCII) - If Not sLastFile.atEndOfStream Then - sLastVersion = sLastFile.ReadLine() - End If - sLastFile.Close - End If - - if FSO.FolderExists(VersionDir & ".git") Then - VersionCmd="git log --format=" & quote & "%%h %%ci" & quote & " -1 HEAD" - Set MyFile = FSO.CreateTextFile(tmpFolder & "tmpVersion.Bat", True) - MyFile.WriteLine("@" & "cd " & quote & VersionDir & quote) - MyFile.WriteLine("@" & VersionCmd) - MyFile.Close - Set oExec = WshShell.Exec("cmd /C " & quote & tmpFolder & "tmpVersion.Bat" & quote) - Do - strFromProc = Trim(OExec.StdOut.ReadLine()) - VERSION="git-" & strFromProc - Loop While Not OExec.StdOut.atEndOfStream - sLastVersion = "" - Set sLastFile = FSO.OpenTextFile(tmpFolder & "lastversion", ForReading, true, OpenAsASCII) - If Not sLastFile.atEndOfStream Then - sLastVersion = sLastFile.ReadLine() - End If - sLastFile.Close - VERSION = Replace(VERSION, ":", "-") - End If - End If - + 'Set version to the one reported by configure.in if strVerRev <> "" Then VERSION = strVerRev End If + Dim sLastFile + Const ForReading = 1 + + 'Try To read revision from git, if it's found, use this instead of strVerRev found above + If FSO.FolderExists(VersionDir & ".git") Then + VersionCmd="git log --format=" & quote & "%%h %%ci" & quote & " -1 HEAD" + Set MyFile = FSO.CreateTextFile(tmpFolder & "tmpVersion.Bat", True) + MyFile.WriteLine("@" & "cd " & quote & VersionDir & quote) + MyFile.WriteLine("@" & VersionCmd) + MyFile.Close + Set oExec = WshShell.Exec("cmd /C " & quote & tmpFolder & "tmpVersion.Bat" & quote) + Do + strFromProc = Trim(OExec.StdOut.ReadLine()) + VERSION="git-" & strFromProc + Loop While Not OExec.StdOut.atEndOfStream + sLastVersion = "" + Set sLastFile = FSO.OpenTextFile(tmpFolder & "lastversion", ForReading, true, OpenAsASCII) + If Not sLastFile.atEndOfStream Then + sLastVersion = sLastFile.ReadLine() + End If + sLastFile.Close + VERSION = Replace(VERSION, ":", "-") + End If + If VERSION = "" Then VERSION = "UNKNOWN" End If From 2e42cabf132255d826abd4a852026fddded14bf3 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 15 May 2012 10:18:14 -0500 Subject: [PATCH 324/731] fix sox dependancy --- freeswitch-sounds-en-us-callie.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/freeswitch-sounds-en-us-callie.spec b/freeswitch-sounds-en-us-callie.spec index 468911c53d..68c79e42b6 100644 --- a/freeswitch-sounds-en-us-callie.spec +++ b/freeswitch-sounds-en-us-callie.spec @@ -77,6 +77,7 @@ BuildArch: noarch BuildRequires: sox Requires: freeswitch Requires: freeswitch-sounds-en-us-callie-48000 +Requires: sox BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description From 0d2739bfd25c5c5cb8f00fb2b38230afbebf39a9 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Tue, 15 May 2012 10:20:52 -0500 Subject: [PATCH 325/731] --resolve FS-4209 --- freeswitch-sounds-music.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/freeswitch-sounds-music.spec b/freeswitch-sounds-music.spec index e43ada5736..520a7dddfe 100644 --- a/freeswitch-sounds-music.spec +++ b/freeswitch-sounds-music.spec @@ -1,3 +1,4 @@ +%define fsname freeswitch %define PREFIX %{_prefix} %define EXECPREFIX %{_exec_prefix} %define BINDIR %{_bindir} From 5c75d4cf5bdf57e7d65000981c70509655f4ceaa Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 15 May 2012 08:31:33 -0500 Subject: [PATCH 326/731] FS-4220 --resolve i refactored this into a general cross platform function and use it everywhere else we try to set affinity --- src/include/switch_core.h | 2 +- src/mod/endpoints/mod_sofia/sofia.c | 10 +--------- src/switch_core.c | 29 +++++++++++++++++++++++++++++ src/switch_event.c | 12 ++---------- src/switch_time.c | 9 ++------- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 522ebec1f8..8f9220d0b9 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2328,7 +2328,7 @@ SWITCH_DECLARE(switch_status_t) switch_say_file_handle_create(switch_say_file_ha SWITCH_DECLARE(void) switch_say_file(switch_say_file_handle_t *sh, const char *fmt, ...); SWITCH_DECLARE(int) switch_max_file_desc(void); SWITCH_DECLARE(void) switch_close_extra_files(int *keep, int keep_ttl); - +SWITCH_DECLARE(switch_status_t) switch_core_thread_set_cpu_affinity(int cpu); SWITCH_END_EXTERN_C #endif /* For Emacs: diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index df28e346ae..d7dac7581b 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1363,15 +1363,7 @@ void *SWITCH_THREAD_FUNC sofia_msg_thread_run(switch_thread_t *thread, void *obj switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MSG Thread %d Started\n", my_id); -#ifdef HAVE_CPU_SET_MACROS - { - cpu_set_t set; - CPU_ZERO(&set); - CPU_SET(my_id, &set); - sched_setaffinity(0, sizeof(set), &set); - } -#endif - + switch_core_thread_set_cpu_affinity(my_id); while(switch_queue_pop(q, &pop) == SWITCH_STATUS_SUCCESS && pop) { sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) pop; diff --git a/src/switch_core.c b/src/switch_core.c index f957a7ae5e..8139f8ccf8 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1325,6 +1325,35 @@ SWITCH_DECLARE(uint32_t) switch_core_min_dtmf_duration(uint32_t duration) return runtime.min_dtmf_duration; } +SWITCH_DECLARE(switch_status_t) switch_core_thread_set_cpu_affinity(int cpu) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + if (cpu > -1) { + +#ifdef HAVE_CPU_SET_MACROS + cpu_set_t set; + + CPU_ZERO(&set); + CPU_SET(cpu, &set); + + if (!sched_setaffinity(0, sizeof(set), &set)) { + status = SWITCH_STATUS_SUCCESS; + } + +#else +#if WIN32 + if (SetThreadAffinityMask(GetCurrentThread(), (DWORD_PTR) cpu)) { + status = SWITCH_STATUS_SUCCESS; + } +#endif +#endif + } + + return status; +} + + static void switch_core_set_serial(void) { char buf[13] = ""; diff --git a/src/switch_event.c b/src/switch_event.c index fa864526c8..23670fac93 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -253,16 +253,8 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th EVENT_DISPATCH_QUEUE_RUNNING[my_id] = 1; switch_mutex_unlock(EVENT_QUEUE_MUTEX); - -#ifdef HAVE_CPU_SET_MACROS - { - cpu_set_t set; - CPU_ZERO(&set); - CPU_SET(my_id, &set); - sched_setaffinity(0, sizeof(set), &set); - } -#endif - + + switch_core_thread_set_cpu_affinity(my_id); for (;;) { void *pop = NULL; diff --git a/src/switch_time.c b/src/switch_time.c index 17a0a50675..e7256538f3 100644 --- a/src/switch_time.c +++ b/src/switch_time.c @@ -795,14 +795,9 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime) runtime.profile_timer = switch_new_profile_timer(); switch_get_system_idle_time(runtime.profile_timer, &runtime.profile_time); -#ifdef HAVE_CPU_SET_MACROS - if (runtime.timer_affinity > -1) { - cpu_set_t set; - CPU_ZERO(&set); - CPU_SET(runtime.timer_affinity, &set); - sched_setaffinity(0, sizeof(set), &set); + if (runtime.timer_affinity > -1) { + switch_core_thread_set_cpu_affinity(runtime.timer_affinity); } -#endif switch_time_sync(); time_sync = runtime.time_sync; From da9aacc62e102c341136654a7c824c9309987f69 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 15 May 2012 08:48:08 -0500 Subject: [PATCH 327/731] FS-4217 --resolve --- src/mod/endpoints/mod_sofia/sofia_reg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 81b8da1696..c5fb57bb4d 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -428,6 +428,7 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) gateway_ptr->status = SOFIA_GATEWAY_DOWN; nua_unregister(gateway_ptr->nh, NUTAG_URL(gateway_ptr->register_url), + TAG_IF(gateway_ptr->register_sticky_proxy, NUTAG_PROXY(gateway_ptr->register_sticky_proxy)), TAG_IF(user_via, SIPTAG_VIA_STR(user_via)), SIPTAG_FROM_STR(gateway_ptr->register_from), SIPTAG_TO_STR(gateway_ptr->distinct_to ? gateway_ptr->register_to : gateway_ptr->register_from), From d015395566df56912f760eb88b1781474ed4724c Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Tue, 15 May 2012 11:25:50 -0500 Subject: [PATCH 328/731] FS-4203 --resolve add service setup to windows installer --- w32/Setup/FreeSWITCHConsole.wxs | 51 +++++++++++++++++++++++++++++++++ w32/Setup/Product.wxs | 18 ++++++------ w32/Setup/Setup.wixproj | 2 ++ 3 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 w32/Setup/FreeSWITCHConsole.wxs diff --git a/w32/Setup/FreeSWITCHConsole.wxs b/w32/Setup/FreeSWITCHConsole.wxs new file mode 100644 index 0000000000..243e614e60 --- /dev/null +++ b/w32/Setup/FreeSWITCHConsole.wxs @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/w32/Setup/Product.wxs b/w32/Setup/Product.wxs index 2f072aa8ca..66bc63b61d 100644 --- a/w32/Setup/Product.wxs +++ b/w32/Setup/Product.wxs @@ -66,12 +66,12 @@ WorkingDirectory="INSTALLLOCATION"/> - - + - + + @@ -87,12 +87,12 @@ - - - - - - + + + + + + diff --git a/w32/Setup/Setup.wixproj b/w32/Setup/Setup.wixproj index fcba3f0ceb..f7873cac08 100644 --- a/w32/Setup/Setup.wixproj +++ b/w32/Setup/Setup.wixproj @@ -36,6 +36,7 @@ + @@ -791,6 +792,7 @@ {1af3a893-f7be-43dd-b697-8ab2397c0d67} True + True Binaries;Content;Satellites INSTALLLOCATION From c2a74240ee602b39fc7c92cb2743863702cd7122 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 May 2012 22:25:24 +0000 Subject: [PATCH 329/731] libzrtp: fix client-side enrollment It appears that libzrtp would prevent a non-passive client from enrolling with a PBX because of a broken license mode comparison. Thanks to Ivo Kutts for the report. FS-4223 --resolve --- libs/libzrtp/src/zrtp_pbx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/libzrtp/src/zrtp_pbx.c b/libs/libzrtp/src/zrtp_pbx.c index f4f5a906c4..bb33b8006d 100644 --- a/libs/libzrtp/src/zrtp_pbx.c +++ b/libs/libzrtp/src/zrtp_pbx.c @@ -356,7 +356,7 @@ zrtp_status_t zrtp_register_with_trusted_mitm(zrtp_stream_t* stream) /* Passive Client endpoint should NOT generate PBX Secret. */ if ((stream->mitm_mode == ZRTP_MITM_MODE_REG_CLIENT) && - (ZRTP_LICENSE_MODE_PASSIVE != stream->zrtp->lic_mode)) { + (ZRTP_LICENSE_MODE_PASSIVE == stream->zrtp->lic_mode)) { ZRTP_LOG(2,(_ZTU_,"WARNING: Passive Client endpoint should NOT generate PBX Secert.\n")); return zrtp_status_bad_param; } From 6da083551ef995c5ac5fe5c2dd1e196e6961fff6 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 15 May 2012 22:26:29 +0000 Subject: [PATCH 330/731] libzrtp: fix spelling in log message --- libs/libzrtp/src/zrtp_pbx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/libzrtp/src/zrtp_pbx.c b/libs/libzrtp/src/zrtp_pbx.c index bb33b8006d..3567d4a47b 100644 --- a/libs/libzrtp/src/zrtp_pbx.c +++ b/libs/libzrtp/src/zrtp_pbx.c @@ -357,7 +357,7 @@ zrtp_status_t zrtp_register_with_trusted_mitm(zrtp_stream_t* stream) /* Passive Client endpoint should NOT generate PBX Secret. */ if ((stream->mitm_mode == ZRTP_MITM_MODE_REG_CLIENT) && (ZRTP_LICENSE_MODE_PASSIVE == stream->zrtp->lic_mode)) { - ZRTP_LOG(2,(_ZTU_,"WARNING: Passive Client endpoint should NOT generate PBX Secert.\n")); + ZRTP_LOG(2,(_ZTU_,"WARNING: Passive Client endpoint should NOT generate PBX Secret.\n")); return zrtp_status_bad_param; } From 6a32e98c492f66fb5914e5f585c62f88bad09714 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 15 May 2012 19:37:41 -0400 Subject: [PATCH 331/731] 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 332/731] 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 333/731] 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 334/731] 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 f0aa4ab390b1f905ec1d99f689bfec6215308dcd Mon Sep 17 00:00:00 2001 From: Brian West Date: Tue, 15 May 2012 21:05:04 -0500 Subject: [PATCH 335/731] disable these options if zrtp isn't enabled. --- src/switch_channel.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 20734d04f4..806f5f0d82 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2952,6 +2952,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(swi return SWITCH_STATUS_FALSE; } +#ifdef ENABLE_ZRTP SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) { @@ -3000,7 +3001,7 @@ SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) } } } - +#endif @@ -3013,7 +3014,9 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_ const char *uuid; switch_core_session_t *other_session; +#ifdef ENABLE_ZRTP switch_channel_check_zrtp(channel); +#endif switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Pre-Answer %s!\n", channel->name); switch_channel_set_flag(channel, CF_EARLY_MEDIA); switch_channel_set_callstate(channel, CCS_EARLY); @@ -3273,7 +3276,9 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan switch_mutex_unlock(channel->profile_mutex); } +#ifdef ENABLE_ZRTP switch_channel_check_zrtp(channel); +#endif switch_channel_set_flag(channel, CF_ANSWERED); switch_channel_set_callstate(channel, CCS_ACTIVE); From 7e193ed3827edf4534bf63167d3fb071a799ec1f Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 16 May 2012 02:41:24 +0000 Subject: [PATCH 336/731] Revert "disable these options if zrtp isn't enabled" Brian and I talked about this and concurred on the reversion here. Part of the point of the ZRTP pass-through mode code is that it allows two legs to have a ZRTP-enabled call even if FS doesn't have ZRTP. This reverts commit f0aa4ab390b1f905ec1d99f689bfec6215308dcd. --- src/switch_channel.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 806f5f0d82..20734d04f4 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2952,7 +2952,6 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(swi return SWITCH_STATUS_FALSE; } -#ifdef ENABLE_ZRTP SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) { @@ -3001,7 +3000,7 @@ SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) } } } -#endif + @@ -3014,9 +3013,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_ const char *uuid; switch_core_session_t *other_session; -#ifdef ENABLE_ZRTP switch_channel_check_zrtp(channel); -#endif switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_NOTICE, "Pre-Answer %s!\n", channel->name); switch_channel_set_flag(channel, CF_EARLY_MEDIA); switch_channel_set_callstate(channel, CCS_EARLY); @@ -3276,9 +3273,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan switch_mutex_unlock(channel->profile_mutex); } -#ifdef ENABLE_ZRTP switch_channel_check_zrtp(channel); -#endif switch_channel_set_flag(channel, CF_ANSWERED); switch_channel_set_callstate(channel, CCS_ACTIVE); From 0709cc6f1bab24192697344630c8344d6808c34b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 16 May 2012 02:50:13 +0000 Subject: [PATCH 337/731] make log message relevant even if FS doesn't have ZRTP --- src/switch_channel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 20734d04f4..f7d7e3aae4 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2982,7 +2982,7 @@ SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) if (doit) { switch_channel_set_variable(channel, "zrtp_secure_media", "true"); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(channel->session), SWITCH_LOG_INFO, - "%s ZRTP not negotiated on both sides, Activating ZRTP man-in-the-middle mode.\n", switch_channel_get_name(channel)); + "%s ZRTP not negotiated on both sides; disabling ZRTP passthru mode.\n", switch_channel_get_name(channel)); switch_channel_clear_flag(channel, CF_ZRTP_PASS); switch_channel_clear_flag(channel, CF_ZRTP_HASH); From 32c5100e625f99c68f7979bddc24100aeea8e293 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 16 May 2012 18:36:26 +0530 Subject: [PATCH 338/731] 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 18ee7ce3d03423d4882b171edf049f610768f7a4 Mon Sep 17 00:00:00 2001 From: Mahdi Moradi Date: Wed, 16 May 2012 20:10:13 +0430 Subject: [PATCH 339/731] First upload. --- src/mod/say/mod_say_fa/mod_say_fa.c | 685 ++++++++++++++++++++++++++++ 1 file changed, 685 insertions(+) create mode 100644 src/mod/say/mod_say_fa/mod_say_fa.c diff --git a/src/mod/say/mod_say_fa/mod_say_fa.c b/src/mod/say/mod_say_fa/mod_say_fa.c new file mode 100644 index 0000000000..e044fca7b6 --- /dev/null +++ b/src/mod/say/mod_say_fa/mod_say_fa.c @@ -0,0 +1,685 @@ +/* + * Copyright (c) 2007, Anthony Minessale II + * 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. + * + * 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): + * + * Anthony Minessale II + * Mahdi Moradi + * Babak Yakhchali + * + * mod_say_fa.c -- Say for Persian + * + */ + +#include +#include +#include + +void gregorian_to_jalali(/* output */ int *j_y, int *j_m, int *j_d, + /* input */ int g_y, int g_m, int g_d); +void jalali_to_gregorian(/* output */ int *g_y, int *g_m, int *g_d, + /* input */ int j_y, int j_m, int j_d); + +SWITCH_MODULE_LOAD_FUNCTION(mod_say_fa_load); +SWITCH_MODULE_DEFINITION(mod_say_fa, mod_say_fa_load, NULL, NULL); + +#define say_num(num, meth) { \ + char tmp[80]; \ + switch_status_t tstatus; \ + switch_say_method_t smeth = say_args->method; \ + switch_say_type_t stype = say_args->type; \ + say_args->type = SST_ITEMS; say_args->method = meth; \ + switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)num); \ + if ((tstatus = \ + fa_say_general_count(session, tmp, say_args, args)) \ + != SWITCH_STATUS_SUCCESS) { \ + return tstatus; \ + } \ + say_args->method = smeth; say_args->type = stype; \ + } \ + +#define say_file(...) { \ + char tmp[80]; \ + switch_status_t tstatus; \ + switch_snprintf(tmp, sizeof(tmp), __VA_ARGS__); \ + if ((tstatus = \ + switch_ivr_play_file(session, NULL, tmp, args)) \ + != SWITCH_STATUS_SUCCESS){ \ + return tstatus; \ + } \ + if (!switch_channel_ready(switch_core_session_get_channel(session))) { \ + return SWITCH_STATUS_FALSE; \ + }} \ + +static switch_status_t play_group(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args) +{ + if (a) { + if ( !b && !c ) + { + if( method == SSM_COUNTED ) + { + say_file("digits/%d00om.wav", a); + } + else + say_file("digits/%d00.wav", a); + b = c = 0; + } + else + say_file("digits/%d00+.wav", a); + } + + if (b) { + if ( !c || b == 1 ) + { + if( method == SSM_COUNTED ) + { + say_file("digits/%d%dom.wav", b, c); + } + else + say_file("digits/%d%d.wav", b, c); + c = 0; + } + else + say_file("digits/%d0+.wav", b); + } + + if (c) { + if (method == SSM_COUNTED) { + say_file("digits/%dom.wav", c); + } else { + say_file("digits/%d.wav", c); + } + } + + if (what && (a || b || c)) { + say_file(what); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t fa_say_general_count(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args) +{ + int in; + int x = 0; + int sum = 0; + char what_file[50] = ""; + int places[9] = { 0 }; + char sbuf[128] = ""; + switch_status_t status; + + if (say_args->method == SSM_ITERATED) { + if ((tosay = switch_strip_commas(tosay, sbuf, sizeof(sbuf)))) { + char *p; + for (p = tosay; p && *p; p++) { + say_file("digits/%c.wav", *p); + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n"); + return SWITCH_STATUS_GENERR; + } + return SWITCH_STATUS_SUCCESS; + } + + if (!(tosay = switch_strip_commas(tosay, sbuf, sizeof(sbuf))) || strlen(tosay) > 9) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n"); + return SWITCH_STATUS_GENERR; + } + + in = atoi(tosay); + + if (in != 0) { + for (x = 8; x >= 0; x--) { + int num = (int) pow(10, x); + if ((places[(uint32_t) x] = in / num)) { + in -= places[(uint32_t) x] * num; + } + } + + switch (say_args->method) { + case SSM_COUNTED: + case SSM_PRONOUNCED: + sum = places[5] + places[4] + places[3] + places[2] + places[1] + places[0]; + if( !sum ) + { + if( say_args->method == SSM_COUNTED ) + { + strcpy(what_file,"digits/1000000om.wav"); + } + else + strcpy(what_file,"digits/1000000.wav"); + } + else + strcpy(what_file,"digits/1000000+.wav"); + if ((status = play_group(SSM_PRONOUNCED, places[8], places[7], places[6], what_file, session, args)) != SWITCH_STATUS_SUCCESS) { + return status; + } + sum = places[2] + places[1] + places[0]; + if( !sum ) + { if( say_args->method == SSM_COUNTED ) + { + strcpy(what_file,"digits/1000om.wav"); + } + else + strcpy(what_file,"digits/1000.wav"); + } + else + strcpy(what_file,"digits/1000+.wav"); + if ((status = play_group(SSM_PRONOUNCED, places[5], places[4], places[3], what_file, session, args)) != SWITCH_STATUS_SUCCESS) { + return status; + } + if ((status = play_group(say_args->method, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) { + return status; + } + break; + default: + break; + } + } else { + say_file("digits/0.wav"); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t fa_say_time(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args) +{ + int32_t t; + switch_time_t target = 0, target_now = 0; + switch_time_exp_t tm, tm_now; + uint8_t say_date = 0, say_time = 0, say_year = 0, say_month = 0, say_dow = 0, say_day = 0, say_yesterday = 0, say_today = 0; + switch_channel_t *channel = switch_core_session_get_channel(session); + const char *tz = switch_channel_get_variable(channel, "timezone"); + int jalali_year = 1, jalali_month = 0, jalali_day = 0; + + if (say_args->type == SST_TIME_MEASUREMENT) { + int64_t hours = 0; + int64_t minutes = 0; + int64_t seconds = 0; + int64_t r = 0; + + if (strchr(tosay, ':')) { + char *tme = switch_core_session_strdup(session, tosay); + char *p; + + if ((p = strrchr(tme, ':'))) { + *p++ = '\0'; + seconds = atoi(p); + if ((p = strchr(tme, ':'))) { + *p++ = '\0'; + minutes = atoi(p); + if (tme) { + hours = atoi(tme); + } + } else { + minutes = atoi(tme); + } + } + } else { + if ((seconds = atol(tosay)) <= 0) { + seconds = (int64_t) switch_epoch_time_now(NULL); + } + + if (seconds >= 60) { + minutes = seconds / 60; + r = seconds % 60; + seconds = r; + } + + if (minutes >= 60) { + hours = minutes / 60; + r = minutes % 60; + minutes = r; + } + } + + if (hours) { + say_num(hours, SSM_PRONOUNCED); + if(minutes || seconds) + { + say_file("time/hour+.wav"); + } + else + say_file("time/hour.wav"); + } + + if (minutes) { + say_num(minutes, SSM_PRONOUNCED); + if( seconds ) + { + say_file("time/minutes+.wav"); + } + else + say_file("time/minutes.wav"); + } + + if (seconds) { + say_num(seconds, SSM_PRONOUNCED); + say_file("time/seconds.wav"); + } + + return SWITCH_STATUS_SUCCESS; + } + + if ((t = atol(tosay)) > 0) { + target = switch_time_make(t, 0); + target_now = switch_micro_time_now(); + } else { + target = switch_micro_time_now(); + target_now = switch_micro_time_now(); + } + + if (tz) { + int check = atoi(tz); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Timezone is [%s]\n", tz); + if (check) { + switch_time_exp_tz(&tm, target, check); + switch_time_exp_tz(&tm_now, target_now, check); + } else { + switch_time_exp_tz_name(tz, &tm, target); + switch_time_exp_tz_name(tz, &tm_now, target_now); + } + } else { + switch_time_exp_lt(&tm, target); + switch_time_exp_lt(&tm_now, target_now); + } + + switch (say_args->type) { + case SST_CURRENT_DATE_TIME: + say_date = say_time = 1; + break; + case SST_CURRENT_DATE: + say_date = 1; + break; + case SST_CURRENT_TIME: + say_time = 1; + break; + case SST_SHORT_DATE_TIME: + say_time = 1; + if (tm.tm_year != tm_now.tm_year) { + say_date = 1; + break; + } + if (tm.tm_yday == tm_now.tm_yday) { + say_today = 1; + break; + } + if (tm.tm_yday == tm_now.tm_yday - 1) { + say_yesterday = 1; + break; + } + if (tm.tm_yday >= tm_now.tm_yday - 5) { + say_dow = 1; + break; + } + if (tm.tm_mon != tm_now.tm_mon) { + say_month = say_day = say_dow = 1; + break; + } + + say_month = say_day = say_dow = 1; + + break; + default: + break; + } + + if (say_today) { + say_file("time/today.wav"); + } + if (say_yesterday) { + say_file("time/yesterday.wav"); + } + if (say_dow) { + say_file("time/day-%d.wav", tm.tm_wday); + } + + if (say_date) { + say_year = say_month = say_day = say_dow = 1; + say_today = say_yesterday = 0; + } + + gregorian_to_jalali(&jalali_year,&jalali_month,&jalali_day,tm.tm_year + 1900,tm.tm_mon + 1,tm.tm_mday); + + if (say_day) { + if(jalali_day > 20 && jalali_day != 30) + { + say_file("digits/%d+.wav", (jalali_day - jalali_day % 10)); + say_file("digits/%de.wav", jalali_day % 10); + } + else + say_file("digits/%de.wav", jalali_day); + } + + if (say_month) { + say_file("time/mon-%d.wav", jalali_month - 1); + } + + if (say_year) { + say_num(jalali_year, SSM_PRONOUNCED); + } + + if (say_time) { + int32_t hour = tm.tm_hour, pm = 0; + + if (say_date || say_today || say_yesterday || say_dow) { + say_file("time/at.wav"); + } + + if (hour > 12) { + hour -= 12; + pm = 1; + } else if (hour == 12) { + pm = 1; + } else if (hour == 0) { + hour = 12; + pm = 0; + } + + say_file("time/hour-e.wav"); + say_file("digits/%do.wav",hour); + play_group(SSM_PRONOUNCED, 0, (tm.tm_min - tm.tm_min % 10) / 10, tm.tm_min % 10, "time/minutes-e.wav", session, args); + say_file("time/%s.wav", pm ? "p-m" : "a-m"); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t fa_say_money(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args) +{ + char sbuf[16] = ""; /* enough for 999,999,999,999.99 (w/o the commas or leading $) */ + char *rials = NULL; + char *cents = NULL; + + if (strlen(tosay) > 15 || !(tosay = switch_strip_nonnumerics(tosay, sbuf, sizeof(sbuf)))) { + /* valid characters are 0 - 9, period (.), minus (-), and plus (+) - remove all others */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n"); + return SWITCH_STATUS_GENERR; + } + + rials = sbuf; + + if ((cents = strchr(sbuf, '.'))) { + *cents++ = '\0'; + if (strlen(cents) > 2) { + cents[2] = '\0'; + } + } + + /* If positive sign - skip over" */ + if (sbuf[0] == '+') { + say_file("currency/positive-e.wav"); + rials++; + } + + /* If negative say "negative" */ + if (sbuf[0] == '-') { + say_file("currency/negative-e.wav"); + rials++; + } + + /* Say rial amount */ + fa_say_general_count(session, rials, say_args, args); + say_file("currency/rials.wav"); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t fa_say_telephone(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args) +{ + char *phone_number; + int tosay_length = 0; + + if( !tosay || !strlen(tosay) ) + { + return SWITCH_STATUS_SUCCESS; + } + + if ((phone_number = strchr(tosay,'-'))) + { + *phone_number++ = '\0'; + fa_say_telephone(session,tosay,say_args,args); + fa_say_telephone(session,phone_number,say_args,args); + return SWITCH_STATUS_SUCCESS; + } + + tosay_length = strlen(tosay); + if( tosay_length == 1 ) + { + say_file("digits/%d.wav",tosay[0] - 48); + } + else if ( tosay[0] == '0' ) + { + if( tosay[1] == '0' ) + { + say_file("digits/00.wav"); + fa_say_telephone(session,tosay + 2,say_args,args); + } + else + { + say_file("digits/0.wav"); + fa_say_telephone(session,tosay + 1,say_args,args); + } + } + else if ( tosay_length % 2 ) + { + play_group(SSM_PRONOUNCED,tosay[0] - 48,tosay[1] - 48,tosay[2] - 48,NULL,session,args); + fa_say_telephone(session,tosay + 3,say_args,args); + } + else + { + play_group(SSM_PRONOUNCED,0,tosay[0] - 48,tosay[1] - 48,NULL,session,args); + fa_say_telephone(session,tosay + 2,say_args,args); + } + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t fa_say(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args) +{ + switch_say_callback_t say_cb = NULL; + + switch (say_args->type) { + case SST_NUMBER: + case SST_ITEMS: + case SST_PERSONS: + case SST_MESSAGES: + say_cb = fa_say_general_count; + break; + case SST_TIME_MEASUREMENT: + case SST_CURRENT_DATE: + case SST_CURRENT_TIME: + case SST_CURRENT_DATE_TIME: + case SST_SHORT_DATE_TIME: + say_cb = fa_say_time; + break; + case SST_IP_ADDRESS: + return switch_ivr_say_ip(session, tosay, fa_say_general_count, say_args, args); + break; + case SST_NAME_SPELLED: + case SST_NAME_PHONETIC: + return switch_ivr_say_spell(session, tosay, say_args, args); + break; + case SST_CURRENCY: + say_cb = fa_say_money; + break; + case SST_TELEPHONE_NUMBER: + say_cb = fa_say_telephone; + break; + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unknown Say type=[%d]\n", say_args->type); + break; + } + + if (say_cb) { + return say_cb(session, tosay, say_args, args); + } + + return SWITCH_STATUS_FALSE; +} + +SWITCH_MODULE_LOAD_FUNCTION(mod_say_fa_load) +{ + switch_say_interface_t *say_interface; + /* connect my internal structure to the blank pointer passed to me */ + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + say_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_SAY_INTERFACE); + say_interface->interface_name = "fa"; + say_interface->say_function = fa_say; + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + +/* Utility functions */ + +int g_days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +int j_days_in_month[12] = {31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29}; + +void gregorian_to_jalali(int *j_y, int *j_m, int *j_d, + int g_y, int g_m, int g_d) +{ + int gy, gm, gd; + int jy, jm, jd; + long g_day_no, j_day_no; + int j_np; + + int i; + + gy = g_y-1600; + gm = g_m-1; + gd = g_d-1; + + g_day_no = 365*gy+(gy+3)/4-(gy+99)/100+(gy+399)/400; + for (i=0;i1 && ((gy%4==0 && gy%100!=0) || (gy%400==0))) + /* leap and after Feb */ + ++g_day_no; + g_day_no += gd; + + j_day_no = g_day_no-79; + + j_np = j_day_no / 12053; + j_day_no %= 12053; + + jy = 979+33*j_np+4*(j_day_no/1461); + j_day_no %= 1461; + + if (j_day_no >= 366) { + jy += (j_day_no-1)/365; + j_day_no = (j_day_no-1)%365; + } + + for (i = 0; i < 11 && j_day_no >= j_days_in_month[i]; ++i) { + j_day_no -= j_days_in_month[i]; + } + jm = i+1; + jd = j_day_no+1; + *j_y = jy; + *j_m = jm; + *j_d = jd; +} + +void jalali_to_gregorian(int *g_y, int *g_m, int *g_d, + int j_y, int j_m, int j_d) +{ + int gy, gm, gd; + int jy, jm, jd; + long g_day_no, j_day_no; + int leap; + + int i; + + jy = j_y-979; + jm = j_m-1; + jd = j_d-1; + + j_day_no = 365*jy + (jy/33)*8 + (jy%33+3)/4; + for (i=0; i < jm; ++i) + j_day_no += j_days_in_month[i]; + + j_day_no += jd; + + g_day_no = j_day_no+79; + + gy = 1600 + 400*(g_day_no/146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */ + g_day_no = g_day_no % 146097; + + leap = 1; + if (g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */ + { + g_day_no--; + gy += 100*(g_day_no/36524); /* 36524 = 365*100 + 100/4 - 100/100 */ + g_day_no = g_day_no % 36524; + + if (g_day_no >= 365) + g_day_no++; + else + leap = 0; + } + + gy += 4*(g_day_no/1461); /* 1461 = 365*4 + 4/4 */ + g_day_no %= 1461; + + if (g_day_no >= 366) { + leap = 0; + + g_day_no--; + gy += g_day_no/365; + g_day_no = g_day_no % 365; + } + + for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++) + g_day_no -= g_days_in_month[i] + (i == 1 && leap); + gm = i+1; + gd = g_day_no+1; + + *g_y = gy; + *g_m = gm; + *g_d = gd; +} + +/* 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: + */ \ No newline at end of file From 4e4b4444d26c424263d520fe33cfa2686762bb3f Mon Sep 17 00:00:00 2001 From: Mahdi Moradi Date: Wed, 16 May 2012 20:35:15 +0430 Subject: [PATCH 340/731] Microsoft visual studio project files. --- src/mod/say/mod_say_fa/mod_say_fa.2008.vcproj | 283 ++++++++++++++++++ .../say/mod_say_fa/mod_say_fa.2010.vcxproj | 135 +++++++++ .../mod_say_fa/mod_say_fa.2010.vcxproj.user | 3 + src/mod/say/mod_say_fa/mod_say_fa.vcproj | 51 ++++ 4 files changed, 472 insertions(+) create mode 100644 src/mod/say/mod_say_fa/mod_say_fa.2008.vcproj create mode 100644 src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj create mode 100644 src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user create mode 100644 src/mod/say/mod_say_fa/mod_say_fa.vcproj diff --git a/src/mod/say/mod_say_fa/mod_say_fa.2008.vcproj b/src/mod/say/mod_say_fa/mod_say_fa.2008.vcproj new file mode 100644 index 0000000000..7cd7862cd7 --- /dev/null +++ b/src/mod/say/mod_say_fa/mod_say_fa.2008.vcproj @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj b/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj new file mode 100644 index 0000000000..cefc30eeab --- /dev/null +++ b/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj @@ -0,0 +1,135 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + mod_say_fa + {85a71f08-9f6c-11e1-9967-002186cfa17e} + mod_say_fa + Win32Proj + + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + DynamicLibrary + MultiByte + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + + + + + false + + + + + + + X64 + + + + + + + false + + + MachineX64 + + + + + + + + + false + + + + + + + X64 + + + + + + + false + + + MachineX64 + + + + + + + + {f6c55d93-b927-4483-bb69-15aef3dd2dff} + false + + + {202d7a4e-760d-4d0e-afa1-d7459ced30ff} + false + + + + + + \ No newline at end of file diff --git a/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user b/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user new file mode 100644 index 0000000000..695b5c78b9 --- /dev/null +++ b/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/mod/say/mod_say_fa/mod_say_fa.vcproj b/src/mod/say/mod_say_fa/mod_say_fa.vcproj new file mode 100644 index 0000000000..02de50a6fa --- /dev/null +++ b/src/mod/say/mod_say_fa/mod_say_fa.vcproj @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + From 31e0e17d6b98a3b26b584f91916f8168e3752837 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 16 May 2012 21:05:41 +0000 Subject: [PATCH 341/731] make some ZRTP-related integer casts explicit ...to satisfy Windows Visual Studio. Thanks to Jeff Lenk. --- src/switch_rtp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index d481a17d49..c34da28c58 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -858,7 +858,7 @@ SWITCH_DECLARE(void) switch_rtp_init(switch_memory_pool_t *pool) zrtp_config.lic_mode = ZRTP_LICENSE_MODE_ACTIVE; switch_snprintf(zrtp_cache_path, sizeof(zrtp_cache_path), "%s%szrtp.dat", SWITCH_GLOBAL_dirs.db_dir, SWITCH_PATH_SEPARATOR); zrtp_zstrcpyc((zrtp_stringn_t*)zrtp_config.def_cache_path.buffer, zrtp_cache_path); - zrtp_config.def_cache_path.length = strlen(zrtp_cache_path); + zrtp_config.def_cache_path.length = (uint16_t)strlen(zrtp_cache_path); zrtp_config.def_cache_path.max_length = 255; zrtp_config.cb.event_cb.on_zrtp_protocol_event = zrtp_event_callback; zrtp_config.cb.misc_cb.on_send_packet = zrtp_send_rtp_callback; @@ -1726,7 +1726,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_create(switch_rtp_t **new_rtp_session rtp_session->zrtp_profile->allowclear = 0; rtp_session->zrtp_profile->disclose_bit = 0; - rtp_session->zrtp_profile->cache_ttl = -1; + rtp_session->zrtp_profile->cache_ttl = (uint32_t) -1; if (zrtp_status_ok != zrtp_session_init(zrtp_global, rtp_session->zrtp_profile, zid, initiator, &rtp_session->zrtp_session)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error! zRTP INIT Failed\n"); From 7bd9efc7f52a725b7ef9efb64b65873b4bc4330b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 16 May 2012 21:26:50 +0000 Subject: [PATCH 342/731] use the typedef for an enum rather than unsigned The callback here receives both zrtp_protocol_event_t and zrtp_security_event_t events. The latter is numbered contiguously to the former. Still, it's a bit confusing to have to pick one as a type, but apparently this fixes a warning on Visual Studio on Windows. Thanks to Jeff Lenk. --- 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 c34da28c58..9211ec2cee 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -688,7 +688,7 @@ static int zrtp_send_rtp_callback(const zrtp_stream_t *stream, char *rtp_packet, return status; } -static void zrtp_event_callback(zrtp_stream_t *stream, unsigned event) +static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t event) { switch_rtp_t *rtp_session = zrtp_stream_get_userdata(stream); zrtp_session_info_t zrtp_session_info; From fdc9e7f8b6a81df14bee9a2bb7d4b626e8df3e1a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 May 2012 05:33:44 +0000 Subject: [PATCH 343/731] work around libzrtp API mistake for VS libzrtp's sas_is_verified field is a uint32_t, but zrtp_verified_set expects a uint8_t. This is a boolean field, so it doesn't matter one way or the other. gcc doesn't care, but Windows Visual Studio apparently throws a warning about this. --- src/switch_rtp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 9211ec2cee..9c42520ff9 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -715,7 +715,7 @@ static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t eve switch_channel_set_variable_name_printf(channel, stream->session->sas1.buffer, "zrtp_sas1_string_%s", type); switch_channel_set_variable_name_printf(channel, stream->session->sas2.buffer, "zrtp_sas2_string", type); - zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); } } @@ -777,7 +777,7 @@ static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t eve if (zrtp_status_ok == zrtp_session_get(stream->session, &zrtp_session_info)) { if (zrtp_session_info.sas_is_ready) { - zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); } } } @@ -790,7 +790,7 @@ static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t eve if (zrtp_status_ok == zrtp_session_get(stream->session, &zrtp_session_info)) { if (zrtp_session_info.sas_is_ready) { - zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); } } } @@ -803,7 +803,7 @@ static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t eve if (zrtp_status_ok == zrtp_session_get(stream->session, &zrtp_session_info)) { if (zrtp_session_info.sas_is_ready) { - zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + zrtp_verified_set(zrtp_global, &stream->session->zid, &stream->session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); } } } @@ -3645,7 +3645,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp switch_clear_flag(other_rtp_session, SWITCH_ZRTP_FLAG_SECURE_MITM_RECV); switch_clear_flag(other_rtp_session, SWITCH_ZRTP_FLAG_SECURE_MITM_SEND); zrtp_verified_set(zrtp_global, &rtp_session->zrtp_session->zid, - &rtp_session->zrtp_session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + &rtp_session->zrtp_session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); rtp_session->zrtp_mitm_tries++; } } @@ -4275,7 +4275,7 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra switch_clear_flag(other_rtp_session, SWITCH_ZRTP_FLAG_SECURE_MITM_RECV); switch_clear_flag(other_rtp_session, SWITCH_ZRTP_FLAG_SECURE_MITM_SEND); zrtp_verified_set(zrtp_global, &rtp_session->zrtp_session->zid, - &rtp_session->zrtp_session->peer_zid, zrtp_session_info.sas_is_verified ^ 1); + &rtp_session->zrtp_session->peer_zid, (uint8_t)(zrtp_session_info.sas_is_verified ^ 1)); rtp_session->zrtp_mitm_tries++; } rtp_session->zrtp_mitm_tries++; From d5484651ce473636fcfb5ecc2a4289c4645319ca Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 May 2012 06:13:32 +0000 Subject: [PATCH 344/731] squelch a Windows VS warning about null termination on the ZID According Jeff Lenk, Windows Visual Studio doesn't understand that people use the char type for non-null-terminated byte arrays, so it throws a warning about this that causes the build to fail on Windows. As the initial value for the ZID doesn't really matter here one iota, just null-terminate it on Windows. --- src/switch_rtp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 9c42520ff9..c4030148aa 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -73,7 +73,11 @@ typedef srtp_hdr_t rtp_hdr_t; #ifdef ENABLE_ZRTP #include "zrtp.h" static zrtp_global_t *zrtp_global; +#ifndef WIN32 static zrtp_zid_t zid = { "FreeSWITCH01" }; +#else +static zrtp_zid_t zid = { "FreeSWITCH0\0" }; +#endif static int zrtp_on = 0; #define ZRTP_MITM_TRIES 100 #endif From df76709e95241e7971e380e99f66853838902397 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 17 May 2012 16:14:05 +0530 Subject: [PATCH 345/731] 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 b65c32119373a000f93ed7d974fc95b9c4c01dcc Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Thu, 17 May 2012 08:38:11 -0500 Subject: [PATCH 346/731] FS-4228 --resolve add zrtp support to windows vs2010 build --- Freeswitch.2010.sln | 20 ++ .../libzrtp/projects/win/libzrtp.2010.vcxproj | 250 +++++++++++++++++ .../projects/win/libzrtp.2010.vcxproj.filters | 256 ++++++++++++++++++ libs/libzrtp/third_party/bnlib/bnconfig.win | 76 ++++++ libs/libzrtp/third_party/bnlib/lbn.h | 6 + src/switch_rtp.c | 2 +- w32/Library/FreeSwitchCore.2010.vcxproj | 19 +- 7 files changed, 620 insertions(+), 9 deletions(-) create mode 100644 libs/libzrtp/projects/win/libzrtp.2010.vcxproj create mode 100644 libs/libzrtp/projects/win/libzrtp.2010.vcxproj.filters create mode 100644 libs/libzrtp/third_party/bnlib/bnconfig.win diff --git a/Freeswitch.2010.sln b/Freeswitch.2010.sln index e7cccee08c..954ce1cc1b 100644 --- a/Freeswitch.2010.sln +++ b/Freeswitch.2010.sln @@ -525,6 +525,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsmlib", "src\mod\endpoints EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endpoints\mod_gsmopen\mod_gsmopen.2010.vcxproj", "{74B120FF-6935-4DFE-A142-CDB6BEA99C90}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2010.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -3574,6 +3576,23 @@ Global {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64.ActiveCfg = Release|x64 {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x64 Setup.ActiveCfg = Release|x64 {74B120FF-6935-4DFE-A142-CDB6BEA99C90}.Release|x86 Setup.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.Build.0 = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64 Setup.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x86 Setup.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64 Setup.ActiveCfg = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x86 Setup.ActiveCfg = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64 Setup.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x86 Setup.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3687,6 +3706,7 @@ Global {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {23B4D303-79FC-49E0-89E2-2280E7E28940} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {26C82FCE-E0CF-4D10-A00C-D8E582FFEB53} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC} {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000} {ACFFF684-4D19-4D48-AF12-88EA1D778BDF} = {0C808854-54D1-4230-BFF5-77B5FD905000} diff --git a/libs/libzrtp/projects/win/libzrtp.2010.vcxproj b/libs/libzrtp/projects/win/libzrtp.2010.vcxproj new file mode 100644 index 0000000000..3306611920 --- /dev/null +++ b/libs/libzrtp/projects/win/libzrtp.2010.vcxproj @@ -0,0 +1,250 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C13CC324-0032-4492-9A30-310A6BD64FF5} + libzrtp.x32 + Win32Proj + libzrtp + + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + + + + Disabled + ../../include;../../third_party/bnlib;../../third_party/bgaes;../../test/include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;HAVE_CONFIG_H=1;ZRTP_ENABLE_EC=0;ZRTP_USE_BUILTIN_CACHE=1;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Default + + + Level3 + ProgramDatabase + CompileAsC + + + + if not exist "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" copy "$(ProjectDir)..\..\third_party\bnlib\bnconfig.win" "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" + + + + + Disabled + ../../include;../../third_party/bnlib;../../third_party/bgaes;../../test/include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;HAVE_CONFIG_H=1;ZRTP_ENABLE_EC=0;ZRTP_USE_BUILTIN_CACHE=1;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Default + + + Level3 + ProgramDatabase + CompileAsC + + + + if not exist "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" copy "$(ProjectDir)..\..\third_party\bnlib\bnconfig.win" "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" + + + + + ../../include;../../third_party/bnlib;../../third_party/bgaes;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;HAVE_CONFIG_H=1;ZRTP_ENABLE_EC=0;ZRTP_USE_BUILTIN_CACHE=1;%(PreprocessorDefinitions) + + + MultiThreadedDLL + Default + false + + + Level3 + ProgramDatabase + CompileAsC + + + + if not exist "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" copy "$(ProjectDir)..\..\third_party\bnlib\bnconfig.win" "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" + + + + + ../../include;../../third_party/bnlib;../../third_party/bgaes;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;HAVE_CONFIG_H=1;ZRTP_ENABLE_EC=0;ZRTP_USE_BUILTIN_CACHE=1;%(PreprocessorDefinitions) + + + MultiThreadedDLL + Default + false + + + Level3 + ProgramDatabase + CompileAsC + + + + if not exist "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" copy "$(ProjectDir)..\..\third_party\bnlib\bnconfig.win" "$(ProjectDir)..\..\third_party\bnlib\bnconfig.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/libzrtp/projects/win/libzrtp.2010.vcxproj.filters b/libs/libzrtp/projects/win/libzrtp.2010.vcxproj.filters new file mode 100644 index 0000000000..4bae11a1dd --- /dev/null +++ b/libs/libzrtp/projects/win/libzrtp.2010.vcxproj.filters @@ -0,0 +1,256 @@ + + + + + {c0e76076-0032-445d-8c07-32b6c762622b} + + + {a03c0d83-0032-4848-9704-22cdce5ab144} + + + {dbe8a34e-0032-495e-8df7-e82218921e60} + + + {96d1a5c9-0032-4230-a764-a0ed11f434a7} + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bnlib + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + bgaes + + + + + + + \ No newline at end of file diff --git a/libs/libzrtp/third_party/bnlib/bnconfig.win b/libs/libzrtp/third_party/bnlib/bnconfig.win new file mode 100644 index 0000000000..303a25b689 --- /dev/null +++ b/libs/libzrtp/third_party/bnlib/bnconfig.win @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1995 Colin Plumb. All rights reserved. + * For licensing and other legal details, see the file legal.c. + * + * bnconfig.h -- Configuration file for BigNum library. + * + * This file is automatically filled in by configure. + * Everything must start out turned *off*, because configure + * (or, more properly, config.status) only knows how to turn them + * *on*. + */ +#ifndef CONFIG_H +#define CONFIG_H + +/* Define to empty if the compiler does not support 'const' variables. */ +#undef const + +/* Define to `unsigned' if doesn't define it. */ +#undef size_t + +/* Checks for the presence and absence of various header files */ +#define HAVE_ASSERT_H 1 +#define NO_ASSERT_H !HAVE_ASSERT_H +#define HAVE_LIMITS_H 1 +#define NO_LIMITS_H !HAVE_LIMITS_H +#define HAVE_STDLIB_H 1 +#define NO_STDLIB_H !HAVE_STDLIB_H +#define HAVE_STRING_H 1 +#define NO_STRING_H !HAVE_STRING_H + +#define HAVE_STRINGS_H 0 +#define NEED_MEMORY_H 0 + +/* We go to some trouble to find accurate times... */ + +/* Define if you have Posix.4 glock_gettime() */ +#define HAVE_CLOCK_GETTIME 0 +/* Define if you have Solaris-style gethrvtime() */ +#define HAVE_GETHRVTIME 0 +/* Define if you have getrusage() */ +#define HAVE_GETRUSAGE 0 +/* Define if you have clock() */ +#define HAVE_CLOCK 0 +/* Define if you have time() */ +#define HAVE_TIME 0 + +/* + * Define as 0 if #including automatically + * #includes , and doing so explicitly causes an + * error. + */ +#define TIME_WITH_SYS_TIME 0 + +/* Defines for various kinds of library brokenness */ + +/* Define if is missing prototypes (= lots of warnings!) */ +#define NO_STDIO_PROTOS 0 + +/* Define if depends on and breaks without it */ +#define ASSERT_NEEDS_STDIO 0 +/* Define if depends on and complains without it */ +#define ASSERT_NEEDS_STDLIB 0 + +/* + * Define if delcares the mem* functions to take char * + * instead of void * parameters (= lots of warnings) + */ +#define MEM_PROTOS_BROKEN 0 + +/* If not available, bcopy() is substituted */ +#define HAVE_MEMMOVE 1 +#define NO_MEMMOVE !HAVE_MEMMOVE +#define HAVE_MEMCPY 1 +#define NO_MEMCPY !HAVE_MEMCPY + +#endif /* CONFIG_H */ diff --git a/libs/libzrtp/third_party/bnlib/lbn.h b/libs/libzrtp/third_party/bnlib/lbn.h index b0fd21cfb5..43fc7c91dc 100644 --- a/libs/libzrtp/third_party/bnlib/lbn.h +++ b/libs/libzrtp/third_party/bnlib/lbn.h @@ -145,6 +145,12 @@ typedef unsigned long long bnword64; #define BNWORD64 bnword64 #endif +/*Workaround for windows for now. */ +#ifdef WIN32 +typedef unsigned long long bnword64; +#define BNWORD64 bnword64 +#endif + /* We don't even try to find a 128-bit type at the moment */ #endif /* !LBN_H */ diff --git a/src/switch_rtp.c b/src/switch_rtp.c index c4030148aa..481bd54e84 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -76,7 +76,7 @@ static zrtp_global_t *zrtp_global; #ifndef WIN32 static zrtp_zid_t zid = { "FreeSWITCH01" }; #else -static zrtp_zid_t zid = { "FreeSWITCH0\0" }; +static zrtp_zid_t zid = { "FreeSWITCH0" }; #endif static int zrtp_on = 0; #define ZRTP_MITM_TRIES 100 diff --git a/w32/Library/FreeSwitchCore.2010.vcxproj b/w32/Library/FreeSwitchCore.2010.vcxproj index 94b5dbc55a..eb1933a7f6 100644 --- a/w32/Library/FreeSwitchCore.2010.vcxproj +++ b/w32/Library/FreeSwitchCore.2010.vcxproj @@ -88,8 +88,8 @@ Disabled - ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;PCRE_STATIC;STATICLIB;%(PreprocessorDefinitions) + ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;..\..\libs\libzrtp\include;..\..\libs\libzrtp\third_party\bgaes;..\..\libs\libzrtp\third_party\bnlib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;PCRE_STATIC;STATICLIB;ENABLE_ZRTP;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -146,8 +146,8 @@ if not exist "$(OutDir)htdocs" xcopy "$(SolutionDir)htdocs\*.*" "$(OutDir)htdocs Disabled - ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;PCRE_STATIC;STATICLIB;%(PreprocessorDefinitions) + ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;..\..\libs\libzrtp\include;..\..\libs\libzrtp\third_party\bgaes;..\..\libs\libzrtp\third_party\bnlib;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;PCRE_STATIC;STATICLIB;ENABLE_ZRTP;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -198,8 +198,8 @@ if not exist "$(OutDir)htdocs" xcopy "$(SolutionDir)htdocs\*.*" "$(OutDir)htdocs MaxSpeed - ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;STATICLIB;CRASH_PROT;PCRE_STATIC;%(PreprocessorDefinitions) + ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;..\..\libs\libzrtp\include;..\..\libs\libzrtp\third_party\bgaes;..\..\libs\libzrtp\third_party\bnlib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;STATICLIB;CRASH_PROT;PCRE_STATIC;ENABLE_ZRTP;%(PreprocessorDefinitions) MultiThreadedDLL Use switch.h @@ -247,8 +247,8 @@ if not exist "$(OutDir)htdocs" xcopy "$(SolutionDir)htdocs\*.*" "$(OutDir)htdocs MaxSpeed - ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;STATICLIB;CRASH_PROT;PCRE_STATIC;%(PreprocessorDefinitions) + ..\..\src\include;..\..\libs\include;..\..\libs\srtp\include;..\..\libs\srtp\crypto\include;..\..\libs\libteletone\src;..\..\libs\win32\sqlite;..\..\libs\pcre;..\..\libs\stfu;..\..\libs\speex\include;..\..\libs\spandsp\src\msvc;..\..\libs\spandsp\src;..\..\libs\tiff-3.8.2\libtiff;..\..\libs\libzrtp\include;..\..\libs\libzrtp\third_party\bgaes;..\..\libs\libzrtp\third_party\bnlib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;FREESWITCHCORE_EXPORTS;STATICLIB;CRASH_PROT;PCRE_STATIC;ENABLE_ZRTP;%(PreprocessorDefinitions) MultiThreadedDLL Use switch.h @@ -766,6 +766,9 @@ if not exist "$(OutDir)htdocs" xcopy "$(SolutionDir)htdocs\*.*" "$(OutDir)htdocs {89385c74-5860-4174-9caf-a39e7c48909c} false + + {c13cc324-0032-4492-9a30-310a6bd64ff5} + {1cbb0077-18c5-455f-801c-0a0ce7b0bbf5} From 021f48d02ec06d27d43d440fa3e9574aa06e3ff6 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Thu, 17 May 2012 10:28:51 -0500 Subject: [PATCH 347/731] FS-4169 --resolve compiler warning for solaris --- src/switch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch.c b/src/switch.c index a3f8759d8c..189eea40cf 100644 --- a/src/switch.c +++ b/src/switch.c @@ -288,7 +288,7 @@ void daemonize(int do_wait) while(--sanity && !system_ready) { if (sanity % 2 == 0) { - printf("FreeSWITCH[%d] Waiting for background process pid:%d to be ready.....\n", getpid(), (int) pid); + printf("FreeSWITCH[%d] Waiting for background process pid:%d to be ready.....\n", (int)getpid(), (int) pid); } sleep(1); } From 92eb698ddc4c683a6e85cac4584f8aa7e576b9c0 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 May 2012 11:27:57 -0500 Subject: [PATCH 348/731] FS-4231 --resolve declinatio mortuus obfirmo! --- src/mod/endpoints/mod_sofia/sofia_presence.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 5965c54cd8..be360520ea 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -3419,9 +3419,8 @@ void sofia_presence_handle_sip_i_subscribe(int status, "sub del sql: %s\n", sql); } - switch_mutex_lock(profile->ireg_mutex); switch_assert(sql != NULL); - sofia_glue_actually_execute_sql(profile, sql, NULL); + sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex); switch_safe_free(sql); sstr = switch_mprintf("terminated;reason=noresource"); @@ -3460,7 +3459,6 @@ void sofia_presence_handle_sip_i_subscribe(int status, sstr = switch_mprintf("active;expires=%ld", exp_delta); } - switch_mutex_unlock(profile->ireg_mutex); } if (status < 200) { From 83e090c30d8851ba0ee42540e9a943541d00070d Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 17 May 2012 16:24:56 +0000 Subject: [PATCH 349/731] add some casts to make things work with both gcc and VS This amends commit 7bd9efc7f52a725b7ef9efb64b65873b4bc4330b. Using the more explicit typedef causes gcc to warn about the incompatible types for the reasons noted in the earlier commit message. This is why we just used the unsigned type earlier so we could avoid all this casting. The things we do to make Windows happy... --- src/switch_rtp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 481bd54e84..be7f180fcd 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -864,9 +864,9 @@ SWITCH_DECLARE(void) switch_rtp_init(switch_memory_pool_t *pool) zrtp_zstrcpyc((zrtp_stringn_t*)zrtp_config.def_cache_path.buffer, zrtp_cache_path); zrtp_config.def_cache_path.length = (uint16_t)strlen(zrtp_cache_path); zrtp_config.def_cache_path.max_length = 255; - zrtp_config.cb.event_cb.on_zrtp_protocol_event = zrtp_event_callback; + zrtp_config.cb.event_cb.on_zrtp_protocol_event = (void (*)(zrtp_stream_t*,zrtp_protocol_event_t))zrtp_event_callback; zrtp_config.cb.misc_cb.on_send_packet = zrtp_send_rtp_callback; - zrtp_config.cb.event_cb.on_zrtp_security_event = zrtp_event_callback; + zrtp_config.cb.event_cb.on_zrtp_security_event = (void (*)(zrtp_stream_t*,zrtp_security_event_t))zrtp_event_callback; zrtp_log_set_log_engine((zrtp_log_engine *) zrtp_logger); zrtp_log_set_level(4); From ce46a57b857c3648ec5518fcd23a7ad66fd16cd9 Mon Sep 17 00:00:00 2001 From: James Zhang Date: Thu, 17 May 2012 17:56:50 -0400 Subject: [PATCH 350/731] 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 ad7149bfa6c924ad7c36dea5611a00b39f4416b3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 May 2012 18:57:22 -0500 Subject: [PATCH 351/731] allow mod loopback bowout to reach out across stacked loopback bridges and remove all of them --- src/mod/endpoints/mod_loopback/mod_loopback.c | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index 9ad780f838..200d6e5b71 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -650,6 +650,39 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch return status; } +static switch_status_t find_non_loopback_bridge(switch_core_session_t *session, switch_core_session_t **br_session, const char **br_uuid) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + const char *a_uuid; + switch_core_session_t *sp; + + *br_session = NULL; + *br_uuid = NULL; + + a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + + while (a_uuid && (sp = switch_core_session_locate(a_uuid))) { + if (switch_core_session_check_interface(sp, loopback_endpoint_interface)) { + private_t *tech_pvt = switch_core_session_get_private(sp); + + a_uuid = switch_channel_get_variable(tech_pvt->other_channel, SWITCH_SIGNAL_BOND_VARIABLE); + switch_core_session_rwunlock(sp); + sp = NULL; + } else { + break; + } + } + + if (sp) { + *br_session = sp; + *br_uuid = a_uuid; + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; + +} + static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id) { switch_channel_t *channel = NULL; @@ -678,8 +711,8 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc switch_channel_test_flag(tech_pvt->other_channel, CF_BRIDGED) && switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED) && switch_channel_test_flag(tech_pvt->other_channel, CF_ANSWERED) && --tech_pvt->bowout_frame_count <= 0) { - const char *a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); - const char *b_uuid = switch_channel_get_variable(tech_pvt->other_channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *a_uuid = NULL; + const char *b_uuid = NULL; const char *vetoa, *vetob; @@ -690,16 +723,21 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc switch_core_session_t *br_a, *br_b; switch_channel_t *ch_a = NULL, *ch_b = NULL; int good_to_go = 0; + + find_non_loopback_bridge(session, &br_a, &a_uuid); + find_non_loopback_bridge(tech_pvt->other_session, &br_b, &b_uuid); + - if ((br_a = switch_core_session_locate(a_uuid))) { + if (br_a) { ch_a = switch_core_session_get_channel(br_a); } - if ((br_b = switch_core_session_locate(b_uuid))) { + if (br_b) { ch_b = switch_core_session_get_channel(br_b); } if (ch_a && ch_b && switch_channel_test_flag(ch_a, CF_BRIDGED) && switch_channel_test_flag(ch_b, CF_BRIDGED)) { + switch_set_flag_locked(tech_pvt, TFLAG_BOWOUT); switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_BOWOUT); From b117a65c5035cf43e00d5e5add58162f85dfecef Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 May 2012 19:57:02 -0500 Subject: [PATCH 352/731] put a little contention in the reg in new thread feature to prevent endless pileup --- src/mod/endpoints/mod_sofia/sofia.c | 4 +++- src/switch_core.c | 2 +- src/switch_core_sqldb.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index d7dac7581b..0e579ca1f8 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1306,6 +1306,7 @@ void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) switch_threadattr_t *thd_attr = NULL; switch_memory_pool_t *pool; switch_thread_t *thread; + sofia_profile_t *profile = (*dep)->profile; switch_core_new_memory_pool(&pool); @@ -1313,6 +1314,7 @@ void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) *dep = NULL; de->pool = pool; + switch_mutex_lock(profile->ireg_mutex); switch_threadattr_create(&thd_attr, de->pool); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); switch_thread_create(&thread, @@ -1320,7 +1322,7 @@ void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) sofia_msg_thread_run_once, de, de->pool); - + switch_mutex_unlock(profile->ireg_mutex); } diff --git a/src/switch_core.c b/src/switch_core.c index 8139f8ccf8..f89aeb5ee2 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1420,7 +1420,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc gethostname(runtime.hostname, sizeof(runtime.hostname)); runtime.max_db_handles = 50; - runtime.db_handle_timeout = 5000000;; + runtime.db_handle_timeout = 5000000; runtime.runlevel++; runtime.sql_buffer_len = 1024 * 32; diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index 5c59d96962..85d38160ed 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -218,7 +218,7 @@ SWITCH_DECLARE(switch_status_t) _switch_core_db_handle(switch_cache_db_handle_t } -#define SQL_CACHE_TIMEOUT 120 +#define SQL_CACHE_TIMEOUT 30 #define SQL_REG_TIMEOUT 15 From bbdcd33bde0e9aef0325aa4d93a62c7caa79c36c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 May 2012 20:10:53 -0500 Subject: [PATCH 353/731] performance tweaks for sip message parsing and event system --- src/include/switch_core.h | 2 + src/mod/endpoints/mod_sofia/mod_sofia.c | 12 +- src/mod/endpoints/mod_sofia/mod_sofia.h | 4 +- src/mod/endpoints/mod_sofia/sofia.c | 92 ++++++++---- src/switch_channel.c | 2 +- src/switch_event.c | 190 ++++++++---------------- src/switch_time.c | 8 +- 7 files changed, 137 insertions(+), 173 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 8f9220d0b9..9803c6708b 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2329,6 +2329,8 @@ SWITCH_DECLARE(void) switch_say_file(switch_say_file_handle_t *sh, const char *f SWITCH_DECLARE(int) switch_max_file_desc(void); SWITCH_DECLARE(void) switch_close_extra_files(int *keep, int keep_ttl); SWITCH_DECLARE(switch_status_t) switch_core_thread_set_cpu_affinity(int cpu); +SWITCH_DECLARE(void) switch_os_yield(void); + SWITCH_END_EXTERN_C #endif /* For Emacs: diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 164d0e76ff..6f64078509 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -5445,7 +5445,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) switch_yield(1500000); mod_sofia_globals.cpu_count = switch_core_cpu_count(); - mod_sofia_globals.max_msg_queues = mod_sofia_globals.cpu_count + 1; + mod_sofia_globals.max_msg_queues = (mod_sofia_globals.cpu_count / 2) + 1; + if (mod_sofia_globals.max_msg_queues < 2) { + mod_sofia_globals.max_msg_queues = 2; + } if (mod_sofia_globals.max_msg_queues > SOFIA_MAX_MSG_QUEUE) { mod_sofia_globals.max_msg_queues = SOFIA_MAX_MSG_QUEUE; @@ -5627,11 +5630,12 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sofia_shutdown) } - for (i = 0; i < mod_sofia_globals.msg_queue_len; i++) { - switch_queue_push(mod_sofia_globals.msg_queue[i], NULL); + for (i = 0; mod_sofia_globals.msg_queue_thread[i]; i++) { + switch_queue_push(mod_sofia_globals.msg_queue, NULL); } - for (i = 0; i < mod_sofia_globals.msg_queue_len; i++) { + + for (i = 0; mod_sofia_globals.msg_queue_thread[i]; i++) { switch_status_t st; switch_thread_join(&st, mod_sofia_globals.msg_queue_thread[i]); } diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index b96ff52011..c0fc7dfba4 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -342,7 +342,7 @@ typedef enum { } TFLAGS; #define SOFIA_MAX_MSG_QUEUE 64 -#define SOFIA_MSG_QUEUE_SIZE 250 +#define SOFIA_MSG_QUEUE_SIZE 100 struct mod_sofia_globals { switch_memory_pool_t *pool; @@ -359,7 +359,7 @@ struct mod_sofia_globals { char hostname[512]; switch_queue_t *presence_queue; switch_queue_t *mwi_queue; - switch_queue_t *msg_queue[SOFIA_MAX_MSG_QUEUE]; + switch_queue_t *msg_queue; switch_thread_t *msg_queue_thread[SOFIA_MAX_MSG_QUEUE]; int msg_queue_len; struct sofia_private destroy_private; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 0e579ca1f8..8eb122b310 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1347,34 +1347,56 @@ void sofia_process_dispatch_event(sofia_dispatch_event_t **dep) nua_handle_unref(nh); nua_stack_unref(nua); + switch_os_yield(); } + +static int msg_queue_threads = 0; +//static int count = 0; + void *SWITCH_THREAD_FUNC sofia_msg_thread_run(switch_thread_t *thread, void *obj) { void *pop; switch_queue_t *q = (switch_queue_t *) obj; int my_id; + for (my_id = 0; my_id < mod_sofia_globals.msg_queue_len; my_id++) { - if (mod_sofia_globals.msg_queue[my_id] == q) { + if (mod_sofia_globals.msg_queue_thread[my_id] == thread) { + break; + } + } + + switch_mutex_lock(mod_sofia_globals.mutex); + msg_queue_threads++; + switch_mutex_unlock(mod_sofia_globals.mutex); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MSG Thread %d Started\n", my_id); + + + for(;;) { + + if (switch_queue_pop(q, &pop) != SWITCH_STATUS_SUCCESS) { + switch_cond_next(); + continue; + } + + if (pop) { + sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) pop; + sofia_process_dispatch_event(&de); + switch_os_yield(); + } else { break; } } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MSG Thread %d Started\n", my_id); - - switch_core_thread_set_cpu_affinity(my_id); - - while(switch_queue_pop(q, &pop) == SWITCH_STATUS_SUCCESS && pop) { - sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) pop; - sofia_process_dispatch_event(&de); - switch_cond_next(); - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "MSG Thread Ended\n"); + switch_mutex_lock(mod_sofia_globals.mutex); + msg_queue_threads--; + switch_mutex_unlock(mod_sofia_globals.mutex); + return NULL; } @@ -1392,11 +1414,14 @@ void sofia_msg_thread_start(int idx) int i; mod_sofia_globals.msg_queue_len = idx + 1; - for (i = 0; i < mod_sofia_globals.msg_queue_len; i++) { - if (!mod_sofia_globals.msg_queue[i]) { - switch_threadattr_t *thd_attr = NULL; + if (!mod_sofia_globals.msg_queue) { + switch_queue_create(&mod_sofia_globals.msg_queue, SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.cpu_count, mod_sofia_globals.pool); + } - switch_queue_create(&mod_sofia_globals.msg_queue[i], SOFIA_MSG_QUEUE_SIZE, mod_sofia_globals.pool); + + for (i = 0; i < mod_sofia_globals.msg_queue_len; i++) { + if (!mod_sofia_globals.msg_queue_thread[i]) { + switch_threadattr_t *thd_attr = NULL; switch_threadattr_create(&thd_attr, mod_sofia_globals.pool); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); @@ -1404,7 +1429,7 @@ void sofia_msg_thread_start(int idx) switch_thread_create(&mod_sofia_globals.msg_queue_thread[i], thd_attr, sofia_msg_thread_run, - mod_sofia_globals.msg_queue[i], + mod_sofia_globals.msg_queue, mod_sofia_globals.pool); } } @@ -1413,12 +1438,12 @@ void sofia_msg_thread_start(int idx) switch_mutex_unlock(mod_sofia_globals.mutex); } - +//static int foo = 0; static void sofia_queue_message(sofia_dispatch_event_t *de) { - int idx = 0, queued = 0; + int launch = 0; - if (mod_sofia_globals.running == 0 || !mod_sofia_globals.msg_queue[0]) { + if (mod_sofia_globals.running == 0 || !mod_sofia_globals.msg_queue) { sofia_process_dispatch_event(&de); return; } @@ -1430,25 +1455,18 @@ static void sofia_queue_message(sofia_dispatch_event_t *de) } - again: - - for (idx = 0; idx < mod_sofia_globals.msg_queue_len; idx++) { - if (switch_queue_trypush(mod_sofia_globals.msg_queue[idx], de) == SWITCH_STATUS_SUCCESS) { - queued++; - break; - } + if ((switch_queue_size(mod_sofia_globals.msg_queue) > (SOFIA_MSG_QUEUE_SIZE * msg_queue_threads))) { + launch++; } - if (!queued) { + if (launch) { if (mod_sofia_globals.msg_queue_len < mod_sofia_globals.max_msg_queues) { sofia_msg_thread_start(mod_sofia_globals.msg_queue_len + 1); - goto again; } - - switch_queue_push(mod_sofia_globals.msg_queue[0], de); } - + + switch_queue_push(mod_sofia_globals.msg_queue, de); } @@ -1468,6 +1486,7 @@ void sofia_event_callback(nua_event_t event, return; } + switch_mutex_lock(profile->flag_mutex); profile->queued_events++; @@ -1483,6 +1502,13 @@ void sofia_event_callback(nua_event_t event, de->nua = nua_stack_ref(nua); if (event == nua_i_invite && !sofia_private) { + int critical = (((SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues) * 900) / 1000); + + if (switch_queue_size(mod_sofia_globals.msg_queue) > critical) { + nua_respond(nh, 503, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), TAG_END()); + return; + } + if (!(sofia_private = su_alloc(nh->nh_home, sizeof(*sofia_private)))) { abort(); } @@ -1516,8 +1542,8 @@ void sofia_event_callback(nua_event_t event, } } - sofia_queue_message(de); + switch_os_yield(); } diff --git a/src/switch_channel.c b/src/switch_channel.c index f7d7e3aae4..7afe342103 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1415,7 +1415,7 @@ SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, sw (other_channel && switch_channel_down_nosig(other_channel)) || switch_channel_down(channel)) { break; } - switch_yield(20000); + switch_cond_next(); } } diff --git a/src/switch_event.c b/src/switch_event.c index 23670fac93..38ec16bf26 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -35,7 +35,7 @@ #include #include //#define SWITCH_EVENT_RECYCLE -#define DISPATCH_QUEUE_LEN 1000 +#define DISPATCH_QUEUE_LEN 100 //#define DEBUG_DISPATCH_QUEUES /*! \brief A node to store binded events */ @@ -74,23 +74,20 @@ static switch_mutex_t *BLOCK = NULL; static switch_mutex_t *POOL_LOCK = NULL; static switch_memory_pool_t *RUNTIME_POOL = NULL; static switch_memory_pool_t *THRUNTIME_POOL = NULL; -#define NUMBER_OF_QUEUES 3 -static switch_thread_t *EVENT_QUEUE_THREADS[NUMBER_OF_QUEUES] = { 0 }; -static switch_queue_t *EVENT_QUEUE[NUMBER_OF_QUEUES] = { 0 }; static switch_thread_t *EVENT_DISPATCH_QUEUE_THREADS[MAX_DISPATCH_VAL] = { 0 }; static uint8_t EVENT_DISPATCH_QUEUE_RUNNING[MAX_DISPATCH_VAL] = { 0 }; -static switch_queue_t *EVENT_DISPATCH_QUEUE[MAX_DISPATCH_VAL] = { 0 }; -static int POOL_COUNT_MAX = SWITCH_CORE_QUEUE_LEN; +static switch_queue_t *EVENT_DISPATCH_QUEUE = NULL; static switch_mutex_t *EVENT_QUEUE_MUTEX = NULL; static switch_hash_t *CUSTOM_HASH = NULL; static int THREAD_COUNT = 0; +static int DISPATCH_THREAD_COUNT = 0; static int SYSTEM_RUNNING = 0; static uint64_t EVENT_SEQUENCE_NR = 0; #ifdef SWITCH_EVENT_RECYCLE static switch_queue_t *EVENT_RECYCLE_QUEUE = NULL; static switch_queue_t *EVENT_HEADER_RECYCLE_QUEUE = NULL; #endif -static void launch_dispatch_threads(uint32_t max, int len, switch_memory_pool_t *pool); +static void launch_dispatch_threads(uint32_t max, switch_memory_pool_t *pool); static char *my_dup(const char *s) { @@ -244,9 +241,10 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th switch_mutex_lock(EVENT_QUEUE_MUTEX); THREAD_COUNT++; + DISPATCH_THREAD_COUNT++; - for (my_id = 0; my_id < NUMBER_OF_QUEUES; my_id++) { - if (EVENT_DISPATCH_QUEUE[my_id] == queue) { + for (my_id = 0; my_id < MAX_DISPATCH_VAL; my_id++) { + if (EVENT_DISPATCH_QUEUE_THREADS[my_id] == thread) { break; } } @@ -254,7 +252,6 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th EVENT_DISPATCH_QUEUE_RUNNING[my_id] = 1; switch_mutex_unlock(EVENT_QUEUE_MUTEX); - switch_core_thread_set_cpu_affinity(my_id); for (;;) { void *pop = NULL; @@ -265,7 +262,7 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th } if (switch_queue_pop(queue, &pop) != SWITCH_STATUS_SUCCESS) { - break; + continue; } if (!pop) { @@ -280,6 +277,7 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th switch_mutex_lock(EVENT_QUEUE_MUTEX); EVENT_DISPATCH_QUEUE_RUNNING[my_id] = 0; THREAD_COUNT--; + DISPATCH_THREAD_COUNT--; switch_mutex_unlock(EVENT_QUEUE_MUTEX); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Dispatch Thread %d Ended.\n", my_id); @@ -287,74 +285,41 @@ static void *SWITCH_THREAD_FUNC switch_event_dispatch_thread(switch_thread_t *th } - -static void *SWITCH_THREAD_FUNC switch_event_thread(switch_thread_t *thread, void *obj) +static switch_status_t switch_event_queue_dispatch_event(switch_event_t **eventp) { - switch_queue_t *queue = (switch_queue_t *) obj; - uint32_t index = 0; - int my_id = 0; - switch_mutex_lock(EVENT_QUEUE_MUTEX); - THREAD_COUNT++; - switch_mutex_unlock(EVENT_QUEUE_MUTEX); + switch_event_t *event = *eventp; - for (my_id = 0; my_id < NUMBER_OF_QUEUES; my_id++) { - if (EVENT_QUEUE[my_id] == queue) { - break; - } + if (!SYSTEM_RUNNING) { + return SWITCH_STATUS_FALSE; } + + while (event) { + int launch = 0; - for (;;) { - void *pop = NULL; - switch_event_t *event = NULL; + switch_mutex_lock(EVENT_QUEUE_MUTEX); - if (switch_queue_pop(queue, &pop) != SWITCH_STATUS_SUCCESS) { - break; + if (switch_queue_size(EVENT_DISPATCH_QUEUE) > (DISPATCH_QUEUE_LEN * DISPATCH_THREAD_COUNT)) { + launch++; } - - if (!pop) { - break; - } - - if (!SYSTEM_RUNNING) { - break; - } - - event = (switch_event_t *) pop; - - while (event) { - - for (index = 0; index < SOFT_MAX_DISPATCH; index++) { - if (switch_queue_trypush(EVENT_DISPATCH_QUEUE[index], event) == SWITCH_STATUS_SUCCESS) { - event = NULL; - break; - } - } - - if (event) { - if (SOFT_MAX_DISPATCH + 1 < MAX_DISPATCH) { - switch_mutex_lock(EVENT_QUEUE_MUTEX); - launch_dispatch_threads(SOFT_MAX_DISPATCH + 1, DISPATCH_QUEUE_LEN, RUNTIME_POOL); - switch_mutex_unlock(EVENT_QUEUE_MUTEX); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Event Thread %d is blocking\n", my_id); - switch_queue_push(EVENT_DISPATCH_QUEUE[0], event); - event = NULL; - } + + if (launch) { + if (SOFT_MAX_DISPATCH + 1 < MAX_DISPATCH) { + launch_dispatch_threads(SOFT_MAX_DISPATCH + 1, RUNTIME_POOL); } } + + switch_mutex_unlock(EVENT_QUEUE_MUTEX); + + *eventp = NULL; + switch_queue_push(EVENT_DISPATCH_QUEUE, event); + event = NULL; + } - - switch_mutex_lock(EVENT_QUEUE_MUTEX); - THREAD_COUNT--; - switch_mutex_unlock(EVENT_QUEUE_MUTEX); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Event Thread %d Ended.\n", my_id); - return NULL; - + + return SWITCH_STATUS_SUCCESS; } - SWITCH_DECLARE(void) switch_event_deliver(switch_event_t **event) { switch_event_types_t e; @@ -499,20 +464,23 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) SYSTEM_RUNNING = 0; switch_mutex_unlock(EVENT_QUEUE_MUTEX); - for (x = 0; x < 3; x++) { - if (EVENT_QUEUE[x]) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping event queue %d\n", x); - switch_queue_trypush(EVENT_QUEUE[x], NULL); - switch_queue_interrupt_all(EVENT_QUEUE[x]); - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queues\n"); + + + for(x = 0; x < DISPATCH_THREAD_COUNT; x++) { + switch_queue_trypush(EVENT_DISPATCH_QUEUE, NULL); } - for (x = 0; x < SOFT_MAX_DISPATCH; x++) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queue %d\n", x); - switch_queue_trypush(EVENT_DISPATCH_QUEUE[x], NULL); - switch_queue_interrupt_all(EVENT_DISPATCH_QUEUE[x]); + switch_queue_interrupt_all(EVENT_DISPATCH_QUEUE); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch threads\n"); + + for(x = 0; x < DISPATCH_THREAD_COUNT; x++) { + switch_status_t st; + switch_thread_join(&st, EVENT_DISPATCH_QUEUE_THREADS[x]); } + x = 0; while (x < 10000 && THREAD_COUNT) { switch_cond_next(); if (THREAD_COUNT == last) { @@ -521,37 +489,16 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) last = THREAD_COUNT; } - for (x = 0; x < SOFT_MAX_DISPATCH; x++) { + { void *pop = NULL; switch_event_t *event = NULL; - switch_status_t st; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch thread %d\n", x); - switch_thread_join(&st, EVENT_DISPATCH_QUEUE_THREADS[x]); - - while (switch_queue_trypop(EVENT_DISPATCH_QUEUE[x], &pop) == SWITCH_STATUS_SUCCESS && pop) { + while (switch_queue_trypop(EVENT_DISPATCH_QUEUE, &pop) == SWITCH_STATUS_SUCCESS && pop) { event = (switch_event_t *) pop; switch_event_destroy(&event); } } - for (x = 0; x < NUMBER_OF_QUEUES; x++) { - void *pop = NULL; - switch_event_t *event = NULL; - switch_status_t st; - - if (EVENT_QUEUE_THREADS[x]) { - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping queue thread %d\n", x); - switch_thread_join(&st, EVENT_QUEUE_THREADS[x]); - - while (switch_queue_trypop(EVENT_QUEUE[x], &pop) == SWITCH_STATUS_SUCCESS && pop) { - event = (switch_event_t *) pop; - switch_event_destroy(&event); - } - } - } - for (hi = switch_hash_first(NULL, CUSTOM_HASH); hi; hi = switch_hash_next(hi)) { switch_event_subclass_t *subclass; switch_hash_this(hi, &var, NULL, &val); @@ -568,7 +515,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) return SWITCH_STATUS_SUCCESS; } -static void launch_dispatch_threads(uint32_t max, int len, switch_memory_pool_t *pool) +static void launch_dispatch_threads(uint32_t max, switch_memory_pool_t *pool) { switch_threadattr_t *thd_attr; uint32_t index = 0; @@ -584,14 +531,14 @@ static void launch_dispatch_threads(uint32_t max, int len, switch_memory_pool_t } for (index = SOFT_MAX_DISPATCH; index < max && index < MAX_DISPATCH; index++) { - if (EVENT_DISPATCH_QUEUE[index]) { + if (EVENT_DISPATCH_QUEUE_THREADS[index]) { continue; } - switch_queue_create(&EVENT_DISPATCH_QUEUE[index], len, pool); + switch_threadattr_create(&thd_attr, pool); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); switch_threadattr_priority_increase(thd_attr); - switch_thread_create(&EVENT_DISPATCH_QUEUE_THREADS[index], thd_attr, switch_event_dispatch_thread, EVENT_DISPATCH_QUEUE[index], pool); + switch_thread_create(&EVENT_DISPATCH_QUEUE_THREADS[index], thd_attr, switch_event_dispatch_thread, EVENT_DISPATCH_QUEUE, pool); while(--sanity && !EVENT_DISPATCH_QUEUE_RUNNING[index]) switch_yield(10000); if (index == 1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Create event dispatch thread %d\n", index); @@ -616,8 +563,10 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool) */ /* don't need any more dispatch threads than we have CPU's*/ - MAX_DISPATCH = switch_core_cpu_count() + 1; - + MAX_DISPATCH = (switch_core_cpu_count() / 2) + 1; + if (MAX_DISPATCH < 2) { + MAX_DISPATCH = 2; + } switch_assert(pool != NULL); THRUNTIME_POOL = RUNTIME_POOL = pool; @@ -648,7 +597,9 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool) //switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); //switch_threadattr_priority_increase(thd_attr); - launch_dispatch_threads(1, DISPATCH_QUEUE_LEN, RUNTIME_POOL); + switch_queue_create(&EVENT_DISPATCH_QUEUE, DISPATCH_QUEUE_LEN * MAX_DISPATCH, pool); + launch_dispatch_threads(1, RUNTIME_POOL); + //switch_thread_create(&EVENT_QUEUE_THREADS[0], thd_attr, switch_event_thread, EVENT_QUEUE[0], RUNTIME_POOL); //switch_thread_create(&EVENT_QUEUE_THREADS[1], thd_attr, switch_event_thread, EVENT_QUEUE[1], RUNTIME_POOL); //switch_thread_create(&EVENT_QUEUE_THREADS[2], thd_attr, switch_event_thread, EVENT_QUEUE[2], RUNTIME_POOL); @@ -1782,30 +1733,11 @@ SWITCH_DECLARE(switch_status_t) switch_event_fire_detailed(const char *file, con (*event)->event_user_data = user_data; } - if (!EVENT_QUEUE_THREADS[(*event)->priority] && (*event)->priority < 3) { - switch_threadattr_t *thd_attr; - - switch_queue_create(&EVENT_QUEUE[(*event)->priority], POOL_COUNT_MAX + 10, THRUNTIME_POOL); - switch_threadattr_create(&thd_attr, THRUNTIME_POOL); - switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_threadattr_priority_increase(thd_attr); - switch_thread_create(&EVENT_QUEUE_THREADS[(*event)->priority], thd_attr, switch_event_thread, EVENT_QUEUE[(*event)->priority], RUNTIME_POOL); + if (switch_event_queue_dispatch_event(event) != SWITCH_STATUS_SUCCESS) { + switch_event_destroy(event); + return SWITCH_STATUS_FALSE; } - for (;;) { - if (switch_queue_trypush(EVENT_QUEUE[(*event)->priority], *event) == SWITCH_STATUS_SUCCESS) { - goto end; - } - - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Event queue is full!\n"); - switch_yield(100000); - } - - end: - - *event = NULL; - return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_time.c b/src/switch_time.c index e7256538f3..381d2dc5ad 100644 --- a/src/switch_time.c +++ b/src/switch_time.c @@ -140,7 +140,7 @@ typedef struct timer_matrix timer_matrix_t; static timer_matrix_t TIMER_MATRIX[MAX_ELEMENTS + 1]; -static void os_yield(void) +SWITCH_DECLARE(void) switch_os_yield(void) { #if defined(WIN32) SwitchToThread(); @@ -467,7 +467,7 @@ SWITCH_DECLARE(void) switch_sleep(switch_interval_time_t t) SWITCH_DECLARE(void) switch_cond_next(void) { if (runtime.tipping_point && globals.timer_count >= runtime.tipping_point) { - os_yield(); + switch_os_yield(); return; } #ifdef DISABLE_1MS_COND @@ -633,7 +633,7 @@ static switch_status_t timer_next(switch_timer_t *timer) check_roll(); if (runtime.tipping_point && globals.timer_count >= runtime.tipping_point) { - os_yield(); + switch_os_yield(); globals.use_cond_yield = 0; } else { if (globals.use_cond_yield == 1) { @@ -884,7 +884,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime) } if (runtime.tipping_point && globals.timer_count >= runtime.tipping_point) { - os_yield(); + switch_os_yield(); } else { if (tfd > -1 && globals.RUNNING == 1) { uint64_t exp; From 23ca7f8fed32b8679564e06fccf970f92ae645f3 Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 18 May 2012 12:05:25 +0530 Subject: [PATCH 354/731] 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 355/731] 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 356/731] 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 718a311a41d2c7e93259fd3014e36a7aa4c3da13 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 May 2012 07:52:58 -0500 Subject: [PATCH 357/731] FS-4224 --resolve add optional wait param to sofia profile stop [sofia profile foo stop wait] --- src/mod/endpoints/mod_sofia/mod_sofia.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 6f64078509..8d50a221e8 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3640,6 +3640,17 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t if (!strcasecmp(argv[1], "stop")) { sofia_clear_pflag_locked(profile, PFLAG_RUNNING); + if (argv[2] && !strcasecmp(argv[2], "wait")) { + int loops = 20 * 2; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for %s to finish SIP transactions.\n", profile->name); + while (!sofia_test_pflag(profile, PFLAG_SHUTDOWN)) { + switch_yield(500000); + if (!--loops) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Timeout Waiting for %s to finish SIP transactions.\n", profile->name); + break; + } + } + } stream->write_function(stream, "stopping: %s", profile->name); } else { sofia_set_pflag_locked(profile, PFLAG_RESPAWN); @@ -4129,7 +4140,7 @@ SWITCH_STANDARD_API(sofia_function) "sofia global siptrace \n" "sofia capture \n" " watchdog \n\n" - "sofia profile [start | stop | restart | rescan]\n" + "sofia profile [start | stop | restart | rescan] [wait]\n" " flush_inbound_reg [ | <[user]@domain>] [reboot]\n" " check_sync [ | <[user]@domain>]\n" " [register | unregister] [ | all]\n" @@ -5555,9 +5566,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) switch_console_set_complete("add sofia profile"); switch_console_set_complete("add sofia profile restart all"); - + switch_console_set_complete("add sofia profile ::sofia::list_profiles start"); - switch_console_set_complete("add sofia profile ::sofia::list_profiles stop"); + switch_console_set_complete("add sofia profile ::sofia::list_profiles stop wait"); switch_console_set_complete("add sofia profile ::sofia::list_profiles rescan"); switch_console_set_complete("add sofia profile ::sofia::list_profiles restart"); From e91e4d68163368371461e9db451790667c90947b Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 18 May 2012 09:57:51 -0400 Subject: [PATCH 358/731] 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 e32b90306edcc1bee2dc5ae3847e234d1206643e Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Fri, 18 May 2012 11:08:15 -0500 Subject: [PATCH 359/731] build warnings --- src/switch_event.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/switch_event.c b/src/switch_event.c index 38ec16bf26..9a0776efd1 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -299,7 +299,7 @@ static switch_status_t switch_event_queue_dispatch_event(switch_event_t **eventp switch_mutex_lock(EVENT_QUEUE_MUTEX); - if (switch_queue_size(EVENT_DISPATCH_QUEUE) > (DISPATCH_QUEUE_LEN * DISPATCH_THREAD_COUNT)) { + if (switch_queue_size(EVENT_DISPATCH_QUEUE) > (unsigned int)(DISPATCH_QUEUE_LEN * DISPATCH_THREAD_COUNT)) { launch++; } @@ -467,7 +467,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch queues\n"); - for(x = 0; x < DISPATCH_THREAD_COUNT; x++) { + for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) { switch_queue_trypush(EVENT_DISPATCH_QUEUE, NULL); } @@ -475,7 +475,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Stopping dispatch threads\n"); - for(x = 0; x < DISPATCH_THREAD_COUNT; x++) { + for(x = 0; x < (uint32_t)DISPATCH_THREAD_COUNT; x++) { switch_status_t st; switch_thread_join(&st, EVENT_DISPATCH_QUEUE_THREADS[x]); } From bcd7a1629063889ace9e6607edd92f717f265e3a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 May 2012 10:15:08 -0500 Subject: [PATCH 360/731] indent --- src/mod/endpoints/mod_sofia/sofia_presence.c | 131 ++++++++++--------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index be360520ea..fd3a106a58 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -1257,88 +1257,89 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) switch_str_nil(status), switch_str_nil(rpid), host, dh.status,dh.rpid,dh.presence_id, mod_sofia_globals.hostname, profile->name, call_id); - } + } - helper.profile = profile; - helper.event = event; - SWITCH_STANDARD_STREAM(helper.stream); - switch_assert(helper.stream.data); + helper.profile = profile; + helper.event = event; + SWITCH_STANDARD_STREAM(helper.stream); + switch_assert(helper.stream.data); - if (mod_sofia_globals.debug_presence > 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s START_PRESENCE_SQL (%s)\n", - event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); - } - - if (mod_sofia_globals.debug_presence) { - char *buf; - switch_event_serialize(event, &buf, SWITCH_FALSE); - switch_assert(buf); - if (mod_sofia_globals.debug_presence > 1) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DUMP PRESENCE SQL:\n%s\nEVENT DUMP:\n%s\n", sql, buf); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "EVENT DUMP:\n%s\n", buf); + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s START_PRESENCE_SQL (%s)\n", + event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); } - free(buf); - } - sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_presence_sub_callback, &helper); - switch_safe_free(sql); + if (mod_sofia_globals.debug_presence) { + char *buf; + switch_event_serialize(event, &buf, SWITCH_FALSE); + switch_assert(buf); + if (mod_sofia_globals.debug_presence > 1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DUMP PRESENCE SQL:\n%s\nEVENT DUMP:\n%s\n", sql, buf); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "EVENT DUMP:\n%s\n", buf); + } + free(buf); + } + + sofia_glue_execute_sql_callback(profile, profile->ireg_mutex, sql, sofia_presence_sub_callback, &helper); + switch_safe_free(sql); - if (mod_sofia_globals.debug_presence > 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s END_PRESENCE_SQL (%s)\n", - event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); - } - - - if (hup && dh.hits < 1) { - /* so many phones get confused when whe hangup we have to reprobe to get them all to reset to absolute states so the lights stay correct */ - switch_event_t *s_event; - - if (switch_event_create(&s_event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); - switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "login", profile->name); - switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "from", "%s@%s", euser, host); - switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "to", "%s@%s", euser, host); - switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "event_type", "presence"); - switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); - switch_event_fire(&s_event); + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s END_PRESENCE_SQL (%s)\n", + event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); + } + + + if (hup && dh.hits < 1) { + /* so many phones get confused when whe hangup we have to reprobe to get them all to reset to absolute states so the lights stay correct */ + switch_event_t *s_event; + + if (switch_event_create(&s_event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "login", profile->name); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "from", "%s@%s", euser, host); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "to", "%s@%s", euser, host); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "event_type", "presence"); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "alt_event_type", "dialog"); + switch_event_fire(&s_event); + } } - } - if (!zstr((char *) helper.stream.data)) { - char *this_sql = (char *) helper.stream.data; - char *next = NULL; - char *last = NULL; + if (!zstr((char *) helper.stream.data)) { + char *this_sql = (char *) helper.stream.data; + char *next = NULL; + char *last = NULL; - do { - if ((next = strchr(this_sql, ';'))) { - *next++ = '\0'; - while (*next == '\n' || *next == ' ' || *next == '\r') { + do { + if ((next = strchr(this_sql, ';'))) { *next++ = '\0'; + while (*next == '\n' || *next == ' ' || *next == '\r') { + *next++ = '\0'; + } } - } - if (!zstr(this_sql) && (!last || strcmp(last, this_sql))) { - sofia_glue_execute_sql(profile, &this_sql, SWITCH_FALSE); - last = this_sql; - } - this_sql = next; - } while (this_sql); - } - switch_safe_free(helper.stream.data); - helper.stream.data = NULL; + if (!zstr(this_sql) && (!last || strcmp(last, this_sql))) { + sofia_glue_execute_sql(profile, &this_sql, SWITCH_FALSE); + last = this_sql; + } + this_sql = next; + } while (this_sql); + } + switch_safe_free(helper.stream.data); + helper.stream.data = NULL; - sofia_glue_release_profile(profile); + sofia_glue_release_profile(profile); + } } + switch_console_free_matches(&matches); } - switch_console_free_matches(&matches); -} -done: -switch_safe_free(sql); -switch_safe_free(user); + done: + + switch_safe_free(sql); + switch_safe_free(user); } static int EVENT_THREAD_RUNNING = 0; From b3b2c3752636f67fd5f2da53a199567a4da0b2e7 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 May 2012 13:41:16 -0500 Subject: [PATCH 361/731] FS-3983 --resolve --- src/mod/endpoints/mod_sofia/sofia_presence.c | 39 +++++++++++--------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index fd3a106a58..800ba66cd2 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -90,6 +90,9 @@ struct presence_helper { switch_event_t *event; switch_stream_handle_t stream; char last_uuid[512]; + int hup; + int calls_up; + }; switch_status_t sofia_presence_chat_send(switch_event_t *message_event) @@ -1170,11 +1173,6 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) #endif - if (hup && dh.hits > 0) { - goto done; - } - - if (zstr(call_id) && (dh.hits && presence_source && (!strcasecmp(presence_source, "register") || switch_stristr("register", status)))) { goto done; } @@ -1259,7 +1257,8 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) } - + helper.hup = hup; + helper.calls_up = dh.hits; helper.profile = profile; helper.event = event; SWITCH_STANDARD_STREAM(helper.stream); @@ -2437,6 +2436,10 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * is_dialog = !strcmp(event, "dialog"); + if (helper->hup && helper->calls_up > 0 && (!is_dialog || !user_agent || !switch_stristr("polycom", user_agent) || !switch_stristr("snom", user_agent))) { + goto end; + } + if (helper->event) { switch_stream_handle_t stream = { 0 }; const char *direction = switch_str_nil(switch_event_get_header(helper->event, "presence-call-direction")); @@ -2456,6 +2459,7 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * int force_status = 0; const char *call_state = switch_event_get_header(helper->event, "channel-state"); char *call_info_state = switch_event_get_header(helper->event, "presence-call-info-state"); + int term = 0; if (user_agent && switch_stristr("snom", user_agent) && uuid) { default_dialog = "full" ; @@ -2463,18 +2467,21 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * if (call_state && !strcasecmp(call_state, "cs_hangup")) { astate = "hangup"; - } + holding = 0; + term = 1; + } else { - if (event_status && !strncasecmp(event_status, "hold", 4)) { - holding = 1; - } + if (event_status && !strncasecmp(event_status, "hold", 4)) { + holding = 1; + } - if (force_event_status && !event_status) { - event_status = force_event_status; - } + if (force_event_status && !event_status) { + event_status = force_event_status; + } - if (event_status && !strncasecmp(event_status, "hold", 4)) { - holding = 1; + if (event_status && !strncasecmp(event_status, "hold", 4)) { + holding = 1; + } } if (!strcasecmp(direction, "inbound")) { @@ -2701,8 +2708,6 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * open = "open"; if (switch_false(resub)) { - int term; - const char *direction = switch_event_get_header(helper->event, "Caller-Direction"); const char *op, *what = "Ring"; From e120f4b3594df680b63baabc9f70cefe47b20eb1 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Mon, 21 May 2012 09:58:02 -0500 Subject: [PATCH 362/731] --resolve FS-4234 --- build/freeswitch.init.suse | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/build/freeswitch.init.suse b/build/freeswitch.init.suse index 2859ddc501..29f832d86a 100644 --- a/build/freeswitch.init.suse +++ b/build/freeswitch.init.suse @@ -46,12 +46,7 @@ # Voice Platform ### END INIT INFO # -# Check for missing binaries (stale symlinks should not happen) -# Note: Special treatment of stop for LSB conformance FREESWITCH_BIN=/opt/freeswitch/bin/freeswitch -test -x $FREESWITCH_BIN || { echo "$FREESWITCH_BIN not installed"; - if [ "$1" = "stop" ]; then exit 0; - else exit 5; fi; } # Check for existence of needed config file and read it FREESWITCH_CONFIG=/etc/sysconfig/freeswitch @@ -62,6 +57,12 @@ test -r $FREESWITCH_CONFIG || { echo "$FREESWITCH_CONFIG not existing"; # Read config . $FREESWITCH_CONFIG +# Check for missing binaries (stale symlinks should not happen) +# Note: Special treatment of stop for LSB conformance +test -x $FREESWITCH_BIN || { echo "$FREESWITCH_BIN not installed"; + if [ "$1" = "stop" ]; then exit 0; + else exit 5; fi; } + # Source LSB init functions # providing start_daemon, killproc, pidofproc, # log_success_msg, log_failure_msg and log_warning_msg. @@ -202,7 +203,7 @@ case "$1" in ## argument to this init script which is required for a reload. ## Note: probe is not (yet) part of LSB (as of 1.9) - test /opt/freeswitch/conf/freeswitch.xml -nt /opt/freeswitch/run/freeswitch.pid && echo reload + test ${FREESWITCH_HOME}/conf/freeswitch.xml -nt ${FREESWITCH_HOME}/run/freeswitch.pid && echo reload ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" From 34df90196c9746b345ab20725739630d1ddbd139 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Mon, 21 May 2012 15:47:30 -0400 Subject: [PATCH 363/731] bail out on make mod_modname when core build dies --- Makefile.am | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index c3f3a2fc28..db22184f5d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,11 +20,18 @@ DEFAULT_SOUNDS=en-us-callie-8000 sounds_version=`grep $$base_sound_dir $(switch_srcdir)/build/sounds_version.txt | cut -d ' ' -f2`;\ soundfile=`echo freeswitch-sounds-$$full_sound_dir-$$moh_version.tar.gz`; \ echo $$full_sound_dir | grep music >/dev/null || soundfile=`echo freeswitch-sounds-$$full_sound_dir-$$sounds_version.tar.gz`; \ - if test "$$target" = "install"; then $(MAKE) $(AM_MAKEFLAGS) core_install; else $(MAKE) $(AM_MAKEFLAGS) core ; fi; \ if test "$$target_prefix" = "sounds"; then \ - if test "$$target" = "install"; then $(GETSOUNDS) $$soundfile $(DESTDIR)$(soundsdir)/; else $(GETSOUNDS) $$soundfile ; fi; \ + if test "$$target" = "install"; then \ + $(GETSOUNDS) $$soundfile $(DESTDIR)$(soundsdir)/;\ + else \ + $(GETSOUNDS) $$soundfile ; \ + fi; \ else \ - cd src/mod && $(MAKE) $(AM_MAKEFLAGS) $@ ;\ + if test "$$target" = "install"; then \ + $(MAKE) $(AM_MAKEFLAGS) core_install && cd src/mod && $(MAKE) $(AM_MAKEFLAGS) $@ ; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) core && cd src/mod && $(MAKE) $(AM_MAKEFLAGS) $@ ;\ + fi; \ fi sounds: sounds-en-us-callie-8000 From 792b004f36d209185ef726dd2882c18bf295f523 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 21 May 2012 13:55:50 -0500 Subject: [PATCH 364/731] add mwi-use-reg-callid --- src/mod/endpoints/mod_sofia/mod_sofia.h | 3 ++- src/mod/endpoints/mod_sofia/sofia.c | 14 +++++++++++++- src/mod/endpoints/mod_sofia/sofia_glue.c | 3 ++- src/mod/endpoints/mod_sofia/sofia_presence.c | 11 ++++++++--- src/mod/endpoints/mod_sofia/sofia_reg.c | 2 +- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index c0fc7dfba4..abbd1c226a 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -267,6 +267,7 @@ typedef enum { PFLAG_PRESENCE_DISABLE_EARLY, PFLAG_CONFIRM_BLIND_TRANSFER, PFLAG_THREAD_PER_REG, + PFLAG_MWI_USE_REG_CALLID, /* No new flags below this line */ PFLAG_MAX } PFLAGS; @@ -1139,7 +1140,7 @@ void sofia_glue_get_addr(msg_t *msg, char *buf, size_t buflen, int *port); sofia_destination_t *sofia_glue_get_destination(char *data); void sofia_glue_free_destination(sofia_destination_t *dst); switch_status_t sofia_glue_send_notify(sofia_profile_t *profile, const char *user, const char *host, const char *event, const char *contenttype, - const char *body, const char *o_contact, const char *network_ip); + const char *body, const char *o_contact, const char *network_ip, const char *call_id); char *sofia_glue_get_extra_headers(switch_channel_t *channel, const char *prefix); void sofia_glue_set_extra_headers(switch_core_session_t *session, sip_t const *sip, const char *prefix); char *sofia_glue_get_extra_headers_from_event(switch_event_t *event, const char *prefix); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 8eb122b310..549c8cd246 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1415,7 +1415,7 @@ void sofia_msg_thread_start(int idx) mod_sofia_globals.msg_queue_len = idx + 1; if (!mod_sofia_globals.msg_queue) { - switch_queue_create(&mod_sofia_globals.msg_queue, SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.cpu_count, mod_sofia_globals.pool); + switch_queue_create(&mod_sofia_globals.msg_queue, SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues, mod_sofia_globals.pool); } @@ -3195,6 +3195,12 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile) } else { sofia_clear_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); } + } else if (!strcasecmp(var, "mwi-use-reg-callid")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_MWI_USE_REG_CALLID); + } else { + sofia_clear_pflag(profile, PFLAG_MWI_USE_REG_CALLID); + } } else if (!strcasecmp(var, "presence-proto-lookup")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_PRESENCE_MAP); @@ -3994,6 +4000,12 @@ switch_status_t config_sofia(int reload, char *profile_name) } else { sofia_clear_pflag(profile, PFLAG_CONFIRM_BLIND_TRANSFER); } + } else if (!strcasecmp(var, "mwi-use-reg-callid")) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_MWI_USE_REG_CALLID); + } else { + sofia_clear_pflag(profile, PFLAG_MWI_USE_REG_CALLID); + } } else if (!strcasecmp(var, "presence-proto-lookup")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_PRESENCE_MAP); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 2039116b41..85799d6c8a 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -6643,7 +6643,7 @@ void sofia_glue_free_destination(sofia_destination_t *dst) } switch_status_t sofia_glue_send_notify(sofia_profile_t *profile, const char *user, const char *host, const char *event, const char *contenttype, - const char *body, const char *o_contact, const char *network_ip) + const char *body, const char *o_contact, const char *network_ip, const char *call_id) { char *id = NULL; nua_handle_t *nh; @@ -6706,6 +6706,7 @@ switch_status_t sofia_glue_send_notify(sofia_profile_t *profile, const char *use TAG_IF(user_via, SIPTAG_VIA_STR(user_via)), SIPTAG_SUBSCRIPTION_STATE_STR("terminated;reason=noresource"), TAG_IF(event, SIPTAG_EVENT_STR(event)), + TAG_IF(call_id, SIPTAG_CALL_ID_STR(call_id)), TAG_IF(contenttype, SIPTAG_CONTENT_TYPE_STR(contenttype)), TAG_IF(body, SIPTAG_PAYLOAD_STR(body)), TAG_END()); switch_safe_free(contact); diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 800ba66cd2..23ae017531 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -558,11 +558,11 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) } if (for_everyone) { - sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q' " + sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q',call_id " "from sip_registrations where hostname='%q' and profile_name='%q' and mwi_user='%q' and mwi_host='%q'", stream.data, mod_sofia_globals.hostname, profile->name, user, host); } else if (call_id) { - sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q' " + sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q',call_id " "from sip_registrations where hostname='%q' and profile_name='%q' and call_id='%q'", stream.data, mod_sofia_globals.hostname, profile->name, call_id); } @@ -2914,6 +2914,7 @@ static int sofia_presence_mwi_callback2(void *pArg, int argc, char **argv, char const char *body = argv[5]; const char *o_contact = argv[2]; const char *network_ip = argv[4]; + const char *call_id = argv[6]; char *profile_name = argv[3]; struct mwi_helper *h = (struct mwi_helper *) pArg; @@ -2925,7 +2926,11 @@ static int sofia_presence_mwi_callback2(void *pArg, int argc, char **argv, char } } - sofia_glue_send_notify(profile, user, host, event, contenttype, body, o_contact, network_ip); + if (!sofia_test_pflag(profile, PFLAG_MWI_USE_REG_CALLID)) { + call_id = NULL; + } + + sofia_glue_send_notify(profile, user, host, event, contenttype, body, o_contact, network_ip, call_id); if (ext_profile) { sofia_glue_release_profile(ext_profile); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index c5fb57bb4d..a7a384ebe2 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -587,7 +587,7 @@ void sofia_reg_send_reboot(sofia_profile_t *profile, const char *user, const cha event = "reboot"; } - sofia_glue_send_notify(profile, user, host, event, contenttype, body, contact, network_ip); + sofia_glue_send_notify(profile, user, host, event, contenttype, body, contact, network_ip, NULL); } int sofia_sla_dialog_del_callback(void *pArg, int argc, char **argv, char **columnNames) From 10617b6153619a008604c575076d3fb672d0b5c2 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 22 May 2012 00:23:47 -0400 Subject: [PATCH 365/731] .gitignore --- .gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index f31e630473..cbeaaa463e 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,23 @@ 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 +libs/apr-util/a.out.dSYM/Contents/Info.plist +libs/apr-util/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/apr/a.out.dSYM/Contents/Info.plist +libs/apr/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/iksemel/a.out.dSYM/Contents/Info.plist +libs/iksemel/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/ilbc/a.out.dSYM/Contents/Info.plist +libs/ilbc/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/libedit/a.out.dSYM/Contents/Info.plist +libs/libedit/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/pcre/a.out.dSYM/Contents/Info.plist +libs/pcre/a.out.dSYM/Contents/Resources/DWARF/a.out +libs/sqlite/lemon.dSYM/Contents/Info.plist +libs/sqlite/lemon.dSYM/Contents/Resources/DWARF/lemon +libs/sqlite/mkkeywordhash.dSYM/Contents/Info.plist +libs/sqlite/mkkeywordhash.dSYM/Contents/Resources/DWARF/mkkeywordhash +libs/sqlite/sqlite3.dSYM/Contents/Info.plist +libs/sqlite/sqlite3.dSYM/Contents/Resources/DWARF/sqlite3 +libs/srtp/a.out.dSYM/Contents/Info.plist +libs/srtp/a.out.dSYM/Contents/Resources/DWARF/a.out From a672c99a57952559a02fe5ca245955d6069b269c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 May 2012 07:59:16 -0500 Subject: [PATCH 366/731] FS-4224 --resolve this was a regression from d6374535 to fix FS-3029, when you find a profile you must release it --- src/mod/endpoints/mod_sofia/sofia_glue.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 85799d6c8a..0adcce9606 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -5858,6 +5858,7 @@ int sofia_glue_recover(switch_bool_t flush) for (m = matches->head; m; m = m->next) { if ((profile = sofia_glue_find_profile(m->val))) { r += sofia_glue_profile_recover(profile, flush); + sofia_glue_release_profile(profile); } } switch_console_free_matches(&matches); From 059ef54feb61393479225c9ebfd09dd75f6dfde9 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Tue, 22 May 2012 10:21:14 -0500 Subject: [PATCH 367/731] FS-4243 zrtp addition to vs2010 express try this and verify edited by hand --- Freeswitch.2010.express.sln | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Freeswitch.2010.express.sln b/Freeswitch.2010.express.sln index b0df7d9c35..baea4a0c35 100644 --- a/Freeswitch.2010.express.sln +++ b/Freeswitch.2010.express.sln @@ -320,6 +320,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ldns", "libs\win32\ldns\ldn EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpcre Generate pcre_chartables.c", "libs\win32\pcre\pcre_chartables.c.2010.vcxproj", "{1CED5987-A529-46DC-B30F-870D85FF9C94}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2010.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -1989,6 +1991,17 @@ Global {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.ActiveCfg = Release|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.Build.0 = Release|Win32 {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x64.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|Win32.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.All|x64.Build.0 = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|Win32.Build.0 = Debug|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.ActiveCfg = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Debug|x64.Build.0 = Debug|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.ActiveCfg = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|Win32.Build.0 = Release|Win32 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.ActiveCfg = Release|x64 + {C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2089,6 +2102,7 @@ Global {ABB71A76-42B0-47A4-973A-42E3D920C6FD} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {9778F1C0-09BC-4698-8EBC-BD982247209A} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} + {C13CC324-0032-4492-9A30-310A6BD64FF5} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {EC3E5C7F-EE09-47E2-80FE-546363D14A98} = {B8F5B47B-8568-46EB-B320-64C17D2A98BC} {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {0C808854-54D1-4230-BFF5-77B5FD905000} {ACFFF684-4D19-4D48-AF12-88EA1D778BDF} = {0C808854-54D1-4230-BFF5-77B5FD905000} From fb790bc32067e3b83601c63f7987129c7112b4a7 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 22 May 2012 10:27:18 -0500 Subject: [PATCH 368/731] block any inbound messages when queue is full; add debounce for mwi and pres on register; fix missing detach attr on new mode to process reg in new thread --- src/mod/endpoints/mod_sofia/mod_sofia.c | 18 ++++++------ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 38 +++++++++++++------------ src/mod/endpoints/mod_sofia/sofia_reg.c | 37 ++++++++++++++++++++---- 4 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 8d50a221e8..ebd009a16d 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -5447,14 +5447,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) switch_queue_create(&mod_sofia_globals.presence_queue, SOFIA_QUEUE_SIZE, mod_sofia_globals.pool); switch_queue_create(&mod_sofia_globals.mwi_queue, SOFIA_QUEUE_SIZE, mod_sofia_globals.pool); - if (config_sofia(0, NULL) != SWITCH_STATUS_SUCCESS) { - mod_sofia_globals.running = 0; - return SWITCH_STATUS_GENERR; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for profiles to start\n"); - switch_yield(1500000); - mod_sofia_globals.cpu_count = switch_core_cpu_count(); mod_sofia_globals.max_msg_queues = (mod_sofia_globals.cpu_count / 2) + 1; if (mod_sofia_globals.max_msg_queues < 2) { @@ -5465,10 +5457,20 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load) mod_sofia_globals.max_msg_queues = SOFIA_MAX_MSG_QUEUE; } + switch_queue_create(&mod_sofia_globals.msg_queue, SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues, mod_sofia_globals.pool); + /* start one message thread */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Starting initial message thread.\n"); sofia_msg_thread_start(0); + if (config_sofia(0, NULL) != SWITCH_STATUS_SUCCESS) { + mod_sofia_globals.running = 0; + return SWITCH_STATUS_GENERR; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for profiles to start\n"); + switch_yield(1500000); + if (switch_event_bind_removable(modname, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT, event_handler, NULL, &mod_sofia_globals.custom_node) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n"); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index abbd1c226a..5902cdad93 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -613,6 +613,7 @@ struct sofia_profile { sofia_gateway_t *gateways; //su_home_t *home; switch_hash_t *chat_hash; + switch_hash_t *mwi_debounce_hash; //switch_core_db_t *master_db; switch_thread_rwlock_t *rwlock; switch_mutex_t *flag_mutex; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 549c8cd246..8a1409bb27 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1307,6 +1307,7 @@ void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) switch_memory_pool_t *pool; switch_thread_t *thread; sofia_profile_t *profile = (*dep)->profile; + switch_status_t status; switch_core_new_memory_pool(&pool); @@ -1316,14 +1317,19 @@ void sofia_process_dispatch_event_in_thread(sofia_dispatch_event_t **dep) switch_mutex_lock(profile->ireg_mutex); switch_threadattr_create(&thd_attr, de->pool); + switch_threadattr_detach_set(thd_attr, 1); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_thread_create(&thread, - thd_attr, - sofia_msg_thread_run_once, - de, - de->pool); + status = switch_thread_create(&thread, + thd_attr, + sofia_msg_thread_run_once, + de, + de->pool); switch_mutex_unlock(profile->ireg_mutex); - + + if (status != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot create threads!\n"); + sofia_process_dispatch_event(&de); + } } void sofia_process_dispatch_event(sofia_dispatch_event_t **dep) @@ -1414,11 +1420,6 @@ void sofia_msg_thread_start(int idx) int i; mod_sofia_globals.msg_queue_len = idx + 1; - if (!mod_sofia_globals.msg_queue) { - switch_queue_create(&mod_sofia_globals.msg_queue, SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues, mod_sofia_globals.pool); - } - - for (i = 0; i < mod_sofia_globals.msg_queue_len; i++) { if (!mod_sofia_globals.msg_queue_thread[i]) { switch_threadattr_t *thd_attr = NULL; @@ -1477,8 +1478,14 @@ void sofia_event_callback(nua_event_t event, tagi_t tags[]) { sofia_dispatch_event_t *de; + int critical = (((SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues) * 900) / 1000); + if (switch_queue_size(mod_sofia_globals.msg_queue) > critical) { + nua_respond(nh, 503, "System Busy", SIPTAG_RETRY_AFTER_STR("300"), TAG_END()); + return; + } + if (sofia_test_pflag(profile, PFLAG_STANDBY)) { if (event < nua_r_set_params || event > nua_r_authenticate) { nua_respond(nh, 503, "System Paused", TAG_END()); @@ -1502,13 +1509,6 @@ void sofia_event_callback(nua_event_t event, de->nua = nua_stack_ref(nua); if (event == nua_i_invite && !sofia_private) { - int critical = (((SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues) * 900) / 1000); - - if (switch_queue_size(mod_sofia_globals.msg_queue) > critical) { - nua_respond(nh, 503, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), TAG_END()); - return; - } - if (!(sofia_private = su_alloc(nh->nh_home, sizeof(*sofia_private)))) { abort(); } @@ -2307,6 +2307,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void sofia_glue_del_profile(profile); switch_core_hash_destroy(&profile->chat_hash); + switch_core_hash_destroy(&profile->mwi_debounce_hash); switch_thread_rwlock_unlock(profile->rwlock); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write unlock %s\n", profile->name); @@ -3910,6 +3911,7 @@ switch_status_t config_sofia(int reload, char *profile_name) profile->dbname = switch_core_strdup(profile->pool, url); switch_core_hash_init(&profile->chat_hash, profile->pool); + switch_core_hash_init(&profile->mwi_debounce_hash, profile->pool); switch_thread_rwlock_create(&profile->rwlock, profile->pool); switch_mutex_init(&profile->flag_mutex, SWITCH_MUTEX_NESTED, profile->pool); profile->dtmf_duration = 100; diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index a7a384ebe2..e358c8f228 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -993,6 +993,30 @@ uint32_t sofia_reg_reg_count(sofia_profile_t *profile, const char *user, const c return atoi(buf); } +static int debounce_check(sofia_profile_t *profile, const char *user, const char *host) +{ + char key[512] = ""; + int r = 0; + time_t *last, now = switch_epoch_time_now(NULL); + + snprintf(key, sizeof(key), "%s%s", user, host); + + if ((last = switch_core_hash_find(profile->mwi_debounce_hash, key))) { + if (now - *last > 30) { + *last = now; + r = 1; + } + } else { + last = switch_core_alloc(profile->pool, sizeof(*last)); + *last = now; + switch_core_hash_insert(profile->mwi_debounce_hash, key, last); + r = 1; + } + + return r; +} + + uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sip_t const *sip, sofia_dispatch_event_t *de, sofia_regtype_t regtype, char *key, uint32_t keylen, switch_event_t **v_event, const char *is_nat) @@ -1668,11 +1692,14 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand if (contact) { if (exptime) { + int debounce_ok = debounce_check(profile, mwi_user, mwi_host); + switch_snprintf(exp_param, sizeof(exp_param), "expires=%ld", exptime); sip_contact_add_param(nua_handle_home(nh), sip->sip_contact, exp_param); - - if (sofia_test_pflag(profile, PFLAG_MESSAGE_QUERY_ON_REGISTER) || - (reg_count == 1 && sofia_test_pflag(profile, PFLAG_MESSAGE_QUERY_ON_FIRST_REGISTER))) { + + if ((sofia_test_pflag(profile, PFLAG_MESSAGE_QUERY_ON_REGISTER) || + (reg_count == 1 && sofia_test_pflag(profile, PFLAG_MESSAGE_QUERY_ON_FIRST_REGISTER))) && debounce_ok) { + if (switch_event_create(&s_mwi_event, SWITCH_EVENT_MESSAGE_QUERY) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(s_mwi_event, SWITCH_STACK_BOTTOM, "Message-Account", "sip:%s@%s", mwi_user, mwi_host); switch_event_add_header_string(s_mwi_event, SWITCH_STACK_BOTTOM, "VM-Sofia-Profile", profile->name); @@ -1680,9 +1707,9 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand } } - if (sofia_test_pflag(profile, PFLAG_PRESENCE_ON_REGISTER) || + if ((sofia_test_pflag(profile, PFLAG_PRESENCE_ON_REGISTER) || (reg_count == 1 && sofia_test_pflag(profile, PFLAG_PRESENCE_ON_FIRST_REGISTER)) - || send_pres == 1 || (reg_count == 1 && send_pres == 2)) { + || send_pres == 1 || (reg_count == 1 && send_pres == 2)) && debounce_ok) { if (sofia_test_pflag(profile, PFLAG_PRESENCE_PROBE_ON_REGISTER)) { if (switch_event_create(&s_event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { From a5cd951c532639e371f0b5a3c9f08a8ca6d5a996 Mon Sep 17 00:00:00 2001 From: Mathieu Rene Date: Tue, 22 May 2012 14:00:39 -0400 Subject: [PATCH 369/731] Update the outgoing channel handler so it passes the "var_event" event down towards rtmp_send_incoming_call since variables passed using originate are not yet in the session before the outgoing channel function returns. --- src/mod/endpoints/mod_rtmp/mod_rtmp.c | 2 +- src/mod/endpoints/mod_rtmp/mod_rtmp.h | 2 +- src/mod/endpoints/mod_rtmp/rtmp.c | 27 +++++++++++++++++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_rtmp/mod_rtmp.c b/src/mod/endpoints/mod_rtmp/mod_rtmp.c index 5247074762..6b5bc862c9 100644 --- a/src/mod/endpoints/mod_rtmp/mod_rtmp.c +++ b/src/mod/endpoints/mod_rtmp/mod_rtmp.c @@ -625,7 +625,7 @@ switch_call_cause_t rtmp_outgoing_channel(switch_core_session_t *session, switch /*switch_channel_mark_pre_answered(channel);*/ switch_channel_ring_ready(channel); - rtmp_send_incoming_call(*newsession); + rtmp_send_incoming_call(*newsession, var_event); switch_channel_set_state(channel, CS_INIT); switch_set_flag_locked(tech_pvt, TFLAG_IO); diff --git a/src/mod/endpoints/mod_rtmp/mod_rtmp.h b/src/mod/endpoints/mod_rtmp/mod_rtmp.h index 388afeacb5..6109c8544e 100644 --- a/src/mod/endpoints/mod_rtmp/mod_rtmp.h +++ b/src/mod/endpoints/mod_rtmp/mod_rtmp.h @@ -616,7 +616,7 @@ switch_status_t rtmp_send_message(rtmp_session_t *rsession, uint8_t amfnumber, u void rtmp_send_event(rtmp_session_t *rsession, switch_event_t *event); void rtmp_notify_call_state(switch_core_session_t *session); void rtmp_send_display_update(switch_core_session_t *session); -void rtmp_send_incoming_call(switch_core_session_t *session); +void rtmp_send_incoming_call(switch_core_session_t *session, switch_event_t *var_event); void rtmp_send_onhangup(switch_core_session_t *session); void rtmp_add_registration(rtmp_session_t *rsession, const char *auth, const char *nickname); void rtmp_clear_registration(rtmp_session_t *rsession, const char *auth, const char *nickname); diff --git a/src/mod/endpoints/mod_rtmp/rtmp.c b/src/mod/endpoints/mod_rtmp/rtmp.c index f28f518383..a5224719e6 100644 --- a/src/mod/endpoints/mod_rtmp/rtmp.c +++ b/src/mod/endpoints/mod_rtmp/rtmp.c @@ -357,6 +357,25 @@ void rtmp_get_user_variables(switch_event_t **event, switch_core_session_t *sess } } + +void rtmp_get_user_variables_event(switch_event_t **event, switch_event_t *var_event) +{ + switch_event_header_t *he; + + if (!*event && switch_event_create(event, SWITCH_EVENT_CLONE) != SWITCH_STATUS_SUCCESS) { + return; + } + + if ((he = var_event->headers)) { + for (; he; he = he->next) { + if (!strncmp(he->name, RTMP_USER_VARIABLE_PREFIX, strlen(RTMP_USER_VARIABLE_PREFIX))) { + switch_event_add_header_string(*event, SWITCH_STACK_BOTTOM, he->name, he->value); + } + } + } +} + + void rtmp_session_send_onattach(rtmp_session_t *rsession) { const char *uuid = ""; @@ -386,7 +405,7 @@ void rtmp_send_display_update(switch_core_session_t *session) amf0_str(switch_str_nil(tech_pvt->display_callee_id_number)), NULL); } -void rtmp_send_incoming_call(switch_core_session_t *session) +void rtmp_send_incoming_call(switch_core_session_t *session, switch_event_t *var_event) { rtmp_private_t *tech_pvt = switch_core_session_get_private(session); switch_channel_t *channel = switch_core_session_get_channel(session); @@ -394,7 +413,11 @@ void rtmp_send_incoming_call(switch_core_session_t *session) switch_event_t *event = NULL; amf0_data *obj = NULL; - rtmp_get_user_variables(&event, session); + if (var_event) { + rtmp_get_user_variables_event(&event, var_event); + } else { + rtmp_get_user_variables(&event, session); + } if (event) { amf_event_to_object(&obj, event); From bb3f72cb666803c99f38b5f0f176b4757b55cf41 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 May 2012 09:37:54 -0500 Subject: [PATCH 370/731] add perl wrapper to scgi --- libs/libscgi/FSSCGI.i | 6 + libs/libscgi/Makefile | 26 +- libs/libscgi/perl/FSSCGI.pm | 103 + libs/libscgi/perl/Makefile | 38 + libs/libscgi/perl/esl_wrap.cpp | 4149 +++++++++++++++++++++++++++ libs/libscgi/perl/perlxsi.c | 16 + libs/libscgi/perl/scgi_wrap.cpp | 2459 ++++++++++++++++ libs/libscgi/src/include/scgi.h | 4 +- libs/libscgi/src/include/scgi_oop.h | 72 + libs/libscgi/src/scgi.c | 74 +- libs/libscgi/src/scgi_oop.cpp | 101 + libs/libscgi/testserver.c | 7 +- 12 files changed, 7025 insertions(+), 30 deletions(-) create mode 100644 libs/libscgi/FSSCGI.i create mode 100644 libs/libscgi/perl/FSSCGI.pm create mode 100644 libs/libscgi/perl/Makefile create mode 100644 libs/libscgi/perl/esl_wrap.cpp create mode 100644 libs/libscgi/perl/perlxsi.c create mode 100644 libs/libscgi/perl/scgi_wrap.cpp create mode 100644 libs/libscgi/src/include/scgi_oop.h create mode 100644 libs/libscgi/src/scgi_oop.cpp diff --git a/libs/libscgi/FSSCGI.i b/libs/libscgi/FSSCGI.i new file mode 100644 index 0000000000..186cef6244 --- /dev/null +++ b/libs/libscgi/FSSCGI.i @@ -0,0 +1,6 @@ +%{ +#include "scgi.h" +#include "scgi_oop.h" +%} + +%include "scgi_oop.h" diff --git a/libs/libscgi/Makefile b/libs/libscgi/Makefile index 88b5b4e73c..265834ae69 100644 --- a/libs/libscgi/Makefile +++ b/libs/libscgi/Makefile @@ -8,11 +8,13 @@ CXXFLAGS=$(BASE_FLAGS) MYLIB=libscgi.a LIBS= LDFLAGS=-L. -OBJS=src/scgi.o -SRC=src/scgi.c -HEADERS=src/include/scgi.h +OBJS=src/scgi.o +SRC=src/scgi.c src/scgi_oop.cpp +HEADERS=src/include/scgi.h src/include/scgi_oop.h SOLINK=-shared -Xlinker -x +# comment the next line to disable c++ (no swig mods for you then) +OBJS += src/scgi_oop.o all: $(MYLIB) testclient testserver @@ -23,13 +25,27 @@ $(MYLIB): $(OBJS) $(HEADERS) $(SRC) %.o: %.c $(HEADERS) $(CC) $(CC_CFLAGS) $(CFLAGS) -c $< -o $@ +%.o: %.cpp $(HEADERS) + $(CXX) $(CXX_CFLAGS) $(CXXFLAGS) -c $< -o $@ + testclient: $(MYLIB) testclient.c $(CC) $(CC_CFLAGS) $(CFLAGS) testclient.c -o testclient -lscgi $(LDFLAGS) $(LIBS) testserver: $(MYLIB) testserver.c $(CC) $(CC_CFLAGS) $(CFLAGS) testserver.c -o testserver -lscgi $(LDFLAGS) $(LIBS) - - clean: rm -f *.o src/*.o libscgi.a *~ src/*~ src/include/*~ testclient testserver + $(MAKE) -C perl clean + +reswig: swigclean + $(MAKE) -C perl reswig + +swigclean: clean + $(MAKE) -C perl swigclean + +perlmod: $(MYLIB) + $(MAKE) MYLIB="../$(MYLIB)" SOLINK="$(SOLINK)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CXX_CFLAGS="$(CXX_CFLAGS)" -C perl + +perlmod-install: perlmod + $(MAKE) -C perl install diff --git a/libs/libscgi/perl/FSSCGI.pm b/libs/libscgi/perl/FSSCGI.pm new file mode 100644 index 0000000000..7dfd256e05 --- /dev/null +++ b/libs/libscgi/perl/FSSCGI.pm @@ -0,0 +1,103 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 1.3.35 +# +# Don't modify this file, modify the SWIG interface instead. + +package FSSCGI; +require Exporter; +require DynaLoader; +@ISA = qw(Exporter DynaLoader); +package FSSCGIc; +bootstrap FSSCGI; +package FSSCGI; +@EXPORT = qw( ); + +# ---------- BASE METHODS ------------- + +package FSSCGI; + +sub TIEHASH { + my ($classname,$obj) = @_; + return bless $obj, $classname; +} + +sub CLEAR { } + +sub FIRSTKEY { } + +sub NEXTKEY { } + +sub FETCH { + my ($self,$field) = @_; + my $member_func = "swig_${field}_get"; + $self->$member_func(); +} + +sub STORE { + my ($self,$field,$newval) = @_; + my $member_func = "swig_${field}_set"; + $self->$member_func($newval); +} + +sub this { + my $ptr = shift; + return tied(%$ptr); +} + + +# ------- FUNCTION WRAPPERS -------- + +package FSSCGI; + + +############# Class : FSSCGI::SCGIhandle ############## + +package FSSCGI::SCGIhandle; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( FSSCGI ); +%OWNER = (); +%ITERATORS = (); +sub new { + my $pkg = shift; + my $self = FSSCGIc::new_SCGIhandle(@_); + bless $self, $pkg if defined($self); +} + +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + FSSCGIc::delete_SCGIhandle($self); + delete $OWNER{$self}; + } +} + +*connected = *FSSCGIc::SCGIhandle_connected; +*socketDescriptor = *FSSCGIc::SCGIhandle_socketDescriptor; +*disconnect = *FSSCGIc::SCGIhandle_disconnect; +*addParam = *FSSCGIc::SCGIhandle_addParam; +*addBody = *FSSCGIc::SCGIhandle_addBody; +*sendRequest = *FSSCGIc::SCGIhandle_sendRequest; +*recv = *FSSCGIc::SCGIhandle_recv; +*bind = *FSSCGIc::SCGIhandle_bind; +*accept = *FSSCGIc::SCGIhandle_accept; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +# ------- VARIABLE STUBS -------- + +package FSSCGI; + +1; diff --git a/libs/libscgi/perl/Makefile b/libs/libscgi/perl/Makefile new file mode 100644 index 0000000000..3bce02368d --- /dev/null +++ b/libs/libscgi/perl/Makefile @@ -0,0 +1,38 @@ +PERL=$(shell which perl) +PERL_SITEDIR=$(shell perl -MConfig -e 'print $$Config{sitelibexp}') +PERL_LIBDIR=-L$(shell perl -MConfig -e 'print $$Config{archlib}')/CORE +PERL_LIBS=$(shell perl -MConfig -e 'print $$Config{libs}') +LOCAL_CFLAGS=-w -DMULTIPLICITY $(shell $(PERL) -MExtUtils::Embed -e ccopts) -DEMBED_PERL +LOCAL_LDFLAGS=$(shell $(PERL) -MExtUtils::Embed -e ldopts) $(shell $(PERL) -MConfig -e 'print $$Config{libs}') +GCC_WARNING_JUNK=-w +PERL_INC=$(shell $(PERL) -MExtUtils::Embed -e perl_inc) +all: FSSCGI.so + +scgi_wrap.cpp: + swig -module FSSCGI -shadow -perl5 -c++ -DMULTIPLICITY -I../src/include -o scgi_wrap.cpp ../FSSCGI.i + +perlxsi.c: + $(PERL) -MExtUtils::Embed -e xsinit -- -o perlxsi.c + +perlxsi.o: perlxsi.c + $(CC) $(CC_CFLAGS) $(CFLAGS) $(LOCAL_CFLAGS) -c perlxsi.c -o perlxsi.o + +scgi_wrap.o: scgi_wrap.cpp + $(CXX) $(CXX_CFLAGS) $(CXXFLAGS) $(GCC_WARNING_JUNK) $(PERL_INC) -c scgi_wrap.cpp -o scgi_wrap.o + +FSSCGI.so: scgi_wrap.o perlxsi.o + $(CXX) $(SOLINK) scgi_wrap.o perlxsi.o $(MYLIB) $(LOCAL_LDFLAGS) -o FSSCGI.so -L. $(LIBS) + +clean: + rm -f *.o *.so *~ + +swigclean: + rm -f scgi_wrap.* FSSCGI.so FSSCGI.pm perlxsi.* + +reswig: swigclean scgi_wrap.cpp perlxsi.c + +install: FSSCGI.so + install -m 755 FSSCGI.so $(PERL_SITEDIR) + install -m 755 FSSCGI.pm $(PERL_SITEDIR) + install -d -m 755 FSSCGI $(PERL_SITEDIR)/FSSCGI + install -m 755 FSSCGI/* $(PERL_SITEDIR)/FSSCGI diff --git a/libs/libscgi/perl/esl_wrap.cpp b/libs/libscgi/perl/esl_wrap.cpp new file mode 100644 index 0000000000..832289f156 --- /dev/null +++ b/libs/libscgi/perl/esl_wrap.cpp @@ -0,0 +1,4149 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPERL +#define SWIG_CASTRANK_MODE + +#ifdef __cplusplus +template class SwigValueWrapper { + T *tt; +public: + SwigValueWrapper() : tt(0) { } + SwigValueWrapper(const SwigValueWrapper& rhs) : tt(new T(*rhs.tt)) { } + SwigValueWrapper(const T& t) : tt(new T(t)) { } + ~SwigValueWrapper() { delete tt; } + SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; } + operator T&() const { return *tt; } + T *operator&() { return tt; } +private: + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic CAPI SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the swig runtime code. + In 99.9% of the cases, swig just needs to declare them as 'static'. + + But only do this if is strictly necessary, ie, if you have problems + with your compiler or so. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The swig conversion methods, as ConvertPtr, return and integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old swig versions, you usually write code as: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit as: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + that seems to be the same, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + requires also to SWIG_ConvertPtr to return new result values, as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + swig errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() + + + */ +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* think of this as a c++ template<> or a scheme macro */ +#define SWIG_TypeCheck_Template(comparison, ty) \ + if (ty) { \ + swig_cast_info *iter = ty->cast; \ + while (iter) { \ + if (comparison) { \ + if (iter == ty->cast) return iter; \ + /* Move iter to the top of the linked list */ \ + iter->prev->next = iter->next; \ + if (iter->next) \ + iter->next->prev = iter->prev; \ + iter->next = ty->cast; \ + iter->prev = 0; \ + if (ty->cast) ty->cast->prev = iter; \ + ty->cast = iter; \ + return iter; \ + } \ + iter = iter->next; \ + } \ + } \ + return 0 + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty); +} + +/* Same as previous function, except strcmp is replaced with a pointer comparison */ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) { + SWIG_TypeCheck_Template(iter->type == from, into); +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +#ifdef __cplusplus +/* Needed on some windows machines---since MS plays funny games with the header files under C++ */ +#include +#include +extern "C" { +#endif +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +/* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ + +/* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION +# endif +#endif + +#if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) +#define PerlIO_exportFILE(fh,fl) (FILE*)(fh) +#endif + +#ifndef SvIOK_UV +# define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) +#endif + +#ifndef SvUOK +# define SvUOK(sv) SvIOK_UV(sv) +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) +# define PL_sv_undef sv_undef +# define PL_na na +# define PL_errgv errgv +# define PL_sv_no sv_no +# define PL_sv_yes sv_yes +# define PL_markstack_ptr markstack_ptr +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif /* !INT2PTR */ + +#ifndef SvPV_nolen +# define SvPV_nolen(x) SvPV(x,PL_na) +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +#ifndef pTHX_ +#define pTHX_ +#endif + +#include +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGINTERN const char* +SWIG_Perl_ErrorType(int code) { + const char* type = 0; + switch(code) { + case SWIG_MemoryError: + type = "MemoryError"; + break; + case SWIG_IOError: + type = "IOError"; + break; + case SWIG_RuntimeError: + type = "RuntimeError"; + break; + case SWIG_IndexError: + type = "IndexError"; + break; + case SWIG_TypeError: + type = "TypeError"; + break; + case SWIG_DivisionByZero: + type = "ZeroDivisionError"; + break; + case SWIG_OverflowError: + type = "OverflowError"; + break; + case SWIG_SyntaxError: + type = "SyntaxError"; + break; + case SWIG_ValueError: + type = "ValueError"; + break; + case SWIG_SystemError: + type = "SystemError"; + break; + case SWIG_AttributeError: + type = "AttributeError"; + break; + default: + type = "RuntimeError"; + } + return type; +} + + + + +/* ----------------------------------------------------------------------------- + * perlrun.swg + * + * This file contains the runtime support for Perl modules + * and includes code for managing global variables and pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +#ifdef PERL_OBJECT +#define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), +#define SWIG_PERL_OBJECT_CALL pPerl, +#else +#define SWIG_PERL_OBJECT_DECL +#define SWIG_PERL_OBJECT_CALL +#endif + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) +#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) +#define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) +#define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + +/* Perl-specific SWIG API */ + +#define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) +#define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) +#define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) + + +#define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) +#define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) +#define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) +#define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 + +#ifdef __cplusplus +extern "C" { +#endif + +#define SWIG_OWNER SWIG_POINTER_OWN +#define SWIG_SHADOW SWIG_OWNER << 1 + +#define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL + +/* SWIG Perl macros */ + +/* Macro to declare an XS function */ +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +/* Macro to call an XS function */ +#ifdef PERL_OBJECT +# define SWIG_CALLXS(_name) _name(cv,pPerl) +#else +# ifndef MULTIPLICITY +# define SWIG_CALLXS(_name) _name(cv) +# else +# define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) +# endif +#endif + +#ifdef PERL_OBJECT +#define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) +#define SWIGCLASS_STATIC + +#else /* PERL_OBJECT */ + +#define MAGIC_PPERL +#define SWIGCLASS_STATIC static SWIGUNUSED + +#ifndef MULTIPLICITY +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#else /* MULTIPLICITY */ + +#define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#endif /* MULTIPLICITY */ +#endif /* PERL_OBJECT */ + +/* Workaround for bug in perl 5.6.x croak and earlier */ +#if (PERL_VERSION < 8) +# ifdef PERL_OBJECT +# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) +static void SWIG_Perl_croak_null(CPerlObj *pPerl) +# else +static void SWIG_croak_null() +# endif +{ + SV *err=ERRSV; +# if (PERL_VERSION < 6) + croak("%_", err); +# else + if (SvOK(err) && !SvROK(err)) croak("%_", err); + croak(Nullch); +# endif +} +#else +# define SWIG_croak_null() croak(Nullch) +#endif + + +/* + Define how strict is the cast between strings and integers/doubles + when overloading between these types occurs. + + The default is making it as strict as possible by using SWIG_AddCast + when needed. + + You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to + disable the SWIG_AddCast, making the casting between string and + numbers less strict. + + In the end, we try to solve the overloading between strings and + numerical types in the more natural way, but if you can avoid it, + well, avoid it using %rename, for example. +*/ +#ifndef SWIG_PERL_NO_STRICT_STR2NUM +# ifndef SWIG_PERL_STRICT_STR2NUM +# define SWIG_PERL_STRICT_STR2NUM +# endif +#endif +#ifdef SWIG_PERL_STRICT_STR2NUM +/* string takes precedence */ +#define SWIG_Str2NumCast(x) SWIG_AddCast(x) +#else +/* number takes precedence */ +#define SWIG_Str2NumCast(x) x +#endif + + + +#include + +SWIGRUNTIME const char * +SWIG_Perl_TypeProxyName(const swig_type_info *type) { + if (!type) return NULL; + if (type->clientdata != NULL) { + return (const char*) type->clientdata; + } + else { + return type->name; + } +} + +SWIGRUNTIME swig_cast_info * +SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { + SWIG_TypeCheck_Template(( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) + || (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0))), ty); +} + + +/* Function for getting a pointer value */ + +SWIGRUNTIME int +SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { + swig_cast_info *tc; + void *voidptr = (void *)0; + SV *tsv = 0; + /* If magical, apply more magic */ + if (SvGMAGICAL(sv)) + mg_get(sv); + + /* Check to see if this is an object */ + if (sv_isobject(sv)) { + IV tmp = 0; + tsv = (SV*) SvRV(sv); + if ((SvTYPE(tsv) == SVt_PVHV)) { + MAGIC *mg; + if (SvMAGICAL(tsv)) { + mg = mg_find(tsv,'P'); + if (mg) { + sv = mg->mg_obj; + if (sv_isobject(sv)) { + tsv = (SV*)SvRV(sv); + tmp = SvIV(tsv); + } + } + } else { + return SWIG_ERROR; + } + } else { + tmp = SvIV(tsv); + } + voidptr = INT2PTR(void *,tmp); + } else if (! SvOK(sv)) { /* Check for undef */ + *(ptr) = (void *) 0; + return SWIG_OK; + } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ + if (!SvROK(sv)) { + *(ptr) = (void *) 0; + return SWIG_OK; + } else { + return SWIG_ERROR; + } + } else { /* Don't know what it is */ + return SWIG_ERROR; + } + if (_t) { + /* Now see if the types match */ + char *_c = HvNAME(SvSTASH(SvRV(sv))); + tc = SWIG_TypeProxyCheck(_c,_t); + if (!tc) { + return SWIG_ERROR; + } + { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } + } else { + *ptr = voidptr; + } + + /* + * DISOWN implementation: we need a perl guru to check this one. + */ + if (tsv && (flags & SWIG_POINTER_DISOWN)) { + /* + * almost copy paste code from below SWIG_POINTER_OWN setting + */ + SV *obj = sv; + HV *stash = SvSTASH(SvRV(obj)); + GV *gv = *(GV**) hv_fetch(stash, "OWNER", 5, TRUE); + if (isGV(gv)) { + HV *hv = GvHVn(gv); + /* + * To set ownership (see below), a newSViv(1) entry is added. + * Hence, to remove ownership, we delete the entry. + */ + if (hv_exists_ent(hv, obj, 0)) { + hv_delete_ent(hv, obj, 0, 0); + } + } + } + return SWIG_OK; +} + +SWIGRUNTIME void +SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { + if (ptr && (flags & SWIG_SHADOW)) { + SV *self; + SV *obj=newSV(0); + HV *hash=newHV(); + HV *stash; + sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); + stash=SvSTASH(SvRV(obj)); + if (flags & SWIG_POINTER_OWN) { + HV *hv; + GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (!isGV(gv)) + gv_init(gv, stash, "OWNER", 5, FALSE); + hv=GvHVn(gv); + hv_store_ent(hv, obj, newSViv(1), 0); + } + sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); + SvREFCNT_dec(obj); + self=newRV_noinc((SV *)hash); + sv_setsv(sv, self); + SvREFCNT_dec((SV *)self); + sv_bless(sv, stash); + } + else { + sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); + } +} + +SWIGRUNTIMEINLINE SV * +SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { + SV *result = sv_newmortal(); + SWIG_MakePtr(result, ptr, t, flags); + return result; +} + +SWIGRUNTIME void +SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + strcpy(r,SWIG_Perl_TypeProxyName(type)); + sv_setpv(sv, result); +} + +SWIGRUNTIME SV * +SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { + SV *result = sv_newmortal(); + SWIG_Perl_MakePackedObj(result, ptr, sz, type); + return result; +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c = 0; + + if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; + c = SvPV_nolen(obj); + /* Pointer values must start with leading underscore */ + if (*c != '_') return SWIG_ERROR; + c++; + c = SWIG_UnpackData(c,ptr,sz); + if (ty) { + tc = SWIG_TypeCheck(c,ty); + if (!tc) return SWIG_ERROR; + } + return SWIG_OK; +} + + +/* Macros for low-level exception handling */ +#define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } + + +typedef XSPROTO(SwigPerlWrapper); +typedef SwigPerlWrapper *SwigPerlWrapperPtr; + +/* Structure for command table */ +typedef struct { + const char *name; + SwigPerlWrapperPtr wrapper; +} swig_command_info; + +/* Information for constant table */ + +#define SWIG_INT 1 +#define SWIG_FLOAT 2 +#define SWIG_STRING 3 +#define SWIG_POINTER 4 +#define SWIG_BINARY 5 + +/* Constant information structure */ +typedef struct swig_constant_info { + int type; + const char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_constant_info; + + +/* Structure for variable table */ +typedef struct { + const char *name; + SwigMagicFunc set; + SwigMagicFunc get; + swig_type_info **type; +} swig_variable_info; + +/* Magic variable code */ +#ifndef PERL_OBJECT +#define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) + #ifndef MULTIPLICITY + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) + #else + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) + #endif +#else +# define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) +SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) +#endif +{ + MAGIC *mg; + sv_magic(sv,sv,'U',(char *) name,strlen(name)); + mg = mg_find(sv,'U'); + mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); + mg->mg_virtual->svt_get = (SwigMagicFunc) get; + mg->mg_virtual->svt_set = (SwigMagicFunc) set; + mg->mg_virtual->svt_len = 0; + mg->mg_virtual->svt_clear = 0; + mg->mg_virtual->svt_free = 0; +} + + +SWIGRUNTIME swig_module_info * +SWIG_Perl_GetModule(void) { + static void *type_pointer = (void *)0; + SV *pointer; + + /* first check if pointer already created */ + if (!type_pointer) { + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); + if (pointer && SvOK(pointer)) { + type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); + } + } + + return (swig_module_info *) type_pointer; +} + +SWIGRUNTIME void +SWIG_Perl_SetModule(swig_module_info *module) { + SV *pointer; + + /* create a new pointer */ + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); + sv_setiv(pointer, PTR2IV(module)); +} + +#ifdef __cplusplus +} +#endif + +/* Workaround perl5 global namespace pollution. Note that undefining library + * functions like fopen will not solve the problem on all platforms as fopen + * might be a macro on Windows but not necessarily on other operating systems. */ +#ifdef do_open + #undef do_open +#endif +#ifdef do_close + #undef do_close +#endif +#ifdef scalar + #undef scalar +#endif +#ifdef list + #undef list +#endif +#ifdef apply + #undef apply +#endif +#ifdef convert + #undef convert +#endif +#ifdef Error + #undef Error +#endif +#ifdef form + #undef form +#endif +#ifdef vform + #undef vform +#endif +#ifdef LABEL + #undef LABEL +#endif +#ifdef METHOD + #undef METHOD +#endif +#ifdef Move + #undef Move +#endif +#ifdef yylex + #undef yylex +#endif +#ifdef yyparse + #undef yyparse +#endif +#ifdef yyerror + #undef yyerror +#endif +#ifdef invert + #undef invert +#endif +#ifdef ref + #undef ref +#endif +#ifdef read + #undef read +#endif +#ifdef write + #undef write +#endif +#ifdef eof + #undef eof +#endif +#ifdef bool + #undef bool +#endif +#ifdef close + #undef close +#endif +#ifdef rewind + #undef rewind +#endif +#ifdef free + #undef free +#endif +#ifdef malloc + #undef malloc +#endif +#ifdef calloc + #undef calloc +#endif +#ifdef Stat + #undef Stat +#endif +#ifdef check + #undef check +#endif +#ifdef seekdir + #undef seekdir +#endif +#ifdef open + #undef open +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_ESLconnection swig_types[0] +#define SWIGTYPE_p_ESLevent swig_types[1] +#define SWIGTYPE_p_char swig_types[2] +#define SWIGTYPE_p_esl_event_t swig_types[3] +#define SWIGTYPE_p_esl_priority_t swig_types[4] +static swig_type_info *swig_types[6]; +static swig_module_info swig_module = {swig_types, 5, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#define SWIG_init boot_ESL + +#define SWIG_name "ESLc::boot_ESL" +#define SWIG_prefix "ESLc::" + +#define SWIGVERSION 0x010335 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +#ifdef __cplusplus +extern "C" +#endif +#ifndef PERL_OBJECT +#ifndef MULTIPLICITY +SWIGEXPORT void SWIG_init (CV* cv); +#else +SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); +#endif +#else +SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); +#endif + + +#include "esl.h" +#include "esl_oop.h" + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) +{ + if (SvPOK(obj)) { + STRLEN len = 0; + char *cstr = SvPV(obj, len); + size_t size = len + 1; + if (cptr) { + if (alloc) { + if (*alloc == SWIG_NEWOBJ) { + *cptr = reinterpret_cast< char* >(memcpy((new char[size]), cstr, sizeof(char)*(size))); + } else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } + } + if (psize) *psize = size; + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + char* vptr = 0; + if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = vptr; + if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + + + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + SV *obj = sv_newmortal(); + if (carray) { + sv_setpvn(obj, carray, size); + } else { + sv_setsv(obj, &PL_sv_undef); + } + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) +{ + if (SvNIOK(obj)) { + if (val) *val = SvNV(obj); + return SWIG_OK; + } else if (SvIOK(obj)) { + if (val) *val = (double) SvIV(obj); + return SWIG_AddCast(SWIG_OK); + } else { + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + double v = strtod(nptr, &endptr); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + } + return SWIG_TypeError; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val) +{ + if (SvIOK(obj)) { + if (val) *val = SvIV(obj); + return SWIG_OK; + } else { + int dispatch = 0; + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + long v; + errno = 0; + v = strtol(nptr, &endptr,0); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERNINLINE SV * +SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value) +{ + SV *obj = sv_newmortal(); + sv_setiv(obj, (IV) value); + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_int SWIG_PERL_DECL_ARGS_1(int value) +{ + return SWIG_From_long SWIG_PERL_CALL_ARGS_1(value); +} + + +SWIGINTERNINLINE SV * +SWIG_From_bool SWIG_PERL_DECL_ARGS_1(bool value) +{ + SV *obj = sv_newmortal(); + if (value) { + sv_setsv(obj, &PL_sv_yes); + } else { + sv_setsv(obj, &PL_sv_no); + } + return obj; +} + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PERL_OBJECT +#define MAGIC_CLASS _wrap_ESL_var:: +class _wrap_ESL_var : public CPerlObj { +public: +#else +#define MAGIC_CLASS +#endif +SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) { + MAGIC_PPERL + croak("Value is read-only."); + return 0; +} + + +#ifdef PERL_OBJECT +}; +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif +XS(_wrap_ESLevent_event_set) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + esl_event_t *arg2 = (esl_event_t *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLevent_event_set(self,event);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_event_set" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_esl_event_t, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_event_set" "', argument " "2"" of type '" "esl_event_t *""'"); + } + arg2 = reinterpret_cast< esl_event_t * >(argp2); + if (arg1) (arg1)->event = arg2; + + + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_event_get) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + esl_event_t *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_event_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_event_get" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (esl_event_t *) ((arg1)->event); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_esl_event_t, 0 | 0); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_serialized_string_set) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLevent_serialized_string_set(self,serialized_string);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_serialized_string_set" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_serialized_string_set" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (arg1->serialized_string) delete[] arg1->serialized_string; + if (arg2) { + size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1; + arg1->serialized_string = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size))); + } else { + arg1->serialized_string = 0; + } + + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_serialized_string_get) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_serialized_string_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_serialized_string_get" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (char *) ((arg1)->serialized_string); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_mine_set) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + int arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLevent_mine_set(self,mine);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_mine_set" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ESLevent_mine_set" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + if (arg1) (arg1)->mine = arg2; + + + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_mine_get) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_mine_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_mine_get" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (int) ((arg1)->mine); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLevent__SWIG_0) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) NULL ; + ESLevent *result = 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 2)) { + SWIG_croak("Usage: new_ESLevent(type,subclass_name);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ESLevent" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + if (items > 1) { + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ESLevent" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + } + result = (ESLevent *)new ESLevent((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLevent__SWIG_1) { + { + esl_event_t *arg1 = (esl_event_t *) 0 ; + int arg2 = (int) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 2)) { + SWIG_croak("Usage: new_ESLevent(wrap_me,free_me);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_esl_event_t, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ESLevent" "', argument " "1"" of type '" "esl_event_t *""'"); + } + arg1 = reinterpret_cast< esl_event_t * >(argp1); + if (items > 1) { + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_ESLevent" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + } + result = (ESLevent *)new ESLevent(arg1,arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLevent__SWIG_2) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: new_ESLevent(me);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ESLevent" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (ESLevent *)new ESLevent(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLevent) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if ((items >= 1) && (items <= 2)) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_esl_event_t, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (items > 1) { + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + } + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_ESLevent, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if ((items >= 1) && (items <= 2)) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsCharPtrAndSize(ST(0), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (items > 1) { + { + int res = SWIG_AsCharPtrAndSize(ST(1), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + } + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLevent__SWIG_1); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLevent__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLevent__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'new_ESLevent'"); + XSRETURN(0); +} + + +XS(_wrap_delete_ESLevent) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_ESLevent(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ESLevent" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + delete arg1; + + + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_serialize) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) NULL ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 2)) { + SWIG_croak("Usage: ESLevent_serialize(self,format);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_serialize" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + if (items > 1) { + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_serialize" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + } + result = (char *)(arg1)->serialize((char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_setPriority) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + esl_priority_t arg2 = (esl_priority_t) ESL_PRIORITY_NORMAL ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 2)) { + SWIG_croak("Usage: ESLevent_setPriority(self,priority);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_setPriority" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + if (items > 1) { + { + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_esl_priority_t, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_setPriority" "', argument " "2"" of type '" "esl_priority_t""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ESLevent_setPriority" "', argument " "2"" of type '" "esl_priority_t""'"); + } else { + arg2 = *(reinterpret_cast< esl_priority_t * >(argp2)); + } + } + } + result = (bool)(arg1)->setPriority(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_getHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + int arg3 = (int) -1 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 3)) { + SWIG_croak("Usage: ESLevent_getHeader(self,header_name,idx);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_getHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_getHeader" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (items > 2) { + ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ESLevent_getHeader" "', argument " "3"" of type '" "int""'"); + } + arg3 = static_cast< int >(val3); + } + result = (char *)(arg1)->getHeader((char const *)arg2,arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_getBody) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_getBody(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_getBody" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (char *)(arg1)->getBody(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_getType) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_getType(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_getType" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (char *)(arg1)->getType(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_addBody) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLevent_addBody(self,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_addBody" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_addBody" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->addBody((char const *)arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_addHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: ESLevent_addHeader(self,header_name,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_addHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_addHeader" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLevent_addHeader" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (bool)(arg1)->addHeader((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_pushHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: ESLevent_pushHeader(self,header_name,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_pushHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_pushHeader" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLevent_pushHeader" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (bool)(arg1)->pushHeader((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_unshiftHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: ESLevent_unshiftHeader(self,header_name,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_unshiftHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_unshiftHeader" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLevent_unshiftHeader" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (bool)(arg1)->unshiftHeader((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_delHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *arg2 = (char *) 0 ; + bool result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLevent_delHeader(self,header_name);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_delHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLevent_delHeader" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (bool)(arg1)->delHeader((char const *)arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_firstHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_firstHeader(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_firstHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (char *)(arg1)->firstHeader(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLevent_nextHeader) { + { + ESLevent *arg1 = (ESLevent *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLevent_nextHeader(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLevent_nextHeader" "', argument " "1"" of type '" "ESLevent *""'"); + } + arg1 = reinterpret_cast< ESLevent * >(argp1); + result = (char *)(arg1)->nextHeader(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLconnection__SWIG_0) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + ESLconnection *result = 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: new_ESLconnection(host,port,user,password);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ESLconnection" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ESLconnection" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_ESLconnection" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_ESLconnection" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (ESLconnection *)new ESLconnection((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLconnection, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLconnection__SWIG_1) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + ESLconnection *result = 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: new_ESLconnection(host,port,password);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ESLconnection" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ESLconnection" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_ESLconnection" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (ESLconnection *)new ESLconnection((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLconnection, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLconnection__SWIG_2) { + { + int arg1 ; + ESLconnection *result = 0 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: new_ESLconnection(socket);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_ESLconnection" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (ESLconnection *)new ESLconnection(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLconnection, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_ESLconnection) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsCharPtrAndSize(ST(0), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsCharPtrAndSize(ST(1), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsCharPtrAndSize(ST(2), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsCharPtrAndSize(ST(0), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsCharPtrAndSize(ST(1), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsCharPtrAndSize(ST(2), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsCharPtrAndSize(ST(3), 0, NULL, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLconnection__SWIG_2); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLconnection__SWIG_1); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_new_ESLconnection__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'new_ESLconnection'"); + XSRETURN(0); +} + + +XS(_wrap_delete_ESLconnection) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_ESLconnection(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ESLconnection" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + delete arg1; + + + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_socketDescriptor) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLconnection_socketDescriptor(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_socketDescriptor" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + result = (int)(arg1)->socketDescriptor(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_connected) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLconnection_connected(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_connected" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + result = (int)(arg1)->connected(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_getInfo) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLconnection_getInfo(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_getInfo" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + result = (ESLevent *)(arg1)->getInfo(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_send) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_send(self,cmd);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_send" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_send" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)(arg1)->send((char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_sendRecv) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_sendRecv(self,cmd);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_sendRecv" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_sendRecv" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (ESLevent *)(arg1)->sendRecv((char const *)arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_api) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) NULL ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 3)) { + SWIG_croak("Usage: ESLconnection_api(self,cmd,arg);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_api" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_api" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (items > 2) { + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_api" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + } + result = (ESLevent *)(arg1)->api((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_bgapi) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) NULL ; + char *arg4 = (char *) NULL ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 4)) { + SWIG_croak("Usage: ESLconnection_bgapi(self,cmd,arg,job_uuid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_bgapi" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_bgapi" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (items > 2) { + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_bgapi" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + } + if (items > 3) { + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ESLconnection_bgapi" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + } + result = (ESLevent *)(arg1)->bgapi((char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_sendEvent) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + ESLevent *arg2 = (ESLevent *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_sendEvent(self,send_me);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_sendEvent" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_sendEvent" "', argument " "2"" of type '" "ESLevent *""'"); + } + arg2 = reinterpret_cast< ESLevent * >(argp2); + result = (ESLevent *)(arg1)->sendEvent(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_sendMSG) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + ESLevent *arg2 = (ESLevent *) 0 ; + char *arg3 = (char *) NULL ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 3)) { + SWIG_croak("Usage: ESLconnection_sendMSG(self,send_me,uuid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_sendMSG" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_ESLevent, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_sendMSG" "', argument " "2"" of type '" "ESLevent *""'"); + } + arg2 = reinterpret_cast< ESLevent * >(argp2); + if (items > 2) { + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_sendMSG" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + } + result = (int)(arg1)->sendMSG(arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_recvEvent) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLconnection_recvEvent(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_recvEvent" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + result = (ESLevent *)(arg1)->recvEvent(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_recvEventTimed) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + int arg2 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_recvEventTimed(self,ms);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_recvEventTimed" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ESLconnection_recvEventTimed" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (ESLevent *)(arg1)->recvEventTimed(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_filter) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: ESLconnection_filter(self,header,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_filter" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_filter" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_filter" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (ESLevent *)(arg1)->filter((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_events) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: ESLconnection_events(self,etype,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_events" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_events" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_events" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)(arg1)->events((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_execute) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) NULL ; + char *arg4 = (char *) NULL ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 4)) { + SWIG_croak("Usage: ESLconnection_execute(self,app,arg,uuid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_execute" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_execute" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (items > 2) { + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_execute" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + } + if (items > 3) { + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ESLconnection_execute" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + } + result = (ESLevent *)(arg1)->execute((char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_executeAsync) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) NULL ; + char *arg4 = (char *) NULL ; + ESLevent *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 4)) { + SWIG_croak("Usage: ESLconnection_executeAsync(self,app,arg,uuid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_executeAsync" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_executeAsync" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + if (items > 2) { + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ESLconnection_executeAsync" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + } + if (items > 3) { + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ESLconnection_executeAsync" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + } + result = (ESLevent *)(arg1)->executeAsync((char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ESLevent, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_setAsyncExecute) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_setAsyncExecute(self,val);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_setAsyncExecute" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_setAsyncExecute" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)(arg1)->setAsyncExecute((char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_setEventLock) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + char *arg2 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ESLconnection_setEventLock(self,val);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_setEventLock" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ESLconnection_setEventLock" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)(arg1)->setEventLock((char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ESLconnection_disconnect) { + { + ESLconnection *arg1 = (ESLconnection *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ESLconnection_disconnect(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ESLconnection, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ESLconnection_disconnect" "', argument " "1"" of type '" "ESLconnection *""'"); + } + arg1 = reinterpret_cast< ESLconnection * >(argp1); + result = (int)(arg1)->disconnect(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_eslSetLogLevel) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: eslSetLogLevel(level);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "eslSetLogLevel" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + eslSetLogLevel(arg1); + + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static swig_type_info _swigt__p_ESLconnection = {"_p_ESLconnection", "ESLconnection *", 0, 0, (void*)"ESL::ESLconnection", 0}; +static swig_type_info _swigt__p_ESLevent = {"_p_ESLevent", "ESLevent *", 0, 0, (void*)"ESL::ESLevent", 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_esl_event_t = {"_p_esl_event_t", "esl_event_t *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_esl_priority_t = {"_p_esl_priority_t", "esl_priority_t *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_ESLconnection, + &_swigt__p_ESLevent, + &_swigt__p_char, + &_swigt__p_esl_event_t, + &_swigt__p_esl_priority_t, +}; + +static swig_cast_info _swigc__p_ESLconnection[] = { {&_swigt__p_ESLconnection, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_ESLevent[] = { {&_swigt__p_ESLevent, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_esl_event_t[] = { {&_swigt__p_esl_event_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_esl_priority_t[] = { {&_swigt__p_esl_priority_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_ESLconnection, + _swigc__p_ESLevent, + _swigc__p_char, + _swigc__p_esl_event_t, + _swigc__p_esl_priority_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_constant_info swig_constants[] = { +{0,0,0,0,0,0} +}; +#ifdef __cplusplus +} +#endif +static swig_variable_info swig_variables[] = { +{0,0,0,0} +}; +static swig_command_info swig_commands[] = { +{"ESLc::ESLevent_event_set", _wrap_ESLevent_event_set}, +{"ESLc::ESLevent_event_get", _wrap_ESLevent_event_get}, +{"ESLc::ESLevent_serialized_string_set", _wrap_ESLevent_serialized_string_set}, +{"ESLc::ESLevent_serialized_string_get", _wrap_ESLevent_serialized_string_get}, +{"ESLc::ESLevent_mine_set", _wrap_ESLevent_mine_set}, +{"ESLc::ESLevent_mine_get", _wrap_ESLevent_mine_get}, +{"ESLc::new_ESLevent", _wrap_new_ESLevent}, +{"ESLc::delete_ESLevent", _wrap_delete_ESLevent}, +{"ESLc::ESLevent_serialize", _wrap_ESLevent_serialize}, +{"ESLc::ESLevent_setPriority", _wrap_ESLevent_setPriority}, +{"ESLc::ESLevent_getHeader", _wrap_ESLevent_getHeader}, +{"ESLc::ESLevent_getBody", _wrap_ESLevent_getBody}, +{"ESLc::ESLevent_getType", _wrap_ESLevent_getType}, +{"ESLc::ESLevent_addBody", _wrap_ESLevent_addBody}, +{"ESLc::ESLevent_addHeader", _wrap_ESLevent_addHeader}, +{"ESLc::ESLevent_pushHeader", _wrap_ESLevent_pushHeader}, +{"ESLc::ESLevent_unshiftHeader", _wrap_ESLevent_unshiftHeader}, +{"ESLc::ESLevent_delHeader", _wrap_ESLevent_delHeader}, +{"ESLc::ESLevent_firstHeader", _wrap_ESLevent_firstHeader}, +{"ESLc::ESLevent_nextHeader", _wrap_ESLevent_nextHeader}, +{"ESLc::new_ESLconnection", _wrap_new_ESLconnection}, +{"ESLc::delete_ESLconnection", _wrap_delete_ESLconnection}, +{"ESLc::ESLconnection_socketDescriptor", _wrap_ESLconnection_socketDescriptor}, +{"ESLc::ESLconnection_connected", _wrap_ESLconnection_connected}, +{"ESLc::ESLconnection_getInfo", _wrap_ESLconnection_getInfo}, +{"ESLc::ESLconnection_send", _wrap_ESLconnection_send}, +{"ESLc::ESLconnection_sendRecv", _wrap_ESLconnection_sendRecv}, +{"ESLc::ESLconnection_api", _wrap_ESLconnection_api}, +{"ESLc::ESLconnection_bgapi", _wrap_ESLconnection_bgapi}, +{"ESLc::ESLconnection_sendEvent", _wrap_ESLconnection_sendEvent}, +{"ESLc::ESLconnection_sendMSG", _wrap_ESLconnection_sendMSG}, +{"ESLc::ESLconnection_recvEvent", _wrap_ESLconnection_recvEvent}, +{"ESLc::ESLconnection_recvEventTimed", _wrap_ESLconnection_recvEventTimed}, +{"ESLc::ESLconnection_filter", _wrap_ESLconnection_filter}, +{"ESLc::ESLconnection_events", _wrap_ESLconnection_events}, +{"ESLc::ESLconnection_execute", _wrap_ESLconnection_execute}, +{"ESLc::ESLconnection_executeAsync", _wrap_ESLconnection_executeAsync}, +{"ESLc::ESLconnection_setAsyncExecute", _wrap_ESLconnection_setAsyncExecute}, +{"ESLc::ESLconnection_setEventLock", _wrap_ESLconnection_setEventLock}, +{"ESLc::ESLconnection_disconnect", _wrap_ESLconnection_disconnect}, +{"ESLc::eslSetLogLevel", _wrap_eslSetLogLevel}, +{0,0} +}; +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" +#endif + +XS(SWIG_init) { + dXSARGS; + int i; + + SWIG_InitializeModule(0); + + /* Install commands */ + for (i = 0; swig_commands[i].name; i++) { + newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__); + } + + /* Install variables */ + for (i = 0; swig_variables[i].name; i++) { + SV *sv; + sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); + if (swig_variables[i].type) { + SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); + } else { + sv_setiv(sv,(IV) 0); + } + swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); + } + + /* Install constant */ + for (i = 0; swig_constants[i].type; i++) { + SV *sv; + sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); + switch(swig_constants[i].type) { + case SWIG_INT: + sv_setiv(sv, (IV) swig_constants[i].lvalue); + break; + case SWIG_FLOAT: + sv_setnv(sv, (double) swig_constants[i].dvalue); + break; + case SWIG_STRING: + sv_setpv(sv, (char *) swig_constants[i].pvalue); + break; + case SWIG_POINTER: + SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); + break; + case SWIG_BINARY: + SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); + break; + default: + break; + } + SvREADONLY_on(sv); + } + + SWIG_TypeClientData(SWIGTYPE_p_ESLevent, (void*) "ESL::ESLevent"); + SWIG_TypeClientData(SWIGTYPE_p_ESLconnection, (void*) "ESL::ESLconnection"); + ST(0) = &PL_sv_yes; + XSRETURN(1); +} + diff --git a/libs/libscgi/perl/perlxsi.c b/libs/libscgi/perl/perlxsi.c new file mode 100644 index 0000000000..9ca8fc1fb1 --- /dev/null +++ b/libs/libscgi/perl/perlxsi.c @@ -0,0 +1,16 @@ +#include +#include + +EXTERN_C void xs_init (pTHX); + +EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); + +EXTERN_C void +xs_init(pTHX) +{ + char *file = __FILE__; + dXSUB_SYS; + + /* DynaLoader is a special case */ + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +} diff --git a/libs/libscgi/perl/scgi_wrap.cpp b/libs/libscgi/perl/scgi_wrap.cpp new file mode 100644 index 0000000000..aaa8e40219 --- /dev/null +++ b/libs/libscgi/perl/scgi_wrap.cpp @@ -0,0 +1,2459 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPERL +#define SWIG_CASTRANK_MODE + +#ifdef __cplusplus +template class SwigValueWrapper { + T *tt; +public: + SwigValueWrapper() : tt(0) { } + SwigValueWrapper(const SwigValueWrapper& rhs) : tt(new T(*rhs.tt)) { } + SwigValueWrapper(const T& t) : tt(new T(t)) { } + ~SwigValueWrapper() { delete tt; } + SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; } + operator T&() const { return *tt; } + T *operator&() { return tt; } +private: + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic CAPI SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the swig runtime code. + In 99.9% of the cases, swig just needs to declare them as 'static'. + + But only do this if is strictly necessary, ie, if you have problems + with your compiler or so. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The swig conversion methods, as ConvertPtr, return and integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old swig versions, you usually write code as: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit as: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + that seems to be the same, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + requires also to SWIG_ConvertPtr to return new result values, as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + swig errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() + + + */ +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* think of this as a c++ template<> or a scheme macro */ +#define SWIG_TypeCheck_Template(comparison, ty) \ + if (ty) { \ + swig_cast_info *iter = ty->cast; \ + while (iter) { \ + if (comparison) { \ + if (iter == ty->cast) return iter; \ + /* Move iter to the top of the linked list */ \ + iter->prev->next = iter->next; \ + if (iter->next) \ + iter->next->prev = iter->prev; \ + iter->next = ty->cast; \ + iter->prev = 0; \ + if (ty->cast) ty->cast->prev = iter; \ + ty->cast = iter; \ + return iter; \ + } \ + iter = iter->next; \ + } \ + } \ + return 0 + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty); +} + +/* Same as previous function, except strcmp is replaced with a pointer comparison */ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) { + SWIG_TypeCheck_Template(iter->type == from, into); +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +#ifdef __cplusplus +/* Needed on some windows machines---since MS plays funny games with the header files under C++ */ +#include +#include +extern "C" { +#endif +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +/* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ + +/* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION +# endif +#endif + +#if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) +#define PerlIO_exportFILE(fh,fl) (FILE*)(fh) +#endif + +#ifndef SvIOK_UV +# define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) +#endif + +#ifndef SvUOK +# define SvUOK(sv) SvIOK_UV(sv) +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) +# define PL_sv_undef sv_undef +# define PL_na na +# define PL_errgv errgv +# define PL_sv_no sv_no +# define PL_sv_yes sv_yes +# define PL_markstack_ptr markstack_ptr +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif /* !INT2PTR */ + +#ifndef SvPV_nolen +# define SvPV_nolen(x) SvPV(x,PL_na) +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +#ifndef pTHX_ +#define pTHX_ +#endif + +#include +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGINTERN const char* +SWIG_Perl_ErrorType(int code) { + const char* type = 0; + switch(code) { + case SWIG_MemoryError: + type = "MemoryError"; + break; + case SWIG_IOError: + type = "IOError"; + break; + case SWIG_RuntimeError: + type = "RuntimeError"; + break; + case SWIG_IndexError: + type = "IndexError"; + break; + case SWIG_TypeError: + type = "TypeError"; + break; + case SWIG_DivisionByZero: + type = "ZeroDivisionError"; + break; + case SWIG_OverflowError: + type = "OverflowError"; + break; + case SWIG_SyntaxError: + type = "SyntaxError"; + break; + case SWIG_ValueError: + type = "ValueError"; + break; + case SWIG_SystemError: + type = "SystemError"; + break; + case SWIG_AttributeError: + type = "AttributeError"; + break; + default: + type = "RuntimeError"; + } + return type; +} + + + + +/* ----------------------------------------------------------------------------- + * perlrun.swg + * + * This file contains the runtime support for Perl modules + * and includes code for managing global variables and pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +#ifdef PERL_OBJECT +#define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), +#define SWIG_PERL_OBJECT_CALL pPerl, +#else +#define SWIG_PERL_OBJECT_DECL +#define SWIG_PERL_OBJECT_CALL +#endif + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) +#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) +#define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) +#define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + +/* Perl-specific SWIG API */ + +#define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) +#define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) +#define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) + + +#define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) +#define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) +#define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) +#define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 + +#ifdef __cplusplus +extern "C" { +#endif + +#define SWIG_OWNER SWIG_POINTER_OWN +#define SWIG_SHADOW SWIG_OWNER << 1 + +#define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL + +/* SWIG Perl macros */ + +/* Macro to declare an XS function */ +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +/* Macro to call an XS function */ +#ifdef PERL_OBJECT +# define SWIG_CALLXS(_name) _name(cv,pPerl) +#else +# ifndef MULTIPLICITY +# define SWIG_CALLXS(_name) _name(cv) +# else +# define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) +# endif +#endif + +#ifdef PERL_OBJECT +#define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) +#define SWIGCLASS_STATIC + +#else /* PERL_OBJECT */ + +#define MAGIC_PPERL +#define SWIGCLASS_STATIC static SWIGUNUSED + +#ifndef MULTIPLICITY +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#else /* MULTIPLICITY */ + +#define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#endif /* MULTIPLICITY */ +#endif /* PERL_OBJECT */ + +/* Workaround for bug in perl 5.6.x croak and earlier */ +#if (PERL_VERSION < 8) +# ifdef PERL_OBJECT +# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) +static void SWIG_Perl_croak_null(CPerlObj *pPerl) +# else +static void SWIG_croak_null() +# endif +{ + SV *err=ERRSV; +# if (PERL_VERSION < 6) + croak("%_", err); +# else + if (SvOK(err) && !SvROK(err)) croak("%_", err); + croak(Nullch); +# endif +} +#else +# define SWIG_croak_null() croak(Nullch) +#endif + + +/* + Define how strict is the cast between strings and integers/doubles + when overloading between these types occurs. + + The default is making it as strict as possible by using SWIG_AddCast + when needed. + + You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to + disable the SWIG_AddCast, making the casting between string and + numbers less strict. + + In the end, we try to solve the overloading between strings and + numerical types in the more natural way, but if you can avoid it, + well, avoid it using %rename, for example. +*/ +#ifndef SWIG_PERL_NO_STRICT_STR2NUM +# ifndef SWIG_PERL_STRICT_STR2NUM +# define SWIG_PERL_STRICT_STR2NUM +# endif +#endif +#ifdef SWIG_PERL_STRICT_STR2NUM +/* string takes precedence */ +#define SWIG_Str2NumCast(x) SWIG_AddCast(x) +#else +/* number takes precedence */ +#define SWIG_Str2NumCast(x) x +#endif + + + +#include + +SWIGRUNTIME const char * +SWIG_Perl_TypeProxyName(const swig_type_info *type) { + if (!type) return NULL; + if (type->clientdata != NULL) { + return (const char*) type->clientdata; + } + else { + return type->name; + } +} + +SWIGRUNTIME swig_cast_info * +SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { + SWIG_TypeCheck_Template(( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) + || (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0))), ty); +} + + +/* Function for getting a pointer value */ + +SWIGRUNTIME int +SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { + swig_cast_info *tc; + void *voidptr = (void *)0; + SV *tsv = 0; + /* If magical, apply more magic */ + if (SvGMAGICAL(sv)) + mg_get(sv); + + /* Check to see if this is an object */ + if (sv_isobject(sv)) { + IV tmp = 0; + tsv = (SV*) SvRV(sv); + if ((SvTYPE(tsv) == SVt_PVHV)) { + MAGIC *mg; + if (SvMAGICAL(tsv)) { + mg = mg_find(tsv,'P'); + if (mg) { + sv = mg->mg_obj; + if (sv_isobject(sv)) { + tsv = (SV*)SvRV(sv); + tmp = SvIV(tsv); + } + } + } else { + return SWIG_ERROR; + } + } else { + tmp = SvIV(tsv); + } + voidptr = INT2PTR(void *,tmp); + } else if (! SvOK(sv)) { /* Check for undef */ + *(ptr) = (void *) 0; + return SWIG_OK; + } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ + if (!SvROK(sv)) { + *(ptr) = (void *) 0; + return SWIG_OK; + } else { + return SWIG_ERROR; + } + } else { /* Don't know what it is */ + return SWIG_ERROR; + } + if (_t) { + /* Now see if the types match */ + char *_c = HvNAME(SvSTASH(SvRV(sv))); + tc = SWIG_TypeProxyCheck(_c,_t); + if (!tc) { + return SWIG_ERROR; + } + { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } + } else { + *ptr = voidptr; + } + + /* + * DISOWN implementation: we need a perl guru to check this one. + */ + if (tsv && (flags & SWIG_POINTER_DISOWN)) { + /* + * almost copy paste code from below SWIG_POINTER_OWN setting + */ + SV *obj = sv; + HV *stash = SvSTASH(SvRV(obj)); + GV *gv = *(GV**) hv_fetch(stash, "OWNER", 5, TRUE); + if (isGV(gv)) { + HV *hv = GvHVn(gv); + /* + * To set ownership (see below), a newSViv(1) entry is added. + * Hence, to remove ownership, we delete the entry. + */ + if (hv_exists_ent(hv, obj, 0)) { + hv_delete_ent(hv, obj, 0, 0); + } + } + } + return SWIG_OK; +} + +SWIGRUNTIME void +SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { + if (ptr && (flags & SWIG_SHADOW)) { + SV *self; + SV *obj=newSV(0); + HV *hash=newHV(); + HV *stash; + sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); + stash=SvSTASH(SvRV(obj)); + if (flags & SWIG_POINTER_OWN) { + HV *hv; + GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (!isGV(gv)) + gv_init(gv, stash, "OWNER", 5, FALSE); + hv=GvHVn(gv); + hv_store_ent(hv, obj, newSViv(1), 0); + } + sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); + SvREFCNT_dec(obj); + self=newRV_noinc((SV *)hash); + sv_setsv(sv, self); + SvREFCNT_dec((SV *)self); + sv_bless(sv, stash); + } + else { + sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); + } +} + +SWIGRUNTIMEINLINE SV * +SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { + SV *result = sv_newmortal(); + SWIG_MakePtr(result, ptr, t, flags); + return result; +} + +SWIGRUNTIME void +SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + strcpy(r,SWIG_Perl_TypeProxyName(type)); + sv_setpv(sv, result); +} + +SWIGRUNTIME SV * +SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { + SV *result = sv_newmortal(); + SWIG_Perl_MakePackedObj(result, ptr, sz, type); + return result; +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c = 0; + + if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; + c = SvPV_nolen(obj); + /* Pointer values must start with leading underscore */ + if (*c != '_') return SWIG_ERROR; + c++; + c = SWIG_UnpackData(c,ptr,sz); + if (ty) { + tc = SWIG_TypeCheck(c,ty); + if (!tc) return SWIG_ERROR; + } + return SWIG_OK; +} + + +/* Macros for low-level exception handling */ +#define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } + + +typedef XSPROTO(SwigPerlWrapper); +typedef SwigPerlWrapper *SwigPerlWrapperPtr; + +/* Structure for command table */ +typedef struct { + const char *name; + SwigPerlWrapperPtr wrapper; +} swig_command_info; + +/* Information for constant table */ + +#define SWIG_INT 1 +#define SWIG_FLOAT 2 +#define SWIG_STRING 3 +#define SWIG_POINTER 4 +#define SWIG_BINARY 5 + +/* Constant information structure */ +typedef struct swig_constant_info { + int type; + const char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_constant_info; + + +/* Structure for variable table */ +typedef struct { + const char *name; + SwigMagicFunc set; + SwigMagicFunc get; + swig_type_info **type; +} swig_variable_info; + +/* Magic variable code */ +#ifndef PERL_OBJECT +#define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) + #ifndef MULTIPLICITY + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) + #else + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) + #endif +#else +# define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) +SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) +#endif +{ + MAGIC *mg; + sv_magic(sv,sv,'U',(char *) name,strlen(name)); + mg = mg_find(sv,'U'); + mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); + mg->mg_virtual->svt_get = (SwigMagicFunc) get; + mg->mg_virtual->svt_set = (SwigMagicFunc) set; + mg->mg_virtual->svt_len = 0; + mg->mg_virtual->svt_clear = 0; + mg->mg_virtual->svt_free = 0; +} + + +SWIGRUNTIME swig_module_info * +SWIG_Perl_GetModule(void) { + static void *type_pointer = (void *)0; + SV *pointer; + + /* first check if pointer already created */ + if (!type_pointer) { + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); + if (pointer && SvOK(pointer)) { + type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); + } + } + + return (swig_module_info *) type_pointer; +} + +SWIGRUNTIME void +SWIG_Perl_SetModule(swig_module_info *module) { + SV *pointer; + + /* create a new pointer */ + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); + sv_setiv(pointer, PTR2IV(module)); +} + +#ifdef __cplusplus +} +#endif + +/* Workaround perl5 global namespace pollution. Note that undefining library + * functions like fopen will not solve the problem on all platforms as fopen + * might be a macro on Windows but not necessarily on other operating systems. */ +#ifdef do_open + #undef do_open +#endif +#ifdef do_close + #undef do_close +#endif +#ifdef scalar + #undef scalar +#endif +#ifdef list + #undef list +#endif +#ifdef apply + #undef apply +#endif +#ifdef convert + #undef convert +#endif +#ifdef Error + #undef Error +#endif +#ifdef form + #undef form +#endif +#ifdef vform + #undef vform +#endif +#ifdef LABEL + #undef LABEL +#endif +#ifdef METHOD + #undef METHOD +#endif +#ifdef Move + #undef Move +#endif +#ifdef yylex + #undef yylex +#endif +#ifdef yyparse + #undef yyparse +#endif +#ifdef yyerror + #undef yyerror +#endif +#ifdef invert + #undef invert +#endif +#ifdef ref + #undef ref +#endif +#ifdef read + #undef read +#endif +#ifdef write + #undef write +#endif +#ifdef eof + #undef eof +#endif +#ifdef bool + #undef bool +#endif +#ifdef close + #undef close +#endif +#ifdef rewind + #undef rewind +#endif +#ifdef free + #undef free +#endif +#ifdef malloc + #undef malloc +#endif +#ifdef calloc + #undef calloc +#endif +#ifdef Stat + #undef Stat +#endif +#ifdef check + #undef check +#endif +#ifdef seekdir + #undef seekdir +#endif +#ifdef open + #undef open +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_SCGIhandle swig_types[0] +#define SWIGTYPE_p_char swig_types[1] +static swig_type_info *swig_types[3]; +static swig_module_info swig_module = {swig_types, 2, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#define SWIG_init boot_FSSCGI + +#define SWIG_name "FSSCGIc::boot_FSSCGI" +#define SWIG_prefix "FSSCGIc::" + +#define SWIGVERSION 0x010335 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +#ifdef __cplusplus +extern "C" +#endif +#ifndef PERL_OBJECT +#ifndef MULTIPLICITY +SWIGEXPORT void SWIG_init (CV* cv); +#else +SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); +#endif +#else +SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); +#endif + + +#include "scgi.h" +#include "scgi_oop.h" + + +SWIGINTERNINLINE SV * +SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value) +{ + SV *obj = sv_newmortal(); + sv_setiv(obj, (IV) value); + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_int SWIG_PERL_DECL_ARGS_1(int value) +{ + return SWIG_From_long SWIG_PERL_CALL_ARGS_1(value); +} + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) +{ + if (SvPOK(obj)) { + STRLEN len = 0; + char *cstr = SvPV(obj, len); + size_t size = len + 1; + if (cptr) { + if (alloc) { + if (*alloc == SWIG_NEWOBJ) { + *cptr = reinterpret_cast< char* >(memcpy((new char[size]), cstr, sizeof(char)*(size))); + } else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } + } + if (psize) *psize = size; + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + char* vptr = 0; + if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = vptr; + if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + + + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) +{ + if (SvNIOK(obj)) { + if (val) *val = SvNV(obj); + return SWIG_OK; + } else if (SvIOK(obj)) { + if (val) *val = (double) SvIV(obj); + return SWIG_AddCast(SWIG_OK); + } else { + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + double v = strtod(nptr, &endptr); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + } + return SWIG_TypeError; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val) +{ + if (SvIOK(obj)) { + if (val) *val = SvIV(obj); + return SWIG_OK; + } else { + int dispatch = 0; + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + long v; + errno = 0; + v = strtol(nptr, &endptr,0); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + SV *obj = sv_newmortal(); + if (carray) { + sv_setpvn(obj, carray, size); + } else { + sv_setsv(obj, &PL_sv_undef); + } + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PERL_OBJECT +#define MAGIC_CLASS _wrap_FSSCGI_var:: +class _wrap_FSSCGI_var : public CPerlObj { +public: +#else +#define MAGIC_CLASS +#endif +SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) { + MAGIC_PPERL + croak("Value is read-only."); + return 0; +} + + +#ifdef PERL_OBJECT +}; +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif +XS(_wrap_new_SCGIhandle) { + { + SCGIhandle *result = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: new_SCGIhandle();"); + } + result = (SCGIhandle *)new SCGIhandle(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SCGIhandle, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_SCGIhandle) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_SCGIhandle(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SCGIhandle" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + delete arg1; + + + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_connected) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_connected(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_connected" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (int)(arg1)->connected(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_socketDescriptor) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_socketDescriptor(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_socketDescriptor" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (int)(arg1)->socketDescriptor(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_disconnect) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_disconnect(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_disconnect" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (int)(arg1)->disconnect(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_addParam) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: SCGIhandle_addParam(self,name,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_addParam" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_addParam" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SCGIhandle_addParam" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)(arg1)->addParam((char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_addBody) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *arg2 = (char *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SCGIhandle_addBody(self,value);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_addBody" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_addBody" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)(arg1)->addBody((char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_sendRequest) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *arg2 = (char *) 0 ; + int arg3 ; + int arg4 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int val4 ; + int ecode4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: SCGIhandle_sendRequest(self,host,port,timeout);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_sendRequest" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_sendRequest" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SCGIhandle_sendRequest" "', argument " "3"" of type '" "int""'"); + } + arg3 = static_cast< int >(val3); + ecode4 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(3), &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SCGIhandle_sendRequest" "', argument " "4"" of type '" "int""'"); + } + arg4 = static_cast< int >(val4); + result = (int)(arg1)->sendRequest((char const *)arg2,arg3,arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_recv) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_recv(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_recv" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (char *)(arg1)->recv(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_bind) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *arg2 = (char *) 0 ; + int arg3 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: SCGIhandle_bind(self,host,port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_bind" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_bind" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SCGIhandle_bind" "', argument " "3"" of type '" "int""'"); + } + arg3 = static_cast< int >(val3); + result = (int)(arg1)->bind((char const *)arg2,arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_accept) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_accept(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_accept" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (int)(arg1)->accept(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static swig_type_info _swigt__p_SCGIhandle = {"_p_SCGIhandle", "SCGIhandle *", 0, 0, (void*)"FSSCGI::SCGIhandle", 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_SCGIhandle, + &_swigt__p_char, +}; + +static swig_cast_info _swigc__p_SCGIhandle[] = { {&_swigt__p_SCGIhandle, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_SCGIhandle, + _swigc__p_char, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_constant_info swig_constants[] = { +{0,0,0,0,0,0} +}; +#ifdef __cplusplus +} +#endif +static swig_variable_info swig_variables[] = { +{0,0,0,0} +}; +static swig_command_info swig_commands[] = { +{"FSSCGIc::new_SCGIhandle", _wrap_new_SCGIhandle}, +{"FSSCGIc::delete_SCGIhandle", _wrap_delete_SCGIhandle}, +{"FSSCGIc::SCGIhandle_connected", _wrap_SCGIhandle_connected}, +{"FSSCGIc::SCGIhandle_socketDescriptor", _wrap_SCGIhandle_socketDescriptor}, +{"FSSCGIc::SCGIhandle_disconnect", _wrap_SCGIhandle_disconnect}, +{"FSSCGIc::SCGIhandle_addParam", _wrap_SCGIhandle_addParam}, +{"FSSCGIc::SCGIhandle_addBody", _wrap_SCGIhandle_addBody}, +{"FSSCGIc::SCGIhandle_sendRequest", _wrap_SCGIhandle_sendRequest}, +{"FSSCGIc::SCGIhandle_recv", _wrap_SCGIhandle_recv}, +{"FSSCGIc::SCGIhandle_bind", _wrap_SCGIhandle_bind}, +{"FSSCGIc::SCGIhandle_accept", _wrap_SCGIhandle_accept}, +{0,0} +}; +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" +#endif + +XS(SWIG_init) { + dXSARGS; + int i; + + SWIG_InitializeModule(0); + + /* Install commands */ + for (i = 0; swig_commands[i].name; i++) { + newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__); + } + + /* Install variables */ + for (i = 0; swig_variables[i].name; i++) { + SV *sv; + sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); + if (swig_variables[i].type) { + SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); + } else { + sv_setiv(sv,(IV) 0); + } + swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); + } + + /* Install constant */ + for (i = 0; swig_constants[i].type; i++) { + SV *sv; + sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); + switch(swig_constants[i].type) { + case SWIG_INT: + sv_setiv(sv, (IV) swig_constants[i].lvalue); + break; + case SWIG_FLOAT: + sv_setnv(sv, (double) swig_constants[i].dvalue); + break; + case SWIG_STRING: + sv_setpv(sv, (char *) swig_constants[i].pvalue); + break; + case SWIG_POINTER: + SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); + break; + case SWIG_BINARY: + SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); + break; + default: + break; + } + SvREADONLY_on(sv); + } + + SWIG_TypeClientData(SWIGTYPE_p_SCGIhandle, (void*) "FSSCGI::SCGIhandle"); + ST(0) = &PL_sv_yes; + XSRETURN(1); +} + diff --git a/libs/libscgi/src/include/scgi.h b/libs/libscgi/src/include/scgi.h index 29abcf0271..8a789a3a9f 100644 --- a/libs/libscgi/src/include/scgi.h +++ b/libs/libscgi/src/include/scgi.h @@ -179,7 +179,7 @@ typedef enum { SCGI_GENERR } scgi_status_t; -typedef void (*scgi_listen_callback_t)(scgi_socket_t server_sock, scgi_socket_t client_sock, struct sockaddr_in *addr); +typedef void (*scgi_listen_callback_t)(scgi_socket_t server_sock, scgi_socket_t *client_sock, struct sockaddr_in *addr); SCGI_DECLARE(scgi_status_t) scgi_connect(scgi_handle_t *handle, const char *host, scgi_port_t port, uint32_t timeout); SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle); @@ -193,6 +193,8 @@ SCGI_DECLARE(scgi_status_t) scgi_destroy_params(scgi_handle_t *handle); SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi_listen_callback_t callback); SCGI_DECLARE(const char *) scgi_get_body(scgi_handle_t *handle); SCGI_DECLARE(const char *) scgi_get_param(scgi_handle_t *handle, const char *name); +SCGI_DECLARE(scgi_status_t) scgi_bind(const char *host, scgi_port_t port, scgi_socket_t *socketp); +SCGI_DECLARE(scgi_status_t) scgi_accept(scgi_socket_t server_sock, scgi_socket_t *client_sock_p, struct sockaddr_in *echoClntAddr); #ifdef __cplusplus } diff --git a/libs/libscgi/src/include/scgi_oop.h b/libs/libscgi/src/include/scgi_oop.h new file mode 100644 index 0000000000..a49c96cdd1 --- /dev/null +++ b/libs/libscgi/src/include/scgi_oop.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2007-2012, Anthony Minessale II + * 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. + */ + +#ifndef _SCGI_OOP_H_ +#define _SCGI_OOP_H_ +#include +#ifdef __cplusplus +extern "C" { +#endif + +#define this_check(x) do { if (!this) { scgi_log(SCGI_LOG_ERROR, "object is not initalized\n"); return x;}} while(0) +#define this_check_void() do { if (!this) { scgi_log(SCGI_LOG_ERROR, "object is not initalized\n"); return;}} while(0) + + + +class SCGIhandle { + private: + scgi_handle_t handle; + unsigned char buf[65536]; + public: + SCGIhandle(); + virtual ~SCGIhandle(); + int connected(); + int socketDescriptor(); + int disconnect(void); + int addParam(const char *name, const char *value); + int addBody(const char *value); + int sendRequest(const char *host, int port, int timeout); + char *recv(); + int bind(const char *host, int port); + int accept(void); +}; + + + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index f50b5b8d88..f33afe30c8 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -548,7 +548,7 @@ static int scgi_socket_reuseaddr(scgi_socket_t socket) #endif } -SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi_listen_callback_t callback) +SCGI_DECLARE(scgi_status_t) scgi_bind(const char *host, scgi_port_t port, scgi_socket_t *socketp) { scgi_socket_t server_sock = SCGI_SOCK_INVALID; struct sockaddr_in addr; @@ -573,32 +573,64 @@ SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi if (listen(server_sock, 10000) < 0) { status = SCGI_FAIL; goto end; - } - - for (;;) { - int client_sock; - struct sockaddr_in echoClntAddr; -#ifdef WIN32 - int clntLen; -#else - unsigned int clntLen; -#endif - - clntLen = sizeof(echoClntAddr); - - if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == SCGI_SOCK_INVALID) { - status = SCGI_FAIL; - goto end; - } - - callback(server_sock, client_sock, &echoClntAddr); - } + } end: if (server_sock != SCGI_SOCK_INVALID) { closesocket(server_sock); server_sock = SCGI_SOCK_INVALID; + } else { + *socketp = server_sock; + } + + return status; +} + +SCGI_DECLARE(scgi_status_t) scgi_accept(scgi_socket_t server_sock, scgi_socket_t *client_sock_p, struct sockaddr_in *echoClntAddr) +{ + scgi_status_t status = SCGI_SUCCESS; + int client_sock; + struct sockaddr_in local_echoClntAddr; +#ifdef WIN32 + int clntLen; +#else + unsigned int clntLen; +#endif + + if (!echoClntAddr) { + echoClntAddr = &local_echoClntAddr; + } + + + clntLen = sizeof(*echoClntAddr); + + if ((client_sock = accept(server_sock, (struct sockaddr *) echoClntAddr, &clntLen)) == SCGI_SOCK_INVALID) { + status = SCGI_FAIL; + } else { + *client_sock_p = client_sock; + } + + return status; +} + +SCGI_DECLARE(scgi_status_t) scgi_listen(const char *host, scgi_port_t port, scgi_listen_callback_t callback) +{ + + scgi_socket_t server_sock = SCGI_SOCK_INVALID, client_sock = SCGI_SOCK_INVALID; + scgi_status_t status = SCGI_FAIL; + struct sockaddr_in echoClntAddr; + + if ((status = scgi_bind(host, port, &server_sock)) == SCGI_SUCCESS) { + + while(scgi_accept(server_sock, &client_sock, &echoClntAddr) == SCGI_SUCCESS) { + callback(server_sock, &client_sock, &echoClntAddr); + + if (client_sock != SCGI_SOCK_INVALID) { + closesocket(client_sock); + client_sock = SCGI_SOCK_INVALID; + } + } } return status; diff --git a/libs/libscgi/src/scgi_oop.cpp b/libs/libscgi/src/scgi_oop.cpp new file mode 100644 index 0000000000..c5b98334b9 --- /dev/null +++ b/libs/libscgi/src/scgi_oop.cpp @@ -0,0 +1,101 @@ +#include +#include + +#define connection_construct_common() memset(&handle, 0, sizeof(handle)) + + + +SCGIhandle::SCGIhandle(void) +{ + connection_construct_common(); +} + +SCGIhandle::~SCGIhandle() +{ + if (handle.connected) { + scgi_disconnect(&handle); + } +} + +int SCGIhandle::socketDescriptor() +{ + if (handle.connected) { + return (int) handle.sock; + } + + return -1; +} + + +int SCGIhandle::disconnect() +{ + if (handle.connected) { + return scgi_disconnect(&handle); + } + + return 0; +} + +int SCGIhandle::connected() +{ + return handle.connected; +} + +int SCGIhandle::addParam(const char *name, const char *value) +{ + return (int) scgi_add_param(&handle, name, value); +} + +int SCGIhandle::addBody(const char *value) +{ + return (int) scgi_add_body(&handle, value); +} + + +int SCGIhandle::sendRequest(const char *host, int port, int timeout) +{ + if (!host) { + return -2; + } + + if (timeout < 1000) { + timeout = 1000; + } + + if (scgi_connect(&handle, host, port, timeout) == SCGI_SUCCESS) { + return (int) scgi_send_request(&handle); + } + + return -2; +} + +char *SCGIhandle::recv(void) +{ + ssize_t len = scgi_recv(&handle, buf, sizeof(buf)); + + if (len > 0) { + return (char *)buf; + } + + return NULL; +} + + +int SCGIhandle::bind(const char *host, int port) +{ + return (int) scgi_bind(host, port, &handle.sock); +} + + +int SCGIhandle::accept(void) +{ + scgi_socket_t client_sock; + + if (scgi_accept(handle.sock, &client_sock, NULL) == SCGI_SUCCESS) { + return (int) client_sock; + } + + return -1; +} + + diff --git a/libs/libscgi/testserver.c b/libs/libscgi/testserver.c index 7cb6e32a03..2a784e83a8 100644 --- a/libs/libscgi/testserver.c +++ b/libs/libscgi/testserver.c @@ -1,12 +1,14 @@ #include -static void callback(scgi_socket_t server_sock, scgi_socket_t client_sock, struct sockaddr_in *addr) +static void callback(scgi_socket_t server_sock, scgi_socket_t *client_sock, struct sockaddr_in *addr) { scgi_handle_t handle = { 0 }; if (scgi_parse(client_sock, &handle) == SCGI_SUCCESS) { scgi_param_t *pp; + *client_sock = SCGI_SOCK_INVALID; + for(pp = handle.params; pp; pp = pp->next) { printf("HEADER: [%s] VALUE: [%s]\n", pp->name, pp->value); } @@ -15,10 +17,9 @@ static void callback(scgi_socket_t server_sock, scgi_socket_t client_sock, struc printf("\n\nBODY:\n%s\n\n", handle.body); } + scgi_disconnect(&handle); } - scgi_disconnect(&handle); - } int main(int argc, char *argv[]) From 4b2e7fc1f20a78909431997392fd355b2eed4a0d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 May 2012 11:31:17 -0500 Subject: [PATCH 371/731] perl update --- libs/libscgi/perl/FSSCGI.pm | 4 +- libs/libscgi/perl/scgi_wrap.cpp | 142 ++++++++++++++++++++++------ libs/libscgi/perl/testclient.pl | 19 ++++ libs/libscgi/perl/testserver.pl | 17 ++++ libs/libscgi/src/include/scgi.h | 5 + libs/libscgi/src/include/scgi_oop.h | 10 +- libs/libscgi/src/scgi.c | 31 +++--- libs/libscgi/src/scgi_oop.cpp | 84 ++++++++++------ libs/libscgi/testserver.c | 2 +- 9 files changed, 238 insertions(+), 76 deletions(-) create mode 100644 libs/libscgi/perl/testclient.pl create mode 100644 libs/libscgi/perl/testserver.pl diff --git a/libs/libscgi/perl/FSSCGI.pm b/libs/libscgi/perl/FSSCGI.pm index 7dfd256e05..05370a12a7 100644 --- a/libs/libscgi/perl/FSSCGI.pm +++ b/libs/libscgi/perl/FSSCGI.pm @@ -79,8 +79,10 @@ sub DESTROY { *disconnect = *FSSCGIc::SCGIhandle_disconnect; *addParam = *FSSCGIc::SCGIhandle_addParam; *addBody = *FSSCGIc::SCGIhandle_addBody; +*getBody = *FSSCGIc::SCGIhandle_getBody; +*getParam = *FSSCGIc::SCGIhandle_getParam; *sendRequest = *FSSCGIc::SCGIhandle_sendRequest; -*recv = *FSSCGIc::SCGIhandle_recv; +*respond = *FSSCGIc::SCGIhandle_respond; *bind = *FSSCGIc::SCGIhandle_bind; *accept = *FSSCGIc::SCGIhandle_accept; sub DISOWN { diff --git a/libs/libscgi/perl/scgi_wrap.cpp b/libs/libscgi/perl/scgi_wrap.cpp index aaa8e40219..cc96e9494c 100644 --- a/libs/libscgi/perl/scgi_wrap.cpp +++ b/libs/libscgi/perl/scgi_wrap.cpp @@ -1556,6 +1556,26 @@ SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) +SWIGINTERNINLINE SV * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + SV *obj = sv_newmortal(); + if (carray) { + sv_setpvn(obj, carray, size); + } else { + sv_setsv(obj, &PL_sv_undef); + } + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) @@ -1683,26 +1703,6 @@ SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) return res; } - -SWIGINTERNINLINE SV * -SWIG_FromCharPtrAndSize(const char* carray, size_t size) -{ - SV *obj = sv_newmortal(); - if (carray) { - sv_setpvn(obj, carray, size); - } else { - sv_setsv(obj, &PL_sv_undef); - } - return obj; -} - - -SWIGINTERNINLINE SV * -SWIG_FromCharPtr(const char *cptr) -{ - return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); -} - #ifdef __cplusplus extern "C" { #endif @@ -1951,13 +1951,80 @@ XS(_wrap_SCGIhandle_addBody) { } +XS(_wrap_SCGIhandle_getBody) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: SCGIhandle_getBody(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_getBody" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + result = (char *)(arg1)->getBody(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_SCGIhandle_getParam) { + { + SCGIhandle *arg1 = (SCGIhandle *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SCGIhandle_getParam(self,name);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_getParam" "', argument " "1"" of type '" "SCGIhandle *""'"); + } + arg1 = reinterpret_cast< SCGIhandle * >(argp1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_getParam" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)(arg1)->getParam((char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + XS(_wrap_SCGIhandle_sendRequest) { { SCGIhandle *arg1 = (SCGIhandle *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; int arg4 ; - int result; + char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; @@ -1993,8 +2060,8 @@ XS(_wrap_SCGIhandle_sendRequest) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SCGIhandle_sendRequest" "', argument " "4"" of type '" "int""'"); } arg4 = static_cast< int >(val4); - result = (int)(arg1)->sendRequest((char const *)arg2,arg3,arg4); - ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + result = (char *)(arg1)->sendRequest((char const *)arg2,arg3,arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; if (alloc2 == SWIG_NEWOBJ) delete[] buf2; @@ -2010,29 +2077,40 @@ XS(_wrap_SCGIhandle_sendRequest) { } -XS(_wrap_SCGIhandle_recv) { +XS(_wrap_SCGIhandle_respond) { { SCGIhandle *arg1 = (SCGIhandle *) 0 ; - char *result = 0 ; + char *arg2 = (char *) 0 ; + int result; void *argp1 = 0 ; int res1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; int argvi = 0; dXSARGS; - if ((items < 1) || (items > 1)) { - SWIG_croak("Usage: SCGIhandle_recv(self);"); + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: SCGIhandle_respond(self,msg);"); } res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_SCGIhandle, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_recv" "', argument " "1"" of type '" "SCGIhandle *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SCGIhandle_respond" "', argument " "1"" of type '" "SCGIhandle *""'"); } arg1 = reinterpret_cast< SCGIhandle * >(argp1); - result = (char *)(arg1)->recv(); - ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SCGIhandle_respond" "', argument " "2"" of type '" "char *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)(arg1)->respond(arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; XSRETURN(argvi); fail: + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; SWIG_croak_null(); } } @@ -2154,8 +2232,10 @@ static swig_command_info swig_commands[] = { {"FSSCGIc::SCGIhandle_disconnect", _wrap_SCGIhandle_disconnect}, {"FSSCGIc::SCGIhandle_addParam", _wrap_SCGIhandle_addParam}, {"FSSCGIc::SCGIhandle_addBody", _wrap_SCGIhandle_addBody}, +{"FSSCGIc::SCGIhandle_getBody", _wrap_SCGIhandle_getBody}, +{"FSSCGIc::SCGIhandle_getParam", _wrap_SCGIhandle_getParam}, {"FSSCGIc::SCGIhandle_sendRequest", _wrap_SCGIhandle_sendRequest}, -{"FSSCGIc::SCGIhandle_recv", _wrap_SCGIhandle_recv}, +{"FSSCGIc::SCGIhandle_respond", _wrap_SCGIhandle_respond}, {"FSSCGIc::SCGIhandle_bind", _wrap_SCGIhandle_bind}, {"FSSCGIc::SCGIhandle_accept", _wrap_SCGIhandle_accept}, {0,0} diff --git a/libs/libscgi/perl/testclient.pl b/libs/libscgi/perl/testclient.pl new file mode 100644 index 0000000000..59415baf72 --- /dev/null +++ b/libs/libscgi/perl/testclient.pl @@ -0,0 +1,19 @@ +use FSSCGI; + + +my $handle = new FSSCGI::SCGIhandle(); + + $handle->addParam( "REQUEST_METHOD", "POST"); + $handle->addParam( "REQUEST_URI", "/deepthought"); + $handle->addParam( "TESTING", "TRUE"); + $handle->addParam( "TESTING", "TRUE"); + $handle->addBody("What is the answer to life?"); + + + +if ((my $response = $handle->sendRequest("127.0.0.1", 7777, 10000))) { + print "RESP[$response]\n"; +} else { + print "ERROR!\n"; +} + diff --git a/libs/libscgi/perl/testserver.pl b/libs/libscgi/perl/testserver.pl new file mode 100644 index 0000000000..6e03d5c5e4 --- /dev/null +++ b/libs/libscgi/perl/testserver.pl @@ -0,0 +1,17 @@ +use FSSCGI; + + +my $handle = new FSSCGI::SCGIhandle(); + +if ($handle->bind("127.0.0.1", 7777)) { + + while($handle->accept()) { + print "REQ: " . $handle->getBody(). "\n\n"; + $handle->respond("W00t!!!!!!\n"); + } + + print "DONE\n"; + +} else { + print "FAIL\n"; +} diff --git a/libs/libscgi/src/include/scgi.h b/libs/libscgi/src/include/scgi.h index 8a789a3a9f..b6a5165858 100644 --- a/libs/libscgi/src/include/scgi.h +++ b/libs/libscgi/src/include/scgi.h @@ -183,6 +183,7 @@ typedef void (*scgi_listen_callback_t)(scgi_socket_t server_sock, scgi_socket_t SCGI_DECLARE(scgi_status_t) scgi_connect(scgi_handle_t *handle, const char *host, scgi_port_t port, uint32_t timeout); SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle); +SCGI_DECLARE(scgi_status_t) scgi_parse(scgi_socket_t sock, scgi_handle_t *handle); SCGI_DECLARE(int) scgi_wait_sock(scgi_socket_t sock, uint32_t ms, scgi_poll_t flags); SCGI_DECLARE(ssize_t) scgi_recv(scgi_handle_t *handle, unsigned char *buf, size_t buflen); SCGI_DECLARE(scgi_status_t) scgi_send_request(scgi_handle_t *handle); @@ -196,6 +197,10 @@ SCGI_DECLARE(const char *) scgi_get_param(scgi_handle_t *handle, const char *nam SCGI_DECLARE(scgi_status_t) scgi_bind(const char *host, scgi_port_t port, scgi_socket_t *socketp); SCGI_DECLARE(scgi_status_t) scgi_accept(scgi_socket_t server_sock, scgi_socket_t *client_sock_p, struct sockaddr_in *echoClntAddr); +#ifndef WIN32 +#define closesocket(x) shutdown(x, 2); close(x) +#endif + #ifdef __cplusplus } #endif /* defined(__cplusplus) */ diff --git a/libs/libscgi/src/include/scgi_oop.h b/libs/libscgi/src/include/scgi_oop.h index a49c96cdd1..64f3267779 100644 --- a/libs/libscgi/src/include/scgi_oop.h +++ b/libs/libscgi/src/include/scgi_oop.h @@ -45,8 +45,12 @@ extern "C" { class SCGIhandle { private: + scgi_socket_t server_sock; scgi_handle_t handle; unsigned char buf[65536]; + char *data_buf; + int buflen; + int bufsize; public: SCGIhandle(); virtual ~SCGIhandle(); @@ -55,8 +59,10 @@ class SCGIhandle { int disconnect(void); int addParam(const char *name, const char *value); int addBody(const char *value); - int sendRequest(const char *host, int port, int timeout); - char *recv(); + char *getBody(); + char *getParam(const char *name); + char *sendRequest(const char *host, int port, int timeout); + int respond(char *msg); int bind(const char *host, int port); int accept(void); }; diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index f33afe30c8..9f8e9956e0 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -34,7 +34,6 @@ #include #ifndef WIN32 -#define closesocket(x) shutdown(x, 2); close(x) #include #include #else @@ -385,11 +384,9 @@ SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle) return SCGI_FAIL; } - handle->destroyed = 1; - handle->connected = 0; - - scgi_destroy_params(handle); - scgi_safe_free(handle->body); + if (!handle->sock) { + abort(); + } if (handle->sock != SCGI_SOCK_INVALID) { closesocket(handle->sock); @@ -397,6 +394,12 @@ SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle) status = SCGI_SUCCESS; } + handle->destroyed = 1; + handle->connected = 0; + + scgi_destroy_params(handle); + scgi_safe_free(handle->body); + return status; } @@ -577,9 +580,11 @@ SCGI_DECLARE(scgi_status_t) scgi_bind(const char *host, scgi_port_t port, scgi_s end: - if (server_sock != SCGI_SOCK_INVALID) { - closesocket(server_sock); - server_sock = SCGI_SOCK_INVALID; + if (status == SCGI_FAIL) { + if (server_sock != SCGI_SOCK_INVALID) { + closesocket(server_sock); + server_sock = SCGI_SOCK_INVALID; + } } else { *socketp = server_sock; } @@ -601,11 +606,11 @@ SCGI_DECLARE(scgi_status_t) scgi_accept(scgi_socket_t server_sock, scgi_socket_t if (!echoClntAddr) { echoClntAddr = &local_echoClntAddr; } - - + clntLen = sizeof(*echoClntAddr); if ((client_sock = accept(server_sock, (struct sockaddr *) echoClntAddr, &clntLen)) == SCGI_SOCK_INVALID) { + printf("FRICK %s\n", strerror(errno)); status = SCGI_FAIL; } else { *client_sock_p = client_sock; @@ -652,10 +657,12 @@ SCGI_DECLARE(scgi_status_t) scgi_parse(scgi_socket_t sock, scgi_handle_t *handle char *body = NULL; char comma = 0; + memset(handle, 0, sizeof(*handle)); + handle->sock = sock; + handle->connected = 1; sock_setup(handle); - for(;;) { diff --git a/libs/libscgi/src/scgi_oop.cpp b/libs/libscgi/src/scgi_oop.cpp index c5b98334b9..4001b748a3 100644 --- a/libs/libscgi/src/scgi_oop.cpp +++ b/libs/libscgi/src/scgi_oop.cpp @@ -12,9 +12,12 @@ SCGIhandle::SCGIhandle(void) SCGIhandle::~SCGIhandle() { - if (handle.connected) { - scgi_disconnect(&handle); - } + + scgi_disconnect(&handle); + scgi_safe_free(data_buf); + buflen = 0; + bufsize = 0; + } int SCGIhandle::socketDescriptor() @@ -29,11 +32,7 @@ int SCGIhandle::socketDescriptor() int SCGIhandle::disconnect() { - if (handle.connected) { - return scgi_disconnect(&handle); - } - - return 0; + return scgi_disconnect(&handle); } int SCGIhandle::connected() @@ -51,11 +50,22 @@ int SCGIhandle::addBody(const char *value) return (int) scgi_add_body(&handle, value); } - -int SCGIhandle::sendRequest(const char *host, int port, int timeout) +char *SCGIhandle::getBody() { + return handle.body; +} + +char *SCGIhandle::getParam(const char *name) +{ + return (char *) scgi_get_param(&handle, name); +} + +char *SCGIhandle::sendRequest(const char *host, int port, int timeout) +{ + ssize_t len; + if (!host) { - return -2; + return 0; } if (timeout < 1000) { @@ -63,27 +73,30 @@ int SCGIhandle::sendRequest(const char *host, int port, int timeout) } if (scgi_connect(&handle, host, port, timeout) == SCGI_SUCCESS) { - return (int) scgi_send_request(&handle); + if (scgi_send_request(&handle) == SCGI_SUCCESS) { + while((len = scgi_recv(&handle, buf, sizeof(buf))) > 0) { + if (buflen + len > bufsize) { + bufsize = buflen + len + 1024; + void *tmp = realloc(data_buf, bufsize); + assert(tmp); + data_buf = (char *)tmp; + + *(data_buf+buflen) = '\0'; + } + snprintf(data_buf+buflen, bufsize-buflen, "%s", buf); + buflen += len; + } + + return data_buf; + } } - return -2; + return (char *) ""; } -char *SCGIhandle::recv(void) -{ - ssize_t len = scgi_recv(&handle, buf, sizeof(buf)); - - if (len > 0) { - return (char *)buf; - } - - return NULL; -} - - int SCGIhandle::bind(const char *host, int port) { - return (int) scgi_bind(host, port, &handle.sock); + return (scgi_bind(host, port, &server_sock) == SCGI_SUCCESS) ? 1 : 0; } @@ -91,11 +104,24 @@ int SCGIhandle::accept(void) { scgi_socket_t client_sock; - if (scgi_accept(handle.sock, &client_sock, NULL) == SCGI_SUCCESS) { - return (int) client_sock; + if (scgi_accept(server_sock, &client_sock, NULL) == SCGI_SUCCESS) { + if (scgi_parse(client_sock, &handle) == SCGI_SUCCESS) { + return 1; + } + + closesocket(client_sock); } - return -1; + return 0; } +int SCGIhandle::respond(char *msg) +{ + int b = write(handle.sock, msg, strlen(msg)); + scgi_disconnect(&handle); + scgi_safe_free(data_buf); + buflen = 0; + bufsize = 0; + return b; +} diff --git a/libs/libscgi/testserver.c b/libs/libscgi/testserver.c index 2a784e83a8..153a215c0e 100644 --- a/libs/libscgi/testserver.c +++ b/libs/libscgi/testserver.c @@ -4,7 +4,7 @@ static void callback(scgi_socket_t server_sock, scgi_socket_t *client_sock, stru { scgi_handle_t handle = { 0 }; - if (scgi_parse(client_sock, &handle) == SCGI_SUCCESS) { + if (scgi_parse(*client_sock, &handle) == SCGI_SUCCESS) { scgi_param_t *pp; *client_sock = SCGI_SOCK_INVALID; From 0a70ea3e09f36f62651b2a9a83e5b8d1847ad8a6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 May 2012 13:12:32 -0500 Subject: [PATCH 372/731] scgi updates --- libs/libscgi/src/include/scgi.h | 2 +- libs/libscgi/src/scgi.c | 4 ---- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/libs/libscgi/src/include/scgi.h b/libs/libscgi/src/include/scgi.h index b6a5165858..575a45f7f9 100644 --- a/libs/libscgi/src/include/scgi.h +++ b/libs/libscgi/src/include/scgi.h @@ -198,7 +198,7 @@ SCGI_DECLARE(scgi_status_t) scgi_bind(const char *host, scgi_port_t port, scgi_s SCGI_DECLARE(scgi_status_t) scgi_accept(scgi_socket_t server_sock, scgi_socket_t *client_sock_p, struct sockaddr_in *echoClntAddr); #ifndef WIN32 -#define closesocket(x) shutdown(x, 2); close(x) +#define closesocket(x) close(x) #endif #ifdef __cplusplus diff --git a/libs/libscgi/src/scgi.c b/libs/libscgi/src/scgi.c index 9f8e9956e0..df05b5980b 100644 --- a/libs/libscgi/src/scgi.c +++ b/libs/libscgi/src/scgi.c @@ -384,10 +384,6 @@ SCGI_DECLARE(scgi_status_t) scgi_disconnect(scgi_handle_t *handle) return SCGI_FAIL; } - if (!handle->sock) { - abort(); - } - if (handle->sock != SCGI_SOCK_INVALID) { closesocket(handle->sock); handle->sock = SCGI_SOCK_INVALID; diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 97b6bdcf0a..6ee62d6ac9 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -145,7 +145,7 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con scgi_disconnect(&handle); - if (len < 0) { + if (len < 0 && (!txt || !strlen(txt))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG:\nURL: %s Connection Read Failed: [%s]\n", binding->url, handle.err); goto end; } From 6df4d7cdc50531254a40392b23a499cbbe4d137a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 23 May 2012 13:13:32 -0500 Subject: [PATCH 373/731] FS-4245 --resolve --- src/switch_core_memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/switch_core_memory.c b/src/switch_core_memory.c index 3a93632338..38a066b020 100644 --- a/src/switch_core_memory.c +++ b/src/switch_core_memory.c @@ -646,7 +646,7 @@ switch_memory_pool_t *switch_core_memory_init(void) switch_queue_create(&memory_manager.pool_recycle_queue, 50000, memory_manager.memory_pool); switch_threadattr_create(&thd_attr, memory_manager.memory_pool); - switch_threadattr_detach_set(thd_attr, 1); + switch_threadattr_detach_set(thd_attr, 0); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); switch_thread_create(&pool_thread_p, thd_attr, pool_thread, NULL, memory_manager.memory_pool); From 11d4658ac4c801f790e606c0993652045075fff9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 23 May 2012 21:28:03 +0000 Subject: [PATCH 374/731] debian: package mod_say_fa (Say for Persian) --- debian/control-modules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debian/control-modules b/debian/control-modules index e229b86fc7..5b76bd5d26 100644 --- a/debian/control-modules +++ b/debian/control-modules @@ -572,6 +572,10 @@ Module: say/mod_say_es Description: mod_say_es Adds mod_say_es. +Module: say/mod_say_fa +Description: mod_say_fa + Adds mod_say_fa. + Module: say/mod_say_fr Description: mod_say_fr Adds mod_say_fr. From cb58e81c17b2f4c2b3ff0cfad92c0a7c06c81c6a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 23 May 2012 05:20:13 +0000 Subject: [PATCH 375/731] add editor variables to mod_sofia.h --- src/mod/endpoints/mod_sofia/mod_sofia.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 5902cdad93..f6e4c1122e 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -1179,3 +1179,15 @@ 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); + + +/* 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 16cf43a68d080139d01acba48f6048da185df9fb Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 2 May 2012 07:42:16 +0000 Subject: [PATCH 376/731] fix indentation; whitespace --- src/mod/endpoints/mod_sofia/sofia.c | 39 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 8a1409bb27..e5d026975d 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -6409,31 +6409,30 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, switch_core_session_rwunlock(other_session); } } else { - uint8_t match = 0; - int is_ok = 1; + uint8_t match = 0; + int is_ok = 1; + if (tech_pvt->num_codecs) { + match = sofia_glue_negotiate_sdp(session, r_sdp); + } - if (tech_pvt->num_codecs) { - match = sofia_glue_negotiate_sdp(session, r_sdp); - } - - if (match) { - sofia_set_flag_locked(tech_pvt, TFLAG_REINVITE); - if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "RTP Error!\n"); - switch_channel_set_variable(tech_pvt->channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RTP ERROR"); + if (match) { + sofia_set_flag_locked(tech_pvt, TFLAG_REINVITE); + if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "RTP Error!\n"); + switch_channel_set_variable(tech_pvt->channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RTP ERROR"); + is_ok = 0; + } + sofia_clear_flag_locked(tech_pvt, TFLAG_REINVITE); + } else { + switch_channel_set_variable(tech_pvt->channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); is_ok = 0; } - sofia_clear_flag_locked(tech_pvt, TFLAG_REINVITE); - } else { - switch_channel_set_variable(tech_pvt->channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); - is_ok = 0; - } - if (!is_ok) { - nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); - switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); - } + if (!is_ok) { + nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); + switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); + } } goto done; } From 0c1a95f745dda29d26103575d92bf8bb46a8e19d Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 00:44:32 +0000 Subject: [PATCH 377/731] fix gcc 4.7.0 warning related to enum type This amends commit 7bd9efc7f52a725b7ef9efb64b65873b4bc4330b. We changed away from using unsigned here because it caused a warning on Windows. Using the more specific type, however, is causing a warning on gcc-4.7 (it notices that the switch statement contains values not present in the specified enum type). So we're switching back to unsigned here while keeping the type casts and hoping that keeps Windows happy. --- 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 be7f180fcd..4de962a31c 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -692,7 +692,7 @@ static int zrtp_send_rtp_callback(const zrtp_stream_t *stream, char *rtp_packet, return status; } -static void zrtp_event_callback(zrtp_stream_t *stream, zrtp_security_event_t event) +static void zrtp_event_callback(zrtp_stream_t *stream, unsigned event) { switch_rtp_t *rtp_session = zrtp_stream_get_userdata(stream); zrtp_session_info_t zrtp_session_info; From 236b927780c8ebd05f35381f651c7acc6406b7d8 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 03:50:42 +0000 Subject: [PATCH 378/731] lower log level on ZRTP protection drop When a call is being setup, a couple seconds of audio may be sent unencrypted. This seems to trigger the log message here with every such packet. --- 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 4de962a31c..92c580664e 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3972,7 +3972,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, case zrtp_status_ok: break; case zrtp_status_drop: - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error: zRTP protection drop with code %d\n", stat); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error: zRTP protection drop with code %d\n", stat); ret = (int) bytes; goto end; break; From d470ae239cfb5fdf6df81efc2f1b9290690ae070 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 03:52:51 +0000 Subject: [PATCH 379/731] don't log ZRTP protection drops At least until we can distinguish the meaningful ones from the noise. --- 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 92c580664e..c91175a108 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3972,7 +3972,7 @@ static int rtp_common_write(switch_rtp_t *rtp_session, case zrtp_status_ok: break; case zrtp_status_drop: - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error: zRTP protection drop with code %d\n", stat); + /* switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error: zRTP protection drop with code %d\n", stat); */ ret = (int) bytes; goto end; break; From f37b1f0c54e8e3e8bb9cc9a276fe743fa95357c9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 03:58:26 +0000 Subject: [PATCH 380/731] squelch another source of noise ZRTP protection drops --- 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 c91175a108..1c243e1b80 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2656,7 +2656,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t *bytes = sbytes; break; case zrtp_status_drop: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error: zRTP protection drop with code %d\n", stat); + /* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error: zRTP protection drop with code %d\n", stat); */ *bytes = 0; return SWITCH_STATUS_SUCCESS; case zrtp_status_fail: From 56678528f855d2779fa95c5431be5b8f0ae669ec Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 08:02:00 +0000 Subject: [PATCH 381/731] gitignore TAGS anywhere in tree --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cbeaaa463e..f153ad6f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ configure.lineno config.log config.status core.* +TAGS *.2010.log *.Build.CppClean.log *.tlog From 343bdec239f3702aa503990293be420f02f0e2db Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 08:04:49 +0000 Subject: [PATCH 382/731] remove .vcxproj.user file in tree --- src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user diff --git a/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user b/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user deleted file mode 100644 index 695b5c78b9..0000000000 --- a/src/mod/say/mod_say_fa/mod_say_fa.2010.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 7b5a9193aad24e37ab1001f71f9e3e30008c05b8 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 15:13:11 +0000 Subject: [PATCH 383/731] debian: remove support for building sounds and music The various sounds and music have their own source packages now as they have their own conventions and version numbers which fortunately update less frequently than FreeSWITCH itself. --- debian/README.source | 4 +- debian/bootstrap.sh | 117 +------------------------------------------ debian/rules | 13 +---- 3 files changed, 4 insertions(+), 130 deletions(-) diff --git a/debian/README.source b/debian/README.source index 3ecd6e1294..a51994be31 100644 --- a/debian/README.source +++ b/debian/README.source @@ -48,10 +48,8 @@ The format of debian/modules.conf is: To build this package, I recommend running the following from the root directory of your FS git working tree: - mkdir ../sounds - export FS_SOUNDS_DIR=$(pwd)/../sounds git clean -fdx && git reset --hard HEAD (cd debian && ./bootstrap.sh) schedtool -B -e git-buildpackage --git-verbose -us -uc - -- Travis Cross , Sat, 5 May 2012 23:32:53 +0000 + -- Travis Cross , Thu, 24 May 2012 16:28:46 +0000 diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 0c2ee5d10a..113675c3e8 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -408,27 +408,13 @@ Description: FreeSWITCH systemd configuration Package: freeswitch-music Architecture: all Depends: \${misc:Depends}, - freeswitch-music-default (= \${binary:Version}) + freeswitch-music-default (>= 1.0.8) Description: Music on hold audio for FreeSWITCH $(debian_wrap "${fs_description}") . This is a metapackage which depends on the default music on hold packages for FreeSWITCH. -Package: freeswitch-music-default -Architecture: all -Depends: \${misc:Depends}, - freeswitch-music-default-8k (= \${binary:Version}) -Recommends: - freeswitch-music-default-16k (= \${binary:Version}), - freeswitch-music-default-32k (= \${binary:Version}), - freeswitch-music-default-48k (= \${binary:Version}) -Description: Music on hold audio for FreeSWITCH - $(debian_wrap "${fs_description}") - . - This is a metapackage which depends on the default music on hold - packages for FreeSWITCH at various sampling rates. - Package: freeswitch-sounds Architecture: all Depends: \${misc:Depends}, @@ -452,27 +438,13 @@ Description: English sounds for FreeSWITCH Package: freeswitch-sounds-en-us Architecture: all Depends: \${misc:Depends}, - freeswitch-sounds-en-us-callie (= \${binary:Version}) + freeswitch-sounds-en-us-callie (>= 1.0.18) Description: US English sounds for FreeSWITCH $(debian_wrap "${fs_description}") . This is a metapackage which depends on the default US/English sound packages for FreeSWITCH. -Package: freeswitch-sounds-en-us-callie -Architecture: all -Depends: \${misc:Depends}, - freeswitch-sounds-en-us-callie-8k (= \${binary:Version}) -Recommends: - freeswitch-sounds-en-us-callie-16k (= \${binary:Version}), - freeswitch-sounds-en-us-callie-32k (= \${binary:Version}), - freeswitch-sounds-en-us-callie-48k (= \${binary:Version}) -Description: US English sounds for FreeSWITCH - $(debian_wrap "${fs_description}") - . - This is a metapackage which depends on the US/English Callie sound - packages for FreeSWITCH at various sampling rates. - EOF } @@ -557,14 +529,6 @@ print_conf_overrides () { print_common_overrides "$1" } -print_sound_overrides () { - print_common_overrides "$1" -} - -print_music_overrides () { - print_common_overrides "$1" -} - print_conf_control () { cat <> $f } -genmusic () { - rate="$1" rate_k="${rate%%000}k" - print_music_control >> control - local p=freeswitch-music-default-${rate_k} - local f=$p.install - (print_edit_warning; print_music_install) > $f - test -f $f.tmpl && cat $f.tmpl >> $f - local f=$p.lintian-overrides - (print_edit_warning; print_music_overrides "$p") > $f - test -f $f.tmpl && cat $f.tmpl >> $f - unset rate rate_k -} - -gensound () { - rate="$1" rate_k="${rate%%000}k" sound_path="$2" sound="${2,,}" - language=$(echo $sound | cut -d/ -f1) - country=$(echo $sound | cut -d/ -f2) - speaker=$(echo $sound | cut -d/ -f3) - print_sound_control >> control - local p=freeswitch-sounds-${sound//\//-}-${rate_k} - local f=$p.install - (print_edit_warning; print_sound_install) > $f - test -f $f.tmpl && cat $f.tmpl >> $f - local f=$p.lintian-overrides - (print_edit_warning; print_sound_overrides "$p") > $f - test -f $f.tmpl && cat $f.tmpl >> $f - unset rate rate_k sound sound_path language country speaker -} - accumulate_build_depends () { local x="" if [ -n "$(eval echo \$build_depends_$codename)" ]; then @@ -865,14 +760,6 @@ map_modules 'mod_filter' '' 'accumulate_build_depends' echo "Generating debian/..." >&2 > control (print_edit_warning; print_source_control; print_core_control) >> control -echo "Generating debian/ (music)..." >&2 -for r in 8000 16000 32000 48000; do genmusic $r; done -echo "Generating debian/ (sounds)..." >&2 -for x in 'en/us/callie'; do - for r in 8000 16000 32000 48000; do - gensound $r $x - done -done echo "Generating debian/ (conf)..." >&2 (echo "### conf"; echo) >> control map_confs 'genconf' diff --git a/debian/rules b/debian/rules index 60c5210940..0e864c398d 100755 --- a/debian/rules +++ b/debian/rules @@ -7,7 +7,6 @@ FS_CFLAGS?=-ggdb3 -O2 FS_CPPFLAGS?= FS_CXXFLAGS?=$(FS_CFLAGS) -FS_INSTALL_SOUNDS?=true export PATH?=/usr/lib/ccache:/usr/sbin:/usr/bin:/sbin:/bin export CFLAGS=$(FS_CFLAGS) export CPPFLAGS=$(FS_CPPFLAGS) @@ -20,7 +19,6 @@ show_vars= \ echo "CFLAGS='$(CFLAGS)'"; \ echo "CXXFLAGS='$(CXXFLAGS)'"; \ echo "CCACHE_DIR='$(CCACHE_DIR)'"; \ - echo "FS_INSTALL_SOUNDS='$(FS_INSTALL_SOUNDS)'"; \ echo; binary: @@ -90,7 +88,6 @@ override_dh_strip: override_dh_auto_install: dh_auto_install - -$(FS_INSTALL_SOUNDS) && DESTDIR=debian/tmp make cd-sounds-install cd-moh-install mkdir -p debian/tmp/lib/systemd/system install -m0644 debian/freeswitch-systemd.freeswitch.service debian/tmp/lib/systemd/system/freeswitch.service rm -f debian/tmp/usr/share/freeswitch/grammar/model/communicator/COPYING @@ -118,13 +115,5 @@ binary-quicktest: @$(call show_vars) echo "applications/mod_commands" > debian/modules.conf (cd debian && ./bootstrap.sh) - env FS_INSTALL_SOUNDS=false dh binary \ - -Nfreeswitch-sounds-music-8k \ - -Nfreeswitch-sounds-music-16k \ - -Nfreeswitch-sounds-music-32k \ - -Nfreeswitch-sounds-music-48k \ - -Nfreeswitch-sounds-en-us-callie-8k \ - -Nfreeswitch-sounds-en-us-callie-16k \ - -Nfreeswitch-sounds-en-us-callie-32k \ - -Nfreeswitch-sounds-en-us-callie-48k + dh binary From 1050a2a9f91fec8fd0beba99bf09dcab4059d9d8 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 15:16:13 +0000 Subject: [PATCH 384/731] debian: version bump --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3df3c52971..9d901307ea 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +freeswitch (1.2~rc2-1) unstable; urgency=low + + * Bump version. + * Sounds and music have been moved to their own source packaging. + + -- Travis Cross Thu, 24 May 2012 15:15:10 +0000 + freeswitch (1.2~alpha1-1) unstable; urgency=low * Initial release of FreeSWITCH in new debian packaging. From 879a798ef3fc4ebd270b5dc305135f4237dc9d21 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 16:36:31 +0000 Subject: [PATCH 385/731] debian: document a better way to build packaging --- debian/README.source | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/debian/README.source b/debian/README.source index a51994be31..ab31d9b711 100644 --- a/debian/README.source +++ b/debian/README.source @@ -48,8 +48,17 @@ The format of debian/modules.conf is: To build this package, I recommend running the following from the root directory of your FS git working tree: + distro=sid + ver="$(cat build/next-release.txt | sed -e 's/-/~/g')~n$(date +%Y%m%dT%H%M%SZ)-1~${distro}+1" git clean -fdx && git reset --hard HEAD - (cd debian && ./bootstrap.sh) - schedtool -B -e git-buildpackage --git-verbose -us -uc + ./build/set-fs-version.sh "$ver" + git add configure.in && git commit -m "bump to custom v$ver" + (cd debian && ./bootstrap.sh -c $distro) + dch -b -m -v "$ver" --force-distribution -D "$suite" "Custom build." + git-buildpackage -b -us -uc \ + --git-verbose \ + --git-pbuilder --git-dist=$distro \ + --git-compression-level=1v --git-compression=xz + git reset --hard HEAD^ - -- Travis Cross , Thu, 24 May 2012 16:28:46 +0000 + -- Travis Cross , Thu, 24 May 2012 16:35:57 +0000 From 2a257a56a223ad15525caa9062e8aac909fa039d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 May 2012 13:06:32 -0500 Subject: [PATCH 386/731] default to forking system on non-windows --- src/switch_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/switch_core.c b/src/switch_core.c index f89aeb5ee2..8f1543e028 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1431,8 +1431,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc switch_set_flag((&runtime.dummy_cng_frame), SFF_CNG); switch_set_flag((&runtime), SCF_AUTO_SCHEMAS); switch_set_flag((&runtime), SCF_CLEAR_SQL); +#ifdef WIN32 switch_set_flag((&runtime), SCF_THREADED_SYSTEM_EXEC); - +#endif switch_set_flag((&runtime), SCF_NO_NEW_SESSIONS); runtime.hard_log_level = SWITCH_LOG_DEBUG; runtime.mailer_app = "sendmail"; From 1cfd145c171968bd7b184206e281f773d6feebdf Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 May 2012 13:07:26 -0500 Subject: [PATCH 387/731] add support for variable expander to recognize 717 vars as specificly globals --- src/switch_channel.c | 18 ++++++++++++++---- src/switch_event.c | 17 +++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 7afe342103..e06706cbc3 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -3411,12 +3411,16 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c memset(data, 0, olen); c = data; for (p = indup; p && p < endof_indup && *p; p++) { + int global = 0; vtype = 0; if (*p == '\\') { if (*(p + 1) == '$') { nv = 1; p++; + if (*(p + 1) == '$') { + p++; + } } else if (*(p + 1) == '\'') { p++; continue; @@ -3428,9 +3432,15 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c } if (*p == '$' && !nv) { + + if (*(p + 1) == '$') { + p++; + global++; + } + if (*(p + 1)) { if (*(p + 1) == '{') { - vtype = 1; + vtype = global ? 3 : 1; } else { nv = 1; } @@ -3452,7 +3462,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c s++; - if (vtype == 1 && *s == '{') { + if ((vtype == 1 || vtype == 3) && *s == '{') { br = 1; s++; } @@ -3513,7 +3523,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c vtype = 2; } - if (vtype == 1) { + if (vtype == 1 || vtype == 3) { char *expanded = NULL; int offset = 0; int ooffset = 0; @@ -3540,7 +3550,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c idx = atoi(ptr); } - if ((sub_val = (char *) switch_channel_get_variable_dup(channel, vname, SWITCH_TRUE, idx))) { + if (vtype == 3 || (sub_val = (char *) switch_channel_get_variable_dup(channel, vname, SWITCH_TRUE, idx))) { if (var_list && !switch_event_check_permission_list(var_list, vname)) { sub_val = "INVALID"; } diff --git a/src/switch_event.c b/src/switch_event.c index 9a0776efd1..defae3586c 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -1957,12 +1957,16 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, memset(data, 0, olen); c = data; for (p = indup; p && p < endof_indup && *p; p++) { + int global = 0; vtype = 0; if (*p == '\\') { if (*(p + 1) == '$') { nv = 1; p++; + if (*(p + 1) == '$') { + p++; + } } else if (*(p + 1) == '\'') { p++; continue; @@ -1974,9 +1978,14 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, } if (*p == '$' && !nv) { + if (*(p + 1) == '$') { + p++; + global++; + } + if (*(p + 1)) { if (*(p + 1) == '{') { - vtype = 1; + vtype = global ? 3 : 1; } else { nv = 1; } @@ -1998,7 +2007,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, s++; - if (vtype == 1 && *s == '{') { + if ((vtype == 1 || vtype == 3) && *s == '{') { br = 1; s++; } @@ -2060,7 +2069,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, vtype = 2; } - if (vtype == 1) { + if (vtype == 1 || vtype == 3) { char *expanded = NULL; int offset = 0; int ooffset = 0; @@ -2086,7 +2095,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, idx = atoi(ptr); } - if (!(sub_val = switch_event_get_header_idx(event, vname, idx))) { + if (vtype == 3 || !(sub_val = switch_event_get_header_idx(event, vname, idx))) { switch_safe_free(gvar); if ((gvar = switch_core_get_variable_dup(vname))) { sub_val = gvar; From 8c889aa3a758e16437ad38ad96852c6b1c6e1aa6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 May 2012 13:07:46 -0500 Subject: [PATCH 388/731] add param for scgi to monitor its own server process --- src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c | 100 +++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c index 6ee62d6ac9..1ac74ebbdf 100644 --- a/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c +++ b/src/mod/xml_int/mod_xml_scgi/mod_xml_scgi.c @@ -46,6 +46,9 @@ struct xml_binding { switch_hash_t *vars_map; char *bindings; + char *server; + switch_thread_t *thread; + struct xml_binding *next; }; static int GLOBAL_DEBUG = 0; @@ -63,6 +66,8 @@ static struct { switch_memory_pool_t *pool; hash_node_t *hash_root; hash_node_t *hash_tail; + int running; + xml_binding_t *bindings; } globals; #define XML_SCGI_SYNTAX "[debug_on|debug_off]" @@ -92,6 +97,38 @@ SWITCH_STANDARD_API(xml_scgi_function) return SWITCH_STATUS_SUCCESS; } +void *SWITCH_THREAD_FUNC monitor_thread_run(switch_thread_t *thread, void *obj) +{ + xml_binding_t *binding = (xml_binding_t *) obj; + time_t st; + int diff; + + while(globals.running) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Running server command: %s\n", binding->server); + st = switch_epoch_time_now(NULL); + switch_system(binding->server, SWITCH_TRUE); + diff = (int) switch_epoch_time_now(NULL) - st; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Server command complete: %s\n", binding->server); + + if (globals.running && diff < 5) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Server command had short run duration, sleeping: %s\n", binding->server); + switch_yield(10000000); + } + } + + return NULL; +} + +static void launch_monitor_thread(xml_binding_t *binding) +{ + switch_threadattr_t *thd_attr = NULL; + + switch_threadattr_create(&thd_attr, globals.pool); + switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); + switch_threadattr_priority_increase(thd_attr); + switch_thread_create(&binding->thread, thd_attr, monitor_thread_run, binding, globals.pool); +} + static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data) @@ -130,6 +167,7 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con txt = (char *) stream.data; while((len = scgi_recv(&handle, buf, sizeof(buf))) > 0) { + char *expanded = switch_event_expand_headers(params, (char *)buf); bytes += len; @@ -139,8 +177,14 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con break; } - stream.write_function(&stream, "%s", buf); + stream.write_function(&stream, "%s", expanded); txt = (char *) stream.data; + + if (expanded != (char *)buf) { + free(expanded); + } + + memset(buf, 0, sizeof(buf)); } scgi_disconnect(&handle); @@ -210,7 +254,8 @@ static switch_status_t do_config(void) char *port = "8080"; char *bind_mask = NULL; int timeout = 0; - + char *server = NULL; + hash_node_t *hash_node; need_vars_map = 0; vars_map = NULL; @@ -248,6 +293,8 @@ static switch_status_t do_config(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't add %s to params hash!\n", val); } } + } else if (!strcasecmp(var, "server")) { + server = val; } } @@ -273,6 +320,10 @@ static switch_status_t do_config(void) binding->vars_map = vars_map; binding->url = switch_mprintf("scgi://%s:%s/%s", host, port, bname); + if (server) { + binding->server = switch_core_strdup(globals.pool, server); + } + if (bind_mask) { binding->bindings = switch_core_strdup(globals.pool, bind_mask); } @@ -297,6 +348,15 @@ static switch_status_t do_config(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Binding [%s] XML Fetch Function [%s] [%s]\n", zstr(bname) ? "N/A" : bname, binding->url, binding->bindings ? binding->bindings : "all"); switch_xml_bind_search_function(xml_url_fetch, switch_xml_parse_section_string(binding->bindings), binding); + + if (binding->server) { + launch_monitor_thread(binding); + } + + binding->next = globals.bindings; + globals.bindings = binding; + + x++; binding = NULL; } @@ -315,6 +375,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_scgi_load) *module_interface = switch_loadable_module_create_module_interface(pool, modname); memset(&globals, 0, sizeof(globals)); + globals.running = 1; globals.pool = pool; globals.hash_root = NULL; globals.hash_tail = NULL; @@ -334,6 +395,41 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_scgi_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_scgi_shutdown) { hash_node_t *ptr = NULL; + xml_binding_t *bp; + + globals.running = 0; + + for(bp = globals.bindings; bp; bp = bp->next) { + if (bp->thread) { + switch_status_t st; + scgi_handle_t handle = { 0 }; + unsigned char buf[16336] = ""; + int x = 3; + + scgi_add_param(&handle, "REQUEST_METHOD", "POST"); + scgi_add_param(&handle, "REQUEST_URI", bp->url); + scgi_add_body(&handle, "SHUTDOWN"); + + while(x--) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Sending shutdown message to server for %s\n", bp->url); + + if (scgi_connect(&handle, bp->host, bp->port, bp->timeout * 1000) == SCGI_SUCCESS) { + while(0 && scgi_recv(&handle, buf, sizeof(buf)) > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s\n", (char *) buf); + memset(buf, 0, sizeof(buf)); + } + break; + } + + switch_yield(5000000); + } + + scgi_disconnect(&handle); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for server to stop.\n"); + switch_thread_join(&st, bp->thread); + } + } + while (globals.hash_root) { ptr = globals.hash_root; From 23f8967c32e63050af93b43c66ec94e7b404b063 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Thu, 24 May 2012 20:39:03 +0000 Subject: [PATCH 389/731] add enhanced zrtp passthrough (zrtp passthru) mode ZRTP passthrough mode allows two ZRTP-capable clients to negotiate an end-to-end security association through FreeSWITCH. The clients are therefore able to be certain that the FreeSWITCH instance mediating the call cannot eavesdrop on their conversation. Importantly, this capability is maintained across multiple FreeSWITCH hops. If widely deployed, this enables a global network architecture where two people can speak securely with strong cryptographically protected authentication and confidentiality. With this commit we implement a zrtp-passthru mode that handles all the details of the negotiation intelligently. This mode can be selected by setting the boolean parameter inbound-zrtp-passthru in the sofia profile. This will also force late-negotiation as it is essential for correctly negotiating an end-to-end ZRTP security association. When an incoming call with a zrtp-hash is received and this mode is enabled, we find the first audio and the first video zrtp-hash in the SDP and store them as remote values on this channel. Once a b-leg is available, we set the local zrtp-hash values on that channel to the remote zrtp-hash values collected from the a-leg. Because zrtp-passthru absolutely requires that the channels negotiate the same codec, we offer to the b-leg only codecs that the a-leg can speak. Once the b-leg accepts a codec, we will force that choice onto the a-leg. If the b-leg sends us zrtp-hash values in the signaling, we store those as remote values on the b-leg and copy them to the local values on the a-leg. At this point, each leg has the zrtp-hash values from the other, and we know we can do ZRTP passthrough mode on the call. We send the b-leg's zrtp-hash back to the a-leg in the 200 OK. We then enable UDPTL mode on the rtp streams for both the audio and the video so that we don't interfere in the ZRTP negotiation. If the b-leg fails to return a zrtp-hash in the signaling, we set up a ZRTP security association with the a-leg ourselves, if we are so equipped. Likewise, if the a-leg fails to send a zrtp-hash in the signaling, we attempt to set up a ZRTP security association ourselves with the b-leg. The zrtp-passthru mode can also be enabled in the dialplan by setting the boolean channel variable zrtp_passthru. If enabled in this manner, we can't force late-negotiation, so the user would need to be sure this is configured. If ZRTP passthrough mode is not enabled in either manner, this change should have no effect. Channel variables for each of the various zrtp-hash values are set, though it is anticipated that there is no good reason to use them, so they may be removed without warning. For checking whether zrtp passthrough mode was successful, we provide the channel variable zrtp_passthru_active which is set on both legs. Though not implemented by this commit, the changes here should make it more straightforward to add correct zrtp-hash values to the signaling and verify that correct hello hash values are received when FreeSWITCH is acting as a terminating leg of the ZRTP security association. A historical note... This commit replaces the recently-added sdp_zrtp_hash_string method, commit 2ab1605a8887adc62be1b75f6ef67af87ff080de. This prior method sets a channel variable from the a-leg's zrtp-hash, then relies on the dialplan to export this channel variable to the b-leg, where it is put into the SDP. While it was a great start and wonderful for testing, this approach has some drawbacks that motivated the present work: * There's no good way to pass the zrtp-hash from the b-leg back to the a-leg. In fact, the implementation seems to send the a-leg's zrtp-hash back to the originating client in the 200 OK. This is not correct. * To support video, we'd need to have a separate dialplan variable, and the dialplan author would need to deal with that explicitly. * The API is problematic as it requires the dialplan author to understand intricate details of how ZRTP works to implement a correct dialplan. Further, by providing too fine-grained control (but at the same time, not enough control) it would limit our ability to make the behavior smarter once people started relying on this. --- src/include/switch_types.h | 4 +- src/mod/endpoints/mod_sofia/mod_sofia.c | 13 +++ src/mod/endpoints/mod_sofia/mod_sofia.h | 8 ++ src/mod/endpoints/mod_sofia/sofia.c | 20 ++++ src/mod/endpoints/mod_sofia/sofia_glue.c | 139 +++++++++++++++++++---- src/switch_channel.c | 18 ++- src/switch_core_session.c | 4 + src/switch_ivr_originate.c | 11 +- 8 files changed, 186 insertions(+), 31 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 477aa3b877..4699cd238f 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -170,6 +170,7 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME "__cache_speech_handles_obj__" #define SWITCH_BYPASS_MEDIA_VARIABLE "bypass_media" #define SWITCH_PROXY_MEDIA_VARIABLE "proxy_media" +#define SWITCH_ZRTP_PASSTHRU_VARIABLE "zrtp_passthru" #define SWITCH_ENDPOINT_DISPOSITION_VARIABLE "endpoint_disposition" #define SWITCH_HOLD_MUSIC_VARIABLE "hold_music" #define SWITCH_TEMP_HOLD_MUSIC_VARIABLE "temp_hold_music" @@ -1213,8 +1214,9 @@ typedef enum { CF_VIDEO_REFRESH_REQ, CF_SERVICE_AUDIO, CF_SERVICE_VIDEO, + CF_ZRTP_PASSTHRU_REQ, + CF_ZRTP_PASSTHRU, CF_ZRTP_HASH, - CF_ZRTP_PASS, CF_CHANNEL_SWAP, CF_PICKUP, CF_CONFIRM_BLIND_TRANSFER, diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index ebd009a16d..92a27fd0f2 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -2997,6 +2997,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t stream->write_function(stream, "NOMEDIA \t%s\n", sofia_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false"); stream->write_function(stream, "LATE-NEG \t%s\n", sofia_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false"); stream->write_function(stream, "PROXY-MEDIA \t%s\n", sofia_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false"); + stream->write_function(stream, "ZRTP-PASSTHRU \t%s\n", sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU) ? "true" : "false"); stream->write_function(stream, "AGGRESSIVENAT \t%s\n", sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false"); stream->write_function(stream, "STUN-ENABLED \t%s\n", sofia_test_pflag(profile, PFLAG_STUN_ENABLED) ? "true" : "false"); @@ -3275,6 +3276,7 @@ static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handl stream->write_function(stream, " %s\n", sofia_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false"); stream->write_function(stream, " %s\n", sofia_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false"); stream->write_function(stream, " %s\n", sofia_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false"); + stream->write_function(stream, " %s\n", sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU) ? "true" : "false"); stream->write_function(stream, " %s\n", sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false"); stream->write_function(stream, " %s\n", @@ -4785,6 +4787,17 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session sofia_clear_flag(ctech_pvt, TFLAG_ENABLE_SOA); } + if (switch_channel_test_flag(o_channel, CF_ZRTP_PASSTHRU_REQ)) { + const char *x = NULL; + sofia_glue_pass_zrtp_hash2(session, nsession); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[zrtp_passthru] Setting a-leg inherit_codec=true\n"); + switch_channel_set_variable(o_channel, "inherit_codec", "true"); + if ((x = switch_channel_get_variable(o_channel, "ep_codec_string"))) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[zrtp_passthru] Setting b-leg absolute_codec_string='%s'\n", x); + switch_channel_set_variable(nchannel, "absolute_codec_string", x); + } + } + /* SNARK: lets copy this across so we can see if we're the other leg of 3PCC + bypass_media... */ if (sofia_test_flag(ctech_pvt, TFLAG_3PCC) && (switch_channel_test_flag(o_channel, CF_PROXY_MODE) || switch_channel_test_flag(o_channel, CF_PROXY_MEDIA))) { sofia_set_flag(tech_pvt, TFLAG_3PCC_INVITE); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index f6e4c1122e..67d513cf27 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -317,6 +317,7 @@ typedef enum { TFLAG_TPORT_LOG, TFLAG_SENT_UPDATE, TFLAG_PROXY_MEDIA, + TFLAG_ZRTP_PASSTHRU, TFLAG_HOLD_LOCK, TFLAG_3PCC_HAS_ACK, TFLAG_PASS_RFC2833, @@ -825,6 +826,11 @@ struct private_object { switch_payload_t ianacodes[SWITCH_MAX_CODECS]; uint32_t session_timeout; enum nua_session_refresher session_refresher; + /** ZRTP **/ + char *local_sdp_audio_zrtp_hash; + char *local_sdp_video_zrtp_hash; + char *remote_sdp_audio_zrtp_hash; + char *remote_sdp_video_zrtp_hash; }; struct callback_t { @@ -932,6 +938,8 @@ void launch_sofia_profile_thread(sofia_profile_t *profile); switch_status_t sofia_presence_chat_send(switch_event_t *message_event); void sofia_glue_tech_absorb_sdp(private_object_t *tech_pvt); +void sofia_glue_pass_zrtp_hash2(switch_core_session_t *aleg_session, switch_core_session_t *bleg_session); +void sofia_glue_pass_zrtp_hash(switch_core_session_t *session); /* * \brief Sets the "ep_codec_string" channel variable, parsing r_sdp and taing codec_string in consideration diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index e5d026975d..0621b3b84d 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -3321,6 +3321,12 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile) } else { sofia_clear_flag(profile, TFLAG_PROXY_MEDIA); } + } else if (!strcasecmp(var, "inbound-zrtp-passthru")) { + if (switch_true(val)) { + sofia_set_flag(profile, TFLAG_ZRTP_PASSTHRU); + } else { + sofia_clear_flag(profile, TFLAG_ZRTP_PASSTHRU); + } } else if (!strcasecmp(var, "inbound-use-callid-as-uuid")) { if (switch_true(val)) { sofia_set_pflag(profile, PFLAG_CALLID_AS_UUID); @@ -3695,6 +3701,10 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile) } } + if (sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU)) { + sofia_set_flag(profile, TFLAG_LATE_NEGOTIATION); + } + if ((gateways_tag = switch_xml_child(xprofile, "gateways"))) { parse_gateways(profile, gateways_tag); } @@ -4171,6 +4181,8 @@ switch_status_t config_sofia(int reload, char *profile_name) } } else if (!strcasecmp(var, "inbound-proxy-media") && switch_true(val)) { sofia_set_flag(profile, TFLAG_PROXY_MEDIA); + } else if (!strcasecmp(var, "inbound-zrtp-passthru") && switch_true(val)) { + sofia_set_flag(profile, TFLAG_ZRTP_PASSTHRU); } else if (!strcasecmp(var, "force-subscription-expires")) { int tmp = atoi(val); if (tmp > 0) { @@ -4801,6 +4813,10 @@ switch_status_t config_sofia(int reload, char *profile_name) } } + if (sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU)) { + sofia_set_flag(profile, TFLAG_LATE_NEGOTIATION); + } + if ((!profile->cng_pt) && (!sofia_test_pflag(profile, PFLAG_SUPPRESS_CNG))) { profile->cng_pt = SWITCH_RTP_CNG_PAYLOAD; } @@ -8264,6 +8280,10 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ switch_channel_set_flag(channel, CF_PROXY_MEDIA); } + if (sofia_test_flag(tech_pvt, TFLAG_ZRTP_PASSTHRU)) { + switch_channel_set_flag(channel, CF_ZRTP_PASSTHRU_REQ); + } + if (!tech_pvt->call_id && sip->sip_call_id && sip->sip_call_id->i_id) { tech_pvt->call_id = switch_core_session_strdup(session, sip->sip_call_id->i_id); switch_channel_set_variable(channel, "sip_call_id", tech_pvt->call_id); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 0adcce9606..6bb7d3ee5f 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -184,7 +184,6 @@ static void generate_m(private_object_t *tech_pvt, char *buf, size_t buflen, int rate; int already_did[128] = { 0 }; int ptime = 0, noptime = 0; - const char *zrtp; switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "m=audio %d RTP/%sAVP", port, secure ? "S" : ""); @@ -344,8 +343,11 @@ static void generate_m(private_object_t *tech_pvt, char *buf, size_t buflen, switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=ptime:%d\n", cur_ptime); } - if ((zrtp = switch_channel_get_variable(tech_pvt->channel, "sdp_zrtp_hash_string"))) { - switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=zrtp-hash:%s\n", zrtp); + if (tech_pvt->local_sdp_audio_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding audio a=zrtp-hash:%s\n", + tech_pvt->local_sdp_audio_zrtp_hash); + switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=zrtp-hash:%s\n", + tech_pvt->local_sdp_audio_zrtp_hash); } if (sr) { @@ -391,7 +393,6 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch switch_event_t *map = NULL, *ptmap = NULL; const char *b_sdp = NULL; int verbose_sdp = 0; - const char *zrtp; sofia_glue_check_dtmf_type(tech_pvt); @@ -545,8 +546,12 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=ptime:%d\n", ptime); } - if ((zrtp = switch_channel_get_variable(tech_pvt->channel, "sdp_zrtp_hash_string"))) { - switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n", zrtp); + + if (tech_pvt->local_sdp_audio_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding audio a=zrtp-hash:%s\n", + tech_pvt->local_sdp_audio_zrtp_hash); + switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n", + tech_pvt->local_sdp_audio_zrtp_hash); } if (sr) { @@ -747,6 +752,13 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch } } + + if (tech_pvt->local_sdp_video_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding video a=zrtp-hash:%s\n", + tech_pvt->local_sdp_video_zrtp_hash); + switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n", + tech_pvt->local_sdp_video_zrtp_hash); + } } } @@ -3563,9 +3575,11 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_PORT_VARIABLE, tmp); - if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASS)) { + if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_INFO, "Activating ZRTP PROXY MODE\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Disable NOTIMER_DURING_BRIDGE\n"); sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Activating audio UDPTL mode\n"); switch_rtp_udptl_mode(tech_pvt->rtp_session); } @@ -3752,7 +3766,10 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f } } } - + if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU)) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Activating video UDPTL mode\n"); + switch_rtp_udptl_mode(tech_pvt->video_rtp_session); + } } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "VIDEO RTP REPORTS ERROR: [%s]\n", switch_str_nil(err)); @@ -3837,7 +3854,93 @@ static void add_audio_codec(sdp_rtpmap_t *map, int ptime, char *buf, switch_size } +void sofia_glue_pass_zrtp_hash2(switch_core_session_t *aleg_session, switch_core_session_t *bleg_session) +{ + switch_channel_t *aleg_channel = switch_core_session_get_channel(aleg_session); + private_object_t *aleg_tech_pvt = switch_core_session_get_private(aleg_session); + switch_channel_t *bleg_channel = switch_core_session_get_channel(bleg_session); + private_object_t *bleg_tech_pvt = switch_core_session_get_private(bleg_session); + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Deciding whether to pass zrtp-hash between a-leg and b-leg\n"); + if (!(switch_channel_test_flag(aleg_tech_pvt->channel, CF_ZRTP_PASSTHRU_REQ))) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "CF_ZRTP_PASSTHRU_REQ not set on a-leg, so not propagating zrtp-hash\n"); + return; + } + if (aleg_tech_pvt->remote_sdp_audio_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing a-leg remote zrtp-hash (audio) to b-leg\n"); + bleg_tech_pvt->local_sdp_audio_zrtp_hash = switch_core_session_strdup(bleg_tech_pvt->session, aleg_tech_pvt->remote_sdp_audio_zrtp_hash); + switch_channel_set_variable(bleg_channel, "l_sdp_audio_zrtp_hash", bleg_tech_pvt->local_sdp_audio_zrtp_hash); + } + if (aleg_tech_pvt->remote_sdp_video_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing a-leg remote zrtp-hash (video) to b-leg\n"); + bleg_tech_pvt->local_sdp_video_zrtp_hash = switch_core_session_strdup(bleg_tech_pvt->session, aleg_tech_pvt->remote_sdp_video_zrtp_hash); + switch_channel_set_variable(bleg_channel, "l_sdp_video_zrtp_hash", bleg_tech_pvt->local_sdp_video_zrtp_hash); + } + if (bleg_tech_pvt->remote_sdp_audio_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing b-leg remote zrtp-hash (audio) to a-leg\n"); + aleg_tech_pvt->local_sdp_audio_zrtp_hash = switch_core_session_strdup(aleg_tech_pvt->session, bleg_tech_pvt->remote_sdp_audio_zrtp_hash); + switch_channel_set_variable(aleg_channel, "l_sdp_audio_zrtp_hash", aleg_tech_pvt->local_sdp_audio_zrtp_hash); + } + if (bleg_tech_pvt->remote_sdp_video_zrtp_hash) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing b-leg remote zrtp-hash (video) to a-leg\n"); + aleg_tech_pvt->local_sdp_video_zrtp_hash = switch_core_session_strdup(aleg_tech_pvt->session, bleg_tech_pvt->remote_sdp_video_zrtp_hash); + switch_channel_set_variable(aleg_channel, "l_sdp_video_zrtp_hash", aleg_tech_pvt->local_sdp_video_zrtp_hash); + } +} +void sofia_glue_pass_zrtp_hash(switch_core_session_t *session) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + private_object_t *tech_pvt = switch_core_session_get_private(session); + switch_core_session_t *other_session; + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Deciding whether to pass zrtp-hash between legs\n"); + if (!(switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU_REQ))) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "CF_ZRTP_PASSTHRU_REQ not set, so not propagating zrtp-hash\n"); + return; + } else if (!(switch_core_session_get_partner(session, &other_session) == SWITCH_STATUS_SUCCESS)) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "No partner channel found, so not propagating zrtp-hash\n"); + return; + } else { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Found peer channel; propagating zrtp-hash if set\n"); + sofia_glue_pass_zrtp_hash2(session, other_session); + switch_core_session_rwunlock(other_session); + } +} + +static void find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + private_object_t *tech_pvt = switch_core_session_get_private(session); + sdp_media_t *m; + sdp_attribute_t *attr; + int got_audio = 0, got_video = 0; + + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Looking for zrtp-hash\n"); + for (m = sdp->sdp_media; m; m = m->m_next) { + if (got_audio && got_video) break; + if (m->m_port && ((m->m_type == sdp_media_audio && !got_audio) + || (m->m_type == sdp_media_video && !got_video))) { + for (attr = m->m_attributes; attr; attr = attr->a_next) { + if (zstr(attr->a_name)) continue; + if (strcasecmp(attr->a_name, "zrtp-hash") || !(attr->a_value)) continue; + if (m->m_type == sdp_media_audio) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, + "Found audio zrtp-hash; setting r_sdp_audio_zrtp_hash=%s\n", attr->a_value); + switch_channel_set_variable(channel, "r_sdp_audio_zrtp_hash", attr->a_value); + tech_pvt->remote_sdp_audio_zrtp_hash = switch_core_session_strdup(tech_pvt->session, attr->a_value); + got_audio++; + } else if (m->m_type == sdp_media_video) { + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, + "Found video zrtp-hash; setting r_sdp_video_zrtp_hash=%s\n", attr->a_value); + switch_channel_set_variable(channel, "r_sdp_video_zrtp_hash", attr->a_value); + tech_pvt->remote_sdp_video_zrtp_hash = switch_core_session_strdup(tech_pvt->session, attr->a_value); + got_video++; + } + switch_channel_set_flag(channel, CF_ZRTP_HASH); + break; + } + } + } +} void sofia_glue_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp) { @@ -3887,18 +3990,8 @@ void sofia_glue_set_r_sdp_codec_string(switch_core_session_t *session, const cha } } - switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Looking for zrtp-hash to set sdp_zrtp_hash_string\n"); - for (m = sdp->sdp_media; m; m = m->m_next) { - for (attr = m->m_attributes; attr; attr = attr->a_next) { - if (zstr(attr->a_name)) continue; - if (!strcasecmp(attr->a_name, "zrtp-hash") && attr->a_value) { - switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Found zrtp-hash, setting sdp_zrtp_hash_string=%s\n", attr->a_value); - switch_channel_set_variable(channel, "sdp_zrtp_hash_string", attr->a_value); - switch_channel_set_flag(channel, CF_ZRTP_HASH); - break; - } - } - } + find_zrtp_hash(session, sdp); + sofia_glue_pass_zrtp_hash(session); for (m = sdp->sdp_media; m; m = m->m_next) { ptime = dptime; @@ -4578,6 +4671,9 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s switch_channel_set_variable(tech_pvt->channel, "t38_broken_boolean", "true"); } + find_zrtp_hash(session, sdp); + sofia_glue_pass_zrtp_hash(session); + for (m = sdp->sdp_media; m; m = m->m_next) { sdp_connection_t *connection; switch_core_session_t *other_session; @@ -4699,9 +4795,6 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s ptime = atoi(attr->a_value); } else if (!strcasecmp(attr->a_name, "maxptime") && attr->a_value) { maxptime = atoi(attr->a_value); - } else if (!strcasecmp(attr->a_name, "zrtp-hash") && attr->a_value) { - switch_channel_set_variable(tech_pvt->channel, "sdp_zrtp_hash_string", attr->a_value); - switch_channel_set_flag(tech_pvt->channel, CF_ZRTP_HASH); } else if (!got_crypto && !strcasecmp(attr->a_name, "crypto") && !zstr(attr->a_value)) { int crypto_tag; diff --git a/src/switch_channel.c b/src/switch_channel.c index e06706cbc3..dc983c78cd 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2955,7 +2955,9 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(swi SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) { - if (switch_channel_test_flag(channel, CF_ZRTP_HASH) && !switch_channel_test_flag(channel, CF_ZRTP_PASS)) { + if (!switch_channel_test_flag(channel, CF_ZRTP_PASSTHRU) + && switch_channel_test_flag(channel, CF_ZRTP_PASSTHRU_REQ) + && switch_channel_test_flag(channel, CF_ZRTP_HASH)) { switch_core_session_t *other_session; switch_channel_t *other_channel; int doit = 1; @@ -2963,14 +2965,16 @@ SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) if (switch_core_session_get_partner(channel->session, &other_session) == SWITCH_STATUS_SUCCESS) { other_channel = switch_core_session_get_channel(other_session); - if (switch_channel_test_flag(other_channel, CF_ZRTP_HASH) && !switch_channel_test_flag(other_channel, CF_ZRTP_PASS)) { + if (switch_channel_test_flag(other_channel, CF_ZRTP_HASH) && !switch_channel_test_flag(other_channel, CF_ZRTP_PASSTHRU)) { - switch_channel_set_flag(channel, CF_ZRTP_PASS); - switch_channel_set_flag(other_channel, CF_ZRTP_PASS); + switch_channel_set_flag(channel, CF_ZRTP_PASSTHRU); + switch_channel_set_flag(other_channel, CF_ZRTP_PASSTHRU); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(channel->session), SWITCH_LOG_INFO, "%s Activating ZRTP passthru mode.\n", switch_channel_get_name(channel)); + switch_channel_set_variable(channel, "zrtp_passthru_active", "true"); + switch_channel_set_variable(other_channel, "zrtp_passthru_active", "true"); switch_channel_set_variable(channel, "zrtp_secure_media", "false"); switch_channel_set_variable(other_channel, "zrtp_secure_media", "false"); doit = 0; @@ -2980,18 +2984,20 @@ SWITCH_DECLARE(void) switch_channel_check_zrtp(switch_channel_t *channel) } if (doit) { + switch_channel_set_variable(channel, "zrtp_passthru_active", "false"); switch_channel_set_variable(channel, "zrtp_secure_media", "true"); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(channel->session), SWITCH_LOG_INFO, "%s ZRTP not negotiated on both sides; disabling ZRTP passthru mode.\n", switch_channel_get_name(channel)); - switch_channel_clear_flag(channel, CF_ZRTP_PASS); + switch_channel_clear_flag(channel, CF_ZRTP_PASSTHRU); switch_channel_clear_flag(channel, CF_ZRTP_HASH); if (switch_core_session_get_partner(channel->session, &other_session) == SWITCH_STATUS_SUCCESS) { other_channel = switch_core_session_get_channel(other_session); + switch_channel_set_variable(other_channel, "zrtp_passthru_active", "false"); switch_channel_set_variable(other_channel, "zrtp_secure_media", "true"); - switch_channel_clear_flag(other_channel, CF_ZRTP_PASS); + switch_channel_clear_flag(other_channel, CF_ZRTP_PASSTHRU); switch_channel_clear_flag(other_channel, CF_ZRTP_HASH); switch_core_session_rwunlock(other_session); diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 56c6e0b3a4..4e43987ecf 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -577,6 +577,10 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_ } } + if (switch_channel_test_flag(channel, CF_ZRTP_PASSTHRU_REQ)) { + switch_channel_set_flag(peer_channel, CF_ZRTP_PASSTHRU_REQ); + } + if (profile) { if ((cloned_profile = switch_caller_profile_clone(*new_session, profile)) != 0) { switch_channel_set_originator_caller_profile(peer_channel, cloned_profile); diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 87ff02ec8c..98fed62b34 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -1820,7 +1820,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } if (session) { - const char *to_var, *bypass_media = NULL, *proxy_media = NULL; + const char *to_var, *bypass_media = NULL, *proxy_media = NULL, *zrtp_passthru = NULL; caller_channel = switch_core_session_get_channel(session); switch_channel_set_flag(caller_channel, CF_ORIGINATOR); oglobals.session = session; @@ -1833,6 +1833,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess proxy_media = switch_channel_get_variable(caller_channel, SWITCH_PROXY_MEDIA_VARIABLE); bypass_media = switch_channel_get_variable(caller_channel, SWITCH_BYPASS_MEDIA_VARIABLE); + zrtp_passthru = switch_channel_get_variable(caller_channel, SWITCH_ZRTP_PASSTHRU_VARIABLE); if (!zstr(proxy_media)) { if (switch_true(proxy_media)) { @@ -1842,6 +1843,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } } + if (!zstr(zrtp_passthru)) { + if (switch_true(zrtp_passthru)) { + switch_channel_set_flag(caller_channel, CF_ZRTP_PASSTHRU_REQ); + } else if (switch_channel_test_flag(caller_channel, CF_ZRTP_PASSTHRU_REQ)) { + switch_channel_clear_flag(caller_channel, CF_ZRTP_PASSTHRU_REQ); + } + } + if (bypass_media && switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA) && !switch_channel_test_flag(caller_channel, CF_ANSWERED)) { switch_core_session_message_t msg = { 0 }; From 9daf595443bb369b1859e64c7337aa429a39fa17 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 May 2012 13:52:47 -0500 Subject: [PATCH 390/731] swigall --- .../languages/mod_managed/freeswitch_wrap.cxx | 251 +++++++++++++++++- src/mod/languages/mod_managed/managed/swig.cs | 210 ++++++++++++++- 2 files changed, 453 insertions(+), 8 deletions(-) diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx index 557cb05f76..5884b42cf5 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx @@ -1113,6 +1113,17 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_READ_RESULT_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ATT_XFER_RESULT_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "att_xfer_result"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -1124,6 +1135,17 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_JSON_CDR_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "copy_json_cdr"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -6732,6 +6754,54 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_disable_heartbeat(void * } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_pop(void * jarg1, char * jarg2, void * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_media_bug_t **arg3 = (switch_media_bug_t **) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_media_bug_t **)jarg3; + result = (switch_status_t)switch_core_media_bug_pop(arg1,(char const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_exec_all(void * jarg1, char * jarg2, void * jarg3, void * jarg4) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_media_bug_exec_cb_t arg3 = (switch_media_bug_exec_cb_t) 0 ; + void *arg4 = (void *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_media_bug_exec_cb_t)jarg3; + arg4 = (void *)jarg4; + result = (switch_status_t)switch_core_media_bug_exec_all(arg1,(char const *)arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_core_media_bug_count(void * jarg1, char * jarg2) { + unsigned long jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + uint32_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + result = (uint32_t)switch_core_media_bug_count(arg1,(char const *)arg2); + jresult = (unsigned long)result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_add(void * jarg1, char * jarg2, char * jarg3, void * jarg4, void * jarg5, void * jarg6, unsigned long jarg7, void * jarg8) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -6838,6 +6908,16 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_media_bug_get_read_replace_fram } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_media_bug_set_read_demux_frame(void * jarg1, void * jarg2) { + switch_media_bug_t *arg1 = (switch_media_bug_t *) 0 ; + switch_frame_t *arg2 = (switch_frame_t *) 0 ; + + arg1 = (switch_media_bug_t *)jarg1; + arg2 = (switch_frame_t *)jarg2; + switch_core_media_bug_set_read_demux_frame(arg1,arg2); +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_media_bug_get_session(void * jarg1) { void * jresult ; switch_media_bug_t *arg1 = (switch_media_bug_t *) 0 ; @@ -6964,13 +7044,15 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_close(void * jarg1) { } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_remove_all(void * jarg1) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_remove_all_function(void * jarg1, char * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; switch_status_t result; arg1 = (switch_core_session_t *)jarg1; - result = (switch_status_t)switch_core_media_bug_remove_all(arg1); + arg2 = (char *)jarg2; + result = (switch_status_t)switch_core_media_bug_remove_all_function(arg1,(char const *)arg2); jresult = result; return jresult; } @@ -9303,6 +9385,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_read_impl(void * jarg1 } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_real_read_impl(void * jarg1, void * jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_codec_implementation_t *)jarg2; + result = (switch_status_t)switch_core_session_get_real_read_impl(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_write_impl(void * jarg1, void * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -11467,6 +11563,23 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_close_extra_files(void * jarg1, int ja } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_thread_set_cpu_affinity(int jarg1) { + int jresult ; + int arg1 ; + switch_status_t result; + + arg1 = (int)jarg1; + result = (switch_status_t)switch_core_thread_set_cpu_affinity(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_os_yield() { + switch_os_yield(); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_module_name_set(void * jarg1, char * jarg2) { switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; char *arg2 = (char *) 0 ; @@ -11970,6 +12083,24 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_codec_interface( } +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_parse_codec_buf(char * jarg1, void * jarg2, void * jarg3, void * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + uint32_t *arg2 = (uint32_t *) 0 ; + uint32_t *arg3 = (uint32_t *) 0 ; + uint32_t *arg4 = (uint32_t *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (uint32_t *)jarg2; + arg3 = (uint32_t *)jarg3; + arg4 = (uint32_t *)jarg4; + result = (char *)switch_parse_codec_buf(arg1,arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_dialplan_interface(char * jarg1) { void * jresult ; char *arg1 = (char *) 0 ; @@ -27723,6 +27854,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_check_permission_list(void * jarg } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_event_add_presence_data_cols(void * jarg1, void * jarg2, char * jarg3) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + switch_event_t *arg2 = (switch_event_t *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (switch_event_t *)jarg2; + arg3 = (char *)jarg3; + switch_event_add_presence_data_cols(arg1,arg2,(char const *)arg3); +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_RESAMPLE_QUALITY_get() { int jresult ; int result; @@ -28123,6 +28266,24 @@ SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_merge_sln(void * jarg1, unsig } +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_unmerge_sln(void * jarg1, unsigned long jarg2, void * jarg3, unsigned long jarg4) { + unsigned long jresult ; + int16_t *arg1 = (int16_t *) 0 ; + uint32_t arg2 ; + int16_t *arg3 = (int16_t *) 0 ; + uint32_t arg4 ; + uint32_t result; + + arg1 = (int16_t *)jarg1; + arg2 = (uint32_t)jarg2; + arg3 = (int16_t *)jarg3; + arg4 = (uint32_t)jarg4; + result = (uint32_t)switch_unmerge_sln(arg1,arg2,arg3,arg4); + jresult = (unsigned long)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_mux_channels(void * jarg1, void * jarg2, unsigned long jarg3) { int16_t *arg1 = (int16_t *) 0 ; switch_size_t arg2 ; @@ -28581,6 +28742,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_activate_unicast(void * jarg1, char } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_generate_json_cdr(void * jarg1, void * jarg2, int jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + cJSON **arg2 = (cJSON **) 0 ; + switch_bool_t arg3 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (cJSON **)jarg2; + arg3 = (switch_bool_t)jarg3; + result = (switch_status_t)switch_ivr_generate_json_cdr(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_generate_xml_cdr(void * jarg1, void * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -28991,6 +29168,52 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_pop_eavesdropper(void * jarg1, void * jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_core_session_t **arg2 = (switch_core_session_t **) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_core_session_t **)jarg2; + result = (switch_status_t)switch_ivr_eavesdrop_pop_eavesdropper(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_exec_all(void * jarg1, char * jarg2, char * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (switch_status_t)switch_ivr_eavesdrop_exec_all(arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_update_display(void * jarg1, char * jarg2, char * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (switch_status_t)switch_ivr_eavesdrop_update_display(arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_session(void * jarg1, char * jarg2, char * jarg3, unsigned long jarg4) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -30703,6 +30926,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_kill_uuid(char * jarg1, int jarg2) } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_blind_transfer_ack(void * jarg1, int jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_bool_t arg2 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_bool_t)jarg2; + result = (switch_status_t)switch_ivr_blind_transfer_ack(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_RTP_MAX_BUF_LEN_get() { int jresult ; int result; @@ -31771,6 +32008,16 @@ SWIGEXPORT unsigned char SWIGSTDCALL CSharp_switch_rtp_check_auto_adj(void * jar } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_set_interdigit_delay(void * jarg1, unsigned long jarg2) { + switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_rtp_t *)jarg1; + arg2 = (uint32_t)jarg2; + switch_rtp_set_interdigit_delay(arg1,arg2); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_log_node_t_data_set(void * jarg1, char * jarg2) { switch_log_node_t *arg1 = (switch_log_node_t *) 0 ; char *arg2 = (char *) 0 ; diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs index 94fecfa933..b16a97ed95 100644 --- a/src/mod/languages/mod_managed/managed/swig.cs +++ b/src/mod/languages/mod_managed/managed/swig.cs @@ -1054,6 +1054,21 @@ public class freeswitch { freeswitchPINVOKE.switch_core_session_disable_heartbeat(SWIGTYPE_p_switch_core_session.getCPtr(session)); } + public static switch_status_t switch_core_media_bug_pop(SWIGTYPE_p_switch_core_session orig_session, string function, SWIGTYPE_p_p_switch_media_bug pop) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_pop(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function, SWIGTYPE_p_p_switch_media_bug.getCPtr(pop)); + return ret; + } + + public static switch_status_t switch_core_media_bug_exec_all(SWIGTYPE_p_switch_core_session orig_session, string function, SWIGTYPE_p_f_p_switch_media_bug_p_void__void cb, SWIGTYPE_p_void user_data) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_exec_all(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function, SWIGTYPE_p_f_p_switch_media_bug_p_void__void.getCPtr(cb), SWIGTYPE_p_void.getCPtr(user_data)); + return ret; + } + + public static uint switch_core_media_bug_count(SWIGTYPE_p_switch_core_session orig_session, string function) { + uint ret = freeswitchPINVOKE.switch_core_media_bug_count(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function); + return ret; + } + public static switch_status_t switch_core_media_bug_add(SWIGTYPE_p_switch_core_session session, string function, string target, SWIGTYPE_p_f_p_switch_media_bug_p_void_enum_switch_abc_type_t__switch_bool_t callback, SWIGTYPE_p_void user_data, SWIGTYPE_p_time_t stop_time, uint flags, SWIGTYPE_p_p_switch_media_bug new_bug) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_add(SWIGTYPE_p_switch_core_session.getCPtr(session), function, target, SWIGTYPE_p_f_p_switch_media_bug_p_void_enum_switch_abc_type_t__switch_bool_t.getCPtr(callback), SWIGTYPE_p_void.getCPtr(user_data), SWIGTYPE_p_time_t.getCPtr(stop_time), flags, SWIGTYPE_p_p_switch_media_bug.getCPtr(new_bug)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -1094,6 +1109,10 @@ public class freeswitch { return ret; } + public static void switch_core_media_bug_set_read_demux_frame(SWIGTYPE_p_switch_media_bug bug, switch_frame frame) { + freeswitchPINVOKE.switch_core_media_bug_set_read_demux_frame(SWIGTYPE_p_switch_media_bug.getCPtr(bug), switch_frame.getCPtr(frame)); + } + public static SWIGTYPE_p_switch_core_session switch_core_media_bug_get_session(SWIGTYPE_p_switch_media_bug bug) { IntPtr cPtr = freeswitchPINVOKE.switch_core_media_bug_get_session(SWIGTYPE_p_switch_media_bug.getCPtr(bug)); SWIGTYPE_p_switch_core_session ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_core_session(cPtr, false); @@ -1144,8 +1163,8 @@ public class freeswitch { return ret; } - public static switch_status_t switch_core_media_bug_remove_all(SWIGTYPE_p_switch_core_session session) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_remove_all(SWIGTYPE_p_switch_core_session.getCPtr(session)); + public static switch_status_t switch_core_media_bug_remove_all_function(SWIGTYPE_p_switch_core_session session, string function) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_remove_all_function(SWIGTYPE_p_switch_core_session.getCPtr(session), function); return ret; } @@ -1988,6 +2007,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_core_session_get_real_read_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_get_real_read_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp)); + return ret; + } + public static switch_status_t switch_core_session_get_write_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_get_write_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp)); return ret; @@ -2687,6 +2711,15 @@ public class freeswitch { freeswitchPINVOKE.switch_close_extra_files(SWIGTYPE_p_int.getCPtr(keep), keep_ttl); } + public static switch_status_t switch_core_thread_set_cpu_affinity(int cpu) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_thread_set_cpu_affinity(cpu); + return ret; + } + + public static void switch_os_yield() { + freeswitchPINVOKE.switch_os_yield(); + } + public static switch_status_t switch_loadable_module_init(switch_bool_t autoload) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_init((int)autoload); return ret; @@ -2708,6 +2741,11 @@ public class freeswitch { return ret; } + public static string switch_parse_codec_buf(string buf, SWIGTYPE_p_unsigned_long interval, SWIGTYPE_p_unsigned_long rate, SWIGTYPE_p_unsigned_long bit) { + string ret = freeswitchPINVOKE.switch_parse_codec_buf(buf, SWIGTYPE_p_unsigned_long.getCPtr(interval), SWIGTYPE_p_unsigned_long.getCPtr(rate), SWIGTYPE_p_unsigned_long.getCPtr(bit)); + return ret; + } + public static switch_dialplan_interface switch_loadable_module_get_dialplan_interface(string name) { IntPtr cPtr = freeswitchPINVOKE.switch_loadable_module_get_dialplan_interface(name); switch_dialplan_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_dialplan_interface(cPtr, false); @@ -4358,6 +4396,10 @@ public class freeswitch { return ret; } + public static void switch_event_add_presence_data_cols(SWIGTYPE_p_switch_channel channel, switch_event arg1, string prefix) { + freeswitchPINVOKE.switch_event_add_presence_data_cols(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1), prefix); + } + public static switch_status_t switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t new_resampler, uint from_rate, uint to_rate, uint to_size, int quality, uint channels, string file, string func, int line) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t.getCPtr(new_resampler), from_rate, to_rate, to_size, quality, channels, file, func, line); return ret; @@ -4414,6 +4456,11 @@ public class freeswitch { return ret; } + public static uint switch_unmerge_sln(SWIGTYPE_p_short data, uint samples, SWIGTYPE_p_short other_data, uint other_samples) { + uint ret = freeswitchPINVOKE.switch_unmerge_sln(SWIGTYPE_p_short.getCPtr(data), samples, SWIGTYPE_p_short.getCPtr(other_data), other_samples); + return ret; + } + public static void switch_mux_channels(SWIGTYPE_p_short data, SWIGTYPE_p_switch_size_t samples, uint channels) { freeswitchPINVOKE.switch_mux_channels(SWIGTYPE_p_short.getCPtr(data), SWIGTYPE_p_switch_size_t.getCPtr(samples), channels); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -4429,6 +4476,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_generate_json_cdr(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_cJSON json_cdr, switch_bool_t urlencode) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_generate_json_cdr(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_cJSON.getCPtr(json_cdr), (int)urlencode); + return ret; + } + public static switch_status_t switch_ivr_generate_xml_cdr(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_xml xml_cdr) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_generate_xml_cdr(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_xml.getCPtr(xml_cdr)); return ret; @@ -4560,6 +4612,21 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_eavesdrop_pop_eavesdropper(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_core_session sessionp) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_pop_eavesdropper(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_core_session.getCPtr(sessionp)); + return ret; + } + + public static switch_status_t switch_ivr_eavesdrop_exec_all(SWIGTYPE_p_switch_core_session session, string app, string arg) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_exec_all(SWIGTYPE_p_switch_core_session.getCPtr(session), app, arg); + return ret; + } + + public static switch_status_t switch_ivr_eavesdrop_update_display(SWIGTYPE_p_switch_core_session session, string name, string number) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_update_display(SWIGTYPE_p_switch_core_session.getCPtr(session), name, number); + return ret; + } + public static switch_status_t switch_ivr_eavesdrop_session(SWIGTYPE_p_switch_core_session session, string uuid, string require_group, uint flags) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_session(SWIGTYPE_p_switch_core_session.getCPtr(session), uuid, require_group, flags); return ret; @@ -5076,6 +5143,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_blind_transfer_ack(SWIGTYPE_p_switch_core_session session, switch_bool_t success) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_blind_transfer_ack(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)success); + return ret; + } + public static switch_status_t switch_rtp_add_crypto_key(SWIGTYPE_p_switch_rtp rtp_session, switch_rtp_crypto_direction_t direction, uint index, switch_rtp_crypto_key_type_t type, SWIGTYPE_p_unsigned_char key, SWIGTYPE_p_switch_size_t keylen) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_add_crypto_key(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)direction, index, (int)type, SWIGTYPE_p_unsigned_char.getCPtr(key), SWIGTYPE_p_switch_size_t.getCPtr(keylen)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -5375,6 +5447,10 @@ public class freeswitch { return ret; } + public static void switch_rtp_set_interdigit_delay(SWIGTYPE_p_switch_rtp rtp_session, uint delay) { + freeswitchPINVOKE.switch_rtp_set_interdigit_delay(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), delay); + } + public static switch_status_t switch_log_init(SWIGTYPE_p_apr_pool_t pool, switch_bool_t colorize) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_log_init(SWIGTYPE_p_apr_pool_t.getCPtr(pool), (int)colorize); return ret; @@ -5992,7 +6068,9 @@ public class freeswitch { public static readonly string SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE = freeswitchPINVOKE.SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get(); public static readonly string SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE = freeswitchPINVOKE.SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE_get(); public static readonly string SWITCH_READ_RESULT_VARIABLE = freeswitchPINVOKE.SWITCH_READ_RESULT_VARIABLE_get(); + public static readonly string SWITCH_ATT_XFER_RESULT_VARIABLE = freeswitchPINVOKE.SWITCH_ATT_XFER_RESULT_VARIABLE_get(); public static readonly string SWITCH_COPY_XML_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_COPY_XML_CDR_VARIABLE_get(); + public static readonly string SWITCH_COPY_JSON_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_COPY_JSON_CDR_VARIABLE_get(); public static readonly string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE = freeswitchPINVOKE.SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); public static readonly string SWITCH_TRANSFER_HISTORY_VARIABLE = freeswitchPINVOKE.SWITCH_TRANSFER_HISTORY_VARIABLE_get(); public static readonly string SWITCH_TRANSFER_SOURCE_VARIABLE = freeswitchPINVOKE.SWITCH_TRANSFER_SOURCE_VARIABLE_get(); @@ -6535,9 +6613,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_READ_RESULT_VARIABLE_get")] public static extern string SWITCH_READ_RESULT_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ATT_XFER_RESULT_VARIABLE_get")] + public static extern string SWITCH_ATT_XFER_RESULT_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get")] public static extern string SWITCH_COPY_XML_CDR_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_COPY_JSON_CDR_VARIABLE_get")] + public static extern string SWITCH_COPY_JSON_CDR_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get")] public static extern string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); @@ -7936,6 +8020,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_disable_heartbeat")] public static extern void switch_core_session_disable_heartbeat(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_pop")] + public static extern int switch_core_media_bug_pop(HandleRef jarg1, string jarg2, HandleRef jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_exec_all")] + public static extern int switch_core_media_bug_exec_all(HandleRef jarg1, string jarg2, HandleRef jarg3, HandleRef jarg4); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_count")] + public static extern uint switch_core_media_bug_count(HandleRef jarg1, string jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_add")] public static extern int switch_core_media_bug_add(HandleRef jarg1, string jarg2, string jarg3, HandleRef jarg4, HandleRef jarg5, HandleRef jarg6, uint jarg7, HandleRef jarg8); @@ -7960,6 +8053,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_get_read_replace_frame")] public static extern IntPtr switch_core_media_bug_get_read_replace_frame(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_set_read_demux_frame")] + public static extern void switch_core_media_bug_set_read_demux_frame(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_get_session")] public static extern IntPtr switch_core_media_bug_get_session(HandleRef jarg1); @@ -7990,8 +8086,8 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_close")] public static extern int switch_core_media_bug_close(HandleRef jarg1); - [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_remove_all")] - public static extern int switch_core_media_bug_remove_all(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_remove_all_function")] + public static extern int switch_core_media_bug_remove_all_function(HandleRef jarg1, string jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_enumerate")] public static extern int switch_core_media_bug_enumerate(HandleRef jarg1, HandleRef jarg2); @@ -8503,6 +8599,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_read_impl")] public static extern int switch_core_session_get_read_impl(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_real_read_impl")] + public static extern int switch_core_session_get_real_read_impl(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_write_impl")] public static extern int switch_core_session_get_write_impl(HandleRef jarg1, HandleRef jarg2); @@ -9007,6 +9106,12 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_close_extra_files")] public static extern void switch_close_extra_files(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_thread_set_cpu_affinity")] + public static extern int switch_core_thread_set_cpu_affinity(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_os_yield")] + public static extern void switch_os_yield(); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_module_name_set")] public static extern void switch_loadable_module_interface_module_name_set(HandleRef jarg1, string jarg2); @@ -9139,6 +9244,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_codec_interface")] public static extern IntPtr switch_loadable_module_get_codec_interface(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_parse_codec_buf")] + public static extern string switch_parse_codec_buf(string jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_dialplan_interface")] public static extern IntPtr switch_loadable_module_get_dialplan_interface(string jarg1); @@ -12871,6 +12979,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_event_check_permission_list")] public static extern int switch_event_check_permission_list(HandleRef jarg1, string jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_add_presence_data_cols")] + public static extern void switch_event_add_presence_data_cols(HandleRef jarg1, HandleRef jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_RESAMPLE_QUALITY_get")] public static extern int SWITCH_RESAMPLE_QUALITY_get(); @@ -12964,6 +13075,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_merge_sln")] public static extern uint switch_merge_sln(HandleRef jarg1, uint jarg2, HandleRef jarg3, uint jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_unmerge_sln")] + public static extern uint switch_unmerge_sln(HandleRef jarg1, uint jarg2, HandleRef jarg3, uint jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_mux_channels")] public static extern void switch_mux_channels(HandleRef jarg1, HandleRef jarg2, uint jarg3); @@ -13075,6 +13189,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_activate_unicast")] public static extern int switch_ivr_activate_unicast(HandleRef jarg1, string jarg2, ushort jarg3, string jarg4, ushort jarg5, string jarg6, string jarg7); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_generate_json_cdr")] + public static extern int switch_ivr_generate_json_cdr(HandleRef jarg1, HandleRef jarg2, int jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_generate_xml_cdr")] public static extern int switch_ivr_generate_xml_cdr(HandleRef jarg1, HandleRef jarg2); @@ -13153,6 +13270,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_record_session")] public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_pop_eavesdropper")] + public static extern int switch_ivr_eavesdrop_pop_eavesdropper(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_exec_all")] + public static extern int switch_ivr_eavesdrop_exec_all(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_update_display")] + public static extern int switch_ivr_eavesdrop_update_display(HandleRef jarg1, string jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_session")] public static extern int switch_ivr_eavesdrop_session(HandleRef jarg1, string jarg2, string jarg3, uint jarg4); @@ -13465,6 +13591,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_kill_uuid")] public static extern int switch_ivr_kill_uuid(string jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_blind_transfer_ack")] + public static extern int switch_ivr_blind_transfer_ack(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_RTP_MAX_BUF_LEN_get")] public static extern int SWITCH_RTP_MAX_BUF_LEN_get(); @@ -13708,6 +13837,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_check_auto_adj")] public static extern byte switch_rtp_check_auto_adj(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_set_interdigit_delay")] + public static extern void switch_rtp_set_interdigit_delay(HandleRef jarg1, uint jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_log_node_t_data_set")] public static extern void switch_log_node_t_data_set(HandleRef jarg1, string jarg2); @@ -17362,6 +17494,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_f_p_switch_media_bug_p_void__void { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_f_p_switch_media_bug_p_void__void(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_f_p_switch_media_bug_p_void__void() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_media_bug_p_void__void obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_f_p_switch_rtp_p_switch_socket_t_p_void_switch_size_t_p_switch_sockaddr_t__void { private HandleRef swigCPtr; @@ -18142,6 +18304,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_p_cJSON { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_p_cJSON(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_p_cJSON() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_p_cJSON obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.35 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_p_p_char { private HandleRef swigCPtr; @@ -22998,6 +23190,9 @@ public enum switch_channel_flag_t { CF_SERVICE_VIDEO, CF_ZRTP_HASH, CF_ZRTP_PASS, + CF_CHANNEL_SWAP, + CF_PICKUP, + CF_CONFIRM_BLIND_TRANSFER, CF_FLAG_MAX } @@ -24891,6 +25086,7 @@ public enum switch_core_session_message_types_t { SWITCH_MESSAGE_INDICATE_SIGNAL_DATA, SWITCH_MESSAGE_INDICATE_INFO, SWITCH_MESSAGE_INDICATE_AUDIO_DATA, + SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE, SWITCH_MESSAGE_INVALID } @@ -25836,7 +26032,8 @@ namespace FreeSWITCH.Native { ED_NONE = 0, ED_MUX_READ = (1 << 0), ED_MUX_WRITE = (1 << 1), - ED_DTMF = (1 << 2) + ED_DTMF = (1 << 2), + ED_COPY_DISPLAY = (1 << 3) } } @@ -29776,7 +29973,8 @@ namespace FreeSWITCH.Native { SMBF_THREAD_LOCK = (1 << 7), SMBF_PRUNE = (1 << 8), SMBF_NO_PAUSE = (1 << 9), - SMBF_STEREO_SWAP = (1 << 10) + SMBF_STEREO_SWAP = (1 << 10), + SMBF_LOCK = (1 << 11) } } From 9b6702da67e63a06f44c36fcea0c6004150c9684 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 May 2012 13:53:23 -0500 Subject: [PATCH 391/731] swigall --- src/mod/languages/mod_managed/freeswitch_wrap.cxx | 11 +++++++++++ src/mod/languages/mod_managed/managed/swig.cs | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx index 5884b42cf5..33feeaee11 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx @@ -1520,6 +1520,17 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_PROXY_MEDIA_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ZRTP_PASSTHRU_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "zrtp_passthru"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get() { char * jresult ; char *result = 0 ; diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs index b16a97ed95..62dea3d5c5 100644 --- a/src/mod/languages/mod_managed/managed/swig.cs +++ b/src/mod/languages/mod_managed/managed/swig.cs @@ -6105,6 +6105,7 @@ public class freeswitch { public static readonly string SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME = freeswitchPINVOKE.SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME_get(); public static readonly string SWITCH_BYPASS_MEDIA_VARIABLE = freeswitchPINVOKE.SWITCH_BYPASS_MEDIA_VARIABLE_get(); public static readonly string SWITCH_PROXY_MEDIA_VARIABLE = freeswitchPINVOKE.SWITCH_PROXY_MEDIA_VARIABLE_get(); + public static readonly string SWITCH_ZRTP_PASSTHRU_VARIABLE = freeswitchPINVOKE.SWITCH_ZRTP_PASSTHRU_VARIABLE_get(); public static readonly string SWITCH_ENDPOINT_DISPOSITION_VARIABLE = freeswitchPINVOKE.SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get(); public static readonly string SWITCH_HOLD_MUSIC_VARIABLE = freeswitchPINVOKE.SWITCH_HOLD_MUSIC_VARIABLE_get(); public static readonly string SWITCH_TEMP_HOLD_MUSIC_VARIABLE = freeswitchPINVOKE.SWITCH_TEMP_HOLD_MUSIC_VARIABLE_get(); @@ -6724,6 +6725,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROXY_MEDIA_VARIABLE_get")] public static extern string SWITCH_PROXY_MEDIA_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ZRTP_PASSTHRU_VARIABLE_get")] + public static extern string SWITCH_ZRTP_PASSTHRU_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get")] public static extern string SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get(); @@ -23188,8 +23192,9 @@ public enum switch_channel_flag_t { CF_VIDEO_REFRESH_REQ, CF_SERVICE_AUDIO, CF_SERVICE_VIDEO, + CF_ZRTP_PASSTHRU_REQ, + CF_ZRTP_PASSTHRU, CF_ZRTP_HASH, - CF_ZRTP_PASS, CF_CHANNEL_SWAP, CF_PICKUP, CF_CONFIRM_BLIND_TRANSFER, From b0e95fdad65029b3f763ce2b0a795a6b1f4f02b1 Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Thu, 24 May 2012 16:03:56 -0500 Subject: [PATCH 392/731] vs2010 reswig mod_managed --- .../mod_managed/freeswitch_wrap.2010.cxx | 259 +++++++++++++++++- .../mod_managed/managed/swig.2010.cs | 217 ++++++++++++++- 2 files changed, 467 insertions(+), 9 deletions(-) diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx index 27cc9fb600..65b4eedf3c 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx @@ -1050,6 +1050,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_READ_RESULT_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ATT_XFER_RESULT_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *)("att_xfer_result"); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -1060,6 +1070,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_JSON_CDR_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *)("copy_json_cdr"); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -1400,6 +1420,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_PROXY_MEDIA_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ZRTP_PASSTHRU_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *)("zrtp_passthru"); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -6425,6 +6455,54 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_disable_heartbeat(void * } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_pop(void * jarg1, char * jarg2, void * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_media_bug_t **arg3 = (switch_media_bug_t **) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_media_bug_t **)jarg3; + result = (switch_status_t)switch_core_media_bug_pop(arg1,(char const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_exec_all(void * jarg1, char * jarg2, void * jarg3, void * jarg4) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + switch_media_bug_exec_cb_t arg3 = (switch_media_bug_exec_cb_t) 0 ; + void *arg4 = (void *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (switch_media_bug_exec_cb_t)jarg3; + arg4 = (void *)jarg4; + result = (switch_status_t)switch_core_media_bug_exec_all(arg1,(char const *)arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_core_media_bug_count(void * jarg1, char * jarg2) { + unsigned long jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + uint32_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + result = (uint32_t)switch_core_media_bug_count(arg1,(char const *)arg2); + jresult = (unsigned long)result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_add(void * jarg1, char * jarg2, char * jarg3, void * jarg4, void * jarg5, void * jarg6, unsigned long jarg7, void * jarg8) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -6531,6 +6609,16 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_media_bug_get_read_replace_fram } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_media_bug_set_read_demux_frame(void * jarg1, void * jarg2) { + switch_media_bug_t *arg1 = (switch_media_bug_t *) 0 ; + switch_frame_t *arg2 = (switch_frame_t *) 0 ; + + arg1 = (switch_media_bug_t *)jarg1; + arg2 = (switch_frame_t *)jarg2; + switch_core_media_bug_set_read_demux_frame(arg1,arg2); +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_media_bug_get_session(void * jarg1) { void * jresult ; switch_media_bug_t *arg1 = (switch_media_bug_t *) 0 ; @@ -6657,13 +6745,15 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_close(void * jarg1) { } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_remove_all(void * jarg1) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_media_bug_remove_all_function(void * jarg1, char * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; switch_status_t result; arg1 = (switch_core_session_t *)jarg1; - result = (switch_status_t)switch_core_media_bug_remove_all(arg1); + arg2 = (char *)jarg2; + result = (switch_status_t)switch_core_media_bug_remove_all_function(arg1,(char const *)arg2); jresult = result; return jresult; } @@ -8996,6 +9086,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_read_impl(void * jarg1 } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_real_read_impl(void * jarg1, void * jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_codec_implementation_t *)jarg2; + result = (switch_status_t)switch_core_session_get_real_read_impl(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_get_write_impl(void * jarg1, void * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -11151,6 +11255,23 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_close_extra_files(void * jarg1, int ja } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_thread_set_cpu_affinity(int jarg1) { + int jresult ; + int arg1 ; + switch_status_t result; + + arg1 = (int)jarg1; + result = (switch_status_t)switch_core_thread_set_cpu_affinity(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_os_yield() { + switch_os_yield(); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_module_name_set(void * jarg1, char * jarg2) { switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; char *arg2 = (char *) 0 ; @@ -11635,6 +11756,24 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_codec_interface( } +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_parse_codec_buf(char * jarg1, void * jarg2, void * jarg3, void * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + uint32_t *arg2 = (uint32_t *) 0 ; + uint32_t *arg3 = (uint32_t *) 0 ; + uint32_t *arg4 = (uint32_t *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (uint32_t *)jarg2; + arg3 = (uint32_t *)jarg3; + arg4 = (uint32_t *)jarg4; + result = (char *)switch_parse_codec_buf(arg1,arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT void * SWIGSTDCALL CSharp_switch_loadable_module_get_dialplan_interface(char * jarg1) { void * jresult ; char *arg1 = (char *) 0 ; @@ -27013,6 +27152,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_event_check_permission_list(void * jarg } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_event_add_presence_data_cols(void * jarg1, void * jarg2, char * jarg3) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + switch_event_t *arg2 = (switch_event_t *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (switch_event_t *)jarg2; + arg3 = (char *)jarg3; + switch_event_add_presence_data_cols(arg1,arg2,(char const *)arg3); +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_RESAMPLE_QUALITY_get() { int jresult ; int result; @@ -27403,6 +27554,24 @@ SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_merge_sln(void * jarg1, unsig } +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_unmerge_sln(void * jarg1, unsigned long jarg2, void * jarg3, unsigned long jarg4) { + unsigned long jresult ; + int16_t *arg1 = (int16_t *) 0 ; + uint32_t arg2 ; + int16_t *arg3 = (int16_t *) 0 ; + uint32_t arg4 ; + uint32_t result; + + arg1 = (int16_t *)jarg1; + arg2 = (uint32_t)jarg2; + arg3 = (int16_t *)jarg3; + arg4 = (uint32_t)jarg4; + result = (uint32_t)switch_unmerge_sln(arg1,arg2,arg3,arg4); + jresult = (unsigned long)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_mux_channels(void * jarg1, void * jarg2, unsigned long jarg3) { int16_t *arg1 = (int16_t *) 0 ; switch_size_t arg2 ; @@ -27847,6 +28016,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_activate_unicast(void * jarg1, char } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_generate_json_cdr(void * jarg1, void * jarg2, int jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + cJSON **arg2 = (cJSON **) 0 ; + switch_bool_t arg3 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (cJSON **)jarg2; + arg3 = (switch_bool_t)jarg3; + result = (switch_status_t)switch_ivr_generate_json_cdr(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_generate_xml_cdr(void * jarg1, void * jarg2) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -28257,6 +28442,52 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_pop_eavesdropper(void * jarg1, void * jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_core_session_t **arg2 = (switch_core_session_t **) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_core_session_t **)jarg2; + result = (switch_status_t)switch_ivr_eavesdrop_pop_eavesdropper(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_exec_all(void * jarg1, char * jarg2, char * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (switch_status_t)switch_ivr_eavesdrop_exec_all(arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_update_display(void * jarg1, char * jarg2, char * jarg3) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (switch_status_t)switch_ivr_eavesdrop_update_display(arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_eavesdrop_session(void * jarg1, char * jarg2, char * jarg3, unsigned long jarg4) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -29969,6 +30200,20 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_kill_uuid(char * jarg1, int jarg2) } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_blind_transfer_ack(void * jarg1, int jarg2) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_bool_t arg2 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + arg2 = (switch_bool_t)jarg2; + result = (switch_status_t)switch_ivr_blind_transfer_ack(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_RTP_MAX_BUF_LEN_get() { int jresult ; int result; @@ -31026,6 +31271,16 @@ SWIGEXPORT unsigned char SWIGSTDCALL CSharp_switch_rtp_check_auto_adj(void * jar } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_set_interdigit_delay(void * jarg1, unsigned long jarg2) { + switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_rtp_t *)jarg1; + arg2 = (uint32_t)jarg2; + switch_rtp_set_interdigit_delay(arg1,arg2); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_log_node_t_data_set(void * jarg1, char * jarg2) { switch_log_node_t *arg1 = (switch_log_node_t *) 0 ; char *arg2 = (char *) 0 ; diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs index d814ce15b9..0654085a50 100644 --- a/src/mod/languages/mod_managed/managed/swig.2010.cs +++ b/src/mod/languages/mod_managed/managed/swig.2010.cs @@ -1066,6 +1066,21 @@ public class freeswitch { freeswitchPINVOKE.switch_core_session_disable_heartbeat(SWIGTYPE_p_switch_core_session.getCPtr(session)); } + public static switch_status_t switch_core_media_bug_pop(SWIGTYPE_p_switch_core_session orig_session, string function, SWIGTYPE_p_p_switch_media_bug pop) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_pop(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function, SWIGTYPE_p_p_switch_media_bug.getCPtr(pop)); + return ret; + } + + public static switch_status_t switch_core_media_bug_exec_all(SWIGTYPE_p_switch_core_session orig_session, string function, SWIGTYPE_p_f_p_switch_media_bug_p_void__void cb, SWIGTYPE_p_void user_data) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_exec_all(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function, SWIGTYPE_p_f_p_switch_media_bug_p_void__void.getCPtr(cb), SWIGTYPE_p_void.getCPtr(user_data)); + return ret; + } + + public static uint switch_core_media_bug_count(SWIGTYPE_p_switch_core_session orig_session, string function) { + uint ret = freeswitchPINVOKE.switch_core_media_bug_count(SWIGTYPE_p_switch_core_session.getCPtr(orig_session), function); + return ret; + } + public static switch_status_t switch_core_media_bug_add(SWIGTYPE_p_switch_core_session session, string function, string target, SWIGTYPE_p_f_p_switch_media_bug_p_void_enum_switch_abc_type_t__switch_bool_t callback, SWIGTYPE_p_void user_data, SWIGTYPE_p_time_t stop_time, uint flags, SWIGTYPE_p_p_switch_media_bug new_bug) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_add(SWIGTYPE_p_switch_core_session.getCPtr(session), function, target, SWIGTYPE_p_f_p_switch_media_bug_p_void_enum_switch_abc_type_t__switch_bool_t.getCPtr(callback), SWIGTYPE_p_void.getCPtr(user_data), SWIGTYPE_p_time_t.getCPtr(stop_time), flags, SWIGTYPE_p_p_switch_media_bug.getCPtr(new_bug)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -1106,6 +1121,10 @@ public class freeswitch { return ret; } + public static void switch_core_media_bug_set_read_demux_frame(SWIGTYPE_p_switch_media_bug bug, switch_frame frame) { + freeswitchPINVOKE.switch_core_media_bug_set_read_demux_frame(SWIGTYPE_p_switch_media_bug.getCPtr(bug), switch_frame.getCPtr(frame)); + } + public static SWIGTYPE_p_switch_core_session switch_core_media_bug_get_session(SWIGTYPE_p_switch_media_bug bug) { IntPtr cPtr = freeswitchPINVOKE.switch_core_media_bug_get_session(SWIGTYPE_p_switch_media_bug.getCPtr(bug)); SWIGTYPE_p_switch_core_session ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_core_session(cPtr, false); @@ -1156,8 +1175,8 @@ public class freeswitch { return ret; } - public static switch_status_t switch_core_media_bug_remove_all(SWIGTYPE_p_switch_core_session session) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_remove_all(SWIGTYPE_p_switch_core_session.getCPtr(session)); + public static switch_status_t switch_core_media_bug_remove_all_function(SWIGTYPE_p_switch_core_session session, string function) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_media_bug_remove_all_function(SWIGTYPE_p_switch_core_session.getCPtr(session), function); return ret; } @@ -2000,6 +2019,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_core_session_get_real_read_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_get_real_read_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp)); + return ret; + } + public static switch_status_t switch_core_session_get_write_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_get_write_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp)); return ret; @@ -2699,6 +2723,15 @@ public class freeswitch { freeswitchPINVOKE.switch_close_extra_files(SWIGTYPE_p_int.getCPtr(keep), keep_ttl); } + public static switch_status_t switch_core_thread_set_cpu_affinity(int cpu) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_thread_set_cpu_affinity(cpu); + return ret; + } + + public static void switch_os_yield() { + freeswitchPINVOKE.switch_os_yield(); + } + public static switch_status_t switch_loadable_module_init(switch_bool_t autoload) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_init((int)autoload); return ret; @@ -2720,6 +2753,11 @@ public class freeswitch { return ret; } + public static string switch_parse_codec_buf(string buf, SWIGTYPE_p_unsigned_long interval, SWIGTYPE_p_unsigned_long rate, SWIGTYPE_p_unsigned_long bit) { + string ret = freeswitchPINVOKE.switch_parse_codec_buf(buf, SWIGTYPE_p_unsigned_long.getCPtr(interval), SWIGTYPE_p_unsigned_long.getCPtr(rate), SWIGTYPE_p_unsigned_long.getCPtr(bit)); + return ret; + } + public static switch_dialplan_interface switch_loadable_module_get_dialplan_interface(string name) { IntPtr cPtr = freeswitchPINVOKE.switch_loadable_module_get_dialplan_interface(name); switch_dialplan_interface ret = (cPtr == IntPtr.Zero) ? null : new switch_dialplan_interface(cPtr, false); @@ -4370,6 +4408,10 @@ public class freeswitch { return ret; } + public static void switch_event_add_presence_data_cols(SWIGTYPE_p_switch_channel channel, switch_event arg1, string prefix) { + freeswitchPINVOKE.switch_event_add_presence_data_cols(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1), prefix); + } + public static switch_status_t switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t new_resampler, uint from_rate, uint to_rate, uint to_size, int quality, uint channels, string file, string func, int line) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_resample_perform_create(SWIGTYPE_p_p_switch_audio_resampler_t.getCPtr(new_resampler), from_rate, to_rate, to_size, quality, channels, file, func, line); return ret; @@ -4426,6 +4468,11 @@ public class freeswitch { return ret; } + public static uint switch_unmerge_sln(SWIGTYPE_p_short data, uint samples, SWIGTYPE_p_short other_data, uint other_samples) { + uint ret = freeswitchPINVOKE.switch_unmerge_sln(SWIGTYPE_p_short.getCPtr(data), samples, SWIGTYPE_p_short.getCPtr(other_data), other_samples); + return ret; + } + public static void switch_mux_channels(SWIGTYPE_p_short data, SWIGTYPE_p_switch_size_t samples, uint channels) { freeswitchPINVOKE.switch_mux_channels(SWIGTYPE_p_short.getCPtr(data), SWIGTYPE_p_switch_size_t.getCPtr(samples), channels); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -4441,6 +4488,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_generate_json_cdr(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_cJSON json_cdr, switch_bool_t urlencode) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_generate_json_cdr(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_cJSON.getCPtr(json_cdr), (int)urlencode); + return ret; + } + public static switch_status_t switch_ivr_generate_xml_cdr(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_xml xml_cdr) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_generate_xml_cdr(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_xml.getCPtr(xml_cdr)); return ret; @@ -4572,6 +4624,21 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_eavesdrop_pop_eavesdropper(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_core_session sessionp) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_pop_eavesdropper(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_core_session.getCPtr(sessionp)); + return ret; + } + + public static switch_status_t switch_ivr_eavesdrop_exec_all(SWIGTYPE_p_switch_core_session session, string app, string arg) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_exec_all(SWIGTYPE_p_switch_core_session.getCPtr(session), app, arg); + return ret; + } + + public static switch_status_t switch_ivr_eavesdrop_update_display(SWIGTYPE_p_switch_core_session session, string name, string number) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_update_display(SWIGTYPE_p_switch_core_session.getCPtr(session), name, number); + return ret; + } + public static switch_status_t switch_ivr_eavesdrop_session(SWIGTYPE_p_switch_core_session session, string uuid, string require_group, uint flags) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_eavesdrop_session(SWIGTYPE_p_switch_core_session.getCPtr(session), uuid, require_group, flags); return ret; @@ -5088,6 +5155,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_ivr_blind_transfer_ack(SWIGTYPE_p_switch_core_session session, switch_bool_t success) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_blind_transfer_ack(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)success); + return ret; + } + public static switch_status_t switch_rtp_add_crypto_key(SWIGTYPE_p_switch_rtp rtp_session, switch_rtp_crypto_direction_t direction, uint index, switch_rtp_crypto_key_type_t type, SWIGTYPE_p_unsigned_char key, SWIGTYPE_p_switch_size_t keylen) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_add_crypto_key(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)direction, index, (int)type, SWIGTYPE_p_unsigned_char.getCPtr(key), SWIGTYPE_p_switch_size_t.getCPtr(keylen)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -5387,6 +5459,10 @@ public class freeswitch { return ret; } + public static void switch_rtp_set_interdigit_delay(SWIGTYPE_p_switch_rtp rtp_session, uint delay) { + freeswitchPINVOKE.switch_rtp_set_interdigit_delay(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), delay); + } + public static switch_status_t switch_log_init(SWIGTYPE_p_apr_pool_t pool, switch_bool_t colorize) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_log_init(SWIGTYPE_p_apr_pool_t.getCPtr(pool), (int)colorize); return ret; @@ -6004,7 +6080,9 @@ public class freeswitch { public static readonly string SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE = freeswitchPINVOKE.SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get(); public static readonly string SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE = freeswitchPINVOKE.SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE_get(); public static readonly string SWITCH_READ_RESULT_VARIABLE = freeswitchPINVOKE.SWITCH_READ_RESULT_VARIABLE_get(); + public static readonly string SWITCH_ATT_XFER_RESULT_VARIABLE = freeswitchPINVOKE.SWITCH_ATT_XFER_RESULT_VARIABLE_get(); public static readonly string SWITCH_COPY_XML_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_COPY_XML_CDR_VARIABLE_get(); + public static readonly string SWITCH_COPY_JSON_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_COPY_JSON_CDR_VARIABLE_get(); public static readonly string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE = freeswitchPINVOKE.SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); public static readonly string SWITCH_TRANSFER_HISTORY_VARIABLE = freeswitchPINVOKE.SWITCH_TRANSFER_HISTORY_VARIABLE_get(); public static readonly string SWITCH_TRANSFER_SOURCE_VARIABLE = freeswitchPINVOKE.SWITCH_TRANSFER_SOURCE_VARIABLE_get(); @@ -6039,6 +6117,7 @@ public class freeswitch { public static readonly string SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME = freeswitchPINVOKE.SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME_get(); public static readonly string SWITCH_BYPASS_MEDIA_VARIABLE = freeswitchPINVOKE.SWITCH_BYPASS_MEDIA_VARIABLE_get(); public static readonly string SWITCH_PROXY_MEDIA_VARIABLE = freeswitchPINVOKE.SWITCH_PROXY_MEDIA_VARIABLE_get(); + public static readonly string SWITCH_ZRTP_PASSTHRU_VARIABLE = freeswitchPINVOKE.SWITCH_ZRTP_PASSTHRU_VARIABLE_get(); public static readonly string SWITCH_ENDPOINT_DISPOSITION_VARIABLE = freeswitchPINVOKE.SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get(); public static readonly string SWITCH_HOLD_MUSIC_VARIABLE = freeswitchPINVOKE.SWITCH_HOLD_MUSIC_VARIABLE_get(); public static readonly string SWITCH_TEMP_HOLD_MUSIC_VARIABLE = freeswitchPINVOKE.SWITCH_TEMP_HOLD_MUSIC_VARIABLE_get(); @@ -6551,9 +6630,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_READ_RESULT_VARIABLE_get")] public static extern string SWITCH_READ_RESULT_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ATT_XFER_RESULT_VARIABLE_get")] + public static extern string SWITCH_ATT_XFER_RESULT_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get")] public static extern string SWITCH_COPY_XML_CDR_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_COPY_JSON_CDR_VARIABLE_get")] + public static extern string SWITCH_COPY_JSON_CDR_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get")] public static extern string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); @@ -6656,6 +6741,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROXY_MEDIA_VARIABLE_get")] public static extern string SWITCH_PROXY_MEDIA_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ZRTP_PASSTHRU_VARIABLE_get")] + public static extern string SWITCH_ZRTP_PASSTHRU_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get")] public static extern string SWITCH_ENDPOINT_DISPOSITION_VARIABLE_get(); @@ -7952,6 +8040,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_disable_heartbeat")] public static extern void switch_core_session_disable_heartbeat(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_pop")] + public static extern int switch_core_media_bug_pop(HandleRef jarg1, string jarg2, HandleRef jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_exec_all")] + public static extern int switch_core_media_bug_exec_all(HandleRef jarg1, string jarg2, HandleRef jarg3, HandleRef jarg4); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_count")] + public static extern uint switch_core_media_bug_count(HandleRef jarg1, string jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_add")] public static extern int switch_core_media_bug_add(HandleRef jarg1, string jarg2, string jarg3, HandleRef jarg4, HandleRef jarg5, HandleRef jarg6, uint jarg7, HandleRef jarg8); @@ -7976,6 +8073,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_get_read_replace_frame")] public static extern IntPtr switch_core_media_bug_get_read_replace_frame(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_set_read_demux_frame")] + public static extern void switch_core_media_bug_set_read_demux_frame(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_get_session")] public static extern IntPtr switch_core_media_bug_get_session(HandleRef jarg1); @@ -8006,8 +8106,8 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_close")] public static extern int switch_core_media_bug_close(HandleRef jarg1); - [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_remove_all")] - public static extern int switch_core_media_bug_remove_all(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_remove_all_function")] + public static extern int switch_core_media_bug_remove_all_function(HandleRef jarg1, string jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_media_bug_enumerate")] public static extern int switch_core_media_bug_enumerate(HandleRef jarg1, HandleRef jarg2); @@ -8519,6 +8619,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_read_impl")] public static extern int switch_core_session_get_read_impl(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_real_read_impl")] + public static extern int switch_core_session_get_real_read_impl(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_write_impl")] public static extern int switch_core_session_get_write_impl(HandleRef jarg1, HandleRef jarg2); @@ -9023,6 +9126,12 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_close_extra_files")] public static extern void switch_close_extra_files(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_thread_set_cpu_affinity")] + public static extern int switch_core_thread_set_cpu_affinity(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_os_yield")] + public static extern void switch_os_yield(); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_module_name_set")] public static extern void switch_loadable_module_interface_module_name_set(HandleRef jarg1, string jarg2); @@ -9155,6 +9264,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_codec_interface")] public static extern IntPtr switch_loadable_module_get_codec_interface(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_parse_codec_buf")] + public static extern string switch_parse_codec_buf(string jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_get_dialplan_interface")] public static extern IntPtr switch_loadable_module_get_dialplan_interface(string jarg1); @@ -12887,6 +12999,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_event_check_permission_list")] public static extern int switch_event_check_permission_list(HandleRef jarg1, string jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_event_add_presence_data_cols")] + public static extern void switch_event_add_presence_data_cols(HandleRef jarg1, HandleRef jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_RESAMPLE_QUALITY_get")] public static extern int SWITCH_RESAMPLE_QUALITY_get(); @@ -12980,6 +13095,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_merge_sln")] public static extern uint switch_merge_sln(HandleRef jarg1, uint jarg2, HandleRef jarg3, uint jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_unmerge_sln")] + public static extern uint switch_unmerge_sln(HandleRef jarg1, uint jarg2, HandleRef jarg3, uint jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_mux_channels")] public static extern void switch_mux_channels(HandleRef jarg1, HandleRef jarg2, uint jarg3); @@ -13091,6 +13209,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_activate_unicast")] public static extern int switch_ivr_activate_unicast(HandleRef jarg1, string jarg2, ushort jarg3, string jarg4, ushort jarg5, string jarg6, string jarg7); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_generate_json_cdr")] + public static extern int switch_ivr_generate_json_cdr(HandleRef jarg1, HandleRef jarg2, int jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_generate_xml_cdr")] public static extern int switch_ivr_generate_xml_cdr(HandleRef jarg1, HandleRef jarg2); @@ -13169,6 +13290,15 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_record_session")] public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_pop_eavesdropper")] + public static extern int switch_ivr_eavesdrop_pop_eavesdropper(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_exec_all")] + public static extern int switch_ivr_eavesdrop_exec_all(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_update_display")] + public static extern int switch_ivr_eavesdrop_update_display(HandleRef jarg1, string jarg2, string jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_eavesdrop_session")] public static extern int switch_ivr_eavesdrop_session(HandleRef jarg1, string jarg2, string jarg3, uint jarg4); @@ -13481,6 +13611,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_kill_uuid")] public static extern int switch_ivr_kill_uuid(string jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_blind_transfer_ack")] + public static extern int switch_ivr_blind_transfer_ack(HandleRef jarg1, int jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_RTP_MAX_BUF_LEN_get")] public static extern int SWITCH_RTP_MAX_BUF_LEN_get(); @@ -13724,6 +13857,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_check_auto_adj")] public static extern byte switch_rtp_check_auto_adj(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_set_interdigit_delay")] + public static extern void switch_rtp_set_interdigit_delay(HandleRef jarg1, uint jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_log_node_t_data_set")] public static extern void switch_log_node_t_data_set(HandleRef jarg1, string jarg2); @@ -17420,6 +17556,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_f_p_switch_media_bug_p_void__void { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_f_p_switch_media_bug_p_void__void(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_f_p_switch_media_bug_p_void__void() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_media_bug_p_void__void obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.1 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_f_p_switch_rtp_p_switch_socket_t_p_void_switch_size_t_p_switch_sockaddr_t__void { private HandleRef swigCPtr; @@ -18200,6 +18366,36 @@ namespace FreeSWITCH.Native { using System; using System.Runtime.InteropServices; +public class SWIGTYPE_p_p_cJSON { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_p_cJSON(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_p_cJSON() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_p_cJSON obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} + +} +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.1 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace FreeSWITCH.Native { + +using System; +using System.Runtime.InteropServices; + public class SWIGTYPE_p_p_p_char { private HandleRef swigCPtr; @@ -23052,8 +23248,12 @@ public enum switch_channel_flag_t { CF_VIDEO_REFRESH_REQ, CF_SERVICE_AUDIO, CF_SERVICE_VIDEO, + CF_ZRTP_PASSTHRU_REQ, + CF_ZRTP_PASSTHRU, CF_ZRTP_HASH, - CF_ZRTP_PASS, + CF_CHANNEL_SWAP, + CF_PICKUP, + CF_CONFIRM_BLIND_TRANSFER, CF_FLAG_MAX } @@ -24971,6 +25171,7 @@ public enum switch_core_session_message_types_t { SWITCH_MESSAGE_INDICATE_SIGNAL_DATA, SWITCH_MESSAGE_INDICATE_INFO, SWITCH_MESSAGE_INDICATE_AUDIO_DATA, + SWITCH_MESSAGE_INDICATE_BLIND_TRANSFER_RESPONSE, SWITCH_MESSAGE_INVALID } @@ -25930,7 +26131,8 @@ namespace FreeSWITCH.Native { ED_NONE = 0, ED_MUX_READ = (1 << 0), ED_MUX_WRITE = (1 << 1), - ED_DTMF = (1 << 2) + ED_DTMF = (1 << 2), + ED_COPY_DISPLAY = (1 << 3) } } @@ -29926,7 +30128,8 @@ namespace FreeSWITCH.Native { SMBF_THREAD_LOCK = (1 << 7), SMBF_PRUNE = (1 << 8), SMBF_NO_PAUSE = (1 << 9), - SMBF_STEREO_SWAP = (1 << 10) + SMBF_STEREO_SWAP = (1 << 10), + SMBF_LOCK = (1 << 11) } } From 409ff21cc4de738c8468a846c998e8f19080b865 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 25 May 2012 02:40:34 +0000 Subject: [PATCH 393/731] debian: improve policy compliance on debian/copyright --- debian/copyright | 984 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 966 insertions(+), 18 deletions(-) diff --git a/debian/copyright b/debian/copyright index 732b2b7d0c..4312f4bb88 100644 --- a/debian/copyright +++ b/debian/copyright @@ -2,29 +2,482 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: freeswitch Source: http://freeswitch.org/ -Files: debian/* -Copyright: 2012, Travis Cross -License: MPL or GPL2+ (at your option) - This packaging may be distributed under either (at your option) the - terms of the MPLv1.1 as described in docs/COPYING in the FreeSWITCH - source tree, or under the terms of the GNU GPL, version 2 or later, - as found on Debian systems in /usr/share/common-licenses/GPL-2. - Files: * -Copyright: 2012, Anthony Minessale II and many other contributors -License: MPL - The contents of these files are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use these files except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ +Copyright: 2012 Anthony Minessale II and many other contributors +License: MPL-1.1 + MOZILLA PUBLIC LICENSE + Version 1.1 . - 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. + --------------- + . + 1. Definitions. + . + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + . + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + . + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + . + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + . + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + . + 1.5. "Executable" means Covered Code in any form other than Source + Code. + . + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + . + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + . + 1.8. "License" means this document. + . + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + . + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + . + B. Any new file that contains any part of the Original Code or + previous Modifications. + . + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + . + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + . + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + . + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + . + 2. Source Code License. + . + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + . + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + . + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + . + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + . + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + . + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + . + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + . + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + . + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + . + 3. Distribution Obligations. + . + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + . + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + . + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + . + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + . + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + . + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + . + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + . + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + . + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + . + 4. Inability to Comply Due to Statute or Regulation. + . + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + . + 5. Application of this License. + . + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + . + 6. Versions of the License. + . + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + . + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + . + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + . + 7. DISCLAIMER OF WARRANTY. + . + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + . + 8. TERMINATION. + . + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + . + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + . + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + . + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + . + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + . + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + . + 9. LIMITATION OF LIABILITY. + . + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + . + 10. U.S. GOVERNMENT END USERS. + . + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + . + 11. MISCELLANEOUS. + . + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + . + 12. RESPONSIBILITY FOR CLAIMS. + . + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + . + 13. MULTIPLE-LICENSED CODE. + . + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + . + EXHIBIT A -Mozilla Public License. + . + ``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 ______________________________________. + . + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + . + Contributor(s): ______________________________________. + . + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + . + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] Files: libs/pocketsphinx* Copyright: 2010 Carnegie Mellon University +License: BSD-2-clause /* ==================================================================== * Copyright (c) 1999-2010 Carnegie Mellon University. All rights * reserved. @@ -61,3 +514,498 @@ Copyright: 2010 Carnegie Mellon University * */ +Files: debian/* +Copyright: 2012 Travis Cross +License: MPL-1.1 or GPL-2+ + This program is free software, and you may redistribute it and/or + modify it under either (at your option) the terms of the Mozilla + Public License Version 1.1 (MPLv1.1) or under the terms of the GNU + General Public License as published by the Free Software Foundation + (either version 2 of the License, or (at your option) any later + version). Both licenses are described below. + . + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA + . + On Debian systems, the full text of the GNU General Public License + version 2 can be found in the file + `/usr/share/common-licenses/GPL-2'. + . + ---- + . + MOZILLA PUBLIC LICENSE + Version 1.1 + . + --------------- + . + 1. Definitions. + . + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + . + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + . + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + . + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + . + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + . + 1.5. "Executable" means Covered Code in any form other than Source + Code. + . + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + . + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + . + 1.8. "License" means this document. + . + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + . + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + . + B. Any new file that contains any part of the Original Code or + previous Modifications. + . + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + . + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + . + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + . + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + . + 2. Source Code License. + . + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + . + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + . + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + . + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + . + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + . + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + . + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + . + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + . + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + . + 3. Distribution Obligations. + . + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + . + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + . + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + . + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + . + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + . + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + . + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + . + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + . + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + . + 4. Inability to Comply Due to Statute or Regulation. + . + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + . + 5. Application of this License. + . + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + . + 6. Versions of the License. + . + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + . + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + . + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + . + 7. DISCLAIMER OF WARRANTY. + . + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + . + 8. TERMINATION. + . + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + . + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + . + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + . + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + . + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + . + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + . + 9. LIMITATION OF LIABILITY. + . + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + . + 10. U.S. GOVERNMENT END USERS. + . + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + . + 11. MISCELLANEOUS. + . + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + . + 12. RESPONSIBILITY FOR CLAIMS. + . + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + . + 13. MULTIPLE-LICENSED CODE. + . + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + . + EXHIBIT A -Mozilla Public License. + . + ``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 ______________________________________. + . + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + . + Contributor(s): ______________________________________. + . + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + . + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] From 771819c4307d72d116114dff315343b265845068 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 25 May 2012 04:46:08 +0000 Subject: [PATCH 394/731] setup-git.sh: set pull.rebase=true git-pull learned about pull.rebase in git-1.7.9. This value is used as a fallback if branch..rebase isn't found. --- scripts/setup-git.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/setup-git.sh b/scripts/setup-git.sh index f9f709ff7f..df3cd73b6c 100755 --- a/scripts/setup-git.sh +++ b/scripts/setup-git.sh @@ -34,13 +34,14 @@ if ! git config user.email >/dev/null 2>&1; then git config --global user.email "$email" fi +git config pull.rebase true git config branch.master.rebase true cat 1>&2 < Date: Fri, 25 May 2012 07:18:55 -0400 Subject: [PATCH 395/731] mod_voicemail: Make sure vm_fsdb api create the user directory before trying to move file into it --- src/mod/applications/mod_voicemail/mod_voicemail.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 2ed70ce05d..0bbea275d5 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -4895,6 +4895,8 @@ SWITCH_STANDARD_API(vm_fsdb_pref_greeting_set_function) profile->name, SWITCH_PATH_SEPARATOR, domain, SWITCH_PATH_SEPARATOR, id); char *final_file_path = switch_core_sprintf(pool, "%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, slot, profile->file_ext); + switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, pool); + if (file_path) { if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "-ERR Filename doesn't exist\n"); @@ -4989,6 +4991,8 @@ SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function) profile->name, SWITCH_PATH_SEPARATOR, domain, SWITCH_PATH_SEPARATOR, id); char *final_file_path = switch_core_sprintf(pool, "%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR, profile->file_ext); + switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, pool); + if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "-ERR Filename doesn't exist\n"); profile_rwunlock(profile); @@ -4996,6 +5000,7 @@ SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function) } switch_file_rename(file_path, final_file_path, pool); + if (atoi(res) == 0) { sql = switch_mprintf("INSERT INTO voicemail_prefs (username, domain, name_path) VALUES('%q', '%q', '%q')", id, domain, final_file_path); } else { From 452e1d82712becfacdd87b30b1fe7ec622c13f00 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 25 May 2012 07:54:11 -0500 Subject: [PATCH 396/731] FS-4249 --resolve --- libs/stfu/stfu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/stfu/stfu.c b/libs/stfu/stfu.c index 5c31133aa8..787fd9c3d9 100644 --- a/libs/stfu/stfu.c +++ b/libs/stfu/stfu.c @@ -461,7 +461,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void i->sync_in = 0; } else { - if ((ts && ts == i->last_rd_ts + i->samples_per_packet) || (i->last_rd_ts > 4294900000 && ts < 5000)) { + if ((ts && ts == i->last_rd_ts + i->samples_per_packet) || (i->last_rd_ts > 4294900000u && ts < 5000)) { good_ts = 1; } From 09bef08b8368b5af17e2205bde9df10502b66efa Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Fri, 25 May 2012 13:45:02 -0400 Subject: [PATCH 397/731] FS-4254 --resolve I've changed the variable name from cc_export to cc_export_vars to be more consistant from the original patch --- src/mod/applications/mod_callcenter/mod_callcenter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c index 30bdf9c2b3..99ece2ff39 100644 --- a/src/mod/applications/mod_callcenter/mod_callcenter.c +++ b/src/mod/applications/mod_callcenter/mod_callcenter.c @@ -1466,6 +1466,8 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "ignore_early_media", "true"); switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "origination_uuid", "%s", agent_uuid_str); + switch_channel_process_export(member_channel, NULL, ovars, "cc_export_vars"); + t_agent_called = local_epoch_time_now(NULL); dialstr = switch_mprintf("%s", h->originate_string); status = switch_ivr_originate(NULL, &agent_session, &cause, dialstr, 60, NULL, cid_name ? cid_name : h->member_cid_name, h->member_cid_number, NULL, ovars, SOF_NONE, NULL); From 03b92c9ba186c9ec1a01dbff9698f909d98d524a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 25 May 2012 11:02:51 -0500 Subject: [PATCH 398/731] FS-4251 --resolve just a silly oversight in the code specific to this use case, thanks --- src/switch_core_io.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/switch_core_io.c b/src/switch_core_io.c index f20fa7bff9..83f8ae6d26 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -1469,6 +1469,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_send_dtmf_string(switch_core switch_assert(session != NULL); + if (zstr(dtmf_string)) { + return SWITCH_STATUS_FALSE; + } + if (*dtmf_string == '~') { dtmf_string++; dtmf.flags = 0; @@ -1478,9 +1482,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_send_dtmf_string(switch_core return SWITCH_STATUS_FALSE; } - if (zstr(dtmf_string)) { - return SWITCH_STATUS_FALSE; - } if (strlen(dtmf_string) > 99) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Attempt to send very large dtmf string ignored!\n"); From 9b569ec875795052e068c244d880cf96deb65a3a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 05:22:17 +0000 Subject: [PATCH 399/731] cleanup and consolidate mod_sofia configuration example --- .../mod_sofia/conf/sip_profiles/external.xml | 95 ---- .../conf/sip_profiles/external/example.xml | 38 -- .../conf/sip_profiles/internal-ipv6.xml | 130 ----- .../mod_sofia/conf/sip_profiles/internal.xml | 385 -------------- .../conf/sip_profiles/internal/example.xml | 37 -- .../endpoints/mod_sofia/conf/sofia.conf.xml | 473 ++++++++++++++++++ 6 files changed, 473 insertions(+), 685 deletions(-) delete mode 100644 src/mod/endpoints/mod_sofia/conf/sip_profiles/external.xml delete mode 100644 src/mod/endpoints/mod_sofia/conf/sip_profiles/external/example.xml delete mode 100644 src/mod/endpoints/mod_sofia/conf/sip_profiles/internal-ipv6.xml delete mode 100644 src/mod/endpoints/mod_sofia/conf/sip_profiles/internal.xml delete mode 100644 src/mod/endpoints/mod_sofia/conf/sip_profiles/internal/example.xml create mode 100644 src/mod/endpoints/mod_sofia/conf/sofia.conf.xml diff --git a/src/mod/endpoints/mod_sofia/conf/sip_profiles/external.xml b/src/mod/endpoints/mod_sofia/conf/sip_profiles/external.xml deleted file mode 100644 index a709cbb94c..0000000000 --- a/src/mod/endpoints/mod_sofia/conf/sip_profiles/external.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/endpoints/mod_sofia/conf/sip_profiles/external/example.xml b/src/mod/endpoints/mod_sofia/conf/sip_profiles/external/example.xml deleted file mode 100644 index 70668a9ce5..0000000000 --- a/src/mod/endpoints/mod_sofia/conf/sip_profiles/external/example.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal-ipv6.xml b/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal-ipv6.xml deleted file mode 100644 index ee27a241a0..0000000000 --- a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal-ipv6.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal.xml b/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal.xml deleted file mode 100644 index b8390c7934..0000000000 --- a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal.xml +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal/example.xml b/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal/example.xml deleted file mode 100644 index fc061f96d1..0000000000 --- a/src/mod/endpoints/mod_sofia/conf/sip_profiles/internal/example.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml new file mode 100644 index 0000000000..2649a24ae8 --- /dev/null +++ b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml @@ -0,0 +1,473 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 73614127fcb04a9370b968438f1ffb01637b4d1a Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 05:44:14 +0000 Subject: [PATCH 400/731] whitespace cleanup --- conf/insideout/sip_profiles/external.xml | 12 +- .../sip_profiles/external/example.xml | 2 +- conf/insideout/sip_profiles/internal-ipv6.xml | 17 +- conf/insideout/sip_profiles/internal.xml | 63 +++--- .../sip_profiles/internal/example.xml | 2 +- conf/sbc/sbc_profiles/external.xml | 14 +- conf/sbc/sbc_profiles/external/example.xml | 2 +- conf/sbc/sbc_profiles/internal-ipv6.xml | 17 +- conf/sbc/sbc_profiles/internal.xml | 61 +++-- conf/sbc/sbc_profiles/internal/example.xml | 2 +- conf/vanilla/sip_profiles/external.xml | 27 ++- .../vanilla/sip_profiles/external/example.xml | 2 +- conf/vanilla/sip_profiles/internal-ipv6.xml | 27 ++- conf/vanilla/sip_profiles/internal.xml | 212 +++++++++--------- .../vanilla/sip_profiles/internal/example.xml | 2 +- 15 files changed, 227 insertions(+), 235 deletions(-) diff --git a/conf/insideout/sip_profiles/external.xml b/conf/insideout/sip_profiles/external.xml index 6f6045255d..3fcb969f7f 100644 --- a/conf/insideout/sip_profiles/external.xml +++ b/conf/insideout/sip_profiles/external.xml @@ -1,4 +1,4 @@ - + @@ -29,10 +29,10 @@ - @@ -48,7 +48,7 @@ diff --git a/conf/insideout/sip_profiles/external/example.xml b/conf/insideout/sip_profiles/external/example.xml index 7ac8db1186..c6b79e8fe3 100644 --- a/conf/insideout/sip_profiles/external/example.xml +++ b/conf/insideout/sip_profiles/external/example.xml @@ -9,7 +9,7 @@ - + diff --git a/conf/insideout/sip_profiles/internal-ipv6.xml b/conf/insideout/sip_profiles/internal-ipv6.xml index 856ac4905d..649246ad36 100644 --- a/conf/insideout/sip_profiles/internal-ipv6.xml +++ b/conf/insideout/sip_profiles/internal-ipv6.xml @@ -53,36 +53,36 @@ - + - + - + - + - + - + - + @@ -128,4 +128,3 @@ - diff --git a/conf/insideout/sip_profiles/internal.xml b/conf/insideout/sip_profiles/internal.xml index a6010b2945..3ea2ef155c 100644 --- a/conf/insideout/sip_profiles/internal.xml +++ b/conf/insideout/sip_profiles/internal.xml @@ -1,7 +1,7 @@ @@ -16,24 +16,24 @@ - + - + - + @@ -63,7 +63,7 @@ - + @@ -88,36 +88,36 @@ - + - + - + - + - + - + - + @@ -138,7 +138,7 @@ - + @@ -158,24 +158,24 @@ - + - + @@ -186,4 +186,3 @@ - diff --git a/conf/insideout/sip_profiles/internal/example.xml b/conf/insideout/sip_profiles/internal/example.xml index 7ac8db1186..c6b79e8fe3 100644 --- a/conf/insideout/sip_profiles/internal/example.xml +++ b/conf/insideout/sip_profiles/internal/example.xml @@ -9,7 +9,7 @@ - + diff --git a/conf/sbc/sbc_profiles/external.xml b/conf/sbc/sbc_profiles/external.xml index d16813960f..9a5686bd91 100644 --- a/conf/sbc/sbc_profiles/external.xml +++ b/conf/sbc/sbc_profiles/external.xml @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ - + @@ -30,10 +30,10 @@ - @@ -49,7 +49,7 @@ diff --git a/conf/sbc/sbc_profiles/external/example.xml b/conf/sbc/sbc_profiles/external/example.xml index 7ac8db1186..c6b79e8fe3 100644 --- a/conf/sbc/sbc_profiles/external/example.xml +++ b/conf/sbc/sbc_profiles/external/example.xml @@ -9,7 +9,7 @@ - + diff --git a/conf/sbc/sbc_profiles/internal-ipv6.xml b/conf/sbc/sbc_profiles/internal-ipv6.xml index 856ac4905d..649246ad36 100644 --- a/conf/sbc/sbc_profiles/internal-ipv6.xml +++ b/conf/sbc/sbc_profiles/internal-ipv6.xml @@ -53,36 +53,36 @@ - + - + - + - + - + - + - + @@ -128,4 +128,3 @@ - diff --git a/conf/sbc/sbc_profiles/internal.xml b/conf/sbc/sbc_profiles/internal.xml index d06e3a76cd..7e1ceeb9df 100644 --- a/conf/sbc/sbc_profiles/internal.xml +++ b/conf/sbc/sbc_profiles/internal.xml @@ -1,7 +1,7 @@ @@ -15,24 +15,24 @@ - + - + - + @@ -69,7 +69,7 @@ - + @@ -94,36 +94,36 @@ - + - + - + - + - + - + - + @@ -154,24 +154,24 @@ - + - + @@ -182,4 +182,3 @@ - diff --git a/conf/sbc/sbc_profiles/internal/example.xml b/conf/sbc/sbc_profiles/internal/example.xml index 7ac8db1186..c6b79e8fe3 100644 --- a/conf/sbc/sbc_profiles/internal/example.xml +++ b/conf/sbc/sbc_profiles/internal/example.xml @@ -9,7 +9,7 @@ - + diff --git a/conf/vanilla/sip_profiles/external.xml b/conf/vanilla/sip_profiles/external.xml index a709cbb94c..39965e9421 100644 --- a/conf/vanilla/sip_profiles/external.xml +++ b/conf/vanilla/sip_profiles/external.xml @@ -1,14 +1,14 @@ - + - @@ -18,10 +18,10 @@ - - + + - + @@ -34,15 +34,15 @@ - + - @@ -57,7 +57,7 @@ @@ -90,6 +90,5 @@ - diff --git a/conf/vanilla/sip_profiles/external/example.xml b/conf/vanilla/sip_profiles/external/example.xml index 70668a9ce5..2a4df31aaf 100644 --- a/conf/vanilla/sip_profiles/external/example.xml +++ b/conf/vanilla/sip_profiles/external/example.xml @@ -9,7 +9,7 @@ - + diff --git a/conf/vanilla/sip_profiles/internal-ipv6.xml b/conf/vanilla/sip_profiles/internal-ipv6.xml index ee27a241a0..5a97f0cd60 100644 --- a/conf/vanilla/sip_profiles/internal-ipv6.xml +++ b/conf/vanilla/sip_profiles/internal-ipv6.xml @@ -54,36 +54,36 @@ - + - + - + - + - + - + - + @@ -103,8 +103,8 @@ @@ -121,10 +121,9 @@ - - - + + + - diff --git a/conf/vanilla/sip_profiles/internal.xml b/conf/vanilla/sip_profiles/internal.xml index b9605a192c..afb12ab94c 100644 --- a/conf/vanilla/sip_profiles/internal.xml +++ b/conf/vanilla/sip_profiles/internal.xml @@ -2,30 +2,30 @@ - + - + - + - + @@ -33,31 +33,31 @@ - - + + - + - @@ -106,26 +106,26 @@ - - - + + + @@ -134,10 +134,10 @@ - + - + @@ -164,7 +164,7 @@ - + @@ -203,39 +203,39 @@ - + - + - + - + - + - + - + - + @@ -252,16 +252,16 @@ - + + Used as the public IP address for SDP. + Can be an one of: + ip address - "12.34.56.78" + a stun server lookup - "stun:stun.server.com" + a DNS name - "host:host.server.com" + auto - Use guessed ip. + auto-nat - Use ip learned from NAT-PMP or UPNP + --> @@ -274,8 +274,8 @@ @@ -297,28 +297,27 @@ - - + @@ -332,59 +331,58 @@ - - - - + + + - - - - - - - - - - - - - - + - - + + + + + - - - + + + + + + + + + + + + + - diff --git a/conf/vanilla/sip_profiles/internal/example.xml b/conf/vanilla/sip_profiles/internal/example.xml index fc061f96d1..10263b05a5 100644 --- a/conf/vanilla/sip_profiles/internal/example.xml +++ b/conf/vanilla/sip_profiles/internal/example.xml @@ -9,7 +9,7 @@ - + From 8513be49de33d2832941b5837239e6c9318daf5b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 05:50:47 +0000 Subject: [PATCH 401/731] enable inbound-late-negotiation in sample configs We often tell people to enable this for various reasons; it likely makes a sensible default. --- conf/insideout/sip_profiles/external.xml | 1 + conf/insideout/sip_profiles/internal-ipv6.xml | 4 ++-- conf/insideout/sip_profiles/internal.xml | 4 ++-- conf/sbc/sbc_profiles/external.xml | 1 + conf/sbc/sbc_profiles/internal-ipv6.xml | 4 ++-- conf/sbc/sbc_profiles/internal.xml | 4 ++-- conf/vanilla/sip_profiles/external.xml | 1 + conf/vanilla/sip_profiles/internal-ipv6.xml | 4 ++-- conf/vanilla/sip_profiles/internal.xml | 4 ++-- src/mod/endpoints/mod_sofia/conf/sofia.conf.xml | 5 ++--- 10 files changed, 17 insertions(+), 15 deletions(-) diff --git a/conf/insideout/sip_profiles/external.xml b/conf/insideout/sip_profiles/external.xml index 3fcb969f7f..be38318432 100644 --- a/conf/insideout/sip_profiles/external.xml +++ b/conf/insideout/sip_profiles/external.xml @@ -47,6 +47,7 @@ + diff --git a/conf/insideout/sip_profiles/internal-ipv6.xml b/conf/insideout/sip_profiles/internal-ipv6.xml index 649246ad36..e433da1425 100644 --- a/conf/insideout/sip_profiles/internal-ipv6.xml +++ b/conf/insideout/sip_profiles/internal-ipv6.xml @@ -66,8 +66,8 @@ - - + + diff --git a/conf/insideout/sip_profiles/internal.xml b/conf/insideout/sip_profiles/internal.xml index 3ea2ef155c..61263f03dc 100644 --- a/conf/insideout/sip_profiles/internal.xml +++ b/conf/insideout/sip_profiles/internal.xml @@ -101,8 +101,8 @@ - - + + diff --git a/conf/sbc/sbc_profiles/external.xml b/conf/sbc/sbc_profiles/external.xml index 9a5686bd91..1cb91e8dab 100644 --- a/conf/sbc/sbc_profiles/external.xml +++ b/conf/sbc/sbc_profiles/external.xml @@ -48,6 +48,7 @@ + diff --git a/conf/sbc/sbc_profiles/internal-ipv6.xml b/conf/sbc/sbc_profiles/internal-ipv6.xml index 649246ad36..e433da1425 100644 --- a/conf/sbc/sbc_profiles/internal-ipv6.xml +++ b/conf/sbc/sbc_profiles/internal-ipv6.xml @@ -66,8 +66,8 @@ - - + + diff --git a/conf/sbc/sbc_profiles/internal.xml b/conf/sbc/sbc_profiles/internal.xml index 7e1ceeb9df..8263a82668 100644 --- a/conf/sbc/sbc_profiles/internal.xml +++ b/conf/sbc/sbc_profiles/internal.xml @@ -107,8 +107,8 @@ - - + + diff --git a/conf/vanilla/sip_profiles/external.xml b/conf/vanilla/sip_profiles/external.xml index 39965e9421..8176d9b23f 100644 --- a/conf/vanilla/sip_profiles/external.xml +++ b/conf/vanilla/sip_profiles/external.xml @@ -56,6 +56,7 @@ + diff --git a/conf/vanilla/sip_profiles/internal-ipv6.xml b/conf/vanilla/sip_profiles/internal-ipv6.xml index 5a97f0cd60..2dd3842649 100644 --- a/conf/vanilla/sip_profiles/internal-ipv6.xml +++ b/conf/vanilla/sip_profiles/internal-ipv6.xml @@ -67,8 +67,8 @@ - - + + diff --git a/conf/vanilla/sip_profiles/internal.xml b/conf/vanilla/sip_profiles/internal.xml index afb12ab94c..1ba2c57427 100644 --- a/conf/vanilla/sip_profiles/internal.xml +++ b/conf/vanilla/sip_profiles/internal.xml @@ -219,8 +219,8 @@ - - + + diff --git a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml index 2649a24ae8..9acbe6d916 100644 --- a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml +++ b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml @@ -263,9 +263,8 @@ - - + + diff --git a/conf/insideout/sip_profiles/internal-ipv6.xml b/conf/insideout/sip_profiles/internal-ipv6.xml index e433da1425..b9907a78ad 100644 --- a/conf/insideout/sip_profiles/internal-ipv6.xml +++ b/conf/insideout/sip_profiles/internal-ipv6.xml @@ -69,6 +69,9 @@ + + + diff --git a/conf/insideout/sip_profiles/internal.xml b/conf/insideout/sip_profiles/internal.xml index 61263f03dc..e406cd5e72 100644 --- a/conf/insideout/sip_profiles/internal.xml +++ b/conf/insideout/sip_profiles/internal.xml @@ -104,6 +104,9 @@ + + + diff --git a/conf/sbc/sbc_profiles/external.xml b/conf/sbc/sbc_profiles/external.xml index 1cb91e8dab..0f15159f58 100644 --- a/conf/sbc/sbc_profiles/external.xml +++ b/conf/sbc/sbc_profiles/external.xml @@ -49,6 +49,7 @@ + diff --git a/conf/sbc/sbc_profiles/internal-ipv6.xml b/conf/sbc/sbc_profiles/internal-ipv6.xml index e433da1425..b9907a78ad 100644 --- a/conf/sbc/sbc_profiles/internal-ipv6.xml +++ b/conf/sbc/sbc_profiles/internal-ipv6.xml @@ -69,6 +69,9 @@ + + + diff --git a/conf/sbc/sbc_profiles/internal.xml b/conf/sbc/sbc_profiles/internal.xml index 8263a82668..3081052c88 100644 --- a/conf/sbc/sbc_profiles/internal.xml +++ b/conf/sbc/sbc_profiles/internal.xml @@ -110,6 +110,9 @@ + + + diff --git a/conf/vanilla/sip_profiles/external.xml b/conf/vanilla/sip_profiles/external.xml index 8176d9b23f..4f18e84be7 100644 --- a/conf/vanilla/sip_profiles/external.xml +++ b/conf/vanilla/sip_profiles/external.xml @@ -57,6 +57,7 @@ + diff --git a/conf/vanilla/sip_profiles/internal-ipv6.xml b/conf/vanilla/sip_profiles/internal-ipv6.xml index 2dd3842649..18274faa4f 100644 --- a/conf/vanilla/sip_profiles/internal-ipv6.xml +++ b/conf/vanilla/sip_profiles/internal-ipv6.xml @@ -70,6 +70,9 @@ + + + diff --git a/conf/vanilla/sip_profiles/internal.xml b/conf/vanilla/sip_profiles/internal.xml index 1ba2c57427..0f4cabe32d 100644 --- a/conf/vanilla/sip_profiles/internal.xml +++ b/conf/vanilla/sip_profiles/internal.xml @@ -222,6 +222,9 @@ + + + diff --git a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml index 9acbe6d916..30d8063a67 100644 --- a/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml +++ b/src/mod/endpoints/mod_sofia/conf/sofia.conf.xml @@ -266,6 +266,9 @@ + + + From 890a89b6e39f1410fbaad5226b030861de0b300e Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 06:17:58 +0000 Subject: [PATCH 403/731] debian: suggest rather than depend on problematic codecs --- debian/bootstrap.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 113675c3e8..d5c533c080 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -322,13 +322,14 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-g723-1 (= \${binary:Version}), freeswitch-mod-g729 (= \${binary:Version}), freeswitch-mod-h26x (= \${binary:Version}), - freeswitch-mod-ilbc (= \${binary:Version}), freeswitch-mod-mp4v (= \${binary:Version}), freeswitch-mod-opus (= \${binary:Version}), freeswitch-mod-silk (= \${binary:Version}), - freeswitch-mod-siren (= \${binary:Version}), freeswitch-mod-speex (= \${binary:Version}), freeswitch-mod-theora (= \${binary:Version}) +Suggests: + freeswitch-mod-ilbc (= \${binary:Version}), + freeswitch-mod-siren (= \${binary:Version}) Description: Cross-Platform Scalable Multi-Protocol Soft Switch $(debian_wrap "${fs_description}") . From 219831edf3cac97e5aa043a75e2e8f212c2e5c8c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 06:34:52 +0000 Subject: [PATCH 404/731] debian: pull in mod_spandsp with other codecs --- debian/bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index d5c533c080..cf27d67934 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -325,6 +325,7 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-mp4v (= \${binary:Version}), freeswitch-mod-opus (= \${binary:Version}), freeswitch-mod-silk (= \${binary:Version}), + freeswitch-mod-spandsp (= \${binary:Version}), freeswitch-mod-speex (= \${binary:Version}), freeswitch-mod-theora (= \${binary:Version}) Suggests: From 44e6dd26800d6524345918b64e0e18610d97a35e Mon Sep 17 00:00:00 2001 From: Stefan Knoblich Date: Sun, 27 May 2012 14:36:15 +0200 Subject: [PATCH 405/731] FreeSWITCH: Make libzrtp library paths absolute (or relative to top srcdir), fixes FS-4260. Reference-URL: http://jira.freeswitch.org/browse/FS-4260 Tested-by: Stefan Knoblich Signed-off-by: Stefan Knoblich --- Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index db22184f5d..31d22f7754 100644 --- a/Makefile.am +++ b/Makefile.am @@ -157,8 +157,8 @@ if ENABLE_ZRTP CORE_CFLAGS += -I$(switch_srcdir)/libs/libzrtp/third_party/bgaes CORE_CFLAGS += -I$(switch_srcdir)/libs/libzrtp/third_party/bnlib CORE_CFLAGS += -isystem $(switch_srcdir)/libs/libzrtp/include -ZRTP_LDFLAGS = -Llibs/libzrtp/third_party/bnlib -ZRTP_LDFLAGS += -Llibs/libzrtp/projects/gnu/build +ZRTP_LDFLAGS = -L$(switch_srcdir)/libs/libzrtp/third_party/bnlib +ZRTP_LDFLAGS += -L$(switch_srcdir)/libs/libzrtp/projects/gnu/build ZRTP_LIBS = -lbn -lzrtp libfreeswitch_la_LDFLAGS += $(ZRTP_LDFLAGS) libfreeswitch_la_LIBADD += $(ZRTP_LIBS) From be3ee2404c4f7f5bd4b0c1def723cfad82c57043 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 09:18:28 +0000 Subject: [PATCH 406/731] reindent --- build/getlib.sh.in | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/build/getlib.sh.in b/build/getlib.sh.in index bbfe696f79..f18ec1da2d 100755 --- a/build/getlib.sh.in +++ b/build/getlib.sh.in @@ -1,4 +1,5 @@ #!/bin/sh +##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- TAR=@TAR@ ZCAT=@ZCAT@ @@ -8,39 +9,39 @@ WGET=@WGET@ CURL=@CURL@ if [ -f "$WGET" ]; then - DOWNLOAD_CMD=$WGET + DOWNLOAD_CMD=$WGET elif [ -f "$CURL" ]; then - DOWNLOAD_CMD="$CURL -O" + DOWNLOAD_CMD="$CURL -O" fi if [ -n "`echo $1 | grep '://'`" ]; then - base=$1/ - tarfile=$2 + base=$1/ + tarfile=$2 else - base=http://files.freeswitch.org/downloads/libs/ - tarfile=$1 + base=http://files.freeswitch.org/downloads/libs/ + tarfile=$1 fi uncompressed=`echo $tarfile | sed 's/\(\(\.tar\.gz\|\.tar\.bz2\|\.tar\.xz\)\|\(\.tgz\|\.tbz2\)\)$//'` case `echo $tarfile | sed 's/^.*\.//'` in - bz2|tbz2) UNZIPPER=$BZIP ;; - xz) UNZIPPER=$XZ ;; - gz|tgz|*) UNZIPPER=$ZCAT ;; + bz2|tbz2) UNZIPPER=$BZIP ;; + xz) UNZIPPER=$XZ ;; + gz|tgz|*) UNZIPPER=$ZCAT ;; esac if [ ! -d $tarfile ]; then + if [ ! -f $tarfile ]; then + rm -fr $uncompressed + $DOWNLOAD_CMD $base$tarfile if [ ! -f $tarfile ]; then - rm -fr $uncompressed - $DOWNLOAD_CMD $base$tarfile - if [ ! -f $tarfile ]; then - echo cannot find $tarfile - exit 1 - fi - fi - if [ ! -d $uncompressed ]; then - $UNZIPPER -c -d $tarfile | $TAR -xf - + echo cannot find $tarfile + exit 1 fi + fi + if [ ! -d $uncompressed ]; then + $UNZIPPER -c -d $tarfile | $TAR -xf - + fi fi exit 0 From dfddd3ec108d446cee59380ea482f758044c5ad6 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 09:12:09 +0000 Subject: [PATCH 407/731] debian: remove utilities that duplicate debian tools install-build-depends is inferior to: mk-build-deps -i --- debian/util.sh | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index be7f2f1cc0..3f25023d6d 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -32,46 +32,6 @@ create_dbg_pkgs () { done } -list_build_depends () { - test -f $ddir/.stamp-bootstrap || (cd $ddir && ./bootstrap.sh) - local deps="" found=false - while xread l; do - if [ "${l%%:*}" = "Build-Depends" ]; then - deps="${l#*:}" - found=true - continue - elif $found; then - if [ -z "$l" ]; then - # is newline - break - elif [ -z "${l##\#*}" ]; then - # is comment - continue - elif [ -z "${l## *}" ]; then - # is continuation line - deps="$deps $(echo "$l" | sed -e 's/^ *//' -e 's/ *([^)]*)//g' -e 's/,//g')" - else - # is a new header - break - fi - fi - done < $ddir/control - echo "${deps# }" -} - -install_build_depends () { - local apt="" - if [ -n "$(which aptitude)" ]; then - apt=$(which aptitude) - elif [ -n "$(which apt-get)" ]; then - apt=$(which apt-get) - else - err "Can't find apt-get or aptitude; are you running on debian?" - fi - $apt install -y $(list_build_depends) - touch $ddir/.stamp-build-depends -} - cwget () { local url="$1" f="${1##*/}" echo "fetching: $url to $f" >&2 @@ -208,7 +168,5 @@ case "$cmd" in create-dbg-pkgs) create_dbg_pkgs ;; create-dsc) create_dsc "$@" ;; create-orig) create_orig "$@" ;; - list-build-depends) list_build_depends ;; - install-build-depends) install_build_depends ;; esac From fa0de2efd3f66d3e56152974e6962d01a30a7d3b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 09:17:59 +0000 Subject: [PATCH 408/731] add .gitattributes Add some attributes that are useful for packaging. --- .gitattributes | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..06c92d07df --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +# gitattributes +*.exe -diff binary executable windows dfsg-nonfree debian-ignore +*.wav -diff binary sound +*.gif -diff binary image +*.jpg -diff binary image +*.jpeg -diff binary image +*.pbm -diff binary image +/clients/flex* dfsg-nonfree +/debian* debian-ignore +/freeswitch.xcodeproj debian-ignore +/libs/ilbc* dfsg-nonfree +/libs/libg722_1* dfsg-nonfree +/libs/win32* windows debian-ignore +/htdocs* dfsg-nonfree debian-ignore +/w32* windows debian-ignore From 7d5062f9c9677b8c5ea59f64454e92f5452e602d Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 09:51:18 +0000 Subject: [PATCH 409/731] debian: don't force-create the orig tarball --- debian/gbp.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/debian/gbp.conf b/debian/gbp.conf index 3889b7e9ee..cd1c5ad37e 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -7,7 +7,6 @@ upstream-branch=master debian-branch=master upstream-tree=branch tag=False -force-create=True compression=xz compression-level=9ev builder=debuild --prepend-path=/usr/lib/ccache -eFS_* -eCCACHE_* -i\.git -I.git -Zxz -z9 From 870ef6f83f191610cad0546a45be28c2abc8cf3c Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 09:31:03 +0000 Subject: [PATCH 410/731] debian: don't bundle sounds in orig tarball We've moved the sounds to a separate source package. --- debian/util.sh | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 3f25023d6d..f303d10608 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -54,12 +54,6 @@ getlib () { && mkdir -p $f) } -getsound () { - local sd="$1" url="$2" f="${2##*/}" - (cd $sd \ - && cwget "$url") -} - getlibs () { local sd="$1" # get pinned libraries @@ -80,11 +74,6 @@ getlibs () { getlib $sd http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz getlib $sd http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz getlib $sd http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz - # get sounds and music - for x in 8000 16000 32000 48000; do - getsound $sd http://files.freeswitch.org/freeswitch-sounds-en-us-callie-$x-1.0.18.tar.gz - getsound $sd http://files.freeswitch.org/freeswitch-sounds-music-$x-1.0.8.tar.gz - done # cleanup mongo ( cd $sd/libs/mongo-cxx-driver-v1.8 From 15a67097d804ae4143e63d2c7a3475ff06943481 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 27 May 2012 06:54:31 +0000 Subject: [PATCH 411/731] debian: add utility for rolling nightly builds --- debian/util.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/debian/util.sh b/debian/util.sh index f303d10608..133457b983 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -12,6 +12,16 @@ err () { exit 1 } +announce () { + cat >&2 < Date: Mon, 28 May 2012 12:11:41 +0000 Subject: [PATCH 412/731] debian: refactor and improve build utilities --- debian/util.sh | 278 ++++++++++++++++++++++++++----------------------- 1 file changed, 148 insertions(+), 130 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 133457b983..326e8f6156 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -6,6 +6,9 @@ set -e ddir="." [ -n "${0%/*}" ] && ddir="${0%/*}" +cd $ddir/../ + +#### lib err () { echo "$0 error: $1" >&2 @@ -31,6 +34,35 @@ xread () { return $ret } +mk_dver () { echo "$1" | sed -e 's/-/~/g'; } +mk_uver () { echo "$1" | sed -e 's/-.*$//' -e 's/~/-/'; } +dsc_source () { dpkg-parsechangelog | grep '^Source:' | awk '{print $2}'; } +dsc_ver () { dpkg-parsechangelog | grep '^Version:' | awk '{print $2}'; } +up_ver () { mk_uver "$(dsc_ver)"; } +dsc_base () { echo "$(dsc_source)_$(dsc_ver)"; } +up_base () { echo "$(dsc_source)-$(up_ver)"; } + +find_distro () { + case "$1" in + experimental) echo "sid";; + unstable) echo "sid";; + testing) echo "wheezy";; + stable) echo "squeeze";; + *) echo "$1";; + esac +} + +find_suite () { + case "$1" in + sid) echo "unstable";; + wheezy) echo "testing";; + squeeze) echo "stable";; + *) echo "$1";; + esac +} + +#### debian/rules helpers + create_dbg_pkgs () { for x in $ddir/*; do test ! -d $x && continue @@ -56,166 +88,152 @@ cwget () { } getlib () { - local sd="$1" url="$2" f="${2##*/}" - (cd $sd/libs \ - && cwget "$url" \ - && tar -xv --no-same-owner --no-same-permissions -f "$f" \ - && rm -f "$f" \ - && mkdir -p $f) + local url="$1" f="${1##*/}" + cwget "$url" + tar -xv --no-same-owner --no-same-permissions -f "$f" + rm -f "$f" && mkdir -p $f && touch $f/.download-stamp } getlibs () { - local sd="$1" # get pinned libraries - getlib $sd http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz - getlib $sd http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2 - getlib $sd http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz - getlib $sd http://download.zeromq.org/zeromq-2.1.9.tar.gz \ - || getlib $sd http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz - getlib $sd http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz + getlib http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz + getlib http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz + getlib http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz + getlib http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz + getlib http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2 + getlib http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz + getlib http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz + getlib http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz + getlib http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz + getlib http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz + getlib http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz + getlib http://download.zeromq.org/zeromq-2.1.9.tar.gz \ + || getlib http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz + getlib http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz + getlib http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz + getlib http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz + getlib http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz # cleanup mongo ( - cd $sd/libs/mongo-cxx-driver-v1.8 + cd mongo-cxx-driver-v1.8 rm -rf config.log .sconf_temp *Test *Example find . -name "*.o" -exec rm -f {} \; ) } -get_current_version () { - cat $ddir/changelog \ - | grep -e '^freeswitch ' \ - | awk '{print $2}' \ - | sed -e 's/[()]//g' -e 's/-.*//' -} - -_create_orig () { - . $ddir/../scripts/ci/common.sh - eval $(parse_version "$(get_current_version)") - local destdir="$1" xz_level="$2" n=freeswitch - local d=${n}-${dver} f=${n}_${dver} - local sd=${ddir}/sdeb/$d - [ -n "$destdir" ] || destdir=$ddir/../../ - mkdir -p $sd - tar -c -C $ddir/../ \ - --exclude=.git \ - --exclude=debian \ - --exclude=freeswitch.xcodeproj \ - --exclude=fscomm \ - --exclude=htdocs \ - --exclude=w32 \ - --exclude=web \ - -vf - . | tar -x -C $sd -vf - - (cd $sd && set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev") - getlibs $sd - tar -c -C $ddir/sdeb -vf $ddir/sdeb/$f.orig.tar $d - xz -${xz_level}v $ddir/sdeb/$f.orig.tar - mv $ddir/sdeb/$f.orig.tar.xz $destdir - rm -rf $ddir/sdeb +check_repo_clean () { + git diff-index --quiet --cached HEAD \ + || err "uncommitted changes present" + git diff-files --quiet \ + || err "unclean working tree" + git diff-index --quiet HEAD \ + || err "unclean repository" + ! git ls-files --other --error-unmatch . >/dev/null 2>&1 \ + || err "untracked files or build products present" } create_orig () { - local xz_level="6" - while getopts 'dz:' o; do + local OPTIND OPTARG + local uver="" bundle_deps=false zl=9e + while getopts 'bnv:z:' o "$@"; do case "$o" in - d) set -vx;; - z) xz_level="$OPTARG";; + b) bundle_deps=true;; + n) uver="nightly";; + v) uver="$OPTARG";; + z) zl="$OPTARG";; esac done shift $(($OPTIND-1)) - _create_orig "$1" "$xz_level" + [ -z "$uver" ] || [ "$uver" = "nightly" ] \ + && uver="$(cat build/next-release.txt)-n$(date +%Y%m%dT%H%M%SZ)" + local treeish="$1" dver="$(mk_dver "$uver")" + local orig="../freeswitch_$dver.orig.tar.xz" + [ -n "$treeish" ] || treeish="HEAD" + check_repo_clean + git reset --hard "$treeish" + mv .gitattributes .gitattributes.orig + grep .gitattributes.orig \ + -e '\bdebian-ignore\b' \ + -e '\bdfsg-nonfree\b' \ + | while xread l; do + echo "$l export-ignore" >> .gitattributes + done + if $bundle_deps; then + (cd libs && getlibs) + git add -f libs + fi + ./build/set-fs-version.sh "$uver" && git add configure.in + git commit --allow-empty -m "nightly v$uver" + git archive -v \ + --worktree-attributes \ + --format=tar \ + --prefix=freeswitch-$uver/ \ + HEAD \ + | xz -c -${zl}v > $orig + mv .gitattributes.orig .gitattributes + git reset --hard HEAD^ && git clean -fdx + echo $orig } create_dsc () { - . $ddir/../scripts/ci/common.sh - local xz_level="6" - while getopts 'dz:' o; do - case "$o" in - d) set -vx;; - z) xz_level="$OPTARG";; - esac - done - shift $(($OPTIND-1)) - eval $(parse_version "$(get_current_version)") - local destdir="$1" n=freeswitch - local d=${n}-${dver} f=${n}_${dver} - [ -n "$destdir" ] || destdir=$ddir/../../ - [ -f $destdir/$f.orig.tar.xz ] \ - || _create_orig "$1" "${xz_level}" - ( - ddir=$(pwd)/$ddir - cd $destdir - mkdir -p $f - cp -a $ddir $f - dpkg-source -b -i.* -Zxz -z9 $f - ) -} - -build_nightly_for () { - set -e - local branch="$1" - local distro="$2" suite="" - case $distro in - experimental) distro="sid" suite="experimental";; - sid) suite="unstable";; - wheezy) suite="testing" ;; - squeeze) suite="stable" ;; - esac - [ -x "$(which cowbuilder)" ] \ - || err "Error: package cowbuilder isn't installed" + local distro="$(find_distro $1)" orig="$2" + local suite="$(find_suite $distro)" + local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')" + local dver="${orig_ver}-1~${distro}+1" [ -x "$(which dch)" ] \ - || err "Error: package devscripts isn't installed" - [ -x "$(which git-buildpackage)" ] \ - || err "Error: package git-buildpackage isn't installed" - ulimit -n 200000 || true - if ! [ -d /var/cache/pbuilder/base-$distro.cow ]; then - announce "Creating base $distro image..." - cowbuilder --create \ - --distribution $distro \ - --basepath /var/cache/pbuilder/base-$distro.cow - fi - announce "Updating base $distro image..." - cowbuilder --update \ - --distribution $distro \ - --basepath /var/cache/pbuilder/base-$distro.cow - local ver="$(cat build/next-release.txt | sed -e 's/-/~/g')~n$(date +%Y%m%dT%H%M%SZ)-1~${distro}+1" - echo "Building v$ver for $distro based on $branch" - cd $ddir/../ - announce "Building v$ver..." - git clean -fdx - git reset --hard $branch - ./build/set-fs-version.sh "$ver" - git add configure.in && git commit --allow-empty -m "nightly v$ver" + || err "package devscripts isn't installed" (cd debian && ./bootstrap.sh -c $distro) - dch -b -m -v "$ver" --force-distribution -D "$suite" "Nightly build." - git-buildpackage -us -uc \ - --git-verbose \ - --git-pbuilder --git-dist=$distro \ - --git-compression=xz --git-compression-level=9ev - git reset --hard HEAD^ + dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build." + git add debian/changelog && git commit -m "nightly v$orig_ver" + dpkg-source -i.* -Zxz -z9 -b . + dpkg-genchanges -S > ../$(dsc_base)_source.changes + local dsc="../$(dsc_base).dsc" + git reset --hard HEAD^ && git clean -fdx + echo $dsc } -build_nightly () { - local branch="$1"; shift - for distro in "$@"; do - build_nightly_for "$branch" "$distro" - done +build_debs () { + local distro="$(find_distro $1)" dsc="$2" arch="$3" + if [ -z "$distro" ] || [ "$distro" = "auto" ]; then + if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then + err "no distro specified or found" + fi + local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')" + distro="$(find_distro $x)" + fi + [ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)" + [ -x "$(which cowbuilder)" ] \ + || err "package cowbuilder isn't installed" + local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow + cow () { + cowbuilder "$@" \ + --distribution $distro \ + --architecture $arch \ + --basepath $cow_img + } + if ! [ -d $cow_img ]; then + announce "Creating base $distro-$arch image..." + cow --create + fi + announce "Updating base $distro-$arch image..." + cow --update + announce "Building $distro-$arch DEBs from $dsc..." + cow --build $dsc + echo ${dsc}_${arch}.changes } +while getopts 'd' o "$@"; do + case "$o" in + d) set -vx;; + esac +done +shift $(($OPTIND-1)) + cmd="$1" shift case "$cmd" in - build-nightly) build_nightly "$@" ;; + archive-orig) archive_orig "$@" ;; + build-debs) build_debs "$@" ;; create-dbg-pkgs) create_dbg_pkgs ;; create-dsc) create_dsc "$@" ;; create-orig) create_orig "$@" ;; From 139485855d3469e5cec4d14884f9f920d8ec1b28 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 13:35:00 +0000 Subject: [PATCH 413/731] debian: don't try to build non-dfsg modules --- debian/bootstrap.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index cf27d67934..62edf42668 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -17,7 +17,9 @@ avoid_mods=( applications/mod_skel asr_tts/mod_cepstral codecs/mod_com_g729 + codecs/mod_ilbc codecs/mod_sangoma_codec + codecs/mod_siren codecs/mod_skel_codec codecs/mod_voipcodecs endpoints/mod_gsmopen From 8fb3f54c15045e699bd43c5df118589df439b179 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 13:37:34 +0000 Subject: [PATCH 414/731] debian: add option to create pbuilder debug hook --- debian/util.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/debian/util.sh b/debian/util.sh index 326e8f6156..08827f3e07 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -192,7 +192,23 @@ create_dsc () { echo $dsc } +fmt_debug_hook () { + cat <<'EOF' +#!/bin/bash +export debian_chroot="cow" +cd /tmp/buildd/*/debian/.. +/bin/bash < /dev/tty > /dev/tty 2> /dev/tty +EOF +} + build_debs () { + local OPTIND OPTARG debug_hook=false hookdir="" + while getopts 'd' o "$@"; do + case "$o" in + d) debug_hook=true;; + esac + done + shift $(($OPTIND-1)) local distro="$(find_distro $1)" dsc="$2" arch="$3" if [ -z "$distro" ] || [ "$distro" = "auto" ]; then if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then @@ -218,7 +234,13 @@ build_debs () { announce "Updating base $distro-$arch image..." cow --update announce "Building $distro-$arch DEBs from $dsc..." - cow --build $dsc + if $debug_hook; then + mkdir -p .hooks + fmt_debug_hook > .hooks/C10shell + chmod +x .hooks/C10shell + hookdir=$(pwd)/.hooks + fi + cow --build $dsc --hookdir "$hookdir" echo ${dsc}_${arch}.changes } From 40a98d4b49f8b986a4bb5ae87f94de1ee297546b Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 13:11:21 +0000 Subject: [PATCH 415/731] debian: disable modules that break the build --- debian/bootstrap.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 62edf42668..bd5547dbc5 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -15,7 +15,9 @@ avoid_mods=( applications/mod_osp applications/mod_rad_auth applications/mod_skel + applications/mod_soundtouch asr_tts/mod_cepstral + asr_tts/mod_flite codecs/mod_com_g729 codecs/mod_ilbc codecs/mod_sangoma_codec @@ -33,6 +35,14 @@ avoid_mods=( sdk/autotools xml_int/mod_xml_ldap ) +avoid_mods_sid=( + endpoints/mod_portaudio + formats/mod_portaudio_stream +) +avoid_mods_wheezy=( + endpoints/mod_portaudio + formats/mod_portaudio_stream +) avoid_mods_squeeze=( formats/mod_vlc languages/mod_managed From 496b9a9c785bab98554df4625facf7ac510afee9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 14:55:44 +0000 Subject: [PATCH 416/731] debian: add utility for building all distros and architectures --- debian/util.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/debian/util.sh b/debian/util.sh index 08827f3e07..181bf04702 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -244,6 +244,42 @@ build_debs () { echo ${dsc}_${arch}.changes } +build_all () { + local OPTIND OPTARG + local orig_opts="" deb_opts="" + local archs="" distros="" + while getopts 'a:bc:dnv:z:' o "$@"; do + case "$o" in + a) archs="$archs $OPTARG";; + b) orig_opts="$orig_opts -b";; + c) distros="$distros $OPTARG";; + d) deb_opts="$deb_opts -d";; + n) orig_opts="$orig_opts -n";; + v) orig_opts="$orig_opts -v$OPTARG";; + z) orig_opts="$orig_opts -z$OPTARG";; + esac + done + shift $(($OPTIND-1)) + [ -n "$archs" ] || archs="amd64 i386" + [ -n "$distros" ] || distros="sid wheezy squeeze" + local acc_changes="" + local orig="$(create_orig $orig_opts HEAD | tail -n1)" + if [ "${orig:0:2}" = ".." ]; then + for distro in $distros; do + local dsc="$(create_dsc $distro $orig | tail -n1)" + if [ "${dsc:0:2}" = ".." ]; then + for arch in $archs; do + local changes="$(build_debs $deb_opts $distro $dsc $arch | tail -n1)" + if [ "${changes:0:2}" = ".." ]; then + acc_changes="$acc_changes $changes" + fi + done + fi + done + fi + echo "${acc_changes:1}" +} + while getopts 'd' o "$@"; do case "$o" in d) set -vx;; @@ -255,6 +291,7 @@ cmd="$1" shift case "$cmd" in archive-orig) archive_orig "$@" ;; + build-all) build_all "$@" ;; build-debs) build_debs "$@" ;; create-dbg-pkgs) create_dbg_pkgs ;; create-dsc) create_dsc "$@" ;; From d3cb7036977c5e59f908f003e5cfce176a9059eb Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 17:03:23 +0000 Subject: [PATCH 417/731] debian: force build output to stderr Because we're capturing the string return value of these functions, we can't see any output that goes to stdout. --- debian/util.sh | 186 +++++++++++++++++++++++++------------------------ 1 file changed, 96 insertions(+), 90 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 181bf04702..829eeba3aa 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -133,62 +133,66 @@ check_repo_clean () { } create_orig () { - local OPTIND OPTARG - local uver="" bundle_deps=false zl=9e - while getopts 'bnv:z:' o "$@"; do - case "$o" in - b) bundle_deps=true;; - n) uver="nightly";; - v) uver="$OPTARG";; - z) zl="$OPTARG";; - esac - done - shift $(($OPTIND-1)) - [ -z "$uver" ] || [ "$uver" = "nightly" ] \ - && uver="$(cat build/next-release.txt)-n$(date +%Y%m%dT%H%M%SZ)" - local treeish="$1" dver="$(mk_dver "$uver")" - local orig="../freeswitch_$dver.orig.tar.xz" - [ -n "$treeish" ] || treeish="HEAD" - check_repo_clean - git reset --hard "$treeish" - mv .gitattributes .gitattributes.orig - grep .gitattributes.orig \ - -e '\bdebian-ignore\b' \ - -e '\bdfsg-nonfree\b' \ - | while xread l; do - echo "$l export-ignore" >> .gitattributes - done - if $bundle_deps; then - (cd libs && getlibs) - git add -f libs - fi - ./build/set-fs-version.sh "$uver" && git add configure.in - git commit --allow-empty -m "nightly v$uver" - git archive -v \ - --worktree-attributes \ - --format=tar \ - --prefix=freeswitch-$uver/ \ - HEAD \ - | xz -c -${zl}v > $orig - mv .gitattributes.orig .gitattributes - git reset --hard HEAD^ && git clean -fdx + { + local OPTIND OPTARG + local uver="" bundle_deps=false zl=9e + while getopts 'bnv:z:' o "$@"; do + case "$o" in + b) bundle_deps=true;; + n) uver="nightly";; + v) uver="$OPTARG";; + z) zl="$OPTARG";; + esac + done + shift $(($OPTIND-1)) + [ -z "$uver" ] || [ "$uver" = "nightly" ] \ + && uver="$(cat build/next-release.txt)-n$(date +%Y%m%dT%H%M%SZ)" + local treeish="$1" dver="$(mk_dver "$uver")" + local orig="../freeswitch_$dver.orig.tar.xz" + [ -n "$treeish" ] || treeish="HEAD" + check_repo_clean + git reset --hard "$treeish" + mv .gitattributes .gitattributes.orig + grep .gitattributes.orig \ + -e '\bdebian-ignore\b' \ + -e '\bdfsg-nonfree\b' \ + | while xread l; do + echo "$l export-ignore" >> .gitattributes + done + if $bundle_deps; then + (cd libs && getlibs) + git add -f libs + fi + ./build/set-fs-version.sh "$uver" && git add configure.in + git commit --allow-empty -m "nightly v$uver" + git archive -v \ + --worktree-attributes \ + --format=tar \ + --prefix=freeswitch-$uver/ \ + HEAD \ + | xz -c -${zl}v > $orig + mv .gitattributes.orig .gitattributes + git reset --hard HEAD^ && git clean -fdx + } 1>&2 echo $orig } create_dsc () { - local distro="$(find_distro $1)" orig="$2" - local suite="$(find_suite $distro)" - local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')" - local dver="${orig_ver}-1~${distro}+1" - [ -x "$(which dch)" ] \ - || err "package devscripts isn't installed" - (cd debian && ./bootstrap.sh -c $distro) - dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build." - git add debian/changelog && git commit -m "nightly v$orig_ver" - dpkg-source -i.* -Zxz -z9 -b . - dpkg-genchanges -S > ../$(dsc_base)_source.changes - local dsc="../$(dsc_base).dsc" - git reset --hard HEAD^ && git clean -fdx + { + local distro="$(find_distro $1)" orig="$2" + local suite="$(find_suite $distro)" + local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')" + local dver="${orig_ver}-1~${distro}+1" + [ -x "$(which dch)" ] \ + || err "package devscripts isn't installed" + (cd debian && ./bootstrap.sh -c $distro) + dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build." + git add debian/changelog && git commit -m "nightly v$orig_ver" + dpkg-source -i.* -Zxz -z9 -b . + dpkg-genchanges -S > ../$(dsc_base)_source.changes + local dsc="../$(dsc_base).dsc" + git reset --hard HEAD^ && git clean -fdx + } 1>&2 echo $dsc } @@ -202,45 +206,47 @@ EOF } build_debs () { - local OPTIND OPTARG debug_hook=false hookdir="" - while getopts 'd' o "$@"; do - case "$o" in - d) debug_hook=true;; - esac - done - shift $(($OPTIND-1)) - local distro="$(find_distro $1)" dsc="$2" arch="$3" - if [ -z "$distro" ] || [ "$distro" = "auto" ]; then - if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then - err "no distro specified or found" + { + local OPTIND OPTARG debug_hook=false hookdir="" + while getopts 'd' o "$@"; do + case "$o" in + d) debug_hook=true;; + esac + done + shift $(($OPTIND-1)) + local distro="$(find_distro $1)" dsc="$2" arch="$3" + if [ -z "$distro" ] || [ "$distro" = "auto" ]; then + if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then + err "no distro specified or found" + fi + local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')" + distro="$(find_distro $x)" fi - local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')" - distro="$(find_distro $x)" - fi - [ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)" - [ -x "$(which cowbuilder)" ] \ - || err "package cowbuilder isn't installed" - local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow - cow () { - cowbuilder "$@" \ - --distribution $distro \ - --architecture $arch \ - --basepath $cow_img - } - if ! [ -d $cow_img ]; then - announce "Creating base $distro-$arch image..." - cow --create - fi - announce "Updating base $distro-$arch image..." - cow --update - announce "Building $distro-$arch DEBs from $dsc..." - if $debug_hook; then - mkdir -p .hooks - fmt_debug_hook > .hooks/C10shell - chmod +x .hooks/C10shell - hookdir=$(pwd)/.hooks - fi - cow --build $dsc --hookdir "$hookdir" + [ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)" + [ -x "$(which cowbuilder)" ] \ + || err "package cowbuilder isn't installed" + local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow + cow () { + cowbuilder "$@" \ + --distribution $distro \ + --architecture $arch \ + --basepath $cow_img + } + if ! [ -d $cow_img ]; then + announce "Creating base $distro-$arch image..." + cow --create + fi + announce "Updating base $distro-$arch image..." + cow --update + announce "Building $distro-$arch DEBs from $dsc..." + if $debug_hook; then + mkdir -p .hooks + fmt_debug_hook > .hooks/C10shell + chmod +x .hooks/C10shell + hookdir=$(pwd)/.hooks + fi + cow --build $dsc --hookdir "$hookdir" + } 1>&2 echo ${dsc}_${arch}.changes } From 2365f41fdc1a7a04248b864aa1a22305a55274d5 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 17:26:32 +0000 Subject: [PATCH 418/731] debian: add a build quicktest feature --- debian/util.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 829eeba3aa..0331913210 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -177,14 +177,30 @@ create_orig () { echo $orig } +set_modules_quicktest () { + cat > debian/modules.conf < Date: Mon, 28 May 2012 17:42:51 +0000 Subject: [PATCH 419/731] debian: ensure set -e behavior when run under build-all build_all call each of these subroutines under a sub-shell, so the set -e gets wiped out. --- debian/util.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/debian/util.sh b/debian/util.sh index 0331913210..c6220e96a0 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -134,6 +134,7 @@ check_repo_clean () { create_orig () { { + set -e local OPTIND OPTARG local uver="" bundle_deps=false zl=9e while getopts 'bnv:z:' o "$@"; do @@ -185,6 +186,7 @@ EOF create_dsc () { { + set -e local OPTIND OPTARG modules_list="" while getopts 'm:' o "$@"; do case "$o" in @@ -223,6 +225,7 @@ EOF build_debs () { { + set -e local OPTIND OPTARG debug_hook=false hookdir="" while getopts 'd' o "$@"; do case "$o" in From b4816ae952828144b59f0b20771f4e5487f67ed9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 18:24:11 +0000 Subject: [PATCH 420/731] debian: place build results in ../ --- debian/util.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/util.sh b/debian/util.sh index c6220e96a0..0b6320d21e 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -264,7 +264,9 @@ build_debs () { chmod +x .hooks/C10shell hookdir=$(pwd)/.hooks fi - cow --build $dsc --hookdir "$hookdir" + cow --build $dsc \ + --hookdir "$hookdir" \ + --buildresult ../ } 1>&2 echo ${dsc}_${arch}.changes } From 9f578ca440276fd6f5ed3b48d07ceca4e735d673 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 18:28:17 +0000 Subject: [PATCH 421/731] debian: use bootstrap.sh -j We believe it to be safe now. In test run on multi-core machines it is producing bit-for-bit identical result compared to the non-parallel invocation. --- debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index 0e864c398d..1460ee8962 100755 --- a/debian/rules +++ b/debian/rules @@ -47,7 +47,7 @@ override_dh_auto_clean: .stamp-bootstrap: @$(call show_vars) - ./bootstrap.sh + ./bootstrap.sh -j touch $@ .stamp-configure: .stamp-bootstrap From 25287f3828c7445ae673aba64c5e17695c06bfd2 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 19:15:20 +0000 Subject: [PATCH 422/731] debian: add option to control make/bootstrap -j settings --- debian/util.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 0b6320d21e..87eca55efe 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -187,10 +187,11 @@ EOF create_dsc () { { set -e - local OPTIND OPTARG modules_list="" - while getopts 'm:' o "$@"; do + local OPTIND OPTARG modules_list="" speed="normal" + while getopts 'm:s:' o "$@"; do case "$o" in m) modules_list="$OPTARG";; + s) speed="$OPTARG";; esac done shift $(($OPTIND-1)) @@ -204,6 +205,13 @@ create_dsc () { set_modules_${modules_list} fi (cd debian && ./bootstrap.sh -c $distro) + case "$speed" in + paranoid) sed -i ./debian/rules \ + -e '/\.stamp-bootstrap:/{:l2 n; /\.\/bootstrap.sh -j/{s/ -j//; :l3 n; b l3}; b l2};' ;; + reckless) sed -i ./debian/rules \ + -e '/\.stamp-build:/{:l2 n; /make/{s/$/ -j/; :l3 n; b l3}; b l2};' ;; + esac + git add debian/rules dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build." git add debian/changelog && git commit -m "nightly v$orig_ver" dpkg-source -i.* -Zxz -z9 -b . @@ -275,7 +283,7 @@ build_all () { local OPTIND OPTARG local orig_opts="" dsc_opts="" deb_opts="" local archs="" distros="" - while getopts 'a:bc:dnm:v:z:' o "$@"; do + while getopts 'a:bc:dnm:s:v:z:' o "$@"; do case "$o" in a) archs="$archs $OPTARG";; b) orig_opts="$orig_opts -b";; @@ -283,6 +291,7 @@ build_all () { d) deb_opts="$deb_opts -d";; n) orig_opts="$orig_opts -n";; m) dsc_opts="$dsc_opts -m$OPTARG";; + s) dsc_opts="$dsc_opts -s$OPTARG";; v) orig_opts="$orig_opts -v$OPTARG";; z) orig_opts="$orig_opts -z$OPTARG";; esac From 91dfa062bf41ce8005696987a20f3c4648c0e888 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 28 May 2012 16:53:45 -0400 Subject: [PATCH 423/731] 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 424/731] 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 baf5bbd565bcdc3dc35106485dc58c4dddd2baad Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 29 May 2012 08:42:51 -0500 Subject: [PATCH 425/731] FS-4266 --resolve --- src/mod/endpoints/mod_sofia/sofia_glue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 6bb7d3ee5f..577c36668e 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1751,7 +1751,7 @@ void sofia_glue_tech_patch_sdp(private_object_t *tech_pvt) } - } else if ((!strncmp("m=audio ", p, 8) && *(p + 9) != '0') || (!strncmp("m=image ", p, 8) && *(p + 9) != '0')) { + } else if ((!strncmp("m=audio ", p, 8) && *(p + 8) != '0') || (!strncmp("m=image ", p, 8) && *(p + 8) != '0')) { strncpy(q, p, 8); p += 8; @@ -1787,7 +1787,7 @@ void sofia_glue_tech_patch_sdp(private_object_t *tech_pvt) has_audio++; - } else if (!strncmp("m=video ", p, 8) && *(p + 9) != '0') { + } else if (!strncmp("m=video ", p, 8) && *(p + 8) != '0') { if (!has_video) { sofia_glue_tech_choose_video_port(tech_pvt, 1); tech_pvt->video_rm_encoding = "PROXY-VID"; From 6679e3f5892e299c6c15b904f4fb707386700429 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Mon, 28 May 2012 20:48:04 +0000 Subject: [PATCH 426/731] debian: add option to run builds in parallel --- debian/util.sh | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/debian/util.sh b/debian/util.sh index 87eca55efe..de1496a950 100755 --- a/debian/util.sh +++ b/debian/util.sh @@ -282,13 +282,14 @@ build_debs () { build_all () { local OPTIND OPTARG local orig_opts="" dsc_opts="" deb_opts="" - local archs="" distros="" - while getopts 'a:bc:dnm:s:v:z:' o "$@"; do + local archs="" distros="" par=false + while getopts 'a:bc:djnm:s:v:z:' o "$@"; do case "$o" in a) archs="$archs $OPTARG";; b) orig_opts="$orig_opts -b";; c) distros="$distros $OPTARG";; d) deb_opts="$deb_opts -d";; + j) par=true;; n) orig_opts="$orig_opts -n";; m) dsc_opts="$dsc_opts -m$OPTARG";; s) dsc_opts="$dsc_opts -s$OPTARG";; @@ -299,22 +300,32 @@ build_all () { shift $(($OPTIND-1)) [ -n "$archs" ] || archs="amd64 i386" [ -n "$distros" ] || distros="sid wheezy squeeze" - local acc_changes="" local orig="$(create_orig $orig_opts HEAD | tail -n1)" + mkdir -p ../log + > ../log/changes + echo; echo; echo; echo if [ "${orig:0:2}" = ".." ]; then for distro in $distros; do - local dsc="$(create_dsc $dsc_opts $distro $orig | tail -n1)" + echo "Creating $distro dsc..." >&2 + local dsc="$(create_dsc $dsc_opts $distro $orig 2>../log/$distro | tail -n1)" + echo "Done creating $distro dsc." >&2 if [ "${dsc:0:2}" = ".." ]; then for arch in $archs; do - local changes="$(build_debs $deb_opts $distro $dsc $arch | tail -n1)" - if [ "${changes:0:2}" = ".." ]; then - acc_changes="$acc_changes $changes" - fi + { + echo "Building $distro-$arch debs..." >&2 + local changes="$(build_debs $deb_opts $distro $dsc $arch 2>../log/$distro-$arch | tail -n1)" + echo "Done building $distro-$arch debs." >&2 + if [ "${changes:0:2}" = ".." ]; then + echo "$changes" >> ../log/changes + fi + } & + $par || wait done fi done + ! $par || wait fi - echo "${acc_changes:1}" + cat ../log/changes } while getopts 'd' o "$@"; do From 226851e8b091f0832f97bde1afe3e7bd2ff829ba Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 29 May 2012 18:41:17 +0000 Subject: [PATCH 427/731] don't use Siren or iLBC by default in example configs These codecs are non-free which creates issues for distributions, so let's not require these by default to run our example configs. We can add back in iLBC once we resolve the licensing situation with our in-tree implementation. --- conf/insideout/autoload_configs/modules.conf.xml | 2 +- conf/sbc/autoload_configs/modules.conf.xml | 2 +- conf/softphone/freeswitch.xml | 4 +--- conf/vanilla/autoload_configs/modules.conf.xml | 4 ++-- conf/vanilla/vars.xml | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/conf/insideout/autoload_configs/modules.conf.xml b/conf/insideout/autoload_configs/modules.conf.xml index 8793a003ba..3c864aec1c 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/sbc/autoload_configs/modules.conf.xml b/conf/sbc/autoload_configs/modules.conf.xml index 31b96dd27a..fb59b386be 100644 --- a/conf/sbc/autoload_configs/modules.conf.xml +++ b/conf/sbc/autoload_configs/modules.conf.xml @@ -39,7 +39,7 @@ - + diff --git a/conf/softphone/freeswitch.xml b/conf/softphone/freeswitch.xml index 00a2bc31cb..66e7c2a923 100644 --- a/conf/softphone/freeswitch.xml +++ b/conf/softphone/freeswitch.xml @@ -3,7 +3,7 @@ - + @@ -86,10 +86,8 @@ - - diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 266b32204a..f88bb7b7c0 100644 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -82,10 +82,10 @@ - + - + diff --git a/conf/vanilla/vars.xml b/conf/vanilla/vars.xml index 4f13a61fbb..907c6f1015 100644 --- a/conf/vanilla/vars.xml +++ b/conf/vanilla/vars.xml @@ -123,7 +123,7 @@ 127 - BV32 --> - + switch_rtp_udptl_mode\n"); switch_rtp_udptl_mode(tech_pvt->rtp_session); diff --git a/src/mod/endpoints/mod_khomp/include/applications.h b/src/mod/endpoints/mod_khomp/include/applications.h index 21b66b2b0a..14ba1d3323 100644 --- a/src/mod/endpoints/mod_khomp/include/applications.h +++ b/src/mod/endpoints/mod_khomp/include/applications.h @@ -599,7 +599,7 @@ struct Transfer return SWITCH_STATUS_FALSE; } - switch_core_session_t *peer_session = switch_core_session_locate(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE)); + switch_core_session_t *peer_session = switch_core_session_locate(switch_channel_get_partner_uuid(chan)); if(!peer_session) { @@ -662,7 +662,7 @@ struct Transfer switch_channel_t * peer = switch_core_session_get_channel(peer_session); /* put the channel in hold */ - //switch_core_session_t *session = switch_core_session_locate(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE)); + //switch_core_session_t *session = switch_core_session_locate(switch_channel_get_partner_uuid(chan)); //switch_channel_t *chan_core = switch_core_session_get_channel(session); const char *stream; @@ -709,7 +709,7 @@ struct Transfer switch_core_session_rwunlock(pvt->session()); switch_core_session_rwunlock(peer_session); - //switch_ivr_unhold_uuid(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE)); + //switch_ivr_unhold_uuid(switch_channel_get_partner_uuid(chan)); } catch (ScopedLockFailed & err) { diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index 200d6e5b71..e2a2c3daab 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -659,13 +659,13 @@ static switch_status_t find_non_loopback_bridge(switch_core_session_t *session, *br_session = NULL; *br_uuid = NULL; - a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + a_uuid = switch_channel_get_partner_uuid(channel); while (a_uuid && (sp = switch_core_session_locate(a_uuid))) { if (switch_core_session_check_interface(sp, loopback_endpoint_interface)) { private_t *tech_pvt = switch_core_session_get_private(sp); - a_uuid = switch_channel_get_variable(tech_pvt->other_channel, SWITCH_SIGNAL_BOND_VARIABLE); + a_uuid = switch_channel_get_partner_uuid(tech_pvt->other_channel); switch_core_session_rwunlock(sp); sp = NULL; } else { @@ -919,7 +919,7 @@ static switch_status_t loopback_bowout_on_execute_state_handler(switch_core_sess /* Wait for b_channel to be fully bridged */ switch_channel_wait_for_flag(b_channel, CF_BRIDGED, SWITCH_TRUE, 5000, NULL); - uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE); + uuid = switch_channel_get_partner_uuid(b_channel); if (uuid && (other_session = switch_core_session_locate(uuid))) { switch_channel_t *other_channel = switch_core_session_get_channel(other_session); diff --git a/src/mod/endpoints/mod_rtmp/rtmp_sig.c b/src/mod/endpoints/mod_rtmp/rtmp_sig.c index 5f57eb04c7..a29465ecc0 100644 --- a/src/mod/endpoints/mod_rtmp/rtmp_sig.c +++ b/src/mod/endpoints/mod_rtmp/rtmp_sig.c @@ -539,7 +539,7 @@ RTMP_INVOKE_FUNCTION(rtmp_i_transfer) } if ((tech_pvt = rtmp_locate_private(rsession, uuid))) { - const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *other_uuid = switch_channel_get_partner_uuid(tech_pvt->channel); switch_core_session_t *session; if (!zstr(other_uuid) && (session = switch_core_session_locate(other_uuid))) { @@ -570,8 +570,8 @@ RTMP_INVOKE_FUNCTION(rtmp_i_join) return SWITCH_STATUS_FALSE; } - if ((other_uuid[0] = switch_channel_get_variable(tech_pvt[0]->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && - (other_uuid[1] = switch_channel_get_variable(tech_pvt[1]->channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((other_uuid[0] = switch_channel_get_partner_uuid(tech_pvt[0]->channel)) && + (other_uuid[1] = switch_channel_get_partner_uuid(tech_pvt[1]->channel))) { #ifndef RTMP_DONT_HOLD if (switch_test_flag(tech_pvt[0], TFLAG_DETACHED)) { @@ -725,8 +725,8 @@ RTMP_INVOKE_FUNCTION(rtmp_i_three_way) return SWITCH_STATUS_FALSE; } - if (!(other_uuid[0] = switch_channel_get_variable(tech_pvt[0]->channel, SWITCH_SIGNAL_BOND_VARIABLE)) || - !(other_uuid[1] = switch_channel_get_variable(tech_pvt[1]->channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if (!(other_uuid[0] = switch_channel_get_partner_uuid(tech_pvt[0]->channel)) || + !(other_uuid[1] = switch_channel_get_partner_uuid(tech_pvt[1]->channel))) { return SWITCH_STATUS_FALSE; /* Both calls aren't bridged */ } diff --git a/src/mod/endpoints/mod_skinny/skinny_server.c b/src/mod/endpoints/mod_skinny/skinny_server.c index 8e47691c36..0957739455 100644 --- a/src/mod/endpoints/mod_skinny/skinny_server.c +++ b/src/mod/endpoints/mod_skinny/skinny_server.c @@ -784,12 +784,12 @@ switch_status_t skinny_session_transfer(switch_core_session_t *session, listener tech_pvt = switch_core_session_get_private(session); channel = switch_core_session_get_channel(session); - remote_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + remote_uuid = switch_channel_get_partner_uuid(channel); if (tech_pvt->transfer_from_call_id) { if((session2 = skinny_profile_find_session(listener->profile, listener, &line_instance, tech_pvt->transfer_from_call_id))) { switch_channel_t *channel2 = switch_core_session_get_channel(session2); - const char *remote_uuid2 = switch_channel_get_variable(channel2, SWITCH_SIGNAL_BOND_VARIABLE); + const char *remote_uuid2 = switch_channel_get_partner_uuid(channel2); if (switch_ivr_uuid_bridge(remote_uuid, remote_uuid2) == SWITCH_STATUS_SUCCESS) { switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); switch_channel_hangup(channel2, SWITCH_CAUSE_NORMAL_CLEARING); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 92a27fd0f2..2b44018665 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -172,7 +172,7 @@ static switch_status_t sofia_on_reset(switch_core_session_t *session) const char *uuid = switch_core_session_get_uuid(session); if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) { - const char *other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *other_uuid = switch_channel_get_partner_uuid(channel); int x = 0; if (other_uuid) { @@ -1824,7 +1824,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi } sofia_glue_tech_set_local_sdp(tech_pvt, NULL, SWITCH_FALSE); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) + if ((uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(uuid))) { other_channel = switch_core_session_get_channel(other_session); ip = switch_channel_get_variable(other_channel, SWITCH_REMOTE_MEDIA_IP_VARIABLE); @@ -2061,7 +2061,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi const char *uuid; const char *call_id = NULL, *to_user = NULL, *to_host = NULL, *to_tag = NULL, *from_tag = NULL, *from_user = NULL, *from_host = NULL; - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *rsession; if ((rsession = switch_core_session_locate(uuid))) { switch_channel_t *rchannel = switch_core_session_get_channel(rsession); @@ -2191,7 +2191,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) { - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "SEND"); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 0621b3b84d..dc4fcfb0f0 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -618,7 +618,7 @@ void sofia_handle_sip_i_bye(switch_core_session_t *session, int status, if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE)) { switch_core_session_t *new_session, *other_session; - const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *other_uuid = switch_channel_get_partner_uuid(tech_pvt->channel); char *cmd = NULL; if (!zstr(other_uuid) && (other_session = switch_core_session_locate(other_uuid))) { @@ -783,7 +783,7 @@ void sofia_send_callee_id(switch_core_session_t *session, const char *name, cons number = caller_profile->destination_number; } - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (session_b = switch_core_session_locate(uuid))) { + if ((uuid = switch_channel_get_partner_uuid(channel)) && (session_b = switch_core_session_locate(uuid))) { switch_core_session_message_t *msg; //switch_channel_t *channel_b = switch_core_session_get_channel(session_b); @@ -906,7 +906,7 @@ void sofia_update_callee_id(switch_core_session_t *session, sofia_profile_t *pro caller_profile->callee_id_number = switch_sanitize_number(switch_core_strdup(caller_profile->pool, number)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s Update Callee ID to \"%s\" <%s>\n", switch_channel_get_name(channel), name, number); - if (lazy || (att && !switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if (lazy || (att && !switch_channel_get_partner_uuid(channel))) { switch_channel_flip_cid(channel); } } @@ -914,7 +914,7 @@ void sofia_update_callee_id(switch_core_session_t *session, sofia_profile_t *pro if (send) { if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) { - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "RECV"); if (uuid) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridged-To", uuid); @@ -5211,7 +5211,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status goto end; } - if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((br = switch_channel_get_partner_uuid(channel))) { switch_xml_t root = NULL, domain = NULL; switch_core_session_t *a_session; switch_channel_t *a_channel; @@ -5370,7 +5370,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status if (sofia_test_flag(tech_pvt, TFLAG_SENT_UPDATE)) { sofia_clear_flag_locked(tech_pvt, TFLAG_SENT_UPDATE); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) { + if ((uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(uuid))) { const char *r_sdp = NULL; switch_core_session_message_t *msg; private_object_t *other_tech_pvt = switch_core_session_get_private(other_session); @@ -5602,7 +5602,7 @@ void *SWITCH_THREAD_FUNC media_on_hold_thread_run(switch_thread_t *thread, void switch_channel_t *channel = switch_core_session_get_channel(session); private_object_t *tech_pvt = switch_core_session_get_private(session); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) { + if ((uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(uuid))) { if (switch_core_session_compare(session, other_session)) { sofia_set_flag_locked(tech_pvt, TFLAG_HOLD_LOCK); switch_ivr_media(switch_core_session_get_uuid(other_session), SMF_REBRIDGE); @@ -6057,7 +6057,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, } if ((b_private = nua_handle_magic(bnh))) { - const char *br_b = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *br_b = switch_channel_get_partner_uuid(channel); char *br_a = b_private->uuid; @@ -6859,8 +6859,8 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t b_tech_pvt = (private_object_t *) switch_core_session_get_private(b_session); channel_b = switch_core_session_get_channel(b_session); - br_a = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE); - br_b = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE); + br_a = switch_channel_get_partner_uuid(channel_a); + br_b = switch_channel_get_partner_uuid(channel_b); if (!switch_ivr_uuid_exists(br_a)) { br_a = NULL; @@ -7109,7 +7109,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t } nua_handle_unref(bnh); } else { /* the other channel is on a different box, we have to go find them */ - if (exten && (br_a = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE))) { + if (exten && (br_a = switch_channel_get_partner_uuid(channel_a))) { switch_core_session_t *a_session; switch_channel_t *channel = switch_core_session_get_channel(session); @@ -7232,7 +7232,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t const char *br; switch_core_session_t *b_session; - if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(br))) { + if ((br = switch_channel_get_partner_uuid(channel)) && (b_session = switch_core_session_locate(br))) { const char *var; switch_channel_t *b_channel = switch_core_session_get_channel(b_session); @@ -7554,7 +7554,7 @@ void sofia_handle_sip_i_info(nua_t *nua, sofia_profile_t *profile, nua_handle_t const char *uuid; switch_core_session_t *session_b; - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (session_b = switch_core_session_locate(uuid))) { + if ((uuid = switch_channel_get_partner_uuid(channel)) && (session_b = switch_core_session_locate(uuid))) { while (switch_channel_has_dtmf(channel)) { switch_dtmf_t idtmf = { 0, 0 }; if (switch_channel_dequeue_dtmf(channel, &idtmf) == SWITCH_STATUS_SUCCESS) { @@ -8575,7 +8575,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ tech_pvt->caller_profile->dialplan = "inline"; - bridge_uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE); + bridge_uuid = switch_channel_get_partner_uuid(b_channel); if (call_info) { const char *olu; diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 577c36668e..cb091daf8e 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -688,7 +688,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch pass_fmtp = NULL; - if (switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) { + if (switch_channel_get_partner_uuid(tech_pvt->channel)) { if ((of = switch_channel_get_variable_partner(tech_pvt->channel, "sip_video_fmtp"))) { pass_fmtp = of; } @@ -4189,9 +4189,9 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly) if (!strcasecmp(stream, "indicate_hold")) { switch_channel_set_flag(tech_pvt->channel, CF_SUSPEND); switch_channel_set_flag(tech_pvt->channel, CF_HOLD); - switch_ivr_hold_uuid(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), NULL, 0); + switch_ivr_hold_uuid(switch_channel_get_partner_uuid(tech_pvt->channel), NULL, 0); } else { - switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, + switch_ivr_broadcast(switch_channel_get_partner_uuid(tech_pvt->channel), stream, SMF_ECHO_ALEG | SMF_LOOP | SMF_PRIORITY); switch_yield(250000); } @@ -4217,7 +4217,7 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly) switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); } - if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(uuid))) { + if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel)) && (b_session = switch_core_session_locate(uuid))) { switch_channel_t *b_channel = switch_core_session_get_channel(b_session); if (switch_channel_test_flag(tech_pvt->channel, CF_HOLD)) { @@ -5330,7 +5330,7 @@ void sofia_glue_pass_sdp(private_object_t *tech_pvt, char *sdp) switch_core_session_t *other_session; switch_channel_t *other_channel; - if ((val = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) + if ((val = switch_channel_get_partner_uuid(tech_pvt->channel)) && (other_session = switch_core_session_locate(val))) { other_channel = switch_core_session_get_channel(other_session); switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, sdp); @@ -5904,7 +5904,7 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName } - if (switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) { + if (switch_channel_get_partner_uuid(channel)) { sofia_set_flag(tech_pvt, TFLAG_RECOVERING_BRIDGE); } else { switch_xml_t callflow, param, x_extension; @@ -6826,7 +6826,7 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt) - if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) + if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel)) && (other_session = switch_core_session_locate(uuid))) { other_channel = switch_core_session_get_channel(other_session); diff --git a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c index 9f3eaf1cb6..77a0438cca 100644 --- a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c +++ b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c @@ -213,7 +213,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session) } */ - if ((signal_bond = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && !zstr(signal_bond)) { + if ((signal_bond = switch_channel_get_partner_uuid(channel)) && !zstr(signal_bond)) { if (rc_avpair_add(rad_config, &send, PW_FS_OTHER_LEG_ID, (void*) signal_bond, -1, PW_FS_PEC) == NULL) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed adding Freeswitch-Other-Leg-Id: %s\n", uuid_str); rc_destroy(rad_config); diff --git a/src/switch_channel.c b/src/switch_channel.c index dc983c78cd..138123f3eb 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -831,7 +831,7 @@ SWITCH_DECLARE(const char *) switch_channel_get_variable_partner(switch_channel_ switch_assert(channel != NULL); if (!zstr(varname)) { - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { switch_channel_t *tchannel = switch_core_session_get_channel(session); @@ -896,7 +896,7 @@ SWITCH_DECLARE(void *) switch_channel_get_private_partner(switch_channel_t *chan switch_assert(channel != NULL); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { val = switch_core_hash_find_locked(channel->private_hash, key, channel->profile_mutex); @@ -1324,7 +1324,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_partner_var_check(sw switch_assert(channel != NULL); if (!zstr(varname)) { - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { switch_channel_t *tchannel = switch_core_session_get_channel(session); @@ -1357,7 +1357,7 @@ SWITCH_DECLARE(switch_bool_t) switch_channel_set_flag_partner(switch_channel_t * switch_assert(channel != NULL); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { switch_channel_set_flag(switch_core_session_get_channel(session), flag); @@ -1376,7 +1376,7 @@ SWITCH_DECLARE(uint32_t) switch_channel_test_flag_partner(switch_channel_t *chan switch_assert(channel != NULL); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { r = switch_channel_test_flag(switch_core_session_get_channel(session), flag); @@ -1393,7 +1393,7 @@ SWITCH_DECLARE(switch_bool_t) switch_channel_clear_flag_partner(switch_channel_t switch_assert(channel != NULL); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { switch_channel_clear_flag(switch_core_session_get_channel(session), flag); @@ -1513,7 +1513,7 @@ SWITCH_DECLARE(uint32_t) switch_channel_test_cap_partner(switch_channel_t *chann switch_assert(channel != NULL); - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(channel))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { r = switch_channel_test_cap(switch_core_session_get_channel(session), cap); @@ -2730,7 +2730,7 @@ SWITCH_DECLARE(void) switch_channel_flip_cid(switch_channel_t *channel) if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) { - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "RECV"); if (uuid) { @@ -4150,6 +4150,17 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t * return status; } +SWITCH_DECLARE(const char *) switch_channel_get_partner_uuid(switch_channel_t *channel) +{ + 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); + } + + return uuid; +} + /* For Emacs: * Local Variables: * mode:c diff --git a/src/switch_core_io.c b/src/switch_core_io.c index 83f8ae6d26..0a3db343ed 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -288,7 +288,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi if (switch_test_flag(session, SSF_READ_TRANSCODE) && !need_codec && switch_core_codec_ready(session->read_codec)) { switch_core_session_t *other_session; - const char *uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(switch_core_session_get_channel(session)); switch_clear_flag(session, SSF_READ_TRANSCODE); if (uuid && (other_session = switch_core_session_locate(uuid))) { @@ -866,7 +866,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess if (switch_test_flag(session, SSF_WRITE_TRANSCODE) && !need_codec && switch_core_codec_ready(session->write_codec)) { switch_core_session_t *other_session; - const char *uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(switch_core_session_get_channel(session)); if (uuid && (other_session = switch_core_session_locate(uuid))) { switch_set_flag(other_session, SSF_READ_CODEC_RESET); diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 4e43987ecf..2cdbeaa81b 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -184,7 +184,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_partner(switch_core_sess { const char *uuid; - if ((uuid = switch_channel_get_variable(session->channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(session->channel, "originate_signal_bond"))) { + if ((uuid = switch_channel_get_partner_uuid(session->channel))) { if ((*partner = switch_core_session_locate(uuid))) { return SWITCH_STATUS_SUCCESS; } @@ -544,7 +544,7 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_ switch_channel_set_variable(peer_channel, SWITCH_ORIGINATOR_VARIABLE, switch_core_session_get_uuid(session)); switch_channel_set_variable(peer_channel, SWITCH_SIGNAL_BOND_VARIABLE, switch_core_session_get_uuid(session)); // Needed by 3PCC proxy so that aleg can find bleg to pass SDP to, when final ACK arrives. - switch_channel_set_variable(channel, "originate_signal_bond", switch_core_session_get_uuid(*new_session)); + switch_channel_set_variable(channel, SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE, switch_core_session_get_uuid(*new_session)); if ((val = switch_channel_get_variable(channel, SWITCH_PROCESS_CDR_VARIABLE))) { switch_channel_set_variable(peer_channel, SWITCH_PROCESS_CDR_VARIABLE, val); @@ -797,7 +797,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_pass_indication(switch_core_ switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_SUCCESS; - if (((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) && (other_session = switch_core_session_locate(uuid))) { + if (((uuid = switch_channel_get_partner_uuid(channel))) && (other_session = switch_core_session_locate(uuid))) { msg.message_id = indication; msg.from = __FILE__; status = switch_core_session_receive_message(other_session, &msg); diff --git a/src/switch_ivr.c b/src/switch_ivr.c index e4fc807596..08d1fcd5a4 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -559,7 +559,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se switch_channel_set_flag(channel, CF_BROADCAST); } if (hold_bleg && switch_true(hold_bleg)) { - if ((b_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((b_uuid = switch_channel_get_partner_uuid(channel))) { const char *stream; b_uuid = switch_core_session_strdup(session, b_uuid); @@ -1384,7 +1384,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, switch_core_session_receive_message(session, &msg); if (moh && (stream = switch_channel_get_hold_music(channel))) { - if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((other_uuid = switch_channel_get_partner_uuid(channel))) { switch_ivr_broadcast(other_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP); } } @@ -1421,7 +1421,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_unhold(switch_core_session_t *session switch_core_session_receive_message(session, &msg); - if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(other_uuid))) { + if ((other_uuid = switch_channel_get_partner_uuid(channel)) && (b_session = switch_core_session_locate(other_uuid))) { switch_channel_t *b_channel = switch_core_session_get_channel(b_session); switch_channel_stop_broadcast(b_channel); switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000, NULL); diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 5d6127d054..37da4f0486 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -4068,7 +4068,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_broadcast(const char *uuid, const cha } } - if ((flags & SMF_ECHO_BLEG) && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) + if ((flags & SMF_ECHO_BLEG) && (other_uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(other_uuid))) { if ((flags & SMF_EXEC_INLINE)) { switch_core_session_execute_application_get_flags(other_session, app, path, &app_flags); diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index d8b548b048..4af0dbb8ff 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1704,7 +1704,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, c const char *brto; if ((brto = switch_channel_get_variable(rchannel, "orignate_signal_bond")) || - (brto = switch_channel_get_variable(rchannel, SWITCH_SIGNAL_BOND_VARIABLE))) { + (brto = switch_channel_get_partner_uuid(rchannel))) { switch_copy_string(b_uuid, brto, blen); status = SWITCH_STATUS_SUCCESS; } @@ -1738,7 +1738,7 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session channel = switch_core_session_get_channel(session); rchannel = switch_core_session_get_channel(rsession); - buuid = switch_channel_get_variable(rchannel, SWITCH_SIGNAL_BOND_VARIABLE); + buuid = switch_channel_get_partner_uuid(rchannel); if ((var = switch_channel_get_variable(channel, "intercept_unbridged_only")) && switch_true(var)) { if ((switch_channel_test_flag(rchannel, CF_BRIDGED))) { diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 98fed62b34..c18da450a6 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -3592,7 +3592,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_variable(caller_channel, SWITCH_SIGNAL_BOND_VARIABLE, switch_core_session_get_uuid(*bleg)); // Now main SWITCH_SIGNAL_BOND_VARIABLE is populated, don't need this one anymore... - switch_channel_set_variable(caller_channel, "originate_signal_bond", NULL); + switch_channel_set_variable(caller_channel, SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE, NULL); } diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c index f435c87026..8738071cb4 100644 --- a/src/switch_ivr_play_say.c +++ b/src/switch_ivr_play_say.c @@ -2570,7 +2570,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_soft_hold(switch_core_session_t *sess channel = switch_core_session_get_channel(session); switch_assert(channel != NULL); - if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((other_uuid = switch_channel_get_partner_uuid(channel))) { if ((other_session = switch_core_session_locate(other_uuid))) { other_channel = switch_core_session_get_channel(other_session); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 1c243e1b80..039cad9eb6 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3048,7 +3048,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ switch_core_session_t *session = switch_core_memory_pool_get_data(rtp_session->pool, "__session"); switch_channel_t *channel = switch_core_session_get_channel(session); - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); if (uuid) { switch_core_session_t *other_session; switch_rtp_t *other_rtp_session = NULL; @@ -3626,7 +3626,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp switch_core_session_t *session = switch_core_memory_pool_get_data(rtp_session->pool, "__session"); switch_channel_t *channel = switch_core_session_get_channel(session); - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); if (uuid) { switch_core_session_t *other_session; @@ -4257,7 +4257,7 @@ SWITCH_DECLARE(int) switch_rtp_write_frame(switch_rtp_t *rtp_session, switch_fra switch_core_session_t *session = switch_core_memory_pool_get_data(rtp_session->pool, "__session"); switch_channel_t *channel = switch_core_session_get_channel(session); - const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); + const char *uuid = switch_channel_get_partner_uuid(channel); if (uuid) { switch_core_session_t *other_session; From 76c3580e83e70ebe592169b3d8e9cb2847f62951 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Tue, 29 May 2012 22:13:46 +0000 Subject: [PATCH 430/731] fix build test for revision number The test was backward. If the revision is in switch_version.h.in then we have the version already. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 31d22f7754..12dc3fa05a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -418,7 +418,7 @@ $(switch_builddir)/quiet_libtool: $(switch_builddir)/libtool src/include/switch_version.h: src/include/switch_version.h.in .version $(libfreeswitch_la_SOURCES) $(library_include_HEADERS) @have_version=1 ; \ force=0 ; \ - grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null && have_version=0 ; \ + grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null || have_version=0 ; \ test ! -f src/include/switch_version.h || grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h > /dev/null && force=1 ; \ if test $$have_version = 1 ; then \ cat src/include/switch_version.h.in > src/include/switch_version.h ; \ From 076d9fbe67ef4282d528ade20fe79fb69f7045e4 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 30 May 2012 07:45:59 +0530 Subject: [PATCH 431/731] 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 432/731] 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 433/731] 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 434/731] 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 82b00ecbc8bfb9e9e389b7a2bf8fe43a2e390520 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 30 May 2012 15:10:00 +0000 Subject: [PATCH 435/731] don't build mod_ilbc or mod_siren by default Our default build probably shouldn't include non-free software. With mod_ilbc, the licensing situation is merely ambiguous. With mod_siren, the user can't use this code without getting explicit permission from Polycom (though it is apparently easily given). --- 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 534c1f0ec2..fdb631927a 100644 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -58,12 +58,12 @@ codecs/mod_bv codecs/mod_g723_1 codecs/mod_g729 codecs/mod_h26x -codecs/mod_ilbc +#codecs/mod_ilbc #codecs/mod_isac #codecs/mod_opus #codecs/mod_sangoma_codec #codecs/mod_silk -codecs/mod_siren +#codecs/mod_siren codecs/mod_speex dialplans/mod_dialplan_asterisk #dialplans/mod_dialplan_directory From e05bd3fae8ed8edaddee6271b3d246a16a0b4234 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 30 May 2012 13:10:04 -0400 Subject: [PATCH 436/731] 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 192030c57898bce8b3df805ea1b21ad436c015b9 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 30 May 2012 13:05:05 -0500 Subject: [PATCH 437/731] add metadata col to internal registrations table --- src/include/switch_core.h | 4 +- src/mod/endpoints/mod_skinny/skinny_server.c | 3 +- src/mod/endpoints/mod_sofia/sofia_reg.c | 7 ++- src/switch_core_sqldb.c | 50 ++++++++++++++------ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 9803c6708b..05d6e0aa48 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2300,10 +2300,12 @@ SWITCH_DECLARE(uint32_t) switch_default_ptime(const char *name, uint32_t number) \param [in] network_ip \param [in] network_port \param [in] network_proto - one of tls, tcp, udp + \param [in] metadata - generic metadata supplied by module \param [out] err - Error if it exists */ SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, const char *realm, const char *token, const char *url, uint32_t expires, - const char *network_ip, const char *network_port, const char *network_proto); + const char *network_ip, const char *network_port, const char *network_proto, + const char *metadata); /*! \brief Delete user registration \param [in] user diff --git a/src/mod/endpoints/mod_skinny/skinny_server.c b/src/mod/endpoints/mod_skinny/skinny_server.c index 0957739455..95f7e6c83e 100644 --- a/src/mod/endpoints/mod_skinny/skinny_server.c +++ b/src/mod/endpoints/mod_skinny/skinny_server.c @@ -1007,6 +1007,7 @@ switch_status_t skinny_handle_register(listener_t *listener, skinny_message_t *r const char *value = switch_xml_attr_soft(xbutton, "value"); if(type == SKINNY_BUTTON_LINE) { const char *caller_name = switch_xml_attr_soft(xbutton, "caller-name"); + const char *reg_metadata = switch_xml_attr_soft(xbutton, "registration-metadata"); uint32_t ring_on_idle = atoi(switch_xml_attr_soft(xbutton, "ring-on-idle")); uint32_t ring_on_active = atoi(switch_xml_attr_soft(xbutton, "ring-on-active")); uint32_t busy_trigger = atoi(switch_xml_attr_soft(xbutton, "busy-trigger")); @@ -1030,7 +1031,7 @@ switch_status_t skinny_handle_register(listener_t *listener, skinny_message_t *r switch_safe_free(sql); token = switch_mprintf("skinny/%q/%q/%q:%d", profile->name, value, request->data.reg.device_name, request->data.reg.instance); url = switch_mprintf("skinny/%q/%q", profile->name, value); - switch_core_add_registration(value, profile->domain, token, url, 0, network_ip, network_port_c, "tcp"); + switch_core_add_registration(value, profile->domain, token, url, 0, network_ip, network_port_c, "tcp", reg_metadata); switch_safe_free(token); switch_safe_free(url); } diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index e358c8f228..7ec9f1f93a 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1028,6 +1028,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand sip_contact_t const *contact = NULL; char *sql; switch_event_t *s_event; + const char *reg_meta = NULL; const char *to_user = NULL; const char *to_host = NULL; char *mwi_account = NULL; @@ -1485,6 +1486,10 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand to_user = var; } + if (v_event && *v_event && (var = switch_event_get_header(*v_event, "registration_metadata"))) { + reg_meta = var; + } + if (v_event && *v_event && (mwi_account = switch_event_get_header(*v_event, "mwi-account"))) { dup_mwi_account = strdup(mwi_account); switch_assert(dup_mwi_account != NULL); @@ -1559,7 +1564,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand url = switch_mprintf("sofia/%q/sip:%q", profile->name, sofia_glue_strip_proto(contact)); switch_core_add_registration(to_user, reg_host, call_id, url, (long) switch_epoch_time_now(NULL) + (long) exptime + 60, - network_ip, network_port_c, is_tls ? "tls" : is_tcp ? "tcp" : "udp"); + network_ip, network_port_c, is_tls ? "tls" : is_tcp ? "tcp" : "udp", reg_meta); switch_safe_free(url); switch_safe_free(contact); diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index 85d38160ed..9b40674065 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -1713,7 +1713,8 @@ static char create_registrations_sql[] = " network_ip VARCHAR(256),\n" " network_port VARCHAR(256),\n" " network_proto VARCHAR(256),\n" - " hostname VARCHAR(256)\n" + " hostname VARCHAR(256),\n" + " metadata VARCHAR(256)\n" ");\n"; @@ -1843,7 +1844,8 @@ static char basic_calls_sql[] = SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, const char *realm, const char *token, const char *url, uint32_t expires, - const char *network_ip, const char *network_port, const char *network_proto) + const char *network_ip, const char *network_port, const char *network_proto, + const char *metadata) { char *sql; @@ -1860,19 +1862,35 @@ SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, c } switch_queue_push(sql_manager.sql_queue[0], sql); - - sql = switch_mprintf("insert into registrations (reg_user,realm,token,url,expires,network_ip,network_port,network_proto,hostname) " - "values ('%q','%q','%q','%q',%ld,'%q','%q','%q','%q')", - switch_str_nil(user), - switch_str_nil(realm), - switch_str_nil(token), - switch_str_nil(url), - expires, - switch_str_nil(network_ip), - switch_str_nil(network_port), - switch_str_nil(network_proto), - switch_core_get_switchname() - ); + + if ( !zstr(metadata) ) { + sql = switch_mprintf("insert into registrations (reg_user,realm,token,url,expires,network_ip,network_port,network_proto,hostname,metadata) " + "values ('%q','%q','%q','%q',%ld,'%q','%q','%q','%q','%q')", + switch_str_nil(user), + switch_str_nil(realm), + switch_str_nil(token), + switch_str_nil(url), + expires, + switch_str_nil(network_ip), + switch_str_nil(network_port), + switch_str_nil(network_proto), + switch_core_get_switchname(), + metadata + ); + } else { + sql = switch_mprintf("insert into registrations (reg_user,realm,token,url,expires,network_ip,network_port,network_proto,hostname) " + "values ('%q','%q','%q','%q',%ld,'%q','%q','%q','%q')", + switch_str_nil(user), + switch_str_nil(realm), + switch_str_nil(token), + switch_str_nil(url), + expires, + switch_str_nil(network_ip), + switch_str_nil(network_port), + switch_str_nil(network_proto), + switch_core_get_switchname() + ); + } switch_queue_push(sql_manager.sql_queue[0], sql); @@ -2007,6 +2025,8 @@ switch_status_t switch_core_sqldb_start(switch_memory_pool_t *pool, switch_bool_ switch_cache_db_test_reactive(dbh, "delete from registrations where reg_user='' or network_proto='tcp' or network_proto='tls'", "DROP TABLE registrations", create_registrations_sql); + switch_cache_db_test_reactive(dbh, "select metadata from registrations", NULL, "ALTER TABLE registrations ADD COLUMN metadata VARCHAR(256)"); + switch (dbh->type) { case SCDB_TYPE_ODBC: From 3e1d68b0a6900b582154bbb72a8149ea1a357c9b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 30 May 2012 13:08:31 -0500 Subject: [PATCH 438/731] FS-4250 --resolve erase replaces header after using it --- src/mod/endpoints/mod_sofia/sofia_glue.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index cb091daf8e..2cb2fdd551 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -2087,7 +2087,9 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) } - rep = switch_channel_get_variable(channel, SOFIA_REPLACES_HEADER); + if ((rep = switch_channel_get_variable(channel, SOFIA_REPLACES_HEADER))) { + switch_channel_set_variable(channel, SOFIA_REPLACES_HEADER, NULL); + } switch_assert(tech_pvt != NULL); From 39bad5b13ef8a85608a6783a9ebdaed3713da04d Mon Sep 17 00:00:00 2001 From: Jeff Lenk Date: Wed, 30 May 2012 15:58:48 -0500 Subject: [PATCH 439/731] vs2010 reswig for last commit --- .../mod_managed/freeswitch_wrap.2010.cxx | 28 +++++++++++++++++-- .../mod_managed/managed/swig.2010.cs | 18 ++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx index 65b4eedf3c..a11d584f49 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx @@ -1550,6 +1550,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_SIGNAL_BOND_VARIABLE_get() { } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *)("originate_signal_bond"); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ORIGINATOR_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -11108,7 +11118,7 @@ SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_default_ptime(char * jarg1, u } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_add_registration(char * jarg1, char * jarg2, char * jarg3, char * jarg4, unsigned long jarg5, char * jarg6, char * jarg7, char * jarg8) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_add_registration(char * jarg1, char * jarg2, char * jarg3, char * jarg4, unsigned long jarg5, char * jarg6, char * jarg7, char * jarg8, char * jarg9) { int jresult ; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; @@ -11118,6 +11128,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_add_registration(char * jarg1, cha char *arg6 = (char *) 0 ; char *arg7 = (char *) 0 ; char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; switch_status_t result; arg1 = (char *)jarg1; @@ -11128,7 +11139,8 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_add_registration(char * jarg1, cha arg6 = (char *)jarg6; arg7 = (char *)jarg7; arg8 = (char *)jarg8; - result = (switch_status_t)switch_core_add_registration((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + arg9 = (char *)jarg9; + result = (switch_status_t)switch_core_add_registration((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9); jresult = result; return jresult; } @@ -25772,6 +25784,18 @@ SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_transfer_to_extension(void * j } +SWIGEXPORT char * SWIGSTDCALL CSharp_switch_channel_get_partner_uuid(void * jarg1) { + char * jresult ; + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + char *result = 0 ; + + arg1 = (switch_channel_t *)jarg1; + result = (char *)switch_channel_get_partner_uuid(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_buffer_create(void * jarg1, void * jarg2, void * jarg3) { int jresult ; switch_memory_pool_t *arg1 = (switch_memory_pool_t *) 0 ; diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs index 0654085a50..3a1cc13d6b 100644 --- a/src/mod/languages/mod_managed/managed/swig.2010.cs +++ b/src/mod/languages/mod_managed/managed/swig.2010.cs @@ -2671,8 +2671,8 @@ public class freeswitch { return ret; } - public static switch_status_t switch_core_add_registration(string user, string realm, string token, string url, uint expires, string network_ip, string network_port, string network_proto) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_add_registration(user, realm, token, url, expires, network_ip, network_port, network_proto); + public static switch_status_t switch_core_add_registration(string user, string realm, string token, string url, uint expires, string network_ip, string network_port, string network_proto, string metadata) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_add_registration(user, realm, token, url, expires, network_ip, network_port, network_proto, metadata); return ret; } @@ -4118,6 +4118,11 @@ public class freeswitch { freeswitchPINVOKE.switch_channel_transfer_to_extension(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_caller_extension.getCPtr(caller_extension)); } + public static string switch_channel_get_partner_uuid(SWIGTYPE_p_switch_channel channel) { + string ret = freeswitchPINVOKE.switch_channel_get_partner_uuid(SWIGTYPE_p_switch_channel.getCPtr(channel)); + return ret; + } + public static switch_status_t switch_buffer_create(SWIGTYPE_p_apr_pool_t pool, SWIGTYPE_p_p_switch_buffer buffer, SWIGTYPE_p_switch_size_t max_len) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_buffer_create(SWIGTYPE_p_apr_pool_t.getCPtr(pool), SWIGTYPE_p_p_switch_buffer.getCPtr(buffer), SWIGTYPE_p_switch_size_t.getCPtr(max_len)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -6130,6 +6135,7 @@ public class freeswitch { public static readonly string SWITCH_LAST_BRIDGE_VARIABLE = freeswitchPINVOKE.SWITCH_LAST_BRIDGE_VARIABLE_get(); public static readonly string SWITCH_SIGNAL_BRIDGE_VARIABLE = freeswitchPINVOKE.SWITCH_SIGNAL_BRIDGE_VARIABLE_get(); public static readonly string SWITCH_SIGNAL_BOND_VARIABLE = freeswitchPINVOKE.SWITCH_SIGNAL_BOND_VARIABLE_get(); + public static readonly string SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE = freeswitchPINVOKE.SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE_get(); public static readonly string SWITCH_ORIGINATOR_VARIABLE = freeswitchPINVOKE.SWITCH_ORIGINATOR_VARIABLE_get(); public static readonly string SWITCH_ORIGINATOR_CODEC_VARIABLE = freeswitchPINVOKE.SWITCH_ORIGINATOR_CODEC_VARIABLE_get(); public static readonly string SWITCH_ORIGINATOR_VIDEO_CODEC_VARIABLE = freeswitchPINVOKE.SWITCH_ORIGINATOR_VIDEO_CODEC_VARIABLE_get(); @@ -6780,6 +6786,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_SIGNAL_BOND_VARIABLE_get")] public static extern string SWITCH_SIGNAL_BOND_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE_get")] + public static extern string SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ORIGINATOR_VARIABLE_get")] public static extern string SWITCH_ORIGINATOR_VARIABLE_get(); @@ -9094,7 +9103,7 @@ class freeswitchPINVOKE { public static extern uint switch_default_ptime(string jarg1, uint jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_add_registration")] - public static extern int switch_core_add_registration(string jarg1, string jarg2, string jarg3, string jarg4, uint jarg5, string jarg6, string jarg7, string jarg8); + public static extern int switch_core_add_registration(string jarg1, string jarg2, string jarg3, string jarg4, uint jarg5, string jarg6, string jarg7, string jarg8, string jarg9); [DllImport("mod_managed", EntryPoint="CSharp_switch_core_del_registration")] public static extern int switch_core_del_registration(string jarg1, string jarg2, string jarg3); @@ -12705,6 +12714,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_transfer_to_extension")] public static extern void switch_channel_transfer_to_extension(HandleRef jarg1, HandleRef jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_get_partner_uuid")] + public static extern string switch_channel_get_partner_uuid(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_buffer_create")] public static extern int switch_buffer_create(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3); From 07bc7ba7639726985daa571ea20490c7d3dc75ce Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Thu, 31 May 2012 07:40:59 +0200 Subject: [PATCH 440/731] gsmopen and skypopen: updated License headers --- src/mod/endpoints/mod_gsmopen/gsmopen.h | 12 +++---- .../mod_gsmopen/gsmopen_protocol.cpp | 36 +++++++++++++++++++ src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 11 +++--- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 12 +++---- src/mod/endpoints/mod_skypopen/skypopen.h | 11 +++--- .../mod_skypopen/skypopen_protocol.c | 34 ++++++++++++++++++ 6 files changed, 89 insertions(+), 27 deletions(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen.h b/src/mod/endpoints/mod_gsmopen/gsmopen.h index 2b4c619783..fd56fd4963 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen.h +++ b/src/mod/endpoints/mod_gsmopen/gsmopen.h @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005/2012, Anthony Minessale II + * Copyright (C) 2005-2011, Anthony Minessale II * * Version: MPL 1.1 * @@ -23,17 +23,15 @@ * * This module (mod_gsmopen) has been contributed by: * - * Giovanni Maruzzelli (gmaruzz@gmail.com) + * Giovanni Maruzzelli * + * Maintainer: Giovanni Maruzzelli * - * Further Contributors: - * - * - * - * mod_gsmopen.c -- GSM compatible Endpoint Module + * mod_gsmopen.cpp -- GSM Modem compatible Endpoint Module * */ + #define __STDC_LIMIT_MACROS #ifdef WIN32 diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index 391dade93a..ffa4e3d014 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -1,3 +1,39 @@ +/* + * 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. + * + * This module (mod_gsmopen) has been contributed by: + * + * Giovanni Maruzzelli + * + * Maintainer: Giovanni Maruzzelli + * + * gsmopen_protocol.cpp -- Low Level Interface for mod_gamopen + * + */ + + + + #include "gsmopen.h" #ifdef WIN32 #include "win_iconv.c" diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index f48d299e0a..837d20ed30 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005/2012, Anthony Minessale II + * Copyright (C) 2005-2011, Anthony Minessale II * * Version: MPL 1.1 * @@ -23,14 +23,11 @@ * * This module (mod_gsmopen) has been contributed by: * - * Giovanni Maruzzelli (gmaruzz@gmail.com) + * Giovanni Maruzzelli * + * Maintainer: Giovanni Maruzzelli * - * Further Contributors: - * - * - * - * mod_gsmopen.c -- GSM compatible Endpoint Module + * mod_gsmopen.cpp -- GSM Modem compatible Endpoint Module * */ diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 25539fa81e..ce89211b83 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2012, Anthony Minessale II + * Copyright (C) 2005-2011, Anthony Minessale II * * Version: MPL 1.1 * @@ -21,19 +21,17 @@ * Portions created by the Initial Developer are Copyright (C) * the Initial Developer. All Rights Reserved. * - * This module (mod_skypopen) has been contributed by: - * - * Giovanni Maruzzelli (gmaruzz@gmail.com) - * - * - * Further Contributors: + * This module (mod_gsmopen) has been contributed by: * + * Giovanni Maruzzelli * + * Maintainer: Giovanni Maruzzelli * * mod_skypopen.c -- Skype compatible Endpoint Module * */ + #include "skypopen.h" #define SKYPE_CHAT_PROTO "skype" diff --git a/src/mod/endpoints/mod_skypopen/skypopen.h b/src/mod/endpoints/mod_skypopen/skypopen.h index d2dd51bd37..864a22c3e4 100644 --- a/src/mod/endpoints/mod_skypopen/skypopen.h +++ b/src/mod/endpoints/mod_skypopen/skypopen.h @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005/2012, Anthony Minessale II + * Copyright (C) 2005-2011, Anthony Minessale II * * Version: MPL 1.1 * @@ -21,18 +21,17 @@ * Portions created by the Initial Developer are Copyright (C) * the Initial Developer. All Rights Reserved. * - * This module (mod_skypopen) has been contributed by: + * This module (mod_gsmopen) has been contributed by: * - * Giovanni Maruzzelli (gmaruzz@gmail.com) - * - * - * Further Contributors: + * Giovanni Maruzzelli * + * Maintainer: Giovanni Maruzzelli * * mod_skypopen.c -- Skype compatible Endpoint Module * */ + #include #include diff --git a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c index 5aa113c3bf..2126955452 100644 --- a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c +++ b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c @@ -1,3 +1,37 @@ +/* + * 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. + * + * This module (mod_gsmopen) has been contributed by: + * + * Giovanni Maruzzelli + * + * Maintainer: Giovanni Maruzzelli + * + * skypopen_protocol.c -- Low Level Interface for mod_skypopen + * + */ + + #include "skypopen.h" #ifdef ASTERISK From a7ac272595e16542ca1218aab61da66c8d6b1263 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 31 May 2012 17:31:06 +0530 Subject: [PATCH 441/731] 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 442/731] 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 be2ec2928214718978551b1419759e6fa13709da Mon Sep 17 00:00:00 2001 From: Christopher Rienzo Date: Thu, 31 May 2012 13:24:24 +0000 Subject: [PATCH 443/731] Add Maintainer to mod_posix_timer, mod_unimrcp, mod_http_cache --- src/mod/applications/mod_http_cache/mod_http_cache.c | 4 +++- src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c | 2 ++ src/mod/timers/mod_posix_timer/mod_posix_timer.c | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mod/applications/mod_http_cache/mod_http_cache.c b/src/mod/applications/mod_http_cache/mod_http_cache.c index 1e40ce2e15..fb2b4e09a2 100644 --- a/src/mod/applications/mod_http_cache/mod_http_cache.c +++ b/src/mod/applications/mod_http_cache/mod_http_cache.c @@ -23,7 +23,9 @@ * * Contributor(s): * - * Chris Rienzo + * Christopher M. Rienzo + * + * Maintainer: Christopher M. Rienzo * * mod_http_cache.c -- HTTP GET with caching * -- designed for downloading audio files from a webserver for playback diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c index 80fa3f2001..e53964277c 100644 --- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c +++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c @@ -28,6 +28,8 @@ * Christopher M. Rienzo * Luke Dashjr (OpenMethods, LLC) * + * Maintainer: Christopher M. Rienzo + * * mod_unimrcp.c -- UniMRCP module (MRCP client) * */ diff --git a/src/mod/timers/mod_posix_timer/mod_posix_timer.c b/src/mod/timers/mod_posix_timer/mod_posix_timer.c index 04d694b5f7..cfb6584701 100644 --- a/src/mod/timers/mod_posix_timer/mod_posix_timer.c +++ b/src/mod/timers/mod_posix_timer/mod_posix_timer.c @@ -22,9 +22,11 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Chris Rienzo + * Christopher M. Rienzo * Timo Teräs (based on mod_timerfd.c) * + * Maintainer: Christopher M. Rienzo + * * mod_posix_timer.c -- soft timer implemented with POSIX timers (timer_create/timer_settime/timer_getoverrun) * */ From 5be9857af249705b96c1235d778b317cc0b99afa Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Thu, 31 May 2012 10:25:49 -0500 Subject: [PATCH 444/731] remove mod_fax. this has been deprecated for quite a while --- src/mod/applications/mod_fax/Makefile.am | 24 - .../applications/mod_fax/mod_fax.2008.vcproj | 299 --- src/mod/applications/mod_fax/mod_fax.c | 1945 ----------------- src/mod/applications/mod_fax/udptl.c | 563 ----- src/mod/applications/mod_fax/udptl.h | 153 -- 5 files changed, 2984 deletions(-) delete mode 100644 src/mod/applications/mod_fax/Makefile.am delete mode 100644 src/mod/applications/mod_fax/mod_fax.2008.vcproj delete mode 100644 src/mod/applications/mod_fax/mod_fax.c delete mode 100644 src/mod/applications/mod_fax/udptl.c delete mode 100644 src/mod/applications/mod_fax/udptl.h diff --git a/src/mod/applications/mod_fax/Makefile.am b/src/mod/applications/mod_fax/Makefile.am deleted file mode 100644 index c71c5b9da5..0000000000 --- a/src/mod/applications/mod_fax/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_fax - -TIFF_DIR=$(switch_srcdir)/libs/tiff-3.8.2 -TIFF_BUILDDIR=$(switch_builddir)/libs/tiff-3.8.2 -TIFF_LA=$(TIFF_BUILDDIR)/libtiff/libtiff.la - -SPANDSP_DIR=$(switch_srcdir)/libs/spandsp -SPANDSP_BUILDDIR=$(switch_builddir)/libs/spandsp -SPANDSP_LA=$(SPANDSP_BUILDDIR)/src/libspandsp.la - -mod_LTLIBRARIES = mod_fax.la -mod_fax_la_SOURCES = mod_fax.c udptl.c -mod_fax_la_CFLAGS = $(AM_CFLAGS) -I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff -I$(SPANDSP_BUILDDIR)/src -I$(TIFF_BUILDDIR)/libtiff -I. -mod_fax_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SPANDSP_LA) $(TIFF_LA) -mod_fax_la_LDFLAGS = -avoid-version -module -no-undefined -shared -ljpeg - -$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update - cd $(SPANDSP_BUILDDIR) && $(MAKE) -j1 - $(TOUCH_TARGET) - -$(TIFF_LA): $(TIFF_DIR) $(TIFF_DIR)/.update - cd $(TIFF_BUILDDIR) && $(MAKE) -j1 - $(TOUCH_TARGET) diff --git a/src/mod/applications/mod_fax/mod_fax.2008.vcproj b/src/mod/applications/mod_fax/mod_fax.2008.vcproj deleted file mode 100644 index dd10ca8a93..0000000000 --- a/src/mod/applications/mod_fax/mod_fax.2008.vcproj +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/mod/applications/mod_fax/mod_fax.c b/src/mod/applications/mod_fax/mod_fax.c deleted file mode 100644 index 7eac2520b3..0000000000 --- a/src/mod/applications/mod_fax/mod_fax.c +++ /dev/null @@ -1,1945 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2012, 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 mod_fax. - * - * The Initial Developer of the Original Code is - * Massimo Cetra - * - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Brian West - * Anthony Minessale II - * Steve Underwood - * Antonio Gallo - * mod_fax.c -- Fax applications provided by SpanDSP - * - */ - -#include -#ifdef WIN32 -#define FAX_INVALID_SOCKET INVALID_HANDLE_VALUE -typedef HANDLE zap_socket_t; -#else -#define FAX_INVALID_SOCKET -1 -typedef int zap_socket_t; -#endif - -#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES -#include -#include - -#include "udptl.h" - -#define LOCAL_FAX_MAX_DATAGRAM 400 -#define MAX_FEC_ENTRIES 4 -#define MAX_FEC_SPAN 4 - -/***************************************************************************** - OUR DEFINES AND STRUCTS -*****************************************************************************/ - -typedef enum { - FUNCTION_TX, - FUNCTION_RX, - FUNCTION_GW -} application_mode_t; - -typedef enum { - T38_MODE, - AUDIO_MODE, - T38_GATEWAY_MODE -} transport_mode_t; - -typedef enum { - T38_MODE_UNKNOWN = 0, - T38_MODE_NEGOTIATED = 1, - T38_MODE_REQUESTED = 2, - T38_MODE_REFUSED = -1, -} t38_mode_t; - -/* The global stuff */ -static struct { - switch_memory_pool_t *pool; - switch_mutex_t *mutex; - - uint32_t total_sessions; - - short int use_ecm; - short int verbose; - short int disable_v17; - short int enable_t38; - short int enable_t38_request; - short int enable_t38_insist; - char ident[20]; - char header[50]; - char *prepend_string; - char *spool; -} globals; - -struct pvt_s { - switch_core_session_t *session; - - application_mode_t app_mode; - - fax_state_t *fax_state; - t38_terminal_state_t *t38_state; - t38_gateway_state_t *t38_gateway_state; - t38_core_state_t *t38_core; - - udptl_state_t *udptl_state; - - char *filename; - char *ident; - char *header; - - int use_ecm; - int disable_v17; - int verbose; - int caller; - - int tx_page_start; - int tx_page_end; - - int done; - - t38_mode_t t38_mode; - - struct pvt_s *next; -}; - -typedef struct pvt_s pvt_t; - -static void launch_timer_thread(void); - -static struct { - pvt_t *head; - switch_mutex_t *mutex; - switch_thread_t *thread; - int thread_running; -} t38_state_list; - -static int add_pvt(pvt_t *pvt) -{ - int r = 0; - uint32_t sanity = 50; - - switch_mutex_lock(t38_state_list.mutex); - if (!t38_state_list.thread_running) { - - launch_timer_thread(); - - while(--sanity && !t38_state_list.thread_running) { - switch_yield(10000); - } - } - switch_mutex_unlock(t38_state_list.mutex); - - if (t38_state_list.thread_running) { - switch_mutex_lock(t38_state_list.mutex); - pvt->next = t38_state_list.head; - t38_state_list.head = pvt; - switch_mutex_unlock(t38_state_list.mutex); - } - - return r; - -} - - -static int del_pvt(pvt_t *del_pvt) -{ - pvt_t *p, *l = NULL; - int r = 0; - - if (!t38_state_list.thread_running) goto end; - - switch_mutex_lock(t38_state_list.mutex); - for (p = t38_state_list.head; p; p = p->next) { - if (p == del_pvt) { - if (l) { - l->next = p->next; - } else { - t38_state_list.head = p->next; - } - p->next = NULL; - r = 1; - goto end; - } - - l = p; - } - - end: - - switch_mutex_unlock(t38_state_list.mutex); - - return r; - -} - -static void *SWITCH_THREAD_FUNC timer_thread_run(switch_thread_t *thread, void *obj) -{ - switch_timer_t timer = { 0 }; - pvt_t *pvt; - int samples = 240; - int ms = 30; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "timer thread started.\n"); - - if (switch_core_timer_init(&timer, "soft", ms, samples, NULL) != SWITCH_STATUS_SUCCESS) { - return NULL; - } - - t38_state_list.thread_running = 1; - - while(t38_state_list.thread_running) { - - switch_mutex_lock(t38_state_list.mutex); - - if (!t38_state_list.head) { - switch_mutex_unlock(t38_state_list.mutex); - goto end; - } - - for (pvt = t38_state_list.head; pvt; pvt = pvt->next) { - if (pvt->udptl_state) { - t38_terminal_send_timeout(pvt->t38_state, samples); - } - } - - switch_mutex_unlock(t38_state_list.mutex); - - switch_core_timer_next(&timer); - } - - end: - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "timer thread ended.\n"); - - t38_state_list.thread_running = 0; - switch_core_timer_destroy(&timer); - - return NULL; -} - -static void launch_timer_thread(void) -{ - - switch_threadattr_t *thd_attr = NULL; - - switch_threadattr_create(&thd_attr, globals.pool); - switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_thread_create(&t38_state_list.thread, thd_attr, timer_thread_run, NULL, globals.pool); -} - - -/***************************************************************************** - LOGGING AND HELPER FUNCTIONS -*****************************************************************************/ - -static void counter_increment(void) -{ - switch_mutex_lock(globals.mutex); - globals.total_sessions++; - switch_mutex_unlock(globals.mutex); -} - -static void spanfax_log_message(int level, const char *msg) -{ - int fs_log_level; - - switch (level) { - case SPAN_LOG_NONE: - return; - case SPAN_LOG_ERROR: - case SPAN_LOG_PROTOCOL_ERROR: - fs_log_level = SWITCH_LOG_ERROR; - break; - case SPAN_LOG_WARNING: - case SPAN_LOG_PROTOCOL_WARNING: - fs_log_level = SWITCH_LOG_WARNING; - break; - case SPAN_LOG_FLOW: - case SPAN_LOG_FLOW_2: - case SPAN_LOG_FLOW_3: - default: /* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */ - fs_log_level = SWITCH_LOG_DEBUG; - break; - } - - if (!zstr(msg)) { - switch_log_printf(SWITCH_CHANNEL_LOG, fs_log_level, "%s", msg); - } -} - -/* - * Called at the end of the document - */ -static void phase_e_handler(t30_state_t *s, void *user_data, int result) -{ - t30_stats_t t; - const char *local_ident; - const char *far_ident; - switch_core_session_t *session; - switch_channel_t *channel; - pvt_t *pvt; - char *tmp; - - pvt = (pvt_t *) user_data; - switch_assert(pvt); - - session = pvt->session; - switch_assert(session); - - channel = switch_core_session_get_channel(session); - switch_assert(channel); - - t30_get_transfer_statistics(s, &t); - local_ident = switch_str_nil(t30_get_tx_ident(s)); - far_ident = switch_str_nil(t30_get_rx_ident(s)); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); - - if (result == T30_ERR_OK) { - if (pvt->app_mode == FUNCTION_TX) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Fax successfully sent.\n"); - } else if (pvt->app_mode == FUNCTION_RX) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Fax successfully received.\n"); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Fax successfully managed. How ?\n"); - } - switch_channel_set_variable(channel, "fax_success", "1"); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Fax processing not successful - result (%d) %s.\n", result, - t30_completion_code_to_str(result)); - switch_channel_set_variable(channel, "fax_success", "0"); - } - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Remote station id: %s\n", far_ident); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Local station id: %s\n", local_ident); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Pages transferred: %i\n", - pvt->app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Total fax pages: %i\n", t.pages_in_file); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Image resolution: %ix%i\n", t.x_resolution, t.y_resolution); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Transfer Rate: %i\n", t.bit_rate); - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "ECM status %s\n", (t.error_correcting_mode) ? "on" : "off"); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "remote country: %s\n", switch_str_nil(t30_get_rx_country(s))); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "remote vendor: %s\n", switch_str_nil(t30_get_rx_vendor(s))); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "remote model: %s\n", switch_str_nil(t30_get_rx_model(s))); - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "==============================================================================\n"); - - /* - Set our channel variables - */ - - tmp = switch_mprintf("%i", result); - if (tmp) { - switch_channel_set_variable(channel, "fax_result_code", tmp); - switch_safe_free(tmp); - } - - switch_channel_set_variable(channel, "fax_result_text", t30_completion_code_to_str(result)); - - switch_channel_set_variable(channel, "fax_ecm_used", (t.error_correcting_mode) ? "on" : "off"); - switch_channel_set_variable(channel, "fax_local_station_id", local_ident); - switch_channel_set_variable(channel, "fax_remote_station_id", far_ident); - - tmp = switch_mprintf("%i", pvt->app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx); - if (tmp) { - switch_channel_set_variable(channel, "fax_document_transferred_pages", tmp); - switch_safe_free(tmp); - } - - tmp = switch_mprintf("%i", t.pages_in_file); - if (tmp) { - switch_channel_set_variable(channel, "fax_document_total_pages", tmp); - switch_safe_free(tmp); - } - - tmp = switch_mprintf("%ix%i", t.x_resolution, t.y_resolution); - if (tmp) { - switch_channel_set_variable(channel, "fax_image_resolution", tmp); - switch_safe_free(tmp); - } - - tmp = switch_mprintf("%d", t.image_size); - if (tmp) { - switch_channel_set_variable(channel, "fax_image_size", tmp); - switch_safe_free(tmp); - } - - tmp = switch_mprintf("%d", t.bad_rows); - if (tmp) { - switch_channel_set_variable(channel, "fax_bad_rows", tmp); - switch_safe_free(tmp); - } - - tmp = switch_mprintf("%i", t.bit_rate); - if (tmp) { - switch_channel_set_variable(channel, "fax_transfer_rate", tmp); - switch_safe_free(tmp); - } - - /* switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); */ - - pvt->done = 1; - - /* - TODO Fire events - */ -} - -static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count) -{ - switch_frame_t out_frame = { 0 }; - switch_core_session_t *session; - switch_channel_t *channel; - pvt_t *pvt; - uint8_t pkt[LOCAL_FAX_MAX_DATAGRAM]; - int x; - int r = 0; - - pvt = (pvt_t *) user_data; - session = pvt->session; - channel = switch_core_session_get_channel(session); - - /* we need to build a real packet here and make write_frame.packet and write_frame.packetlen point to it */ - out_frame.flags = SFF_UDPTL_PACKET | SFF_PROXY_PACKET; - out_frame.packet = pkt; - out_frame.packetlen = udptl_build_packet(pvt->udptl_state, pkt, buf, len); - - //switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "WRITE %d udptl bytes\n", out_frame.packetlen); - - for (x = 0; x < count; x++) { - if (switch_core_session_write_frame(session, &out_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - r = -1; - break; - } - } - - return r; -} - -static switch_status_t spanfax_init(pvt_t *pvt, transport_mode_t trans_mode) -{ - - switch_core_session_t *session; - switch_channel_t *channel; - fax_state_t *fax; - t38_terminal_state_t *t38; - t30_state_t *t30; - - - session = (switch_core_session_t *) pvt->session; - switch_assert(session); - - channel = switch_core_session_get_channel(session); - switch_assert(channel); - - - switch (trans_mode) { - case AUDIO_MODE: - if (pvt->fax_state == NULL) { - pvt->fax_state = (fax_state_t *) switch_core_session_alloc(pvt->session, sizeof(fax_state_t)); - } - if (pvt->fax_state == NULL) { - return SWITCH_STATUS_FALSE; - } - - fax = pvt->fax_state; - t30 = fax_get_t30_state(fax); - - memset(fax, 0, sizeof(fax_state_t)); - if (fax_init(fax, pvt->caller) == NULL) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize my fax structs\n"); - return SWITCH_STATUS_FALSE; - } - - fax_set_transmit_on_idle(fax, TRUE); - - span_log_set_message_handler(&fax->logging, spanfax_log_message); - span_log_set_message_handler(&t30->logging, spanfax_log_message); - - if (pvt->verbose) { - span_log_set_level(&fax->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - span_log_set_level(&t30->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - } - break; - case T38_MODE: - if (pvt->t38_state == NULL) { - pvt->t38_state = (t38_terminal_state_t *) switch_core_session_alloc(pvt->session, sizeof(t38_terminal_state_t)); - } - if (pvt->t38_state == NULL) { - return SWITCH_STATUS_FALSE; - } - if (pvt->udptl_state == NULL) { - pvt->udptl_state = (udptl_state_t *) switch_core_session_alloc(pvt->session, sizeof(udptl_state_t)); - } - if (pvt->udptl_state == NULL) { - t38_terminal_free(pvt->t38_state); - pvt->t38_state = NULL; - return SWITCH_STATUS_FALSE; - } - - /* add to timer thread processing */ - add_pvt(pvt); - - t38 = pvt->t38_state; - t30 = t38_terminal_get_t30_state(t38); - - memset(t38, 0, sizeof(t38_terminal_state_t)); - - if (t38_terminal_init(t38, pvt->caller, t38_tx_packet_handler, pvt) == NULL) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize my T.38 structs\n"); - return SWITCH_STATUS_FALSE; - } - - pvt->t38_core = t38_terminal_get_t38_core_state(pvt->t38_state); - - if (udptl_init(pvt->udptl_state, UDPTL_ERROR_CORRECTION_REDUNDANCY, 3, 3, - (udptl_rx_packet_handler_t *) t38_core_rx_ifp_packet, (void *) pvt->t38_core) == NULL) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize my UDPTL structs\n"); - return SWITCH_STATUS_FALSE; - } - - span_log_set_message_handler(&t38->logging, spanfax_log_message); - span_log_set_message_handler(&t30->logging, spanfax_log_message); - - if (pvt->verbose) { - span_log_set_level(&t38->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - span_log_set_level(&t30->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - } - break; - case T38_GATEWAY_MODE: - if (pvt->t38_gateway_state == NULL) { - pvt->t38_gateway_state = (t38_gateway_state_t *) switch_core_session_alloc(pvt->session, sizeof(t38_gateway_state_t)); - } - - if (pvt->udptl_state == NULL) { - pvt->udptl_state = (udptl_state_t *) switch_core_session_alloc(pvt->session, sizeof(udptl_state_t)); - } - - if (t38_gateway_init(pvt->t38_gateway_state, t38_tx_packet_handler, pvt) == NULL) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize my T.38 structs\n"); - t38_gateway_free(pvt->t38_gateway_state); - pvt->t38_gateway_state = NULL; - - return SWITCH_STATUS_FALSE; - } - - pvt->t38_core = t38_gateway_get_t38_core_state(pvt->t38_gateway_state); - - if (udptl_init(pvt->udptl_state, UDPTL_ERROR_CORRECTION_REDUNDANCY, 3, 3, - (udptl_rx_packet_handler_t *) t38_core_rx_ifp_packet, (void *) pvt->t38_core) == NULL) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize my UDPTL structs\n"); - t38_gateway_free(pvt->t38_gateway_state); - udptl_release(pvt->udptl_state); - pvt->udptl_state = NULL; - return SWITCH_STATUS_FALSE; - } - - t38_gateway_set_transmit_on_idle(pvt->t38_gateway_state, TRUE); - - if (switch_true(switch_channel_get_variable(channel, "fax_v17_disabled"))) { - t38_gateway_set_supported_modems(pvt->t38_gateway_state, T30_SUPPORT_V29 | T30_SUPPORT_V27TER); - } else { - t38_gateway_set_supported_modems(pvt->t38_gateway_state, T30_SUPPORT_V17 | T30_SUPPORT_V29 | T30_SUPPORT_V27TER); - } - - t38_gateway_set_ecm_capability(pvt->t38_gateway_state, pvt->use_ecm); - switch_channel_set_variable(channel, "fax_ecm_requested", pvt->use_ecm ? "true" : "false"); - - if (switch_true(switch_channel_get_variable(channel, "FAX_DISABLE_ECM"))) { - t38_gateway_set_ecm_capability(pvt->t38_gateway_state, FALSE); - } else { - t38_gateway_set_ecm_capability(pvt->t38_gateway_state, TRUE); - } - - - span_log_set_message_handler(&pvt->t38_gateway_state->logging, spanfax_log_message); - span_log_set_message_handler(&pvt->t38_core->logging, spanfax_log_message); - - if (pvt->verbose) { - span_log_set_level(&pvt->t38_gateway_state->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - span_log_set_level(&pvt->t38_core->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); - } - - t38_set_t38_version(pvt->t38_core, 0); - t38_gateway_set_ecm_capability(pvt->t38_gateway_state, 1); - - return SWITCH_STATUS_SUCCESS; - - default: - assert(0); /* What? */ - return SWITCH_STATUS_SUCCESS; - } /* Switch trans mode */ - - /* All the things which are common to audio and T.38 FAX setup */ - t30_set_tx_ident(t30, pvt->ident); - t30_set_tx_page_header_info(t30, pvt->header); - - t30_set_phase_e_handler(t30, phase_e_handler, pvt); - - t30_set_supported_image_sizes(t30, - T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH - | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH); - t30_set_supported_resolutions(t30, - T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION - | T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION); - - if (pvt->disable_v17) { - t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER); - switch_channel_set_variable(channel, "fax_v17_disabled", "1"); - } else { - t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER | T30_SUPPORT_V17); - switch_channel_set_variable(channel, "fax_v17_disabled", "0"); - } - - if (pvt->use_ecm) { - t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); - t30_set_ecm_capability(t30, TRUE); - switch_channel_set_variable(channel, "fax_ecm_requested", "1"); - } else { - t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION); - switch_channel_set_variable(channel, "fax_ecm_requested", "0"); - } - - if (pvt->app_mode == FUNCTION_TX) { - t30_set_tx_file(t30, pvt->filename, pvt->tx_page_start, pvt->tx_page_end); - } else { - t30_set_rx_file(t30, pvt->filename, -1); - } - switch_channel_set_variable(channel, "fax_filename", pvt->filename); - - return SWITCH_STATUS_SUCCESS; -} - -static switch_status_t spanfax_destroy(pvt_t *pvt) -{ - int terminate; - t30_state_t *t30; - - if (!pvt) return SWITCH_STATUS_FALSE; - - if (pvt->fax_state) { - if (pvt->t38_state) { - terminate = 0; - } else { - terminate = 1; - } - - t30 = fax_get_t30_state(pvt->fax_state); - if (terminate && t30) { - t30_terminate(t30); - } - - fax_release(pvt->fax_state); - } - - if (pvt->t38_state) { - - /* remove from timer thread processing */ - del_pvt(pvt); - - if (pvt->t38_state) { - terminate = 1; - } else { - terminate = 0; - } - - t30 = t38_terminal_get_t30_state(pvt->t38_state); - - if (terminate && t30) { - t30_terminate(t30); - } - - t38_terminal_release(pvt->t38_state); - } - - if (pvt->t38_gateway_state) { - t38_gateway_release(pvt->t38_gateway_state); - } - - if (pvt->udptl_state) { - udptl_release(pvt->udptl_state); - } - return SWITCH_STATUS_SUCCESS; -} - -static t38_mode_t configure_t38(pvt_t *pvt) -{ - switch_core_session_t *session = pvt->session; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_t38_options_t *t38_options = switch_channel_get_private(channel, "t38_options"); - int method = 2; - - if (!t38_options || !pvt || !pvt->t38_core) { - pvt->t38_mode = T38_MODE_REFUSED; - return pvt->t38_mode; - } - - t38_set_t38_version(pvt->t38_core, t38_options->T38FaxVersion); - t38_set_max_buffer_size(pvt->t38_core, t38_options->T38FaxMaxBuffer); - t38_set_fastest_image_data_rate(pvt->t38_core, t38_options->T38MaxBitRate); - t38_set_fill_bit_removal(pvt->t38_core, t38_options->T38FaxFillBitRemoval); - t38_set_mmr_transcoding(pvt->t38_core, t38_options->T38FaxTranscodingMMR); - t38_set_jbig_transcoding(pvt->t38_core, t38_options->T38FaxTranscodingJBIG); - t38_set_max_datagram_size(pvt->t38_core, t38_options->T38FaxMaxDatagram); - - if (t38_options->T38FaxRateManagement) { - if (!strcasecmp(t38_options->T38FaxRateManagement, "transferredTCF")) { - method = 2; - } else { - method = 1; - } - } - - t38_set_data_rate_management_method(pvt->t38_core, method); - - - //t38_set_data_transport_protocol(pvt->t38_core, int data_transport_protocol); - //t38_set_redundancy_control(pvt->t38_core, int category, int setting); - - return pvt->t38_mode; -} - -static t38_mode_t negotiate_t38(pvt_t *pvt) -{ - switch_core_session_t *session = pvt->session; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_core_session_message_t msg = { 0 }; - switch_t38_options_t *t38_options = switch_channel_get_private(channel, "t38_options"); - int enabled = 0, insist = 0; - const char *v; - - pvt->t38_mode = T38_MODE_REFUSED; - - if (pvt->app_mode == FUNCTION_GW) { - enabled = 1; - } else if ((v = switch_channel_get_variable(channel, "fax_enable_t38"))) { - enabled = switch_true(v); - } else { - enabled = globals.enable_t38; - } - - if (!(enabled && t38_options)) { - /* if there is no t38_options the endpoint will refuse the transition */ - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s NO T38 options detected.\n", switch_channel_get_name(channel)); - switch_channel_set_private(channel, "t38_options", NULL); - } else { - pvt->t38_mode = T38_MODE_NEGOTIATED; - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxVersion = %d\n", t38_options->T38FaxVersion); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38MaxBitRate = %d\n", t38_options->T38MaxBitRate); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxFillBitRemoval = %d\n", t38_options->T38FaxFillBitRemoval); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxTranscodingMMR = %d\n", t38_options->T38FaxTranscodingMMR); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxTranscodingJBIG = %d\n", t38_options->T38FaxTranscodingJBIG); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxRateManagement = '%s'\n", t38_options->T38FaxRateManagement); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxMaxBuffer = %d\n", t38_options->T38FaxMaxBuffer); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxMaxDatagram = %d\n", t38_options->T38FaxMaxDatagram); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38FaxUdpEC = '%s'\n", t38_options->T38FaxUdpEC); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "T38VendorInfo = '%s'\n", switch_str_nil(t38_options->T38VendorInfo)); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "ip = '%s'\n", t38_options->remote_ip ? t38_options->remote_ip : "Not specified"); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "port = %d\n", t38_options->remote_port); - - /* Time to practice our negotiating skills, by editing the t38_options */ - - if (t38_options->T38FaxVersion > 3) { - t38_options->T38FaxVersion = 3; - } - t38_options->T38MaxBitRate = (pvt->disable_v17) ? 9600 : 14400; - t38_options->T38FaxFillBitRemoval = 1; - t38_options->T38FaxTranscodingMMR = 0; - t38_options->T38FaxTranscodingJBIG = 0; - t38_options->T38FaxRateManagement = "transferredTCF"; - t38_options->T38FaxMaxBuffer = 2000; - t38_options->T38FaxMaxDatagram = LOCAL_FAX_MAX_DATAGRAM; - if (strcasecmp(t38_options->T38FaxUdpEC, "t38UDPRedundancy") == 0 - || - strcasecmp(t38_options->T38FaxUdpEC, "t38UDPFEC") == 0) { - t38_options->T38FaxUdpEC = "t38UDPRedundancy"; - } else { - t38_options->T38FaxUdpEC = NULL; - } - t38_options->T38VendorInfo = "0 0 0"; - } - - if ((v = switch_channel_get_variable(channel, "fax_enable_t38_insist"))) { - insist = switch_true(v); - } else { - insist = globals.enable_t38_insist; - } - - /* This will send the options back in a response */ - msg.from = __FILE__; - msg.message_id = SWITCH_MESSAGE_INDICATE_T38_DESCRIPTION; - msg.numeric_arg = insist; - switch_core_session_receive_message(session, &msg); - - return pvt->t38_mode; -} - - - -static t38_mode_t request_t38(pvt_t *pvt) -{ - switch_core_session_t *session = pvt->session; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_core_session_message_t msg = { 0 }; - switch_t38_options_t *t38_options = NULL; - int enabled = 0, insist = 0; - const char *v; - - pvt->t38_mode = T38_MODE_UNKNOWN; - - if (pvt->app_mode == FUNCTION_GW) { - enabled = 1; - } else if ((v = switch_channel_get_variable(channel, "fax_enable_t38"))) { - enabled = switch_true(v); - } else { - enabled = globals.enable_t38; - } - - if (enabled) { - if ((v = switch_channel_get_variable(channel, "fax_enable_t38_request"))) { - enabled = switch_true(v); - } else { - enabled = globals.enable_t38_request; - } - } - - - if ((v = switch_channel_get_variable(channel, "fax_enable_t38_insist"))) { - insist = switch_true(v); - } else { - insist = globals.enable_t38_insist; - } - - if (enabled) { - t38_options = switch_core_session_alloc(session, sizeof(*t38_options)); - - t38_options->T38MaxBitRate = (pvt->disable_v17) ? 9600 : 14400; - t38_options->T38FaxVersion = 0; - t38_options->T38FaxFillBitRemoval = 1; - t38_options->T38FaxTranscodingMMR = 0; - t38_options->T38FaxTranscodingJBIG = 0; - t38_options->T38FaxRateManagement = "transferredTCF"; - t38_options->T38FaxMaxBuffer = 2000; - t38_options->T38FaxMaxDatagram = LOCAL_FAX_MAX_DATAGRAM; - t38_options->T38FaxUdpEC = "t38UDPRedundancy"; - t38_options->T38VendorInfo = "0 0 0"; - - switch_channel_set_private(channel, "t38_options", t38_options); - pvt->t38_mode = T38_MODE_REQUESTED; - - /* This will send a request for t.38 mode */ - msg.from = __FILE__; - msg.message_id = SWITCH_MESSAGE_INDICATE_REQUEST_IMAGE_MEDIA; - msg.numeric_arg = insist; - switch_core_session_receive_message(session, &msg); - } - - return pvt->t38_mode; -} - -/***************************************************************************** - MAIN FAX PROCESSING -*****************************************************************************/ - -static pvt_t *pvt_init(switch_core_session_t *session, application_mode_t app_mode) -{ - switch_channel_t *channel; - pvt_t *pvt = NULL; - const char *tmp; - - /* Make sure we have a valid channel when starting the FAX application */ - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); - - if (!switch_channel_media_ready(channel)) { - switch_channel_answer(channel); - } - - /* Allocate our structs */ - pvt = switch_core_session_alloc(session, sizeof(pvt_t)); - pvt->session = session; - - pvt->app_mode = app_mode; - - pvt->tx_page_start = -1; - pvt->tx_page_end = -1; - - - switch(pvt->app_mode) { - - case FUNCTION_TX: - pvt->caller = 1; - break; - case FUNCTION_RX: - pvt->caller = 0; - break; - case FUNCTION_GW: - break; - } - - /* Retrieving our settings from the channel variables */ - - if ((tmp = switch_channel_get_variable(channel, "fax_use_ecm"))) { - pvt->use_ecm = switch_true(tmp); - } else { - pvt->use_ecm = globals.use_ecm; - } - - if ((tmp = switch_channel_get_variable(channel, "fax_disable_v17"))) { - pvt->disable_v17 = switch_true(tmp); - } else { - pvt->disable_v17 = globals.disable_v17; - } - - if ((tmp = switch_channel_get_variable(channel, "fax_verbose"))) { - pvt->verbose = switch_true(tmp); - } else { - pvt->verbose = globals.verbose; - } - - if ((tmp = switch_channel_get_variable(channel, "fax_force_caller"))) { - if (switch_true(tmp)) { - pvt->caller = 1; - } else { - pvt->caller = 0; - } - } - - if ((tmp = switch_channel_get_variable(channel, "fax_ident"))) { - pvt->ident = switch_core_session_strdup(session, tmp); - } else { - pvt->ident = switch_core_session_strdup(session, globals.ident); - } - - if ((tmp = switch_channel_get_variable(channel, "fax_header"))) { - pvt->header = switch_core_session_strdup(session, tmp); - } else { - pvt->header = switch_core_session_strdup(session, globals.header); - } - - if (pvt->app_mode == FUNCTION_TX) { - if ((tmp = switch_channel_get_variable(channel, "fax_start_page"))) { - pvt->tx_page_start = atoi(tmp); - } - - if ((tmp = switch_channel_get_variable(channel, "fax_end_page"))) { - pvt->tx_page_end = atoi(tmp); - } - - if (pvt->tx_page_end < -1) { - pvt->tx_page_end = -1; - } - - if (pvt->tx_page_start < -1) { - pvt->tx_page_start = -1; - } - - if ((pvt->tx_page_end < pvt->tx_page_start) && (pvt->tx_page_end != -1)) { - pvt->tx_page_end = pvt->tx_page_start; - } - } - - return pvt; -} - -void process_fax(switch_core_session_t *session, const char *data, application_mode_t app_mode) -{ - pvt_t *pvt; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_codec_t read_codec = { 0 }; - switch_codec_t write_codec = { 0 }; - switch_frame_t *read_frame = { 0 }; - switch_frame_t write_frame = { 0 }; - switch_codec_implementation_t read_impl = { 0 }; - int16_t *buf = NULL; - - switch_core_session_get_read_impl(session, &read_impl); - - counter_increment(); - - - pvt = pvt_init(session, app_mode); - - - buf = switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE); - - if (!zstr(data)) { - pvt->filename = switch_core_session_strdup(session, data); - if (pvt->app_mode == FUNCTION_TX) { - if ((switch_file_exists(pvt->filename, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot send inexistant fax file [%s]\n", - switch_str_nil(pvt->filename)); - goto done; - } - } - } else { - if (pvt->app_mode == FUNCTION_TX) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Fax TX filename not set.\n"); - goto done; - } else if (pvt->app_mode == FUNCTION_RX) { - char *fname; - const char *prefix; - switch_time_t time; - - time = switch_time_now(); - - if (!(prefix = switch_channel_get_variable(channel, "fax_prefix"))) { - prefix = globals.prepend_string; - } - - fname = switch_mprintf("%s/%s-%ld-%ld.tif", globals.spool, prefix, globals.total_sessions, time); - if (fname) { - pvt->filename = switch_core_session_strdup(session, fname); - switch_safe_free(fname); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot automatically set fax RX destination file\n"); - goto done; - } - } else { - assert(0); /* UH ?? */ - } - } - - /* - *** Initialize the SpanDSP elements *** - - Note: we could analyze if a fax was already detected in previous stages - and if so, when T.38 will be supported, send a reinvite in T38_MODE, - bypassing AUDIO_MODE. - */ - - if ((spanfax_init(pvt, AUDIO_MODE) != SWITCH_STATUS_SUCCESS)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot initialize Fax engine\n"); - return; - } - - /* - Note: Disable echocan on the channel, remember to call app "disable_ec" in the dialplan - before invoking fax applications - */ - - /* - Note: we are disabling the Jitterbuffer, here, before we answer. - If you have set it to something else and the channel is pre-answered, - it will have no effect. Make sure that if you want more reliable - faxes, it is disabled. - */ - switch_channel_set_variable(channel, "jitterbuffer_msec", "0"); - - - /* We store the original channel codec before switching both - * legs of the calls to a linear 16 bit codec that is the one - * used internally by spandsp and FS will do the transcoding - * from G.711 or any other original codec - */ - if (switch_core_codec_init(&read_codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Raw read codec activation Success L16 %u\n", - read_codec.implementation->microseconds_per_packet); - switch_core_session_set_read_codec(session, &read_codec); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Raw read codec activation Failed L16\n"); - goto done; - } - - if (switch_core_codec_init(&write_codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Raw write codec activation Success L16\n"); - write_frame.codec = &write_codec; - write_frame.data = buf; - write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Raw write codec activation Failed L16\n"); - goto done; - } - - switch_ivr_sleep(session, 250, SWITCH_TRUE, NULL); - - - /* If you have the means, I highly recommend picking one up. ...*/ - request_t38(pvt); - - - while (switch_channel_ready(channel)) { - int tx = 0; - switch_status_t status; - - /* - if we are in T.38 mode, we should: 1- initialize the ptv->t38_state stuff, if not done - and then set some callbacks when reading frames. - The only thing we need, then, in this loop, is: - - read a frame without blocking - - eventually feed that frame in spandsp, - - call t38_terminal_send_timeout(), sleep for a while - - The T.38 stuff can be placed here (and the audio stuff can be skipped) - */ - - /* read new audio frame from the channel */ - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status) || pvt->done) { - /* Our duty is over */ - goto done; - } - - switch (pvt->t38_mode) { - case T38_MODE_REQUESTED: - { - if (switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - switch_core_session_message_t msg = { 0 }; - pvt->t38_mode = T38_MODE_NEGOTIATED; - spanfax_init(pvt, T38_MODE); - configure_t38(pvt); - - /* This will change the rtp stack to udptl mode */ - msg.from = __FILE__; - msg.message_id = SWITCH_MESSAGE_INDICATE_UDPTL_MODE; - switch_core_session_receive_message(session, &msg); - } - continue; - } - break; - case T38_MODE_UNKNOWN: - { - if (switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - if (negotiate_t38(pvt) == T38_MODE_NEGOTIATED) { - /* is is safe to call this again, it was already called above in AUDIO_MODE */ - /* but this is the only way to set up the t38 stuff */ - spanfax_init(pvt, T38_MODE); - continue; - } - } - } - break; - case T38_MODE_NEGOTIATED: - { - /* do what we need to do when we are in t38 mode */ - if (switch_test_flag(read_frame, SFF_CNG)) { - /* dunno what to do, most likely you will not get too many of these since we turn off the timer in udptl mode */ - continue; - } - - if (switch_test_flag(read_frame, SFF_UDPTL_PACKET)) { - /* now we know we can cast frame->packet to a udptl structure */ - //switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "READ %d udptl bytes\n", read_frame->packetlen); - - udptl_rx_packet(pvt->udptl_state, read_frame->packet, read_frame->packetlen); - - - } - } - continue; - default: - break; - } - - /* Skip CNG frames (auto-generated by FreeSWITCH, usually) */ - if (switch_test_flag(read_frame, SFF_CNG)) { - /* We have no real signal data for the FAX software, but we have a space in time if we have a CNG indication. - Do a fill-in operation in the FAX machine, to keep things rolling along. */ - if (fax_rx_fillin(pvt->fax_state, read_frame->samples)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "fax_rx_fillin reported an error\n"); - goto done; - } - } else { - /* Pass the new incoming audio frame to the fax_rx function */ - if (fax_rx(pvt->fax_state, (int16_t *) read_frame->data, read_frame->samples)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "fax_rx reported an error\n"); - goto done; - } - } - - if ((tx = fax_tx(pvt->fax_state, buf, write_codec.implementation->samples_per_packet)) < 0) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "fax_tx reported an error\n"); - goto done; - } - - if (!tx) { - /* switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "No audio samples to send\n"); */ - continue; - } else { - /* Set our write_frame data */ - write_frame.datalen = tx * sizeof(int16_t); - write_frame.samples = tx; - } - - if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - goto done; - } - - } - - done: - /* Destroy the SpanDSP structures */ - spanfax_destroy(pvt); - - /* restore the original codecs over the channel */ - - switch_core_session_set_read_codec(session, NULL); - - if (switch_core_codec_ready(&read_codec)) { - switch_core_codec_destroy(&read_codec); - } - - if (switch_core_codec_ready(&write_codec)) { - switch_core_codec_destroy(&write_codec); - } -} - -/* ************************************************************************** - CONFIGURATION - ************************************************************************* */ - -void load_configuration(switch_bool_t reload) -{ - switch_xml_t xml = NULL, x_lists = NULL, x_list = NULL, cfg = NULL; - - if ((xml = switch_xml_open_cfg("fax.conf", &cfg, NULL))) { - if ((x_lists = switch_xml_child(cfg, "settings"))) { - for (x_list = switch_xml_child(x_lists, "param"); x_list; x_list = x_list->next) { - const char *name = switch_xml_attr(x_list, "name"); - const char *value = switch_xml_attr(x_list, "value"); - - if (zstr(name)) { - continue; - } - - if (zstr(value)) { - continue; - } - - if (!strcmp(name, "use-ecm")) { - if (switch_true(value)) - globals.use_ecm = 1; - else - globals.use_ecm = 0; - } else if (!strcmp(name, "verbose")) { - if (switch_true(value)) - globals.verbose = 1; - else - globals.verbose = 0; - } else if (!strcmp(name, "disable-v17")) { - if (switch_true(value)) - globals.disable_v17 = 1; - else - globals.disable_v17 = 0; - } else if (!strcmp(name, "enable-t38")) { - if (switch_true(value)) { - globals.enable_t38= 1; - } else { - globals.enable_t38 = 0; - } - } else if (!strcmp(name, "enable-t38-request")) { - if (switch_true(value)) { - globals.enable_t38_request = 1; - } else { - globals.enable_t38_request = 0; - } - } else if (!strcmp(name, "ident")) { - strncpy(globals.ident, value, sizeof(globals.ident) - 1); - } else if (!strcmp(name, "header")) { - strncpy(globals.header, value, sizeof(globals.header) - 1); - } else if (!strcmp(name, "spool-dir")) { - globals.spool = switch_core_strdup(globals.pool, value); - } else if (!strcmp(name, "file-prefix")) { - globals.prepend_string = switch_core_strdup(globals.pool, value); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown parameter %s\n", name); - } - - } - } - - switch_xml_free(xml); - } -} - -static void event_handler(switch_event_t *event) -{ - load_configuration(1); -} - - - - - - -typedef struct { - switch_core_session_t *session; - dtmf_rx_state_t *dtmf_detect; -} switch_inband_dtmf_t; - -static switch_bool_t inband_dtmf_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) -{ - switch_inband_dtmf_t *pvt = (switch_inband_dtmf_t *) user_data; - switch_frame_t *frame = NULL; - char digit_str[80]; - switch_channel_t *channel = switch_core_session_get_channel(pvt->session); - - switch (type) { - case SWITCH_ABC_TYPE_INIT: - pvt->dtmf_detect = dtmf_rx_init(NULL, NULL, NULL); - break; - case SWITCH_ABC_TYPE_CLOSE: - if (pvt->dtmf_detect) { - dtmf_rx_free(pvt->dtmf_detect); - } - break; - case SWITCH_ABC_TYPE_READ_REPLACE: - if ((frame = switch_core_media_bug_get_read_replace_frame(bug))) { - dtmf_rx(pvt->dtmf_detect, frame->data, frame->samples); - dtmf_rx_get(pvt->dtmf_detect, digit_str, sizeof(digit_str)); - if (digit_str[0]) { - char *p = digit_str; - while (p && *p) { - switch_dtmf_t dtmf = {0}; - dtmf.digit = *p; - dtmf.duration = switch_core_default_dtmf_duration(0); - switch_channel_queue_dtmf(channel, &dtmf); - p++; - } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(switch_core_media_bug_get_session(bug)), SWITCH_LOG_DEBUG, "DTMF DETECTED: [%s]\n", - digit_str); - } - switch_core_media_bug_set_read_replace_frame(bug, frame); - } - break; - case SWITCH_ABC_TYPE_WRITE: - default: - break; - } - - return SWITCH_TRUE; -} - -switch_status_t spandsp_stop_inband_dtmf_session(switch_core_session_t *session) -{ - switch_media_bug_t *bug; - switch_channel_t *channel = switch_core_session_get_channel(session); - - if ((bug = switch_channel_get_private(channel, "dtmf"))) { - switch_channel_set_private(channel, "dtmf", NULL); - switch_core_media_bug_remove(session, &bug); - return SWITCH_STATUS_SUCCESS; - } - return SWITCH_STATUS_FALSE; -} - -switch_status_t spandsp_inband_dtmf_session(switch_core_session_t *session) -{ - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_media_bug_t *bug; - switch_status_t status; - switch_inband_dtmf_t *pvt; - switch_codec_implementation_t read_impl = { 0 }; - - switch_core_session_get_read_impl(session, &read_impl); - - if (!(pvt = switch_core_session_alloc(session, sizeof(*pvt)))) { - return SWITCH_STATUS_MEMERR; - } - - - pvt->session = session; - - - if (switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) { - return SWITCH_STATUS_FALSE; - } - - if ((status = switch_core_media_bug_add(session, "spandsp_dtmf_detect", NULL, - inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE, &bug)) != SWITCH_STATUS_SUCCESS) { - return status; - } - - switch_channel_set_private(channel, "dtmf", bug); - - return SWITCH_STATUS_SUCCESS; -} - -/* ************************************************************************** - FREESWITCH MODULE DEFINITIONS - ************************************************************************* */ - -#define SPANFAX_RX_USAGE "" -#define SPANFAX_TX_USAGE "" - -SWITCH_MODULE_LOAD_FUNCTION(mod_fax_init); -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_fax_shutdown); -SWITCH_MODULE_DEFINITION(mod_fax, mod_fax_init, mod_fax_shutdown, NULL); - -static switch_event_node_t *NODE = NULL; - -SWITCH_STANDARD_APP(spanfax_tx_function) -{ - process_fax(session, data, FUNCTION_TX); -} - -SWITCH_STANDARD_APP(spanfax_rx_function) -{ - process_fax(session, data, FUNCTION_RX); -} - - -SWITCH_STANDARD_APP(dtmf_session_function) -{ - spandsp_inband_dtmf_session(session); -} - -SWITCH_STANDARD_APP(stop_dtmf_session_function) -{ - spandsp_stop_inband_dtmf_session(session); -} - -static const switch_state_handler_table_t t38_gateway_state_handlers; - -static switch_status_t t38_gateway_on_soft_execute(switch_core_session_t *session) -{ - switch_core_session_t *other_session; - - switch_channel_t *other_channel, *channel = switch_core_session_get_channel(session); - pvt_t *pvt; - const char *peer_uuid = switch_channel_get_variable(channel, "t38_peer"); - switch_core_session_message_t msg = { 0 }; - switch_status_t status; - switch_frame_t *read_frame = { 0 }; - - if (!(other_session = switch_core_session_locate(peer_uuid))) { - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s Cannot locate channel with uuid %s", - switch_channel_get_name(channel), peer_uuid); - goto end; - } - - other_channel = switch_core_session_get_channel(other_session); - - pvt = pvt_init(session, FUNCTION_GW); - request_t38(pvt); - - msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE; - msg.from = __FILE__; - msg.string_arg = peer_uuid; - switch_core_session_receive_message(session, &msg); - - while (switch_channel_ready(channel) && switch_channel_up(other_channel) && !switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status) || pvt->done) { - /* Our duty is over */ - goto end_unlock; - } - - if (switch_test_flag(read_frame, SFF_CNG)) { - continue; - } - - if (switch_core_session_write_frame(other_session, read_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - goto end_unlock; - } - } - - if (!(switch_channel_ready(channel) && switch_channel_up(other_channel))) { - goto end_unlock; - } - - if (!switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s Could not negotiate T38\n", switch_channel_get_name(channel)); - goto end_unlock; - } - - if (pvt->t38_mode == T38_MODE_REQUESTED) { - spanfax_init(pvt, T38_GATEWAY_MODE); - configure_t38(pvt); - pvt->t38_mode = T38_MODE_NEGOTIATED; - } else { - if (negotiate_t38(pvt) != T38_MODE_NEGOTIATED) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s Could not negotiate T38\n", switch_channel_get_name(channel)); - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - goto end_unlock; - } - - spanfax_init(pvt, T38_GATEWAY_MODE); - } - - /* This will change the rtp stack to udptl mode */ - msg.from = __FILE__; - msg.message_id = SWITCH_MESSAGE_INDICATE_UDPTL_MODE; - switch_core_session_receive_message(session, &msg); - - - /* wake up the audio side */ - switch_channel_set_private(channel, "_t38_pvt", pvt); - switch_channel_set_app_flag_key("T38", other_channel, CF_APP_T38); - - - while (switch_channel_ready(channel) && switch_channel_up(other_channel)) { - - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status) || pvt->done) { - /* Our duty is over */ - goto end_unlock; - } - - if (switch_test_flag(read_frame, SFF_CNG)) { - continue; - } - - if (switch_test_flag(read_frame, SFF_UDPTL_PACKET)) { - udptl_rx_packet(pvt->udptl_state, read_frame->packet, read_frame->packetlen); - } - } - - end_unlock: - - - msg.message_id = SWITCH_MESSAGE_INDICATE_UNBRIDGE; - msg.from = __FILE__; - msg.string_arg = peer_uuid; - switch_core_session_receive_message(session, &msg); - - switch_channel_hangup(other_channel, SWITCH_CAUSE_NORMAL_CLEARING); - switch_core_session_rwunlock(other_session); - - end: - - switch_channel_clear_state_handler(channel, &t38_gateway_state_handlers); - switch_channel_set_variable(channel, "t38_peer", NULL); - - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - return SWITCH_STATUS_SUCCESS; -} - -static switch_status_t t38_gateway_on_consume_media(switch_core_session_t *session) -{ - switch_core_session_t *other_session; - switch_channel_t *other_channel, *channel = switch_core_session_get_channel(session); - const char *peer_uuid = switch_channel_get_variable(channel, "t38_peer"); - pvt_t *pvt = NULL; - switch_codec_t read_codec = { 0 }; - switch_codec_t write_codec = { 0 }; - switch_frame_t *read_frame = { 0 }; - switch_frame_t write_frame = { 0 }; - switch_codec_implementation_t read_impl = { 0 }; - int16_t *buf = NULL; - switch_status_t status; - switch_size_t tx; - const char *t38_trace = switch_channel_get_variable(channel, "t38_trace"); - char *trace_read, *trace_write; - zap_socket_t read_fd = FAX_INVALID_SOCKET, write_fd = FAX_INVALID_SOCKET; - switch_core_session_message_t msg = { 0 }; - switch_event_t *event; - - switch_core_session_get_read_impl(session, &read_impl); - - buf = switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE); - - if (!(other_session = switch_core_session_locate(peer_uuid))) { - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - goto end; - } - - other_channel = switch_core_session_get_channel(other_session); - - msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE; - msg.from = __FILE__; - msg.string_arg = peer_uuid; - switch_core_session_receive_message(session, &msg); - - if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_BRIDGE) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_fire(&event); - } - - while (switch_channel_ready(channel) && switch_channel_up(other_channel) && !switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status)) { - /* Our duty is over */ - goto end_unlock; - } - - if (switch_test_flag(read_frame, SFF_CNG)) { - continue; - } - - if (switch_core_session_write_frame(other_session, read_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - goto end_unlock; - } - } - - if (!(switch_channel_ready(channel) && switch_channel_up(other_channel))) { - goto end_unlock; - } - - if (!switch_channel_test_app_flag_key("T38", channel, CF_APP_T38)) { - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - goto end_unlock; - } - - if (!(pvt = switch_channel_get_private(other_channel, "_t38_pvt"))) { - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - goto end_unlock; - } - - if (switch_core_codec_init(&read_codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Raw read codec activation Success L16 %u\n", - read_codec.implementation->microseconds_per_packet); - switch_core_session_set_read_codec(session, &read_codec); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Raw read codec activation Failed L16\n"); - goto end_unlock; - } - - if (switch_core_codec_init(&write_codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Raw write codec activation Success L16\n"); - write_frame.codec = &write_codec; - write_frame.data = buf; - write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Raw write codec activation Failed L16\n"); - goto end_unlock; - } - - switch_ivr_sleep(session, 0, SWITCH_TRUE, NULL); - - if (switch_true(t38_trace)) { - trace_read = switch_core_session_sprintf(session, "%s%s%s_read.raw", SWITCH_GLOBAL_dirs.temp_dir, - SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session)); - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Tracing inbound audio to %s\n", trace_read); - switch_channel_set_variable(channel, "t38_trace_read", trace_read); - - trace_write = switch_core_session_sprintf(session, "%s%s%s_write.raw", SWITCH_GLOBAL_dirs.temp_dir, - SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session)); - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Tracing outbound audio to %s\n", trace_write); - switch_channel_set_variable(channel, "t38_trace_read", trace_write); - - - if ((write_fd = open(trace_read, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) != FAX_INVALID_SOCKET) { - if ((read_fd = open(trace_write, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) == FAX_INVALID_SOCKET) { - close(write_fd); - write_fd = FAX_INVALID_SOCKET; - } - } - } - - while (switch_channel_ready(channel) && switch_channel_up(other_channel)) { - status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status) || pvt->done) { - /* Our duty is over */ - goto end_unlock; - } - - - /* Skip CNG frames (auto-generated by FreeSWITCH, usually) */ - if (!switch_test_flag(read_frame, SFF_CNG)) { - - if (read_fd != FAX_INVALID_SOCKET) { - int w = write(read_fd, read_frame->data, read_frame->datalen); - if (w <= 0) { - close(read_fd); - read_fd = FAX_INVALID_SOCKET; - } - } - if (t38_gateway_rx(pvt->t38_gateway_state, (int16_t *) read_frame->data, read_frame->samples)) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "fax_rx reported an error\n"); - goto end_unlock; - } - } - - if ((tx = t38_gateway_tx(pvt->t38_gateway_state, buf, write_codec.implementation->samples_per_packet)) < 0) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "fax_tx reported an error\n"); - goto end_unlock; - } - - if (!tx) { - /* switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "No audio samples to send\n"); */ - continue; - } else { - /* Set our write_frame data */ - write_frame.datalen = tx * sizeof(int16_t); - write_frame.samples = tx; - } - - if (write_fd != FAX_INVALID_SOCKET) { - int w = write(write_fd, write_frame.data, write_frame.datalen); - if (w <= 0) { - close(write_fd); - write_fd = FAX_INVALID_SOCKET; - } - } - - if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - goto end_unlock; - } - } - - end_unlock: - - msg.message_id = SWITCH_MESSAGE_INDICATE_UNBRIDGE; - msg.from = __FILE__; - msg.string_arg = peer_uuid; - switch_core_session_receive_message(session, &msg); - - - if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_UNBRIDGE) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_fire(&event); - } - - if (read_fd != FAX_INVALID_SOCKET) { - close(read_fd); - read_fd = FAX_INVALID_SOCKET; - } - - if (write_fd != FAX_INVALID_SOCKET) { - close(write_fd); - write_fd = FAX_INVALID_SOCKET; - } - - - switch_channel_hangup(other_channel, SWITCH_CAUSE_NORMAL_CLEARING); - switch_core_session_rwunlock(other_session); - - switch_core_session_set_read_codec(session, NULL); - - if (switch_core_codec_ready(&read_codec)) { - switch_core_codec_destroy(&read_codec); - } - - if (switch_core_codec_ready(&write_codec)) { - switch_core_codec_destroy(&write_codec); - } - - - end: - - switch_channel_clear_state_handler(channel, &t38_gateway_state_handlers); - switch_channel_set_variable(channel, "t38_peer", NULL); - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - - return SWITCH_STATUS_SUCCESS; -} - -static switch_status_t t38_gateway_on_reset(switch_core_session_t *session) -{ - switch_channel_t *channel = switch_core_session_get_channel(session); - - switch_channel_set_variable(channel, "rtp_autoflush_during_bridge", "false"); - - switch_channel_clear_flag(channel, CF_REDIRECT); - - if (switch_channel_test_app_flag(channel, CF_APP_TAGGED)) { - switch_channel_clear_app_flag(channel, CF_APP_TAGGED); - switch_channel_set_state(channel, CS_CONSUME_MEDIA); - } else { - switch_channel_set_state(channel, CS_SOFT_EXECUTE); - } - - return SWITCH_STATUS_SUCCESS; -} - -static const switch_state_handler_table_t t38_gateway_state_handlers = { - /*.on_init */ NULL, - /*.on_routing */ NULL, - /*.on_execute */ NULL, - /*.on_hangup */ NULL, - /*.on_exchange_media */ NULL, - /*.on_soft_execute */ t38_gateway_on_soft_execute, - /*.on_consume_media */ t38_gateway_on_consume_media, - /*.on_hibernate */ NULL, - /*.on_reset */ t38_gateway_on_reset, - /*.on_park */ NULL, - /*.on_reporting */ NULL, - /*.on_destroy */ NULL, - SSH_FLAG_STICKY -}; - -static switch_bool_t t38_gateway_start(switch_core_session_t *session, const char *app, const char *data) -{ - switch_channel_t *other_channel = NULL, *channel = switch_core_session_get_channel(session); - switch_core_session_t *other_session = NULL; - int peer = app && !strcasecmp(app, "peer"); - - if (switch_core_session_get_partner(session, &other_session) == SWITCH_STATUS_SUCCESS) { - other_channel = switch_core_session_get_channel(other_session); - - switch_channel_set_variable(channel, "t38_peer", switch_core_session_get_uuid(other_session)); - switch_channel_set_variable(other_channel, "t38_peer", switch_core_session_get_uuid(session)); - - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s starting gateway mode to %s\n", - switch_channel_get_name(peer ? channel : other_channel), - switch_channel_get_name(peer ? other_channel : channel)); - - - switch_channel_clear_state_handler(channel, NULL); - switch_channel_clear_state_handler(other_channel, NULL); - - switch_channel_add_state_handler(channel, &t38_gateway_state_handlers); - switch_channel_add_state_handler(other_channel, &t38_gateway_state_handlers); - - switch_channel_set_app_flag(peer ? channel : other_channel, CF_APP_TAGGED); - switch_channel_clear_app_flag(peer ? other_channel : channel, CF_APP_TAGGED); - - switch_channel_set_flag(channel, CF_REDIRECT); - switch_channel_set_state(channel, CS_RESET); - - switch_channel_set_flag(other_channel, CF_REDIRECT); - switch_channel_set_state(other_channel, CS_RESET); - - switch_core_session_rwunlock(other_session); - - } - - return SWITCH_FALSE; -} - - -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; - const char *var; - - if (zstr(data) || strcasecmp(data, "self")) { - data = "peer"; - } - - switch_channel_set_variable(channel, "t38_leg", data); - - 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); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s invalid timeout value.\n", switch_channel_get_name(channel)); - } - } - - switch_ivr_tone_detect_session(session, "t38", "1100.0", "rw", timeout, 1, data, NULL, t38_gateway_start); -} - - -SWITCH_MODULE_LOAD_FUNCTION(mod_fax_init) -{ - switch_application_interface_t *app_interface; - - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - SWITCH_ADD_APP(app_interface, "t38_gateway", "Convert to T38 Gateway if tones are heard", "Convert to T38 Gateway if tones are heard", - t38_gateway_function, "", SAF_MEDIA_TAP); - - SWITCH_ADD_APP(app_interface, "rxfax", "FAX Receive Application", "FAX Receive Application", spanfax_rx_function, SPANFAX_RX_USAGE, - SAF_SUPPORT_NOMEDIA); - SWITCH_ADD_APP(app_interface, "txfax", "FAX Transmit Application", "FAX Transmit Application", spanfax_tx_function, SPANFAX_TX_USAGE, - SAF_SUPPORT_NOMEDIA); - - SWITCH_ADD_APP(app_interface, "spandsp_stop_dtmf", "stop inband dtmf", "Stop detecting inband dtmf.", stop_dtmf_session_function, "", SAF_NONE); - SWITCH_ADD_APP(app_interface, "spandsp_start_dtmf", "Detect dtmf", "Detect inband dtmf on the session", dtmf_session_function, "", SAF_MEDIA_TAP); - - memset(&globals, 0, sizeof(globals)); - memset(&t38_state_list, 0, sizeof(t38_state_list)); - switch_core_new_memory_pool(&globals.pool); - switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool); - switch_mutex_init(&t38_state_list.mutex, SWITCH_MUTEX_NESTED, globals.pool); - - globals.enable_t38 = 1; - globals.total_sessions = 0; - globals.verbose = 1; - globals.use_ecm = 1; - globals.disable_v17 = 0; - globals.prepend_string = switch_core_strdup(globals.pool, "fax"); - globals.spool = switch_core_strdup(globals.pool, "/tmp"); - strncpy(globals.ident, "SpanDSP Fax Ident", sizeof(globals.ident) - 1); - strncpy(globals.header, "SpanDSP Fax Header", sizeof(globals.header) - 1); - - load_configuration(0); - - if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &NODE) != SWITCH_STATUS_SUCCESS)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind our reloadxml handler!\n"); - /* Not such severe to prevent loading */ - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mod_fax loaded, using spandsp library version [%s]\n", SPANDSP_RELEASE_DATETIME_STRING); - - return SWITCH_STATUS_SUCCESS; -} - -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_fax_shutdown) -{ - switch_memory_pool_t *pool = globals.pool; - - switch_event_unbind(&NODE); - - switch_core_destroy_memory_pool(&pool); - memset(&globals, 0, sizeof(globals)); - - return SWITCH_STATUS_UNLOAD; -} - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:nil - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4: - */ diff --git a/src/mod/applications/mod_fax/udptl.c b/src/mod/applications/mod_fax/udptl.c deleted file mode 100644 index a2651513f0..0000000000 --- a/src/mod/applications/mod_fax/udptl.c +++ /dev/null @@ -1,563 +0,0 @@ -//#define UDPTL_DEBUG -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2009, Steve Underwood - * - * 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. - * - * Contributor(s): - * - * Steve Underwood - * - * udptl.c -- UDPTL handling for T.38 - * - */ - -#include -#include -#include -#include -#include - -#include "udptl.h" - -#define FALSE 0 -#define TRUE (!FALSE) - -static int decode_length(const uint8_t *buf, int limit, int *len, int *pvalue) -{ - if (*len >= limit) - return -1; - if ((buf[*len] & 0x80) == 0) { - *pvalue = buf[(*len)++]; - return 0; - } - if ((buf[*len] & 0x40) == 0) { - if (*len >= limit - 1) - return -1; - *pvalue = (buf[(*len)++] & 0x3F) << 8; - *pvalue |= buf[(*len)++]; - return 0; - } - *pvalue = (buf[(*len)++] & 0x3F) << 14; - /* Indicate we have a fragment */ - return 1; -} - -/*- End of function --------------------------------------------------------*/ - -static int decode_open_type(const uint8_t *buf, int limit, int *len, const uint8_t ** p_object, int *p_num_octets) -{ - int octet_cnt; - int octet_idx; - int stat; - int i; - const uint8_t **pbuf; - - for (octet_idx = 0, *p_num_octets = 0;; octet_idx += octet_cnt) { - if ((stat = decode_length(buf, limit, len, &octet_cnt)) < 0) - return -1; - if (octet_cnt > 0) { - *p_num_octets += octet_cnt; - - pbuf = &p_object[octet_idx]; - i = 0; - /* Make sure the buffer contains at least the number of bits requested */ - if ((*len + octet_cnt) > limit) - return -1; - - *pbuf = &buf[*len]; - *len += octet_cnt; - } - if (stat == 0) - break; - } - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -static int encode_length(uint8_t *buf, int *len, int value) -{ - int multiplier; - - if (value < 0x80) { - /* 1 octet */ - buf[(*len)++] = value; - return value; - } - if (value < 0x4000) { - /* 2 octets */ - /* Set the first bit of the first octet */ - buf[(*len)++] = ((0x8000 | value) >> 8) & 0xFF; - buf[(*len)++] = value & 0xFF; - return value; - } - /* Fragmentation */ - multiplier = (value < 0x10000) ? (value >> 14) : 4; - /* Set the first 2 bits of the octet */ - buf[(*len)++] = 0xC0 | multiplier; - return multiplier << 14; -} - -/*- End of function --------------------------------------------------------*/ - -static int encode_open_type(uint8_t *buf, int *len, const uint8_t *data, int num_octets) -{ - int enclen; - int octet_idx; - uint8_t zero_byte; - - /* If open type is of zero length, add a single zero byte (10.1) */ - if (num_octets == 0) { - zero_byte = 0; - data = &zero_byte; - num_octets = 1; - } - /* Encode the open type */ - for (octet_idx = 0;; num_octets -= enclen, octet_idx += enclen) { - if ((enclen = encode_length(buf, len, num_octets)) < 0) - return -1; - if (enclen > 0) { - memcpy(&buf[*len], &data[octet_idx], enclen); - *len += enclen; - } - if (enclen >= num_octets) - break; - } - - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len) -{ - int stat; - int stat2; - int i; - int j; - int k; - int l; - int m; - int x; - int limit; - int which; - int ptr; - int count; - int total_count; - int seq_no; - const uint8_t *msg; - const uint8_t *data; - int msg_len; - int repaired[16]; - const uint8_t *bufs[16]; - int lengths[16]; - int span; - int entries; - - ptr = 0; - /* Decode seq_number */ - if (ptr + 2 > len) - return -1; - seq_no = (buf[0] << 8) | buf[1]; - ptr += 2; - /* Break out the primary packet */ - if ((stat = decode_open_type(buf, len, &ptr, &msg, &msg_len)) != 0) - return -1; - /* Decode error_recovery */ - if (ptr + 1 > len) - return -1; - /* Our buffers cannot tolerate overlength packets */ - if (msg_len > LOCAL_FAX_MAX_DATAGRAM) - return -1; - /* Update any missed slots in the buffer */ - for (i = s->rx_seq_no; seq_no > i; i++) { - x = i & UDPTL_BUF_MASK; - s->rx[x].buf_len = -1; - s->rx[x].fec_len[0] = 0; - s->rx[x].fec_span = 0; - s->rx[x].fec_entries = 0; - } - /* Save the new packet. Pure redundancy mode won't use this, but some systems will switch - into FEC mode after sending some redundant packets. */ - x = seq_no & UDPTL_BUF_MASK; - memcpy(s->rx[x].buf, msg, msg_len); - s->rx[x].buf_len = msg_len; - s->rx[x].fec_len[0] = 0; - s->rx[x].fec_span = 0; - s->rx[x].fec_entries = 0; - if ((buf[ptr++] & 0x80) == 0) { - /* Secondary packet mode for error recovery */ - /* We might have the packet we want, but we need to check through - the redundant stuff, and verify the integrity of the UDPTL. - This greatly reduces our chances of accepting garbage. */ - total_count = 0; - do { - if ((stat2 = decode_length(buf, len, &ptr, &count)) < 0) - return -1; - for (i = 0; i < count; i++) { - if ((stat = decode_open_type(buf, len, &ptr, &bufs[total_count + i], &lengths[total_count + i])) != 0) - return -1; - } - total_count += count; - } - while (stat2 > 0); - /* We should now be exactly at the end of the packet. If not, this is a fault. */ - if (ptr != len) - return -1; - if (seq_no > s->rx_seq_no) { - /* We received a later packet than we expected, so we need to check if we can fill in the gap from the - secondary packets. */ - /* Step through in reverse order, so we go oldest to newest */ - for (i = total_count; i > 0; i--) { - if (seq_no - i >= s->rx_seq_no) { - /* This one wasn't seen before */ - /* Decode the secondary packet */ -#if defined(UDPTL_DEBUG) - fprintf(stderr, "Secondary %d, len %d\n", seq_no - i, lengths[i - 1]); -#endif - /* Save the new packet. Redundancy mode won't use this, but some systems will switch into - FEC mode after sending some redundant packets, and this may then be important. */ - x = (seq_no - i) & UDPTL_BUF_MASK; - memcpy(s->rx[x].buf, bufs[i - 1], lengths[i - 1]); - s->rx[x].buf_len = lengths[i - 1]; - s->rx[x].fec_len[0] = 0; - s->rx[x].fec_span = 0; - s->rx[x].fec_entries = 0; - if (s->rx_packet_handler(s->user_data, bufs[i - 1], lengths[i - 1], seq_no - i) < 0) - fprintf(stderr, "Bad IFP\n"); - } - } - } - } else { - /* FEC mode for error recovery */ - - /* Decode the FEC packets */ - /* The span is defined as an unconstrained integer, but will never be more - than a small value. */ - if (ptr + 2 > len) - return -1; - if (buf[ptr++] != 1) - return -1; - span = buf[ptr++]; - - x = seq_no & UDPTL_BUF_MASK; - - s->rx[x].fec_span = span; - - memset(repaired, 0, sizeof(repaired)); - repaired[x] = TRUE; - - /* The number of entries is defined as a length, but will only ever be a small - value. Treat it as such. */ - if (ptr + 1 > len) - return -1; - entries = buf[ptr++]; - s->rx[x].fec_entries = entries; - - /* Decode the elements */ - for (i = 0; i < entries; i++) { - if ((stat = decode_open_type(buf, len, &ptr, &data, &s->rx[x].fec_len[i])) != 0) - return -1; - if (s->rx[x].fec_len[i] > LOCAL_FAX_MAX_DATAGRAM) - return -1; - - /* Save the new FEC data */ - memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]); -#if 0 - fprintf(stderr, "FEC: "); - for (j = 0; j < s->rx[x].fec_len[i]; j++) - fprintf(stderr, "%02X ", data[j]); - fprintf(stderr, "\n"); -#endif - } - /* We should now be exactly at the end of the packet. If not, this is a fault. */ - if (ptr != len) - return -1; - /* See if we can reconstruct anything which is missing */ - /* TODO: this does not comprehensively hunt back and repair everything that is possible */ - for (l = x; l != ((x - (16 - span * entries)) & UDPTL_BUF_MASK); l = (l - 1) & UDPTL_BUF_MASK) { - if (s->rx[l].fec_len[0] <= 0) - continue; - for (m = 0; m < s->rx[l].fec_entries; m++) { - limit = (l + m) & UDPTL_BUF_MASK; - for (which = -1, k = (limit - s->rx[l].fec_span * s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit; - k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK) { - if (s->rx[k].buf_len <= 0) - which = (which == -1) ? k : -2; - } - if (which >= 0) { - /* Repairable */ - for (j = 0; j < s->rx[l].fec_len[m]; j++) { - s->rx[which].buf[j] = s->rx[l].fec[m][j]; - for (k = (limit - s->rx[l].fec_span * s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit; - k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK) - s->rx[which].buf[j] ^= (s->rx[k].buf_len > j) ? s->rx[k].buf[j] : 0; - } - s->rx[which].buf_len = s->rx[l].fec_len[m]; - repaired[which] = TRUE; - } - } - } - /* Now play any new packets forwards in time */ - for (l = (x + 1) & UDPTL_BUF_MASK, j = seq_no - UDPTL_BUF_MASK; l != x; l = (l + 1) & UDPTL_BUF_MASK, j++) { - if (repaired[l]) { -#if defined(UDPTL_DEBUG) - fprintf(stderr, "Fixed packet %d, len %d\n", j, l); -#endif - if (s->rx_packet_handler(s->user_data, s->rx[l].buf, s->rx[l].buf_len, j) < 0) - fprintf(stderr, "Bad IFP\n"); - } - } - } - /* If packets are received out of sequence, we may have already processed this packet from the error - recovery information in a packet already received. */ - if (seq_no >= s->rx_seq_no) { - /* Decode the primary packet */ -#if defined(UDPTL_DEBUG) - fprintf(stderr, "Primary packet %d, len %d\n", seq_no, msg_len); -#endif - if (s->rx_packet_handler(s->user_data, msg, msg_len, seq_no) < 0) - fprintf(stderr, "Bad IFP\n"); - } - - s->rx_seq_no = (seq_no + 1) & 0xFFFF; - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len) -{ - uint8_t fec[LOCAL_FAX_MAX_DATAGRAM]; - int i; - int j; - int seq; - int entry; - int entries; - int span; - int m; - int len; - int limit; - int high_tide; - - /* UDPTL cannot cope with zero length messages, and our buffering for redundancy limits their - maximum length. */ - if (msg_len < 1 || msg_len > LOCAL_FAX_MAX_DATAGRAM) - return -1; - seq = s->tx_seq_no & 0xFFFF; - - /* Map the sequence number to an entry in the circular buffer */ - entry = seq & UDPTL_BUF_MASK; - - /* We save the message in a circular buffer, for generating FEC or - redundancy sets later on. */ - s->tx[entry].buf_len = msg_len; - memcpy(s->tx[entry].buf, msg, msg_len); - - /* Build the UDPTL packet */ - - len = 0; - /* Encode the sequence number */ - buf[len++] = (seq >> 8) & 0xFF; - buf[len++] = seq & 0xFF; - - /* Encode the primary packet */ - if (encode_open_type(buf, &len, msg, msg_len) < 0) - return -1; - - /* Encode the appropriate type of error recovery information */ - switch (s->error_correction_scheme) { - case UDPTL_ERROR_CORRECTION_NONE: - /* Encode the error recovery type */ - buf[len++] = 0x00; - /* The number of entries will always be zero, so it is pointless allowing - for the fragmented case here. */ - if (encode_length(buf, &len, 0) < 0) - return -1; - break; - case UDPTL_ERROR_CORRECTION_REDUNDANCY: - /* Encode the error recovery type */ - buf[len++] = 0x00; - if (s->tx_seq_no > s->error_correction_entries) - entries = s->error_correction_entries; - else - entries = s->tx_seq_no; - /* The number of entries will always be small, so it is pointless allowing - for the fragmented case here. */ - if (encode_length(buf, &len, entries) < 0) - return -1; - /* Encode the elements */ - for (i = 0; i < entries; i++) { - j = (entry - i - 1) & UDPTL_BUF_MASK; - if (encode_open_type(buf, &len, s->tx[j].buf, s->tx[j].buf_len) < 0) - return -1; - } - break; - case UDPTL_ERROR_CORRECTION_FEC: - span = s->error_correction_span; - entries = s->error_correction_entries; - if (seq < s->error_correction_span * s->error_correction_entries) { - /* In the initial stages, wind up the FEC smoothly */ - entries = seq / s->error_correction_span; - if (seq < s->error_correction_span) - span = 0; - } - /* Encode the error recovery type */ - buf[len++] = 0x80; - /* Span is defined as an inconstrained integer, which it dumb. It will only - ever be a small value. Treat it as such. */ - buf[len++] = 1; - buf[len++] = span; - /* The number of entries is defined as a length, but will only ever be a small - value. Treat it as such. */ - buf[len++] = entries; - for (m = 0; m < entries; m++) { - /* Make an XOR'ed entry the maximum length */ - limit = (entry + m) & UDPTL_BUF_MASK; - high_tide = 0; - for (i = (limit - span * entries) & UDPTL_BUF_MASK; i != limit; i = (i + entries) & UDPTL_BUF_MASK) { - if (high_tide < s->tx[i].buf_len) { - for (j = 0; j < high_tide; j++) - fec[j] ^= s->tx[i].buf[j]; - for (; j < s->tx[i].buf_len; j++) - fec[j] = s->tx[i].buf[j]; - high_tide = s->tx[i].buf_len; - } else { - for (j = 0; j < s->tx[i].buf_len; j++) - fec[j] ^= s->tx[i].buf[j]; - } - } - if (encode_open_type(buf, &len, fec, high_tide) < 0) - return -1; - } - break; - } - - if (s->verbose) - fprintf(stderr, "\n"); - s->tx_seq_no++; - return len; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_set_error_correction(udptl_state_t *s, int ec_scheme, int span, int entries) -{ - switch (ec_scheme) { - case UDPTL_ERROR_CORRECTION_FEC: - case UDPTL_ERROR_CORRECTION_REDUNDANCY: - case UDPTL_ERROR_CORRECTION_NONE: - s->error_correction_scheme = ec_scheme; - break; - case -1: - /* Just don't change the scheme */ - break; - default: - return -1; - } - if (span >= 0) - s->error_correction_span = span; - if (entries >= 0) - s->error_correction_entries = entries; - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_get_error_correction(udptl_state_t *s, int *ec_scheme, int *span, int *entries) -{ - if (ec_scheme) - *ec_scheme = s->error_correction_scheme; - if (span) - *span = s->error_correction_span; - if (entries) - *entries = s->error_correction_entries; - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram) -{ - s->local_max_datagram_size = max_datagram; - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_get_local_max_datagram(udptl_state_t *s) -{ - return s->local_max_datagram_size; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram) -{ - s->far_max_datagram_size = max_datagram; - return 0; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_get_far_max_datagram(udptl_state_t *s) -{ - return s->far_max_datagram_size; -} - -/*- End of function --------------------------------------------------------*/ - -udptl_state_t *udptl_init(udptl_state_t *s, int ec_scheme, int span, int entries, udptl_rx_packet_handler_t rx_packet_handler, void *user_data) -{ - int i; - - if (rx_packet_handler == NULL) - return NULL; - - if (s == NULL) { - if ((s = (udptl_state_t *) malloc(sizeof(*s))) == NULL) - return NULL; - } - memset(s, 0, sizeof(*s)); - - s->error_correction_scheme = ec_scheme; - s->error_correction_span = span; - s->error_correction_entries = entries; - - s->far_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM; - s->local_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM; - - memset(&s->rx, 0, sizeof(s->rx)); - memset(&s->tx, 0, sizeof(s->tx)); - for (i = 0; i <= UDPTL_BUF_MASK; i++) { - s->rx[i].buf_len = -1; - s->tx[i].buf_len = -1; - } - - s->rx_packet_handler = rx_packet_handler; - s->user_data = user_data; - - return s; -} - -/*- End of function --------------------------------------------------------*/ - -int udptl_release(udptl_state_t *s) -{ - return 0; -} - -/*- End of function --------------------------------------------------------*/ -/*- End of file ------------------------------------------------------------*/ diff --git a/src/mod/applications/mod_fax/udptl.h b/src/mod/applications/mod_fax/udptl.h deleted file mode 100644 index 39740353d1..0000000000 --- a/src/mod/applications/mod_fax/udptl.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2009, Steve Underwood - * - * 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. - * - * Contributor(s): - * - * Steve Underwood - * - * udptl.h -- UDPTL handling for T.38 - * - */ - -#if !defined(FREESWITCH_UDPTL_H) -#define FREESWITCH_UDPTL_H - -#define LOCAL_FAX_MAX_DATAGRAM 400 -#define LOCAL_FAX_MAX_FEC_PACKETS 5 - -#define UDPTL_BUF_MASK 15 - -typedef int (udptl_rx_packet_handler_t) (void *user_data, const uint8_t msg[], int len, int seq_no); - -typedef struct { - int buf_len; - uint8_t buf[LOCAL_FAX_MAX_DATAGRAM]; -} udptl_fec_tx_buffer_t; - -typedef struct { - int buf_len; - uint8_t buf[LOCAL_FAX_MAX_DATAGRAM]; - int fec_len[LOCAL_FAX_MAX_FEC_PACKETS]; - uint8_t fec[LOCAL_FAX_MAX_FEC_PACKETS][LOCAL_FAX_MAX_DATAGRAM]; - int fec_span; - int fec_entries; -} udptl_fec_rx_buffer_t; - -struct udptl_state_s { - udptl_rx_packet_handler_t *rx_packet_handler; - void *user_data; - - /*! This option indicates the error correction scheme used in transmitted UDPTL - packets. */ - int error_correction_scheme; - - /*! This option indicates the number of error correction entries transmitted in - UDPTL packets. */ - int error_correction_entries; - - /*! This option indicates the span of the error correction entries in transmitted - UDPTL packets (FEC only). */ - int error_correction_span; - - /*! This option indicates the maximum size of a datagram that can be accepted by - the remote device. */ - int far_max_datagram_size; - - /*! This option indicates the maximum size of a datagram that we are prepared to - accept. */ - int local_max_datagram_size; - - int verbose; - - int tx_seq_no; - int rx_seq_no; - int rx_expected_seq_no; - - udptl_fec_tx_buffer_t tx[UDPTL_BUF_MASK + 1]; - udptl_fec_rx_buffer_t rx[UDPTL_BUF_MASK + 1]; -}; - -enum { - UDPTL_ERROR_CORRECTION_NONE, - UDPTL_ERROR_CORRECTION_FEC, - UDPTL_ERROR_CORRECTION_REDUNDANCY -}; - -typedef struct udptl_state_s udptl_state_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/*! \brief Process an arriving UDPTL packet. - \param s The UDPTL context. - \param buf The UDPTL packet buffer. - \param len The length of the packet. - \return 0 for OK. */ - int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len); - -/*! \brief Construct a UDPTL packet, ready for transmission. - \param s The UDPTL context. - \param buf The UDPTL packet buffer. - \param msg The primary packet. - \param len The length of the primary packet. - \return The length of the constructed UDPTL packet. */ - int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len); - -/*! \brief Change the error correction settings of a UDPTL context. - \param s The UDPTL context. - \param ec_scheme One of the optional error correction schemes. - \param span The packet span over which error correction should be applied. - \param entries The number of error correction entries to include in packets. - \return 0 for OK. */ - int udptl_set_error_correction(udptl_state_t *s, int ec_scheme, int span, int entries); - -/*! \brief Check the error correction settings of a UDPTL context. - \param s The UDPTL context. - \param ec_scheme One of the optional error correction schemes. - \param span The packet span over which error correction is being applied. - \param entries The number of error correction being included in packets. - \return 0 for OK. */ - int udptl_get_error_correction(udptl_state_t *s, int *ec_scheme, int *span, int *entries); - - int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram); - - int udptl_get_local_max_datagram(udptl_state_t *s); - - int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram); - - int udptl_get_far_max_datagram(udptl_state_t *s); - -/*! \brief Initialise a UDPTL context. - \param s The UDPTL context. - \param ec_scheme One of the optional error correction schemes. - \param span The packet span over which error correction should be applied. - \param entries The number of error correction entries to include in packets. - \param rx_packet_handler The callback function, used to report arriving IFP packets. - \param user_data An opaque pointer supplied to rx_packet_handler. - \return A pointer to the UDPTL context, or NULL if there was a problem. */ - udptl_state_t *udptl_init(udptl_state_t *s, int ec_scheme, int span, int entries, udptl_rx_packet_handler_t rx_packet_handler, void *user_data); - -/*! \brief Release a UDPTL context. - \param s The UDPTL context. - \return 0 for OK. */ - int udptl_release(udptl_state_t *s); - -#if defined(__cplusplus) -} -#endif -#endif -/*- End of file ------------------------------------------------------------*/ From 693e04a7dedf6dbae14fd65ecfbaf77bb96879f6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 31 May 2012 09:04:08 -0500 Subject: [PATCH 445/731] FS-4250 please post a new log if this does not work --- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 ++ src/mod/endpoints/mod_sofia/sofia.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 2b44018665..6d28bc01f9 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1587,6 +1587,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi case SWITCH_MESSAGE_INDICATE_BRIDGE: { + + switch_channel_set_variable(channel, SOFIA_REPLACES_HEADER, NULL); sofia_glue_tech_track(tech_pvt->profile, session); sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index dc4fcfb0f0..281aa511da 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -6797,6 +6797,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_THIS_MSG(de->data->e_msg), SIPTAG_EXPIRES_STR("60"), TAG_END()); + + switch_channel_set_variable(tech_pvt->channel, SOFIA_REPLACES_HEADER, NULL); + if (sip->sip_referred_by) { full_ref_by = sip_header_as_string(home, (void *) sip->sip_referred_by); } From a16ee3618732b26ec4c6bb89718056f8422d3121 Mon Sep 17 00:00:00 2001 From: kapil Date: Thu, 31 May 2012 20:20:51 +0530 Subject: [PATCH 446/731] 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 24f6c4056b1bfec94020eeb9611b3fcb0f4f72b4 Mon Sep 17 00:00:00 2001 From: Ken Rice Date: Thu, 31 May 2012 11:25:28 -0500 Subject: [PATCH 447/731] missed a spot removing mod_fax --- configure.in | 1 - 1 file changed, 1 deletion(-) diff --git a/configure.in b/configure.in index 5dbe6d9e12..83cb4144eb 100644 --- a/configure.in +++ b/configure.in @@ -993,7 +993,6 @@ AC_CONFIG_FILES([Makefile src/Makefile src/mod/Makefile src/mod/applications/mod_expr/Makefile - src/mod/applications/mod_fax/Makefile src/mod/applications/mod_spandsp/Makefile src/mod/applications/mod_osp/Makefile src/mod/applications/mod_stress/Makefile From bac3b3bd365f1e58df7ce93e9d35888669a9d1dd Mon Sep 17 00:00:00 2001 From: kapil Date: Fri, 1 Jun 2012 20:35:38 +0530 Subject: [PATCH 448/731] 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 449/731] 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 450/731] 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 451/731] 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 452/731] 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 453/731] 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 454/731] 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 455/731] 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 456/731] 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 457/731] 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 458/731] 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 459/731] 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 460/731] 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 461/731] 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 462/731] 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 463/731] 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 464/731] 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 465/731] 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 466/731] 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 467/731] 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 468/731] 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 469/731] 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 470/731] 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 471/731] 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 472/731] 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 473/731] 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 474/731] 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 475/731] 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 476/731] 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 477/731] 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 478/731] 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 479/731] 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 480/731] 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 481/731] 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 482/731] 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 483/731] 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 484/731] 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 485/731] 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 486/731] 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 487/731] 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 488/731] 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 489/731] 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 490/731] 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 491/731] 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 492/731] 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 493/731] 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 494/731] 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 495/731] 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 496/731] 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 497/731] 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 498/731] 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 499/731] 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 500/731] 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 501/731] 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 502/731] 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 503/731] 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 504/731] 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 505/731] 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 506/731] 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 507/731] 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 508/731] 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 509/731] 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 510/731] 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 511/731] 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 512/731] 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 513/731] 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 514/731] 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 515/731] 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 516/731] 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 517/731] 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 518/731] 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 519/731] 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 520/731] 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 521/731] 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 522/731] 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 523/731] 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 524/731] 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 525/731] 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 526/731] 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 527/731] 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 528/731] 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 529/731] 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 530/731] 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 531/731] 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 532/731] 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 533/731] 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 534/731] 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 535/731] 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 536/731] 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 537/731] 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 538/731] 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 539/731] 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 03be3a3a74e57568df134bc54cc95fecc30211c1 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 2 Sep 2011 16:59:59 -0500 Subject: [PATCH 540/731] 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 541/731] 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 542/731] 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 543/731] 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 544/731] 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 545/731] 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 546/731] 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 547/731] 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 548/731] 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 549/731] 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 550/731] 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 551/731] 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 552/731] 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 553/731] 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 554/731] 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 555/731] 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 556/731] 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 557/731] 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 558/731] 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 559/731] 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 560/731] 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 561/731] 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 562/731] 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 563/731] 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 564/731] 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 565/731] 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 566/731] 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 567/731] 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 568/731] 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 569/731] 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 570/731] 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 571/731] 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 572/731] 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 573/731] 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 574/731] 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 575/731] 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 576/731] 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 577/731] 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 578/731] 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 579/731] 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 580/731] 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 581/731] 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 582/731] 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 583/731] 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 584/731] 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 585/731] 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 586/731] 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 587/731] 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 588/731] 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 589/731] 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 590/731] 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 591/731] 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 592/731] 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 593/731] 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 594/731] 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 595/731] 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 596/731] 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 597/731] 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 598/731] 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 599/731] 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 600/731] 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 601/731] 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 602/731] 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 603/731] 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 604/731] 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 605/731] 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 606/731] 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 607/731] 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 608/731] 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 609/731] 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 610/731] 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 611/731] 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 612/731] 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 613/731] 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 614/731] 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 615/731] 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 616/731] 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 617/731] 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 618/731] 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 619/731] 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 620/731] 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 621/731] 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 622/731] 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 623/731] 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 624/731] 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 625/731] 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 626/731] 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 627/731] 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 628/731] 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 629/731] 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 630/731] 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 631/731] 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 632/731] 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 633/731] 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 634/731] 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 635/731] 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 636/731] 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 637/731] 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 638/731] 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 639/731] 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 640/731] 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 641/731] 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 642/731] 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 643/731] 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 644/731] 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 645/731] 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 646/731] 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 647/731] 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 648/731] 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 649/731] 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 650/731] 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 651/731] 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 652/731] 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 653/731] 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 654/731] 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 655/731] 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 656/731] 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 657/731] 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 658/731] 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 659/731] 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 660/731] 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 661/731] 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 662/731] 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 663/731] 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 664/731] 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 665/731] 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 666/731] 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 667/731] 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 668/731] 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 669/731] 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 670/731] 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 671/731] 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 672/731] 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 673/731] 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 674/731] 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 675/731] 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 676/731] 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 677/731] 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 678/731] 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 679/731] 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 680/731] 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 681/731] 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 682/731] 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 683/731] 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 684/731] 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 685/731] 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 686/731] 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 687/731] 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 688/731] 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 689/731] 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 690/731] 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 691/731] 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 692/731] 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 693/731] 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 694/731] 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 695/731] 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 696/731] 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 697/731] 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 698/731] 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 699/731] 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 700/731] 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 701/731] 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 702/731] 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 703/731] 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 704/731] 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 705/731] 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 706/731] 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 707/731] 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 708/731] 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 709/731] 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 710/731] 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 711/731] 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 712/731] 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 713/731] 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 714/731] 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 715/731] 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 716/731] 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 717/731] 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 718/731] 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 719/731] 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 720/731] 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 721/731] 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 722/731] 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 723/731] 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 724/731] 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 725/731] 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 726/731] 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 727/731] 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 728/731] 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 729/731] 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 730/731] 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 731/731] 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);