summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-02-27 13:02:38 +0000
committerJoshua Colp <jcolp@digium.com>2017-02-27 12:12:22 -0600
commitff2b4308d1ab605861fb7a0931dc36ae1edff9fc (patch)
tree5be2e53fed5d4b81b3b6a0d42c06dc726860f661
parentdf22d297a64ee2ef53ea0296a353a5c90ae70ba2 (diff)
bridge_native_rtp: Handle case where channel joins already suspended.
The bridge_native_rtp module did not properly handle the case where a smart bridge operation occurs while a channel is suspended. In this scenario the module would incorrectly set up local or remote RTP bridging despite the media having to flow through Asterisk. The remote endpoint would see two media streams and experience wonky audio. The module has been changed so that it ensures both channels are not suspended when performing the native RTP bridging and this requirement has been documented in the bridge technology. ASTERISK-26781 Change-Id: Id4022d73ace837d4a293106445e3ade10dbc7c7c
-rw-r--r--bridges/bridge_native_rtp.c6
-rw-r--r--include/asterisk/bridge_technology.h3
2 files changed, 7 insertions, 2 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c
index e011f5037..77e321f4f 100644
--- a/bridges/bridge_native_rtp.c
+++ b/bridges/bridge_native_rtp.c
@@ -129,7 +129,7 @@ static void native_rtp_bridge_start(struct ast_bridge *bridge, struct ast_channe
{
struct ast_bridge_channel *bc0 = AST_LIST_FIRST(&bridge->channels);
struct ast_bridge_channel *bc1 = AST_LIST_LAST(&bridge->channels);
- enum ast_rtp_glue_result native_type;
+ enum ast_rtp_glue_result native_type = AST_RTP_GLUE_RESULT_FORBID;
struct ast_rtp_glue *glue0, *glue1;
RAII_VAR(struct ast_rtp_instance *, instance0, NULL, ao2_cleanup);
RAII_VAR(struct ast_rtp_instance *, instance1, NULL, ao2_cleanup);
@@ -145,7 +145,9 @@ static void native_rtp_bridge_start(struct ast_bridge *bridge, struct ast_channe
}
ast_channel_lock_both(bc0->chan, bc1->chan);
- native_type = native_rtp_bridge_get(bc0->chan, bc1->chan, &glue0, &glue1, &instance0, &instance1, &vinstance0, &vinstance1);
+ if (!bc0->suspended && !bc1->suspended) {
+ native_type = native_rtp_bridge_get(bc0->chan, bc1->chan, &glue0, &glue1, &instance0, &instance1, &vinstance0, &vinstance1);
+ }
switch (native_type) {
case AST_RTP_GLUE_RESULT_LOCAL:
diff --git a/include/asterisk/bridge_technology.h b/include/asterisk/bridge_technology.h
index 8df19d9e9..843d93ccf 100644
--- a/include/asterisk/bridge_technology.h
+++ b/include/asterisk/bridge_technology.h
@@ -110,6 +110,9 @@ struct ast_bridge_technology {
*
* \note The bridge technology must tollerate a failed to join channel
* until it can be kicked from the bridge.
+ *
+ * \note A channel may be in a suspended state already when joining a bridge
+ * technology. The technology must handle this case.
*/
int (*join)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
/*!