From: Matthew Jordan Date: Thu, 29 Dec 2011 15:13:03 +0000 (+0000) Subject: Handle AST_CONTROL_UPDATE_RTP_PEER frames in local bridge loop X-Git-Tag: 1.8.9.0-rc1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5bdcc834dff9f5cf76fd46f388792e3632ea7df2;p=thirdparty%2Fasterisk.git Handle AST_CONTROL_UPDATE_RTP_PEER frames in local bridge loop Failing to handle AST_CONTROL_UPDATE_RTP_PEER frames in the local bridge loop causes the loop to exit prematurely. This causes a variety of negative side effects, depending on when the loop exits. This patch handles the frame by essentially swallowing the frame in the local loop, as the current channel drivers expect the RTP bridge to handle the frame, and, in the case of the local bridge loop, no additional action is necessary. (issue ASTERISK-19040) (issue ASTERISK-19128) (issue ASTERISK-17725) (issue ASTERISK-18340) (closes issue ASTERISK-19095) Reported by: Stefan Schmidt Tested by: Matt Jordan Review: https://reviewboard.asterisk.org/r/1640/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@349339 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/rtp_engine.c b/main/rtp_engine.c index a0dbf72e42..aa54388227 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -889,7 +889,8 @@ static enum ast_bridge_result local_bridge_loop(struct ast_channel *c0, struct a (fr->subclass.integer == AST_CONTROL_UNHOLD) || (fr->subclass.integer == AST_CONTROL_VIDUPDATE) || (fr->subclass.integer == AST_CONTROL_SRCUPDATE) || - (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS)) { + (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS) || + (fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) { /* If we are going on hold, then break callback mode and P2P bridging */ if (fr->subclass.integer == AST_CONTROL_HOLD) { if (instance0->engine->local_bridge) { @@ -910,7 +911,10 @@ static enum ast_bridge_result local_bridge_loop(struct ast_channel *c0, struct a instance0->bridged = instance1; instance1->bridged = instance0; } - ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen); + /* Since UPDATE_BRIDGE_PEER is only used by the bridging code, don't forward it */ + if (fr->subclass.integer != AST_CONTROL_UPDATE_RTP_PEER) { + ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen); + } ast_frfree(fr); } else if (fr->subclass.integer == AST_CONTROL_CONNECTED_LINE) { if (ast_channel_connected_line_macro(who, other, fr, other == c0, 1)) {