summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Fredrickson <creslin@digium.com>2008-04-12 16:13:25 +0000
committerMatthew Fredrickson <creslin@digium.com>2008-04-12 16:13:25 +0000
commitf9960bc748c1c334481cfab48d5753fd26c7d682 (patch)
treee2ea69630c38287456a818dd38319279422fc401
parent7c2632011035e1d64c5de05e23ee8b53fa9f06c3 (diff)
Make sure we start incoming calls on SS7 with echo cancellation enabled. Also make sure when completing a COT we call ss7_start_call with the proper locks held. Lastly, make sure if we fail to get a channel from zt_new that we don't assume it's there.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114092 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_zap.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 1666596ae..84d4b96a3 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -9114,6 +9114,7 @@ static void zt_loopback(struct zt_pvt *p, int enable)
}
}
+/* XXX: This function is assumed to be called with the private channel lock and linkset lock held */
static void ss7_start_call(struct zt_pvt *p, struct zt_ss7 *linkset)
{
struct ss7 *ss7 = linkset->ss7;
@@ -9139,11 +9140,16 @@ static void ss7_start_call(struct zt_pvt *p, struct zt_ss7 *linkset)
ast_mutex_unlock(&linkset->lock);
c = zt_new(p, AST_STATE_RING, 1, SUB_REAL, law, 0);
- ast_mutex_lock(&linkset->lock);
- if (c)
- ast_verb(3, "Accepting call to '%s' on CIC %d\n", p->exten, p->cic);
- else
+
+ if (!c) {
ast_log(LOG_WARNING, "Unable to start PBX on CIC %d\n", p->cic);
+ return;
+ } else
+ ast_verb(3, "Accepting call to '%s' on CIC %d\n", p->exten, p->cic);
+
+ ast_mutex_lock(&linkset->lock);
+
+ zt_enable_ec(p);
if (!ast_strlen_zero(p->charge_number)) {
pbx_builtin_setvar_helper(c, "SS7_CHARGE_NUMBER", p->charge_number);
@@ -9506,11 +9512,15 @@ static void *ss7_linkset(void *data)
}
p = linkset->pvts[chanpos];
+ ast_mutex_lock(&p->lock);
+
if (p->loopedback) {
zt_loopback(p, 0);
ss7_start_call(p, linkset);
}
+ ast_mutex_unlock(&p->lock);
+
break;
case ISUP_EVENT_CCR:
ast_debug(1, "Got CCR request on CIC %d\n", e->ccr.cic);