]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
bridge_native_rtp: Handle case where channel joins already suspended.
authorJoshua Colp <jcolp@digium.com>
Mon, 27 Feb 2017 13:02:38 +0000 (13:02 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 27 Feb 2017 13:02:38 +0000 (13:02 +0000)
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

bridges/bridge_native_rtp.c
include/asterisk/bridge_technology.h

index a106d2d5f3c17293eae6847a65a13ff2d3ae904d..a80ef4c5a6b1bcb26191a81c0f40f3ba8e10d756 100644 (file)
@@ -131,7 +131,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);
@@ -147,7 +147,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:
index 7f5d746f893fdc7e38a2ff62d7de77f200f5ecf6..402b54e989edc07c37406ba5068dad4a243e6ad9 100644 (file)
@@ -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);
        /*!