diff options
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r-- | channels/chan_iax2.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 8f42bf385..a723d2cf4 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -5593,19 +5593,24 @@ static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_cha res = AST_BRIDGE_COMPLETE; break; } - if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS) && (f->subclass.integer != AST_CONTROL_SRCUPDATE)) { - *fo = f; - *rc = who; - res = AST_BRIDGE_COMPLETE; - break; - } other = (who == c0) ? c1 : c0; /* the 'other' channel */ + if ((f->frametype == AST_FRAME_CONTROL)) { + if (f->subclass.integer == AST_CONTROL_PVT_CAUSE_CODE) { + ast_channel_hangupcause_hash_set(other, f->data.ptr); + } else if (!(flags & AST_BRIDGE_IGNORE_SIGS) + && (f->subclass.integer != AST_CONTROL_SRCUPDATE)) { + *fo = f; + *rc = who; + res = AST_BRIDGE_COMPLETE; + break; + } + } if ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_TEXT) || (f->frametype == AST_FRAME_VIDEO) || (f->frametype == AST_FRAME_IMAGE) || (f->frametype == AST_FRAME_DTMF) || - (f->frametype == AST_FRAME_CONTROL)) { + (f->frametype == AST_FRAME_CONTROL && f->subclass.integer != AST_CONTROL_PVT_CAUSE_CODE)) { /* monitored dtmf take out of the bridge. * check if we monitor the specific source. */ |