Fix CLI "bridge kick <bridge> <channel>" to check if the bridge needs dissolving.

SIP/foo -- Local;1==Local;2 -- .... -- Local;1==Local;2 -- SIP/bar
Kick a ;1 channel and the chain toward SIP/foo goes away.
Kick a ;2 channel and the chain toward SIP/bar goes away.

This can leave a local channel chain between the kicked ;1 and ;2 channels
that are orphaned until you manually request one of those channels to
hangup or request the bridge to dissolve.

* Added ast_bridge_kick() as a companion to ast_bridge_remove().  The
functional difference is that ast_bridge_kick() may dissolve the bridge as
a result of the channel leaving the bridge.

* Made CLI "bridge kick <bridge> <channel>" use ast_bridge_kick() instead
of ast_bridge_remove() so the bridge can dissolve if needed.

* Renamed bridge_channel_handle_hangup() to ast_bridge_channel_kick() and
made it accessible to other files.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396877 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett
2013-08-16 20:48:13 +00:00
parent 6399836f9b
commit 35b9c6a660
4 changed files with 78 additions and 34 deletions

View File

@@ -562,6 +562,37 @@ int ast_bridge_depart(struct ast_channel *chan);
*/
int ast_bridge_remove(struct ast_bridge *bridge, struct ast_channel *chan);
/*!
* \brief Kick a channel from a bridge
*
* \param bridge Bridge that the channel is to be kicked from
* \param chan Channel to kick
*
* \retval 0 on success
* \retval -1 on failure
*
* Example usage:
*
* \code
* ast_bridge_kick(bridge, chan);
* \endcode
*
* \details
* This kicks the channel pointed to by the chan pointer from
* the bridge pointed to by the bridge pointer and requests that
* it be hung up. Control over the channel will NOT be given to
* the calling thread.
*
* \note The functional difference between ast_bridge_kick() and
* ast_bridge_remove() is that the bridge may dissolve as a
* result of the channel being kicked.
*
* \note This API call can be used on channels that were added
* to the bridge using both ast_bridge_join and
* ast_bridge_impart.
*/
int ast_bridge_kick(struct ast_bridge *bridge, struct ast_channel *chan);
/*!
* \brief Merge two bridges together
*

View File

@@ -583,6 +583,19 @@ int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel,
int ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid,
const char *parker_uuid, const char *app_data);
/*!
* \brief Kick the channel out of the bridge.
* \since 12.0.0
*
* \param bridge_channel Which channel is being kicked or hungup.
*
* \note This is intended to be called by bridge hooks and the
* bridge channel thread.
*
* \return Nothing
*/
void ast_bridge_channel_kick(struct ast_bridge_channel *bridge_channel);
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif