Merged revisions 54375 via svnmerge from
authorMatthew Fredrickson <creslin@digium.com>
Wed, 14 Feb 2007 17:14:42 +0000 (17:14 +0000)
committerMatthew Fredrickson <creslin@digium.com>
Wed, 14 Feb 2007 17:14:42 +0000 (17:14 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r54375 | mattf | 2007-02-14 10:56:40 -0600 (Wed, 14 Feb 2007) | 10 lines

Merged revisions 54373 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r54373 | mattf | 2007-02-14 10:25:49 -0600 (Wed, 14 Feb 2007) | 2 lines

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/trunk@54404 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index 99faf8c..09b7ad6 100644 (file)
@@ -9356,6 +9356,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) 
@@ -9522,12 +9527,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;
                                                }
@@ -9739,8 +9741,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);