]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
when a PRI call must be moved to a different B channel at the request of the other...
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 5 Mar 2008 15:32:35 +0000 (15:32 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 5 Mar 2008 15:32:35 +0000 (15:32 +0000)
(closes issue #11917)
Reported by: mavetju
Tested by: mavetju

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@106038 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index ab2db946b9edd43f2f65060c7de5cef8a561c24d..42757fb5ce3944d820a2fbe850a17ff5d95e244f 100644 (file)
@@ -8060,30 +8060,37 @@ static int pri_fixup_principle(struct zt_pri *pri, int principle, q931_call *c)
                if (pri->pvts[x]->call == c) {
                        /* Found our call */
                        if (principle != x) {
+                               struct zt_pvt *new = pri->pvts[principle], *old = pri->pvts[x];
+
                                if (option_verbose > 2)
                                        ast_verbose(VERBOSE_PREFIX_3 "Moving call from channel %d to channel %d\n",
-                                               pri->pvts[x]->channel, pri->pvts[principle]->channel);
-                               if (pri->pvts[principle]->owner) {
+                                               old->channel, new->channel);
+                               if (new->owner) {
                                        ast_log(LOG_WARNING, "Can't fix up channel from %d to %d because %d is already in use\n",
-                                               pri->pvts[x]->channel, pri->pvts[principle]->channel, pri->pvts[principle]->channel);
+                                               old->channel, new->channel, new->channel);
                                        return -1;
                                }
                                /* Fix it all up now */
-                               pri->pvts[principle]->owner = pri->pvts[x]->owner;
-                               if (pri->pvts[principle]->owner) {
-                                       ast_string_field_build(pri->pvts[principle]->owner, name, 
+                               new->owner = old->owner;
+                               old->owner = NULL;
+                               if (new->owner) {
+                                       ast_string_field_build(new->owner, name, 
                                                               "Zap/%d:%d-%d", pri->trunkgroup,
-                                                              pri->pvts[principle]->channel, 1);
-                                       pri->pvts[principle]->owner->tech_pvt = pri->pvts[principle];
-                                       pri->pvts[principle]->owner->fds[0] = pri->pvts[principle]->subs[SUB_REAL].zfd;
-                                       pri->pvts[principle]->subs[SUB_REAL].owner = pri->pvts[x]->subs[SUB_REAL].owner;
+                                                              new->channel, 1);
+                                       new->owner->tech_pvt = new;
+                                       new->owner->fds[0] = new->subs[SUB_REAL].zfd;
+                                       new->subs[SUB_REAL].owner = old->subs[SUB_REAL].owner;
+                                       old->subs[SUB_REAL].owner = NULL;
                                } else
-                                       ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", pri->pvts[x]->channel, pri->pvts[principle]->channel);
-                               pri->pvts[principle]->call = pri->pvts[x]->call;
-                               /* Free up the old channel, now not in use */
-                               pri->pvts[x]->subs[SUB_REAL].owner = NULL;
-                               pri->pvts[x]->owner = NULL;
-                               pri->pvts[x]->call = NULL;
+                                       ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", old->channel, new->channel);
+                               new->call = old->call;
+                               old->call = NULL;
+
+                               /* Copy any DSP that may be present */
+                               new->dsp = old->dsp;
+                               new->dsp_features = old->dsp_features;
+                               old->dsp = NULL;
+                               old->dsp_features = 0;
                        }
                        return principle;
                }