Index: channels/sig_ss7.c =================================================================== --- channels/sig_ss7.c (revision 374334) +++ channels/sig_ss7.c (working copy) @@ -281,6 +281,24 @@ /*! * \internal + * \brief Determine if a private channel structure is available. + * + * \param pvt Channel to determine if available. + * + * \return TRUE if the channel is available. + */ +static int sig_ss7_is_chan_available(struct sig_ss7_chan *pvt) +{ + if (!pvt->inalarm && !pvt->owner && !pvt->ss7call + && pvt->call_level == SIG_SS7_CALL_LEVEL_IDLE + && !pvt->locallyblocked && !pvt->remotelyblocked) { + return 1; + } + return 0; +} + +/*! + * \internal * \brief Obtain the sig_ss7 owner channel lock if the owner exists. * \since 1.8 * @@ -547,7 +565,7 @@ ast_log(LOG_WARNING, "Unable to start PBX on CIC %d\n", p->cic); ast_mutex_lock(&linkset->lock); sig_ss7_lock_private(p); - isup_rel(linkset->ss7, p->ss7call, -1); + isup_rel(linkset->ss7, p->ss7call, AST_CAUSE_SWITCH_CONGESTION); p->call_level = SIG_SS7_CALL_LEVEL_IDLE; p->alreadyhungup = 1; return; @@ -894,11 +912,11 @@ * We have not sent our IAM yet and we never will at this point. */ p->alreadyhungup = 1; - isup_rel(ss7, e->iam.call, -1); + isup_rel(ss7, e->iam.call, AST_CAUSE_NORMAL_CIRCUIT_CONGESTION); } p->call_level = SIG_SS7_CALL_LEVEL_GLARE; if (p->owner) { - p->owner->hangupcause = AST_CAUSE_NORMAL_CLEARING; + p->owner->hangupcause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; ast_softhangup_nolock(p->owner, AST_SOFTHANGUP_DEV); ast_channel_unlock(p->owner); } @@ -911,6 +929,13 @@ */ ast_assert(!p->owner); + if (!sig_ss7_is_chan_available(p)) { + /* Circuit is likely blocked or in alarm. */ + isup_rel(ss7, e->iam.call, AST_CAUSE_NORMAL_CIRCUIT_CONGESTION); + sig_ss7_unlock_private(p); + break; + } + /* Mark channel as in use so no outgoing call will steal it. */ p->call_level = SIG_SS7_CALL_LEVEL_ALLOCATED; p->ss7call = e->iam.call; @@ -1350,24 +1375,6 @@ } /*! - * \internal - * \brief Determine if a private channel structure is available. - * - * \param pvt Channel to determine if available. - * - * \return TRUE if the channel is available. - */ -static int sig_ss7_is_chan_available(struct sig_ss7_chan *pvt) -{ - if (!pvt->inalarm && !pvt->owner && !pvt->ss7call - && pvt->call_level == SIG_SS7_CALL_LEVEL_IDLE - && !pvt->locallyblocked && !pvt->remotelyblocked) { - return 1; - } - return 0; -} - -/*! * \brief Determine if the specified channel is available for an outgoing call. * \since 1.8 *