When handling glare on a PRI, move the requested channel rather than hang up the old one. Fix for 8957 and 9011.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@54373 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2
Matthew Fredrickson 19 years ago
parent 5f3b33f0f5
commit 3b38b3f632

@ -8369,6 +8369,11 @@ static void *pri_dchannel(void *vpri)
pri_dump_event(pri->dchans[which], e);
if (e->e != PRI_EVENT_DCHAN_DOWN)
pri->dchanavail[which] |= DCHAN_UP;
if ((e->e != PRI_EVENT_DCHAN_UP) && (e->e != PRI_EVENT_DCHAN_DOWN) && (pri->pri != pri->dchans[which]))
/* Must be an NFAS group that has the secondary dchan active */
pri->pri = pri->dchans[which];
switch(e->e) {
case PRI_EVENT_DCHAN_UP:
if (option_verbose > 1)
@ -8532,12 +8537,9 @@ static void *pri_dchannel(void *vpri)
PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
break;
} else {
ast_log(LOG_WARNING, "Ring requested on channel %d/%d already in use on span %d. Hanging up owner.\n",
/* This is where we handle initial glare */
ast_log(LOG_DEBUG, "Ring requested on channel %d/%d already in use or previously requested on span %d. Attempting to renegotiating channel.\n",
PRI_SPAN(e->ring.channel), PRI_CHANNEL(e->ring.channel), pri->span);
if (pri->pvts[chanpos]->realcall)
pri_hangup_all(pri->pvts[chanpos]->realcall, pri);
else
pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
chanpos = -1;
}
@ -8748,8 +8750,12 @@ static void *pri_dchannel(void *vpri)
if (crv)
ast_mutex_unlock(&crv->lock);
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
} else
pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
} else {
if (e->ring.flexible)
pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION);
else
pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
}
break;
case PRI_EVENT_RINGING:
chanpos = pri_find_principle(pri, e->ringing.channel);

Loading…
Cancel
Save