From: Kinsey Moore Date: Fri, 12 Sep 2014 18:18:44 +0000 (+0000) Subject: Bridging: Fix bouncing native bridge X-Git-Tag: 11.13.0-rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6badd734d34761f9aa59b8e3057c2591bfdc33b1;p=thirdparty%2Fasterisk.git Bridging: Fix bouncing native bridge This fixes a situation in Asterisk 1.8 and 11 where ast_channel_bridge could cause a bouncing native bridge. In the case of the dial_LS_options test, this was a remote RTP bridge which caused the audio path to continually cycle between Asterisk and the remote endpoints generating a large number of SIP messages and delaying the test long enough to cause it to fail (checking timing was part of the test). The root cause was that the code to decide whether to use native bridging was expecting a time-remaining value of 0 to be the default instead of the actual default value of -1. A value of 0 or negative numbers could also be generated by preceding code in some circumstances. Both issues are addressed in this patch. ASTERISK-24211 #close Reported by: Matt Jordan Review: https://reviewboard.asterisk.org/r/3987/ ........ Merged revisions 423006 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@423010 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/channel.c b/main/channel.c index d450f415b3..8be8fe7a31 100644 --- a/main/channel.c +++ b/main/channel.c @@ -7963,8 +7963,13 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (config->timelimit) { time_left_ms = config->timelimit - ast_tvdiff_ms(now, config->start_time); - if (time_left_ms < to) + if (time_left_ms < 0) { + time_left_ms = 0; + } + + if (time_left_ms < to) { to = time_left_ms; + } if (time_left_ms <= 0) { if (caller_warning && config->end_sound) @@ -7972,7 +7977,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (callee_warning && config->end_sound) bridge_playfile(c1, c0, config->end_sound, 0); *fo = NULL; - res = 0; + res = AST_BRIDGE_COMPLETE; ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s\r\nChannel2: %s", ast_channel_name(c0), ast_channel_name(c1)); break; } @@ -8015,7 +8020,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (ast_test_flag(ast_channel_flags(c0), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) || ast_test_flag(ast_channel_flags(c1), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1)) { *fo = NULL; - res = 0; + res = AST_BRIDGE_COMPLETE; ast_debug(1, "Bridge stops because we're zombie or need a soft hangup: c0=%s, c1=%s, flags: %s,%s,%s,%s\n", ast_channel_name(c0), ast_channel_name(c1), ast_test_flag(ast_channel_flags(c0), AST_FLAG_ZOMBIE) ? "Yes" : "No", @@ -8031,7 +8036,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (ast_channel_tech(c0)->bridge && /* if < 1 ms remains use generic bridging for accurate timing */ - (!config->timelimit || to > 1000 || to == 0) && + (!config->timelimit || to > 1000 || to == -1) && (ast_channel_tech(c0)->bridge == ast_channel_tech(c1)->bridge) && !ast_channel_monitor(c0) && !ast_channel_monitor(c1) && !ast_channel_audiohooks(c0) && !ast_channel_audiohooks(c1) &&