From de772e22b22c14eb0a94ec0b55e4777bafb8775b Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Tue, 24 Sep 2013 20:03:30 +0000 Subject: [PATCH] chan_iax2: Prevent some needless breaking of the native IAX2 bridge. * Clean up some twisted code in the iax2_bridge() loop. * Add AST_CONTROL_VIDUPDATE and AST_CONTROL_SRCCHANGE to a list of frames to prevent the native bridge loop from breaking. * Passing the AST_CONTROL_T38_PARAMETERS frame should also allow FAX over a native IAX2 bridge. (issue ABE-2912) Review: https://reviewboard.asterisk.org/r/2870/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@399697 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index c4239ae83d..1f5342e408 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -5593,31 +5593,42 @@ 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_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)) { + if (f->frametype == AST_FRAME_CONTROL && !(flags & AST_BRIDGE_IGNORE_SIGS)) { + switch (f->subclass.integer) { + case AST_CONTROL_VIDUPDATE: + case AST_CONTROL_SRCUPDATE: + case AST_CONTROL_SRCCHANGE: + case AST_CONTROL_T38_PARAMETERS: + ast_write(other, f); + break; + default: + *fo = f; + *rc = who; + res = AST_BRIDGE_COMPLETE; + break; + } + if (res == AST_BRIDGE_COMPLETE) { + break; + } + } else if (f->frametype == AST_FRAME_VOICE + || f->frametype == AST_FRAME_TEXT + || f->frametype == AST_FRAME_VIDEO + || f->frametype == AST_FRAME_IMAGE) { + ast_write(other, f); + } else if (f->frametype == AST_FRAME_DTMF) { /* monitored dtmf take out of the bridge. * check if we monitor the specific source. */ int monitored_source = (who == c0) ? AST_BRIDGE_DTMF_CHANNEL_0 : AST_BRIDGE_DTMF_CHANNEL_1; - if (f->frametype == AST_FRAME_DTMF && (flags & monitored_source)) { + + if (flags & monitored_source) { *rc = who; *fo = f; res = AST_BRIDGE_COMPLETE; /* Remove from native mode */ break; } - /* everything else goes to the other side */ ast_write(other, f); } ast_frfree(f); -- 2.47.3