From 6880c95573a3647782d75b848635274db60d74d9 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 19 Mar 2008 20:45:57 +0000 Subject: [PATCH] update git-svn-id: http://svn.openzap.org/svn/openzap/trunk@426 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/mod_openzap/mod_openzap.c | 25 ++++++++-- libs/openzap/src/include/zap_types.h | 12 ++--- libs/openzap/src/zap_io.c | 17 +++---- libs/openzap/src/zap_ss7_boost.c | 66 ++++++++++++++++++-------- 4 files changed, 81 insertions(+), 39 deletions(-) diff --git a/libs/openzap/mod_openzap/mod_openzap.c b/libs/openzap/mod_openzap/mod_openzap.c index 4763a52b86..64d19abdec 100644 --- a/libs/openzap/mod_openzap/mod_openzap.c +++ b/libs/openzap/mod_openzap/mod_openzap.c @@ -666,21 +666,28 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session, 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); } } @@ -706,7 +713,11 @@ static switch_status_t channel_receive_message_fxo(switch_core_session_t *sessio 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; @@ -731,7 +742,11 @@ static switch_status_t channel_receive_message_fxs(switch_core_session_t *sessio 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; diff --git a/libs/openzap/src/include/zap_types.h b/libs/openzap/src/include/zap_types.h index 84b0243eca..c4f477e625 100644 --- a/libs/openzap/src/include/zap_types.h +++ b/libs/openzap/src/include/zap_types.h @@ -284,7 +284,6 @@ typedef enum { typedef enum { ZAP_CHANNEL_STATE_DOWN, - ZAP_CHANNEL_STATE_HANGUP, ZAP_CHANNEL_STATE_HOLD, ZAP_CHANNEL_STATE_SUSPENDED, ZAP_CHANNEL_STATE_DIALTONE, @@ -296,17 +295,18 @@ typedef enum { 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 { diff --git a/libs/openzap/src/zap_io.c b/libs/openzap/src/zap_io.c index f5b4bc1b67..13c68f0956 100644 --- a/libs/openzap/src/zap_io.c +++ b/libs/openzap/src/zap_io.c @@ -979,16 +979,17 @@ zap_status_t zap_channel_close(zap_channel_t **zchan) 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; } diff --git a/libs/openzap/src/zap_ss7_boost.c b/libs/openzap/src/zap_ss7_boost.c index a44b8bb0ba..b131d6a1ba 100644 --- a/libs/openzap/src/zap_ss7_boost.c +++ b/libs/openzap/src/zap_ss7_boost.c @@ -77,21 +77,38 @@ static zap_channel_t *find_zchan(zap_span_t *span, ss7bc_event_t *event) 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; } @@ -247,13 +264,6 @@ static void handle_call_start(zap_span_t *span, ss7bc_connection_t *mcon, ss7bc_ 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); @@ -454,6 +464,13 @@ static __inline__ void state_advance(zap_channel_t *zchan) 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, @@ -469,12 +486,21 @@ static __inline__ void state_advance(zap_channel_t *zchan) 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); }