diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index fc3f1c4ca9..269908ba27 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1950,6 +1950,16 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal) sigmsg->channel->span_id, sigmsg->channel->chan_id, (uuid) ? uuid : "N/A"); } } + break; + case FTDM_SIGEVENT_SIGSTATUS_CHANGED: + { + if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) { + ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } else { + ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } + } + break; default: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unhandled msg type %d for channel %d:%d\n", @@ -2992,6 +3002,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre "chan_id: %u\n" "physical_span_id: %u\n" "physical_chan_id: %u\n" + "physical_state: %s\n" + "signaling_state: %s\n" "type: %s\n" "state: %s\n" "last_state: %s\n" @@ -3009,6 +3021,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre span->channels[chan_id]->chan_id, span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, + (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", + ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), @@ -3037,6 +3051,8 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * " %u>\n" " %u\n" " %u\n" + " %s\n" + " %s\n" " %s\n" " %s\n" " %s\n" @@ -3055,6 +3071,8 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * span->channels[chan_id]->chan_id, span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, + (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", + ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index f00e7988e3..86fbd88da4 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1279,9 +1279,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_group(uint32_t group_id, ftdm_dir if (!(check = group->channels[i])) { status = FTDM_FAIL; break; - } + } - if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + 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) && @@ -1401,7 +1402,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc break; } - if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + 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) && diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c index a45c5189d3..ef641deb51 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c @@ -2119,6 +2119,7 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_boost_destroy) static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) { int err; + ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data; ftdm_set_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING); err=ftdm_thread_create_detached(ftdm_sangoma_boost_run, span); @@ -2137,23 +2138,23 @@ static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span) { + int cnt = 10; ftdm_status_t status = FTDM_SUCCESS; ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data; if (sangoma_boost_data->sigmod) { + + /* FIXME: we should make sure the span thread is stopped (use pthread_kill or freetdm thread kill function) */ /* I think stopping the span before destroying the queue makes sense otherwise may be boost events would still arrive when the queue is already destroyed! */ status = sangoma_boost_data->sigmod->stop_span(span); ftdm_queue_enqueue(sangoma_boost_data->boost_queue, NULL); - } - - while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING)) { - ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); - ftdm_sleep(100); - } - - if (sangoma_boost_data->sigmod) { + while(ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) { + ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); + ftdm_sleep(500); + } ftdm_queue_destroy(&sangoma_boost_data->boost_queue); + return status; } return status; } diff --git a/libs/freetdm/src/include/ftdm_types.h b/libs/freetdm/src/include/ftdm_types.h index bf7720efd1..90562104db 100644 --- a/libs/freetdm/src/include/ftdm_types.h +++ b/libs/freetdm/src/include/ftdm_types.h @@ -415,6 +415,7 @@ typedef enum { FTDM_CHANNEL_USE_RX_GAIN = (1 << 25), FTDM_CHANNEL_USE_TX_GAIN = (1 << 26), FTDM_CHANNEL_IN_ALARM = (1 << 27), + FTDM_CHANNEL_SIG_UP = (1 << 28), } ftdm_channel_flag_t; #if defined(__cplusplus) && defined(WIN32) // fix C2676