switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_RINGING:
{
- if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_PROGRESS);
+ } else {
zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_PROGRESS);
}
}
break;
case SWITCH_MESSAGE_INDICATE_PROGRESS:
{
- if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_PROGRESS);
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_MEDIA);
+ } else {
zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_PROGRESS_MEDIA);
}
}
break;
case SWITCH_MESSAGE_INDICATE_ANSWER:
{
- if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_ANSWERED);
+ } else {
zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_UP);
}
}
switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_PROGRESS:
case SWITCH_MESSAGE_INDICATE_ANSWER:
- if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_ANSWERED);
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_PROGRESS);
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_MEDIA);
+ } else {
zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_UP);
}
break;
switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_PROGRESS:
case SWITCH_MESSAGE_INDICATE_ANSWER:
- if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_ANSWERED);
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_PROGRESS);
+ zap_set_flag_locked(tech_pvt->zchan, ZAP_CHANNEL_MEDIA);
+ } else {
zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_UP);
}
break;
typedef enum {
ZAP_CHANNEL_STATE_DOWN,
- ZAP_CHANNEL_STATE_HANGUP,
ZAP_CHANNEL_STATE_HOLD,
ZAP_CHANNEL_STATE_SUSPENDED,
ZAP_CHANNEL_STATE_DIALTONE,
ZAP_CHANNEL_STATE_DIALING,
ZAP_CHANNEL_STATE_GET_CALLERID,
ZAP_CHANNEL_STATE_CALLWAITING,
- ZAP_CHANNEL_STATE_TERMINATING,
ZAP_CHANNEL_STATE_RESTART,
- ZAP_CHANNEL_STATE_PROGRESS_MEDIA,
ZAP_CHANNEL_STATE_PROGRESS,
- ZAP_CHANNEL_STATE_IDLE,
+ ZAP_CHANNEL_STATE_PROGRESS_MEDIA,
ZAP_CHANNEL_STATE_UP,
+ ZAP_CHANNEL_STATE_IDLE,
+ ZAP_CHANNEL_STATE_TERMINATING,
+ ZAP_CHANNEL_STATE_HANGUP,
ZAP_CHANNEL_STATE_INVALID
} zap_channel_state_t;
-#define CHANNEL_STATE_STRINGS "DOWN", "HANGUP", "HOLD", "SUSPENDED", "DIALTONE", "COLLECT", \
+#define CHANNEL_STATE_STRINGS "DOWN", "HOLD", "SUSPENDED", "DIALTONE", "COLLECT", \
"RING", "BUSY", "ATTN", "GENRING", "DIALING", "GET_CALLERID", "CALLWAITING", \
- "TERMINATING", "RESTART", "PROGRESS_MEDIA", "PROGRESS", "IDLE", "UP", "INVALID"
+ "RESTART", "PROGRESS", "PROGRESS_MEDIA", "UP", "IDLE", "TERMINATING", "HANGUP", "INVALID"
ZAP_STR2ENUM_P(zap_str2zap_channel_state, zap_channel_state2str, zap_channel_state_t)
typedef enum {
return ZAP_FAIL;
}
- zap_mutex_lock(check->mutex);
- if (zap_test_flag(check, ZAP_CHANNEL_OPEN)) {
- status = check->zio->close(check);
- if (status == ZAP_SUCCESS) {
- zap_channel_reset(check);
- *zchan = NULL;
+ if (zap_test_flag(check, ZAP_CHANNEL_CONFIGURED)) {
+ zap_mutex_lock(check->mutex);
+ if (zap_test_flag(check, ZAP_CHANNEL_OPEN)) {
+ status = check->zio->close(check);
+ if (status == ZAP_SUCCESS) {
+ zap_channel_reset(check);
+ *zchan = NULL;
+ }
}
+ zap_mutex_unlock(check->mutex);
}
-
- zap_mutex_unlock(check->mutex);
return status;
}
int i;
zap_channel_t *zchan = NULL;
+ zap_mutex_lock(signal_mutex);
for(i = 0; i <= span->chan_count; i++) {
if (span->channels[i].physical_span_id == event->span+1 && span->channels[i].physical_chan_id == event->chan+1) {
zchan = &span->channels[i];
if (zap_test_flag(zchan, ZAP_CHANNEL_INUSE)) {
- zchan = NULL;
- zap_log(ZAP_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use.\n",
- span->channels[i].span_id,
- span->channels[i].chan_id,
- span->channels[i].physical_span_id,
- span->channels[i].physical_chan_id
- );
+ if (zchan->state == ZAP_CHANNEL_STATE_DOWN || zchan->state >= ZAP_CHANNEL_STATE_TERMINATING) {
+ int x = 0;
+ zap_log(ZAP_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use waiting for it to become available.\n");
+
+ zap_mutex_unlock(signal_mutex);
+ for (x = 0; x < 200; x++) {
+ if (!zap_test_flag(zchan, ZAP_CHANNEL_INUSE)) {
+ break;
+ }
+ zap_sleep(5);
+ }
+ zap_mutex_lock(signal_mutex);
+ }
+ if (zap_test_flag(zchan, ZAP_CHANNEL_INUSE)) {
+ zchan = NULL;
+ zap_log(ZAP_LOG_ERROR, "Channel %d:%d ~ %d:%d is already in use.\n",
+ span->channels[i].span_id,
+ span->channels[i].chan_id,
+ span->channels[i].physical_span_id,
+ span->channels[i].physical_chan_id
+ );
+ }
}
break;
}
}
+ zap_mutex_unlock(signal_mutex);
return zchan;
}
goto error;
}
- ss7bc_exec_command(mcon,
- event->span,
- event->chan,
- 0,
- SIGBOOST_EVENT_CALL_START_ACK,
- 0);
-
zap_set_string(zchan->caller_data.cid_num.digits, (char *)event->calling_number_digits);
zap_set_string(zchan->caller_data.cid_name, (char *)event->calling_number_digits);
zap_set_string(zchan->caller_data.ani.digits, (char *)event->calling_number_digits);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
+ ss7bc_exec_command(mcon,
+ zchan->physical_span_id-1,
+ zchan->physical_chan_id-1,
+ 0,
+ SIGBOOST_EVENT_CALL_START_ACK,
+ 0);
+
ss7bc_exec_command(mcon,
zchan->physical_span_id-1,
zchan->physical_chan_id-1,
break;
case ZAP_CHANNEL_STATE_HANGUP:
{
- ss7bc_exec_command(mcon,
- zchan->physical_span_id-1,
- zchan->physical_chan_id-1,
- 0,
- SIGBOOST_EVENT_CALL_STOPPED,
- zchan->caller_data.hangup_cause);
+ if (zap_test_flag(zchan, ZAP_CHANNEL_ANSWERED)) {
+ ss7bc_exec_command(mcon,
+ zchan->physical_span_id-1,
+ zchan->physical_chan_id-1,
+ 0,
+ SIGBOOST_EVENT_CALL_STOPPED,
+ zchan->caller_data.hangup_cause);
+ } else {
+ ss7bc_exec_command(mcon,
+ zchan->physical_span_id-1,
+ zchan->physical_chan_id-1,
+ 0,
+ SIGBOOST_EVENT_CALL_START_NACK,
+ zchan->caller_data.hangup_cause);
+ }
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
}