mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 20:04:50 +00:00
when a PRI call must be moved to a different B channel at the request of the other endpoint, ensure that any DSP active on the original channel is moved to the new one
(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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user