From 4c6789b36459e80e2af64ebb1c9f5823b71c0f12 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 21 Mar 2011 15:16:38 -0400 Subject: [PATCH] freetdm: allow setting the sig status in alarmed channels (bugzilla 6441) --- libs/freetdm/src/ftdm_io.c | 13 ------------- libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 12397c0666..36b203dfdd 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2534,20 +2534,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); diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c index 46eb92fede..e53febb3e4 100755 --- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c +++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c @@ -519,6 +519,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);