if (ftdm_test_flag(check, FTDM_CHANNEL_CONFIGURED)) {
ftdm_mutex_lock(check->mutex);
- if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
- status = check->fio->close(check);
- if (status == FTDM_SUCCESS) {
- ftdm_channel_done(check);
- *ftdmchan = NULL;
- }
- } else {
- ftdm_log_chan_msg(check, FTDM_LOG_WARNING, "Called ftdm_channel_close but never ftdm_channel_open??\n");
+ if (!ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
+ ftdm_log_chan_msg(check, FTDM_LOG_WARNING, "Channel not opened, proceeding anyway\n");
+ }
+ status = check->fio->close(check);
+ if (status == FTDM_SUCCESS) {
+ ftdm_channel_done(check);
+ *ftdmchan = NULL;
}
check->ring_count = 0;
ftdm_mutex_unlock(check->mutex);
static ftdm_state_map_t r2_state_map = {
{
+ {
+ ZSD_INBOUND,
+ ZSM_UNACCEPTABLE,
+ {FTDM_ANY_STATE, FTDM_END},
+ {FTDM_CHANNEL_STATE_RESET, FTDM_END}
+ },
+ {
+ ZSD_INBOUND,
+ ZSM_UNACCEPTABLE,
+ {FTDM_CHANNEL_STATE_RESET, FTDM_END},
+ {FTDM_CHANNEL_STATE_DOWN, FTDM_END}
+ },
{
ZSD_INBOUND,
ZSM_UNACCEPTABLE,
/* Outbound states */
+ {
+ ZSD_OUTBOUND,
+ ZSM_UNACCEPTABLE,
+ {FTDM_ANY_STATE, FTDM_END},
+ {FTDM_CHANNEL_STATE_RESET, FTDM_END}
+ },
+
+ {
+ ZSD_OUTBOUND,
+ ZSM_UNACCEPTABLE,
+ {FTDM_CHANNEL_STATE_RESET, FTDM_END},
+ {FTDM_CHANNEL_STATE_DOWN, FTDM_END}
+ },
+
{
ZSD_OUTBOUND,
ZSM_UNACCEPTABLE,
/* finished call for good */
case FTDM_CHANNEL_STATE_DOWN:
{
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "R2 Call is down\n");
+ if (ftdmchan->last_state != FTDM_CHANNEL_STATE_RESET) {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "R2 Call is down\n");
+ }
ret = 1;
}
break;
}
break;
+ /* put the r2 channel back to IDLE, close ftdmchan and set it's state as DOWN */
+ case FTDM_CHANNEL_STATE_RESET:
+ {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "RESET indicated, putting the R2 channel back to IDLE\n");
+ openr2_chan_set_idle(r2chan);
+ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+ }
+ break;
+
default:
{
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Unhandled channel state change: %s\n", ftdm_channel_state2str(ftdmchan->state));