diff --git a/libs/freetdm/docs/variables.txt b/libs/freetdm/docs/variables.txt index 0beecd016c..cb518e14d8 100644 --- a/libs/freetdm/docs/variables.txt +++ b/libs/freetdm/docs/variables.txt @@ -10,6 +10,7 @@ example #1a - Making an outbound call: To make an outbound call: ftdm_usrmsg_t usrmsg; + memset(&usrmsg, 0, sizeof(usrmsg)); /* Attach variable to usrmsg */ ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available"); @@ -22,6 +23,7 @@ When using ftmod_sangoma_isdn, user want to specify progress indicator inside PR ftdm_usrmsg_t usrmsg; + memset(&usrmsg, 0, sizeof(usrmsg)); /* Attach variable to usrmsg */ ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available"); @@ -40,6 +42,8 @@ When using ftmod_sangoma_isdn, user wants to transmit a custom Facility IE, insi uint8_t *my_facility_ie = ftdm_calloc(1, 200); /*memory has to be allocated using ftdm_calloc !! */ unsigned my_facility_ie_len = 0; + memset(&usrmsg, 0, sizeof(usrmsg)); + /* Fill my_facility_ie with custom data here */ my_facility_ie[my_facility_ie_len++] = 0x1C; /* Q.931 Facility IE ID */ my_facility_ie[my_facility_ie_len++] = 0x03; /* Length of facility IE */ @@ -49,7 +53,7 @@ When using ftmod_sangoma_isdn, user wants to transmit a custom Facility IE, insi ftdm_usrmsg_set_raw_data(&usrmsg, my_facility_ie, my_facility_ie_len); - ftdm_channel_call_indicate(ftdmchan, FTDM_CHANNEL_INDICATE_FACILITY, &usrmsg); + ftdm_channel_call_indicate_ex(ftdmchan, FTDM_CHANNEL_INDICATE_FACILITY, &usrmsg); /* FreeTDM will automatically free my_facility_ie */ diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 1951678d73..ff62dc38bb 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2310,7 +2310,9 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_call_indicate(const char *file, const ch ftdm_set_flag(ftdmchan, FTDM_CHANNEL_IND_ACK_PENDING); } - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { + if (indication != FTDM_CHANNEL_INDICATE_FACILITY && + ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { + ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_WARNING, "Cannot indicate %s in outgoing channel in state %s\n", ftdm_channel_indication2str(indication), ftdm_channel_state2str(ftdmchan->state)); status = FTDM_EINVAL; @@ -2525,20 +2527,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_sig_status(ftdm_channel_t *fchan, ftd ftdm_channel_lock(fchan); - if (ftdm_test_flag(fchan, FTDM_CHANNEL_IN_ALARM)) { - ftdm_log_chan_msg(fchan, FTDM_LOG_WARNING, "You can not set the signaling status of an alarmed channel\n"); - res = FTDM_EINVAL; - goto done; - } - - if (sigstatus == FTDM_SIG_STATE_DOWN) { - ftdm_log_chan_msg(fchan, FTDM_LOG_WARNING, "You can not set the signaling status to DOWN, valid states are UP or SUSPENDED\n"); - res = FTDM_EINVAL; - goto done; - } - res = fchan->span->set_channel_sig_status(fchan, sigstatus); -done: ftdm_channel_unlock(fchan); @@ -6057,9 +6046,12 @@ FT_DECLARE(ftdm_status_t) ftdm_sigmsg_get_raw_data_detached(ftdm_sigmsg_t *sigms if (!sigmsg || !sigmsg->raw.len) { return FTDM_FAIL; } - + *data = sigmsg->raw.data; - *datalen = sigmsg->raw.len; + *datalen = sigmsg->raw.len; + + sigmsg->raw.data = NULL; + sigmsg->raw.len = 0; return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c index c47f97a50b..64d8b4fc3c 100755 --- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c +++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c @@ -520,6 +520,28 @@ static FIO_CHANNEL_SET_SIG_STATUS_FUNCTION(ftdm_r2_set_channel_sig_status) openr2_chan_t *r2chan = R2CALL(ftdmchan)->r2chan; openr2_cas_signal_t rxcas, txcas; + if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_IN_ALARM)) { + ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, + "Received request to change sig status of alarmed channel to %s", ftdm_signaling_status2str(status)); + + switch (status) { + case FTDM_SIG_STATE_SUSPENDED: + openr2_chan_set_blocked(r2chan); + /* Need to send sig status change to SUSPENDED once out of alarm */ + R2CALL(ftdmchan)->localsuspend_on_alarm = 1; + break; + case FTDM_SIG_STATE_UP: + openr2_chan_set_blocked(r2chan); + /* DO NOT send sig status change to SUSPENDED once out of alarm */ + R2CALL(ftdmchan)->localsuspend_on_alarm = 0; + break; + default: + ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Cannot set signaling status to unknown value '%d'\n", status); + return FTDM_FAIL; + } + return FTDM_SUCCESS; + } + /* get the current rx and tx cas bits */ openr2_chan_get_cas(r2chan, &rxcas, &txcas); 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 a9d2d06c32..01d5de7f8d 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 @@ -807,17 +807,10 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event) if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) { /* If Facility decoding is disabled, we do not care about current call state, just pass event up to user */ - ftdm_sigmsg_t sigev; if (facEvnt->facElmt.facStr.pres) { get_facility_ie_str(ftdmchan, &facEvnt->facElmt.facStr.val[2], facEvnt->facElmt.facStr.len-2); + sngisdn_send_signal(sngisdn_info, FTDM_SIGEVENT_FACILITY); } - memset(&sigev, 0, sizeof(sigev)); - sigev.chan_id = ftdmchan->chan_id; - sigev.span_id = ftdmchan->span_id; - sigev.channel = ftdmchan; - - sigev.event_id = FTDM_SIGEVENT_FACILITY; - ftdm_span_send_signal(ftdmchan->span, &sigev); ISDN_FUNC_TRACE_EXIT(__FUNCTION__); return; } 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 d24f2d403d..0f9a5ebeb3 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 @@ -370,7 +370,7 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8 my_data[1] = data_len; memcpy(&my_data[2], data, data_len); - sngisdn_add_raw_data((sngisdn_chan_data_t*)ftdmchan->call_data, data, data_len+2); + sngisdn_add_raw_data((sngisdn_chan_data_t*)ftdmchan->call_data, my_data, data_len+2); ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Raw Facility IE copied available\n"); } else { diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 6556164aac..d2c0a7e267 100755 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -1463,11 +1463,6 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter); */ FT_DECLARE(ftdm_status_t) ftdm_iterator_free(ftdm_iterator_t *iter); -/*! \brief Clears all the temporary data attached to this call - * \note Clears caller_data->variables and caller_data->raw_data. - * */ -FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data); - /*! \brief Get the span pointer associated to the channel */ FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan);