mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-28 00:10:25 -07:00
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
This commit is contained in:
+9
-4
@@ -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) &&
|
||||
|
||||
Reference in New Issue
Block a user