From: David Yat Sin Date: Wed, 12 Sep 2012 15:05:39 +0000 (-0400) Subject: Merged latest FreeTDM code from Sangoma's repo X-Git-Tag: v1.2.3^2~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4340c4d74c240dd9ee6ddca249f9c25227d7f9db;p=thirdparty%2Ffreeswitch.git Merged latest FreeTDM code from Sangoma's repo Merge remote branch 'smgfs/master' Conflicts: build/modules.conf.in configure.in libs/esl/fs_cli.c libs/freetdm/mod_freetdm/mod_freetdm.c libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c src/include/switch_types.h src/mod/applications/mod_commands/mod_commands.c src/mod/applications/mod_spandsp/mod_spandsp.c src/mod/endpoints/mod_opal/mod_opal.cpp src/mod/endpoints/mod_opal/mod_opal.h src/mod/endpoints/mod_sofia/mod_sofia.h src/mod/endpoints/mod_sofia/rtp.c src/switch.c src/switch_core.c src/switch_rtp.c --- 4340c4d74c240dd9ee6ddca249f9c25227d7f9db diff --cc libs/freetdm/mod_freetdm/mod_freetdm.c index f38ededc8e,26a26bf61f..da6fb095b0 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@@ -598,10 -638,18 +633,18 @@@ static switch_status_t channel_on_hangu if (hcause < 1 || hcause > 127) { hcause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER; } - ftdm_channel_call_hangup_with_cause(tech_pvt->ftdmchan, hcause); + 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); + } } break; - default: + default: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Unhandled channel type %d for channel %s\n", chantype, switch_channel_get_name(channel)); } @@@ -1416,9 -1497,9 +1492,9 @@@ static switch_call_cause_t channel_outg /* 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"); if (sipvar) { ftdm_set_string(caller_data.rdnis.digits, sipvar); @@@ -1744,10 -1915,12 +1909,12 @@@ ftdm_status_t ftdm_channel_from_event(f switch_channel_set_variable_printf(channel, "freetdm_calling_party_category", ftdm_calling_party_category2str(channel_caller_data->cpc)); switch_channel_set_variable_printf(channel, "screening_ind", ftdm_screening2str(channel_caller_data->screen)); switch_channel_set_variable_printf(channel, "presentation_ind", ftdm_presentation2str(channel_caller_data->pres)); - - + 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-SpanNumber", "%d", spanid); + 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); switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CallerName", "%s", channel_caller_data->cid_name); @@@ -1767,9 -1940,51 +1934,50 @@@ 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); + } + + 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); + } + + 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", "%d", 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"); @@@ -2574,11 -2853,12 +2822,11 @@@ static uint32_t enable_analog_option(co current_options |= ANALOG_OPTION_CALL_SWAP; current_options &= ~ANALOG_OPTION_3WAY; } - + return current_options; - } - #define CONFIG_ERROR(...) { \ + #define LOAD_ERROR(...) { \ ftdm_log(FTDM_LOG_ERROR, __VA_ARGS__); \ globals.config_error = 1; \ } @@@ -2845,10 -3261,10 +3231,10 @@@ static void parse_gsm_spans(switch_xml_ } 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -2883,11 -3299,11 +3269,11 @@@ } } - if (ftdm_configure_span_signaling(span, - "gsm", + if (ftdm_configure_span_signaling(span, + "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; @@@ -2934,10 -3350,10 +3320,10 @@@ static void parse_bri_pri_spans(switch_ } 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -3014,11 -3430,11 +3400,11 @@@ } } - if (ftdm_configure_span_signaling(span, - "sangoma_isdn", + if (ftdm_configure_span_signaling(span, + "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; @@@ -3115,10 -3532,10 +3502,10 @@@ 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -3154,11 -3576,11 +3546,11 @@@ } } - if (ftdm_configure_span_signaling(span, - "sangoma_ss7", + if (ftdm_configure_span_signaling(span, + "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; @@@ -3210,10 -3635,10 +3605,10 @@@ } 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -3285,12 -3710,12 +3680,12 @@@ analog_options = enable_analog_option(val, analog_options); } } - + if (!id && !name) { - CONFIG_ERROR("span missing required param 'id'\n"); + LOAD_ERROR("span missing required param 'id'\n"); continue; } - + if (!tonegroup) { tonegroup = "us"; } @@@ -3317,10 -3742,10 +3712,10 @@@ } 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -3412,9 -3837,9 +3807,9 @@@ analog_options = enable_analog_option(val, analog_options); } } - + if (!id && !name) { - CONFIG_ERROR("span missing required param 'id'\n"); + LOAD_ERROR("span missing required param 'id'\n"); continue; } @@@ -3445,10 -3871,10 +3840,10 @@@ } 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; } - + if (!span_id) { span_id = ftdm_span_get_id(span); } @@@ -3587,10 -4013,10 +3982,10 @@@ paramindex++; } } - + 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; } diff --cc libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index 40a89a80c8,4e9c9dcadd..cc4d1108f6 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@@ -287,8 -274,7 +287,9 @@@ typedef struct sngisdn_span_data uint8_t restart_timeout; uint8_t force_sending_complete; uint8_t cid_name_method; - uint8_t send_cid_name; + uint8_t send_cid_name; ++ uint8_t send_connect_ack; + int32_t timer_t301; int32_t timer_t302; int32_t timer_t303; @@@ -305,7 -291,7 +306,6 @@@ int32_t timer_t318; int32_t timer_t319; int32_t timer_t322; - - uint8_t send_connect_ack; char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS]; ftdm_timer_id_t timers[SNGISDN_NUM_SPAN_TIMERS]; ftdm_sched_t *sched; diff --cc libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c index 47da32d865,52c4ecd8de..8356932ce6 --- 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 @@@ -613,8 -466,8 +614,10 @@@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm parse_timer(val, &signal_data->timer_t319); } else if (!strcasecmp(var, "timer-t322")) { parse_timer(val, &signal_data->timer_t322); + } else if (!strcasecmp(var, "trunkgroup")) { + /* Do nothing, we already parsed this parameter */ + } else if (!strcasecmp(var, "send-connect-ack")) { + parse_yesno(var, val, &signal_data->send_connect_ack); } else { ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var); } diff --cc libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c index 457964a95f,8d2b501850..70d1315353 --- 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 @@@ -2468,10 -3334,11 +3334,11 @@@ ftdm_status_t sngss7_save_iam(ftdm_chan /* 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)); + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%"FTDM_SIZE_FMT"\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:%"FTDM_SIZE_FMT" 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 --cc libs/freetdm/src/include/freetdm.h index 1476ee0158,18dfb7605b..f430ae263e --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@@ -1773,33 -1775,11 +1804,33 @@@ FT_DECLARE(ftdm_trunk_type_t) ftdm_span /*! \brief For display debugging purposes you can display this string which describes the trunk type of a span */ FT_DECLARE(const char *) ftdm_span_get_trunk_type_str(const ftdm_span_t *span); +/*! + * Set the trunk mode for a span + * \note This must be called before configuring any channels within the span! + * \param[in] span The span + * \param[in] type The trunk mode + */ +FT_DECLARE(void) ftdm_span_set_trunk_mode(ftdm_span_t *span, ftdm_trunk_mode_t mode); + +/*! + * Get the trunk mode for a span + * \param[in] span The span + * \return Span trunk mode + */ +FT_DECLARE(ftdm_trunk_mode_t) ftdm_span_get_trunk_mode(const ftdm_span_t *span); + +/*! + * Get the trunk mode of a span in textual form + * \param[in] span The span + * \return Span mode name as a string + */ +FT_DECLARE(const char *) ftdm_span_get_trunk_mode_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 */