]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
bridge : Fix one-way direct-media when early bridging with native_rtp
authorJean Aunis <jean.aunis@prescom.fr>
Thu, 7 Sep 2017 09:41:09 +0000 (11:41 +0200)
committerJean Aunis <jean.aunis@prescom.fr>
Wed, 20 Sep 2017 14:04:41 +0000 (16:04 +0200)
When two channels were early bridged in a native_rtp bridge, the RTP description
on one side was not updated when the other side answered.
This patch forbids non-answered channels to enter a native_rtp bridge, and
triggers a bridge reconfiguration when an ANSWER frame is received.

ASTERISK-27257

Change-Id: If1aaee1b4ed9658a1aa91ab715ee0a6413b878df

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

index a1662589239d37e69ea86137e7e7374e2dbf6187..fc9d701058321237e645b742d32e7b66818b4109 100644 (file)
@@ -600,7 +600,8 @@ static int native_rtp_framehook_consume(void *data, enum ast_frame_type type)
  */
 static int native_rtp_bridge_capable(struct ast_channel *chan)
 {
-       return !ast_channel_has_hook_requiring_audio(chan);
+       return !ast_channel_has_hook_requiring_audio(chan)
+                       && ast_channel_state(chan) == AST_STATE_UP;
 }
 
 /*!
index fb275c149a3cf8b50407341d4f69ccb35740c1dc..8bac1e3ac4598408f6dc8cfacd78c64a515adbd0 100644 (file)
@@ -108,11 +108,13 @@ struct ast_bridge_technology {
         *
         * \note On entry, bridge is already locked.
         *
-        * \note The bridge technology must tollerate a failed to join channel
+        * \note The bridge technology must tolerate 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.
+        *
+        * \note A channel may not be answered when joining a bridge technology.
         */
        int (*join)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
        /*!
index 875d37da7f1a4474c07a4576260cd7bffc5094c1..7ef418ad5b36fd35eeb622f6719dd9c8e5b1f43a 100644 (file)
@@ -2258,6 +2258,10 @@ static void bridge_channel_handle_control(struct ast_bridge_channel *bridge_chan
        case AST_CONTROL_ANSWER:
                if (ast_channel_state(chan) != AST_STATE_UP) {
                        ast_answer(chan);
+                       ast_bridge_channel_lock_bridge(bridge_channel);
+                       bridge_channel->bridge->reconfigured = 1;
+                       bridge_reconfigured(bridge_channel->bridge, 0);
+                       ast_bridge_unlock(bridge_channel->bridge);
                } else {
                        ast_indicate(chan, -1);
                }