Asterisk - The Open Source Telephony Project  GIT-master-060ce10
Data Structures | Macros | Enumerations | Functions | Variables
bridge.c File Reference

Bridging API. More...

#include "asterisk.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/options.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/bridge.h"
#include "asterisk/bridge_internal.h"
#include "asterisk/bridge_channel_internal.h"
#include "asterisk/bridge_features.h"
#include "asterisk/bridge_basic.h"
#include "asterisk/bridge_technology.h"
#include "asterisk/bridge_channel.h"
#include "asterisk/bridge_after.h"
#include "asterisk/stasis_bridges.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/stasis_cache_pattern.h"
#include "asterisk/app.h"
#include "asterisk/file.h"
#include "asterisk/module.h"
#include "asterisk/astobj2.h"
#include "asterisk/pbx.h"
#include "asterisk/test.h"
#include "asterisk/_private.h"
#include "asterisk/heap.h"
#include "asterisk/say.h"
#include "asterisk/timing.h"
#include "asterisk/stringfields.h"
#include "asterisk/musiconhold.h"
#include "asterisk/features.h"
#include "asterisk/cli.h"
#include "asterisk/parking.h"
#include "asterisk/core_local.h"
#include "asterisk/core_unreal.h"
#include "asterisk/causes.h"

Go to the source code of this file.

Data Structures

struct  bridge_channel_impart_cond
 Internal bridge impart wait condition and associated conditional. More...
 
struct  bridge_channel_impart_ds_head
 
struct  bridge_manager_controller
 
struct  bridge_manager_request
 
struct  bridge_technologies
 
struct  merge_direction
 
struct  tech_deferred_destroy
 

Macros

#define ATTENDEDTRANSFER   "ATTENDEDTRANSFER"
 
#define BLINDTRANSFER   "BLINDTRANSFER"
 
#define BRIDGE_ARRAY_GROW   32
 
#define BRIDGE_ARRAY_START   128
 
#define BRIDGE_LOCK_ONE_OR_BOTH(b1, b2)
 
#define FORMAT_HDR   "%-36s %5s %-15s %-15s %s\n"
 
#define FORMAT_HDR   "%-20s %-20s %8s %s\n"
 
#define FORMAT_ROW   "%-36s %5u %-15s %-15s %s\n"
 
#define FORMAT_ROW   "%-20s %-20s %8u %s\n"
 
#define MAX_BRIDGEPEER_CHANS   (10 + 1)
 
#define UPDATE_BRIDGE_VARS_GET(chan, name, pvtid)
 

Enumerations

enum  bridge_allow_merge { MERGE_PROHIBITED, MERGE_NOT_ENOUGH_CHANNELS, MERGE_NO_MULTIMIX, MERGE_ALLOWED }
 
enum  bridge_allow_swap { SWAP_PROHIBITED, SWAP_TO_CHAN_BRIDGE, SWAP_TO_PEER_BRIDGE }
 

Functions

int __ast_bridge_technology_register (struct ast_bridge_technology *technology, struct ast_module *module)
 Register a bridge technology for use. More...
 
int ast_bridge_add_channel (struct ast_bridge *bridge, struct ast_channel *chan, struct ast_bridge_features *features, int play_tone, const char *xfersound)
 Add an arbitrary channel to a bridge. More...
 
struct ast_bridgeast_bridge_base_new (uint32_t capabilities, unsigned int flags, const char *creator, const char *name, const char *id)
 Create a new base class bridge. More...
 
int ast_bridge_depart (struct ast_channel *chan)
 Depart a channel from a bridge. More...
 
int ast_bridge_destroy (struct ast_bridge *bridge, int cause)
 Destroy a bridge. More...
 
int ast_bridge_dtmf_hook (struct ast_bridge_features *features, const char *dtmf, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach a DTMF hook to a bridge features structure. More...
 
void ast_bridge_features_cleanup (struct ast_bridge_features *features)
 Clean up the contents of a bridge features structure. More...
 
void ast_bridge_features_destroy (struct ast_bridge_features *features)
 Destroy an allocated bridge features struct. More...
 
int ast_bridge_features_do (enum ast_bridge_builtin_feature feature, struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 Invoke a built in feature hook now. More...
 
int ast_bridge_features_enable (struct ast_bridge_features *features, enum ast_bridge_builtin_feature feature, const char *dtmf, void *config, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Enable a built in feature on a bridge features structure. More...
 
int ast_bridge_features_init (struct ast_bridge_features *features)
 Initialize bridge features structure. More...
 
int ast_bridge_features_limits_construct (struct ast_bridge_features_limits *limits)
 Constructor function for ast_bridge_features_limits. More...
 
void ast_bridge_features_limits_destroy (struct ast_bridge_features_limits *limits)
 Destructor function for ast_bridge_features_limits. More...
 
void ast_bridge_features_merge (struct ast_bridge_features *into, const struct ast_bridge_features *from)
 Merge one ast_bridge_features into another. More...
 
struct ast_bridge_featuresast_bridge_features_new (void)
 Allocate a new bridge features struct. More...
 
int ast_bridge_features_register (enum ast_bridge_builtin_feature feature, ast_bridge_hook_callback callback, const char *dtmf)
 Register a handler for a built in feature. More...
 
void ast_bridge_features_remove (struct ast_bridge_features *features, enum ast_bridge_hook_remove_flags remove_flags)
 Remove marked bridge channel feature hooks. More...
 
void ast_bridge_features_set_flag (struct ast_bridge_features *features, unsigned int flag)
 Set a flag on a bridge channel features structure. More...
 
int ast_bridge_features_set_limits (struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
 Limit the amount of time a channel may stay in the bridge and optionally play warning messages as time runs out. More...
 
int ast_bridge_features_unregister (enum ast_bridge_builtin_feature feature)
 Unregister a handler for a built in feature. More...
 
struct ast_bridgeast_bridge_find_by_id (const char *bridge_id)
 Find bridge by id. More...
 
int ast_bridge_hangup_hook (struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach a hangup hook to a bridge features structure. More...
 
int ast_bridge_impart (struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, enum ast_bridge_impart_flags flags)
 Impart a channel to a bridge (non-blocking) More...
 
int ast_bridge_interval_hook (struct ast_bridge_features *features, enum ast_bridge_hook_timer_option flags, unsigned int interval, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach an interval hook to a bridge features structure. More...
 
int ast_bridge_interval_register (enum ast_bridge_builtin_interval interval, ast_bridge_builtin_set_limits_fn callback)
 Register a handler for a built in interval feature. More...
 
int ast_bridge_interval_unregister (enum ast_bridge_builtin_interval interval)
 
int ast_bridge_is_video_src (struct ast_bridge *bridge, struct ast_channel *chan)
 Determine if a channel is a video src for the bridge. More...
 
int ast_bridge_join (struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, struct ast_bridge_tech_optimizations *tech_args, enum ast_bridge_join_flags flags)
 Join a channel to a bridge (blocking) More...
 
int ast_bridge_join_hook (struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Unregisters a handler for a built in interval feature. More...
 
int ast_bridge_kick (struct ast_bridge *bridge, struct ast_channel *chan)
 Kick a channel from a bridge. More...
 
int ast_bridge_leave_hook (struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach a bridge channel leave hook to a bridge features structure. More...
 
int ast_bridge_merge (struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, int merge_best_direction, struct ast_channel **kick_me, unsigned int num_kick)
 Merge two bridges together. More...
 
void ast_bridge_merge_inhibit (struct ast_bridge *bridge, int request)
 Adjust the bridge merge inhibit request count. More...
 
int ast_bridge_move (struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_channel *chan, struct ast_channel *swap, int attempt_recovery)
 Move a channel from one bridge to another. More...
 
int ast_bridge_move_hook (struct ast_bridge_features *features, ast_bridge_move_indicate_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach a bridge channel move detection hook to a bridge features structure. More...
 
void ast_bridge_notify_masquerade (struct ast_channel *chan)
 Notify bridging that this channel was just masqueraded. More...
 
int ast_bridge_number_video_src (struct ast_bridge *bridge)
 Returns the number of video sources currently active in the bridge. More...
 
struct ast_channelast_bridge_peer (struct ast_bridge *bridge, struct ast_channel *chan)
 Get the channel's bridge peer only if the bridge is two-party. More...
 
struct ast_channelast_bridge_peer_nolock (struct ast_bridge *bridge, struct ast_channel *chan)
 Get the channel's bridge peer only if the bridge is two-party. More...
 
struct ao2_containerast_bridge_peers (struct ast_bridge *bridge)
 Get a container of all channels in the bridge. More...
 
struct ao2_containerast_bridge_peers_nolock (struct ast_bridge *bridge)
 Get a container of all channels in the bridge. More...
 
int ast_bridge_queue_action (struct ast_bridge *bridge, struct ast_frame *action)
 Put an action onto the specified bridge. More...
 
int ast_bridge_remove (struct ast_bridge *bridge, struct ast_channel *chan)
 Remove a channel from a bridge. More...
 
void ast_bridge_remove_video_src (struct ast_bridge *bridge, struct ast_channel *chan)
 remove a channel as a source of video for the bridge. More...
 
void ast_bridge_set_binaural_active (struct ast_bridge *bridge, unsigned int binaural_active)
 Activates the use of binaural signals in a conference bridge. More...
 
void ast_bridge_set_internal_sample_rate (struct ast_bridge *bridge, unsigned int sample_rate)
 Adjust the internal mixing sample rate of a bridge used during multimix mode. More...
 
void ast_bridge_set_maximum_sample_rate (struct ast_bridge *bridge, unsigned int sample_rate)
 Adjust the maximum mixing sample rate of a bridge used during multimix mode. More...
 
void ast_bridge_set_mixing_interval (struct ast_bridge *bridge, unsigned int mixing_interval)
 Adjust the internal mixing interval of a bridge used during multimix mode. More...
 
void ast_bridge_set_remb_estimated_bitrate (struct ast_bridge *bridge, float estimated_bitrate)
 Force the REMB report estimated bitrate to a specific max value. More...
 
void ast_bridge_set_remb_send_interval (struct ast_bridge *bridge, unsigned int remb_send_interval)
 Set the interval at which a combined REMB frame will be sent to video sources. More...
 
void ast_bridge_set_send_sdp_label (struct ast_bridge *bridge, unsigned int send_sdp_label)
 Controls whether to send a "label" attribute in each stream in an SDP. More...
 
void ast_bridge_set_sfu_video_mode (struct ast_bridge *bridge)
 Set the bridge to be a selective forwarding unit. More...
 
void ast_bridge_set_single_src_video_mode (struct ast_bridge *bridge, struct ast_channel *video_src_chan)
 Set a bridge to feed a single video source to all participants. More...
 
void ast_bridge_set_talker_src_video_mode (struct ast_bridge *bridge)
 Set the bridge to pick the strongest talker supporting video as the single source video feed. More...
 
void ast_bridge_set_transfer_variables (struct ast_channel *chan, const char *value, int attended)
 Set the relevant transfer variables for a single channel. More...
 
void ast_bridge_set_video_update_discard (struct ast_bridge *bridge, unsigned int video_update_discard)
 Set the amount of time to discard subsequent video updates after a video update has been sent. More...
 
int ast_bridge_suspend (struct ast_bridge *bridge, struct ast_channel *chan)
 Suspend a channel temporarily from a bridge. More...
 
int ast_bridge_talk_detector_hook (struct ast_bridge_features *features, ast_bridge_talking_indicate_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 Attach a bridge channel talk detection hook to a bridge features structure. More...
 
void ast_bridge_technology_suspend (struct ast_bridge_technology *technology)
 Suspend a bridge technology from consideration. More...
 
int ast_bridge_technology_unregister (struct ast_bridge_technology *technology)
 Unregister a bridge technology from use. More...
 
void ast_bridge_technology_unsuspend (struct ast_bridge_technology *technology)
 Unsuspend a bridge technology. More...
 
struct ast_bridgeast_bridge_transfer_acquire_bridge (struct ast_channel *chan)
 Acquire the channel's bridge for transfer purposes. More...
 
enum ast_transfer_result ast_bridge_transfer_attended (struct ast_channel *to_transferee, struct ast_channel *to_transfer_target)
 Attended transfer. More...
 
enum ast_transfer_result ast_bridge_transfer_blind (int is_external, struct ast_channel *transferer, const char *exten, const char *context, transfer_channel_cb new_channel_cb, void *user_data)
 Blind transfer target to the extension and context provided. More...
 
int ast_bridge_unreal_optimize_out (struct ast_channel *chan, struct ast_channel *peer, struct ast_unreal_pvt *pvt)
 Check and optimize out the unreal channels between bridges. More...
 
int ast_bridge_unsuspend (struct ast_bridge *bridge, struct ast_channel *chan)
 Unsuspend a channel from a bridge. More...
 
void ast_bridge_update_talker_src_video_mode (struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyframe)
 Update information about talker energy for talker src video mode. More...
 
void ast_bridge_vars_set (struct ast_channel *chan, const char *name, const char *pvtid)
 Sets BRIDGECHANNEL and BRIDGEPVTCALLID for a channel. More...
 
const char * ast_bridge_video_mode_to_string (enum ast_bridge_video_mode_type video_mode)
 Converts an enum representation of a bridge video mode to string. More...
 
struct ao2_containerast_bridges (void)
 Returns the global bridges container. More...
 
enum ast_bridge_optimization ast_bridges_allow_optimization (struct ast_bridge *chan_bridge, struct ast_bridge *peer_bridge)
 Determine if bridges allow for optimization to occur betweem them. More...
 
int ast_bridging_init (void)
 Initialize the bridging system. More...
 
void ast_brige_set_remb_behavior (struct ast_bridge *bridge, enum ast_bridge_video_sfu_remb_behavior behavior)
 Set the REMB report generation behavior on a bridge. More...
 
static enum ast_transfer_result attended_transfer_bridge (struct ast_channel *chan1, struct ast_channel *chan2, struct ast_bridge *bridge1, struct ast_bridge *bridge2, struct ast_attended_transfer_message *transfer_msg)
 Perform an attended transfer of a bridge. More...
 
static enum ast_transfer_result blind_transfer_bridge (int is_external, struct ast_channel *transferer, struct ast_bridge *bridge, const char *exten, const char *context, struct ast_channel *transferee, transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper, struct ast_blind_transfer_message *transfer_message)
 
static void bridge_action_bridge (struct ast_bridge *bridge, struct ast_frame *action)
 
struct ast_bridgebridge_alloc (size_t size, const struct ast_bridge_methods *v_table)
 
static int bridge_allows_optimization (struct ast_bridge *bridge)
 
static void bridge_base_destroy (struct ast_bridge *self)
 
static void bridge_base_dissolving (struct ast_bridge *self)
 
static int bridge_base_get_merge_priority (struct ast_bridge *self)
 
struct ast_bridgebridge_base_init (struct ast_bridge *self, uint32_t capabilities, unsigned int flags, const char *creator, const char *name, const char *id)
 Initialize the base class of the bridge. More...
 
static void bridge_base_notify_masquerade (struct ast_bridge *self, struct ast_bridge_channel *bridge_channel)
 
static void bridge_base_pull (struct ast_bridge *self, struct ast_bridge_channel *bridge_channel)
 
static int bridge_base_push (struct ast_bridge *self, struct ast_bridge_channel *bridge_channel, struct ast_bridge_channel *swap)
 
static int bridge_base_push_peek (struct ast_bridge *self, struct ast_bridge_channel *bridge_channel, struct ast_bridge_channel *swap)
 
static void bridge_channel_change_bridge (struct ast_bridge_channel *bridge_channel, struct ast_bridge *new_bridge)
 
static void bridge_channel_complete_join (struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 
static void * bridge_channel_depart_thread (void *data)
 Thread responsible for imparted bridged channels to be departed. More...
 
static int bridge_channel_impart_add (struct ast_channel *chan, struct bridge_channel_impart_cond *cond)
 
static void bridge_channel_impart_ds_head_dtor (void *doomed)
 
static void bridge_channel_impart_ds_head_fixup (void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
 
static void bridge_channel_impart_ds_head_signal (struct bridge_channel_impart_ds_head *ds_head)
 
void bridge_channel_impart_signal (struct ast_channel *chan)
 Signal imparting threads to wake up. More...
 
static void bridge_channel_impart_wait (struct bridge_channel_impart_cond *cond)
 
static void * bridge_channel_ind_thread (void *data)
 Thread responsible for independent imparted bridged channels. More...
 
static void bridge_channel_moving (struct ast_bridge_channel *bridge_channel, struct ast_bridge *src, struct ast_bridge *dst)
 
static void bridge_cleanup (void)
 
static void bridge_complete_join (struct ast_bridge *bridge)
 
void bridge_dissolve (struct ast_bridge *bridge, int cause)
 
static void bridge_dissolve_check_stolen (struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 
void bridge_do_merge (struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_bridge_channel **kick_me, unsigned int num_kick, unsigned int optimized)
 
int bridge_do_move (struct ast_bridge *dst_bridge, struct ast_bridge_channel *bridge_channel, int attempt_recovery, unsigned int optimized)
 
static int bridge_dtmf_hook_sort (const void *obj_left, const void *obj_right, int flags)
 
struct ast_bridge_channelbridge_find_channel (struct ast_bridge *bridge, struct ast_channel *chan)
 
static void bridge_handle_actions (struct ast_bridge *bridge)
 
static void bridge_hook_destroy (void *vhook)
 
static struct ast_bridge_hookbridge_hook_generic (size_t size, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
 
static int bridge_impart_internal (struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, enum ast_bridge_impart_flags flags, struct bridge_channel_impart_cond *cond)
 
static struct bridge_manager_controllerbridge_manager_create (void)
 
static void bridge_manager_destroy (void *obj)
 
static void bridge_manager_service (struct ast_bridge *bridge)
 
static void bridge_manager_service_req (struct ast_bridge *bridge)
 
static void * bridge_manager_thread (void *data)
 
static struct merge_direction bridge_merge_determine_direction (struct ast_bridge *bridge1, struct ast_bridge *bridge2)
 
void bridge_merge_inhibit_nolock (struct ast_bridge *bridge, int request)
 
static int bridge_merge_locked (struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, int merge_best_direction, struct ast_channel **kick_me, unsigned int num_kick)
 
static int bridge_move_locked (struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_channel *chan, struct ast_channel *swap, int attempt_recovery)
 
static int bridge_other_hook (struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
 
static void bridge_prnt_obj (void *v_obj, void *where, ao2_prnt_fn *prnt)
 
static void bridge_queue_action_nodup (struct ast_bridge *bridge, struct ast_frame *action)
 
void bridge_reconfigured (struct ast_bridge *bridge, unsigned int colp_update)
 
static void bridge_reconfigured_connected_line_update (struct ast_bridge *bridge)
 
struct ast_bridgebridge_register (struct ast_bridge *bridge)
 Register the new bridge with the system. More...
 
static int bridge_show_specific_print_channel (void *obj, void *arg, int flags)
 Internal callback function for sending channels in a bridge to the CLI. More...
 
static int bridge_sort_cmp (const void *obj_left, const void *obj_right, int flags)
 
static enum ast_transfer_result bridge_swap_attended_transfer (struct ast_bridge *dest_bridge, struct ast_bridge_channel *source_bridge_channel, struct ast_channel *swap_channel)
 
static void bridge_tech_deferred_destroy (struct ast_bridge *bridge, struct ast_frame *action)
 
static enum bridge_allow_merge bridges_allow_merge_optimization (struct ast_bridge *chan_bridge, struct ast_bridge *peer_bridge, int num_kick_channels, struct merge_direction *merge)
 
static enum bridge_allow_swap bridges_allow_swap_optimization (struct ast_bridge *chan_bridge, struct ast_bridge *peer_bridge)
 
static int channel_cmp (void *obj, void *arg, int flags)
 
static int channel_hash (const void *obj, int flags)
 
static void check_bridge_play_sound (struct ast_bridge_channel *bridge_channel)
 
static void check_bridge_play_sounds (struct ast_bridge *bridge)
 
static void cleanup_video_mode (struct ast_bridge *bridge)
 
static char * complete_bridge_live (const char *word)
 
static int complete_bridge_live_search (void *obj, void *arg, int flags)
 
static char * complete_bridge_participant (const char *bridge_name, const char *word)
 
static char * complete_bridge_technology (const char *word)
 
static void destroy_bridge (void *obj)
 
static void fill_bridgepeer_buf (char *buf, unsigned int cur_idx, const char *names[], unsigned int num_names)
 
static struct ast_bridge_technologyfind_best_technology (uint32_t capabilities, struct ast_bridge *bridge)
 Helper function used to find the "best" bridge technology given specified capabilities. More...
 
static struct ast_channelget_transferee (struct ao2_container *channels, struct ast_channel *transferer)
 
static char * handle_bridge_kick_channel (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_bridge_show_all (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_bridge_show_specific (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_bridge_technology_show (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_bridge_technology_suspend (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int handle_manager_bridge_tech_suspend (struct mansession *s, const struct message *m, int suspend)
 
static int hook_remove_match (void *obj, void *arg, int flags)
 
static void hooks_remove_container (struct ao2_container *hooks, enum ast_bridge_hook_remove_flags remove_flags)
 
static void hooks_remove_heap (struct ast_heap *hooks, enum ast_bridge_hook_remove_flags remove_flags)
 
static int interval_hook_time_cmp (void *a, void *b)
 
static int interval_wrapper_cb (struct ast_bridge_channel *bridge_channel, void *obj)
 Wrapper for interval hooks that calls into the wrapped hook. More...
 
static void interval_wrapper_pvt_dtor (void *obj)
 Destructor for the hook wrapper. More...
 
static void kick_it (struct ast_bridge_channel *bridge_channel, const void *payload, size_t payload_size)
 
static int manager_bridge_tech_list (struct mansession *s, const struct message *m)
 
static int manager_bridge_tech_suspend (struct mansession *s, const struct message *m)
 
static int manager_bridge_tech_unsuspend (struct mansession *s, const struct message *m)
 
static int merge_container_cb (void *obj, void *data, int flags)
 Callback for merging hook ao2_containers. More...
 
static struct ast_bridgeoptimize_lock_chan_stack (struct ast_channel *chan)
 
static struct ast_bridgeoptimize_lock_peer_stack (struct ast_channel *peer)
 
static void set_bridge_peer_vars (struct ast_bridge *bridge)
 
static void set_bridge_peer_vars_2party (struct ast_channel *c0, struct ast_channel *c1)
 
static void set_bridge_peer_vars_holding (struct ast_bridge *bridge)
 
static void set_bridge_peer_vars_multiparty (struct ast_bridge *bridge)
 
static void set_transfer_variables_all (struct ast_channel *transferer, struct ao2_container *channels, int is_attended)
 
static int smart_bridge_operation (struct ast_bridge *bridge)
 
static const char * tech_capability2str (uint32_t capabilities)
 
static int try_merge_optimize_out (struct ast_bridge *chan_bridge, struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge, struct ast_bridge_channel *peer_bridge_channel, struct ast_unreal_pvt *pvt)
 
static enum ast_transfer_result try_parking (struct ast_channel *transferer, const char *context, const char *exten, transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper)
 
static int try_swap_optimize_out (struct ast_bridge *chan_bridge, struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge, struct ast_bridge_channel *peer_bridge_channel, struct ast_unreal_pvt *pvt)
 
static enum ast_transfer_result two_bridge_attended_transfer (struct ast_channel *to_transferee, struct ast_bridge_channel *to_transferee_bridge_channel, struct ast_channel *to_transfer_target, struct ast_bridge_channel *to_target_bridge_channel, struct ast_bridge *to_transferee_bridge, struct ast_bridge *to_target_bridge, struct ast_attended_transfer_message *transfer_msg)
 
static void wrap_hook (struct ast_bridge_features *features, struct ast_bridge_hook_timer *hook)
 Wrap the provided interval hook and add it to features. More...
 

Variables

struct ast_bridge_methods ast_bridge_base_v_table
 Bridge base class virtual method table. More...
 
static const struct ast_datastore_info bridge_channel_impart_ds_info
 
static struct ast_cli_entry bridge_cli []
 
static struct bridge_manager_controllerbridge_manager
 
static struct bridge_technologies bridge_technologies = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 
static struct ao2_containerbridges
 
static char builtin_features_dtmf [AST_BRIDGE_BUILTIN_END][MAXIMUM_DTMF_FEATURE_STRING]
 
static ast_bridge_hook_callback builtin_features_handlers [AST_BRIDGE_BUILTIN_END]
 
static ast_bridge_builtin_set_limits_fn builtin_interval_handlers [AST_BRIDGE_BUILTIN_INTERVAL_END]
 
static unsigned int optimization_id
 

Detailed Description

Bridging API.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file bridge.c.

Macro Definition Documentation

◆ ATTENDEDTRANSFER

#define ATTENDEDTRANSFER   "ATTENDEDTRANSFER"

Definition at line 139 of file bridge.c.

Referenced by ast_bridge_set_transfer_variables(), and attended_transfer_bridge().

◆ BLINDTRANSFER

#define BLINDTRANSFER   "BLINDTRANSFER"

Definition at line 136 of file bridge.c.

Referenced by ast_bridge_set_transfer_variables(), and blind_transfer_bridge().

◆ BRIDGE_ARRAY_GROW

#define BRIDGE_ARRAY_GROW   32

Definition at line 133 of file bridge.c.

◆ BRIDGE_ARRAY_START

#define BRIDGE_ARRAY_START   128

Definition at line 130 of file bridge.c.

◆ BRIDGE_LOCK_ONE_OR_BOTH

#define BRIDGE_LOCK_ONE_OR_BOTH (   b1,
  b2 
)

◆ FORMAT_HDR [1/2]

#define FORMAT_HDR   "%-36s %5s %-15s %-15s %s\n"

◆ FORMAT_HDR [2/2]

#define FORMAT_HDR   "%-20s %-20s %8s %s\n"

◆ FORMAT_ROW [1/2]

#define FORMAT_ROW   "%-36s %5u %-15s %-15s %s\n"

◆ FORMAT_ROW [2/2]

#define FORMAT_ROW   "%-20s %-20s %8u %s\n"

◆ MAX_BRIDGEPEER_CHANS

#define MAX_BRIDGEPEER_CHANS   (10 + 1)

◆ UPDATE_BRIDGE_VARS_GET

#define UPDATE_BRIDGE_VARS_GET (   chan,
  name,
  pvtid 
)

Enumeration Type Documentation

◆ bridge_allow_merge

Enumerator
MERGE_PROHIBITED 

Bridge properties prohibit merge optimization

MERGE_NOT_ENOUGH_CHANNELS 

Merge optimization cannot occur because the source bridge has too few channels

MERGE_NO_MULTIMIX 

Merge optimization cannot occur because multimix capability could not be requested

MERGE_ALLOWED 

Merge optimization allowed between bridges

Definition at line 2859 of file bridge.c.

2859  {
2860  /*! Bridge properties prohibit merge optimization */
2862  /*! Merge optimization cannot occur because the source bridge has too few channels */
2864  /*! Merge optimization cannot occur because multimix capability could not be requested */
2866  /*! Merge optimization allowed between bridges */
2867  MERGE_ALLOWED,
2868 };

◆ bridge_allow_swap

Enumerator
SWAP_PROHIBITED 

Bridges cannot allow for a swap optimization to occur

SWAP_TO_CHAN_BRIDGE 

Bridge swap optimization can occur into the chan_bridge

SWAP_TO_PEER_BRIDGE 

Bridge swap optimization can occur into the peer_bridge

Definition at line 2720 of file bridge.c.

2720  {
2721  /*! Bridges cannot allow for a swap optimization to occur */
2723  /*! Bridge swap optimization can occur into the chan_bridge */
2725  /*! Bridge swap optimization can occur into the peer_bridge */
2727 };

Function Documentation

◆ __ast_bridge_technology_register()

int __ast_bridge_technology_register ( struct ast_bridge_technology technology,
struct ast_module mod 
)

Register a bridge technology for use.

Parameters
technologyThe bridge technology to register
modThe module that is registering the bridge technology
Return values
0on success
-1on failure

Example usage:

ast_bridge_technology_register(&simple_bridge_tech);

This registers a bridge technology declared as the structure simple_bridge_tech with the bridging core and makes it available for use when creating bridges.

Definition at line 214 of file bridge.c.

References ast_log, AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero, ast_verb, ast_bridge_technology::capabilities, LOG_WARNING, ast_bridge_technology::mod, ast_bridge_technology::name, ast_bridge_technology::preference, and ast_bridge_technology::write.

215 {
216  struct ast_bridge_technology *current;
217 
218  /* Perform a sanity check to make sure the bridge technology conforms to our needed requirements */
219  if (ast_strlen_zero(technology->name)
220  || !technology->capabilities
221  || !technology->write) {
222  ast_log(LOG_WARNING, "Bridge technology %s failed registration sanity check.\n",
223  technology->name);
224  return -1;
225  }
226 
228 
229  /* Look for duplicate bridge technology already using this name, or already registered */
231  if ((!strcasecmp(current->name, technology->name)) || (current == technology)) {
232  ast_log(LOG_WARNING, "A bridge technology of %s already claims to exist in our world.\n",
233  technology->name);
235  return -1;
236  }
237  }
238 
239  /* Copy module pointer so reference counting can keep the module from unloading */
240  technology->mod = module;
241 
242  /* Find the correct position to insert the technology. */
244  /* Put the highest preference tech's first in the list. */
245  if (technology->preference >= current->preference) {
247 
248  break;
249  }
250  }
252 
253  if (!current) {
254  /* Insert our new bridge technology to the end of the list. */
256  }
257 
259 
260  ast_verb(2, "Registered bridge technology %s\n", technology->name);
261 
262  return 0;
263 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define LOG_WARNING
Definition: logger.h:274
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_verb(level,...)
Definition: logger.h:455
#define ast_log
Definition: astobj2.c:42
int(* write)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
Write a frame into the bridging technology instance for a bridge.
enum ast_bridge_preference preference
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
#define AST_RWLIST_INSERT_BEFORE_CURRENT
Definition: linkedlists.h:609
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
struct ast_module * mod
#define ast_strlen_zero(a)
Definition: muted.c:73
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:740
Structure that is the essence of a bridge technology.
Definition: search.h:40
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:616

◆ ast_bridge_add_channel()

int ast_bridge_add_channel ( struct ast_bridge bridge,
struct ast_channel chan,
struct ast_bridge_features features,
int  play_tone,
const char *  xfersound 
)

Add an arbitrary channel to a bridge.

Since
12.0.0

The channel that is being added to the bridge can be in any state: unbridged, bridged, answered, unanswered, etc. The channel will be added asynchronously, meaning that when this function returns once the channel has been added to the bridge, not once the channel has been removed from the bridge.

In addition, a tone can optionally be played to the channel once the channel is placed into the bridge.

Note
When this function returns, there is no guarantee that the channel that was passed in is valid any longer. Do not attempt to operate on the channel after this function returns.
Parameters
bridgeBridge to which the channel should be added
chanThe channel to add to the bridge
featuresFeatures for this channel in the bridge
play_toneIndicates if a tone should be played to the channel
xfersoundSound that should be used to indicate transfer with play_tone
Note
The features parameter must be NULL or obtained by ast_bridge_features_new(). You must not dereference features after calling even if the call fails.
Return values
0Success
-1Failure

Definition at line 2519 of file bridge.c.

References ao2_cleanup, ast_answer(), ast_assert, ast_bridge_channel_queue_playfile(), ast_bridge_features_destroy(), ast_bridge_impart(), AST_BRIDGE_IMPART_CHAN_INDEPENDENT, ast_bridge_lock_both, ast_bridge_unlock, ast_channel_get_bridge(), ast_channel_get_bridge_channel(), ast_channel_lock, ast_channel_name(), ast_channel_pbx(), ast_channel_ref, ast_channel_unlock, ast_channel_unref, ast_channel_yank(), ast_hangup(), ast_log, ast_moh_stop(), AST_STATE_UP, ast_strlen_zero, bridge_dissolve_check_stolen(), bridge_find_channel(), bridge_move_locked(), LOG_WARNING, NULL, and RAII_VAR.

Referenced by action_bridge(), bridge_exec(), and manager_park_unbridged().

2521 {
2522  RAII_VAR(struct ast_bridge *, chan_bridge, NULL, ao2_cleanup);
2523  RAII_VAR(struct ast_channel *, yanked_chan, NULL, ao2_cleanup);
2524 
2525  ast_moh_stop(chan);
2526 
2527  ast_channel_lock(chan);
2528  chan_bridge = ast_channel_get_bridge(chan);
2529  ast_channel_unlock(chan);
2530 
2531  if (chan_bridge) {
2532  struct ast_bridge_channel *bridge_channel;
2533 
2534  /* The channel is in a bridge so it is not getting any new features. */
2535  ast_bridge_features_destroy(features);
2536 
2537  ast_bridge_lock_both(bridge, chan_bridge);
2538  bridge_channel = bridge_find_channel(chan_bridge, chan);
2539 
2540  if (bridge_move_locked(bridge, chan_bridge, chan, NULL, 1)) {
2541  ast_bridge_unlock(chan_bridge);
2542  ast_bridge_unlock(bridge);
2543  return -1;
2544  }
2545 
2546  /*
2547  * bridge_move_locked() will implicitly ensure that
2548  * bridge_channel is not NULL.
2549  */
2550  ast_assert(bridge_channel != NULL);
2551 
2552  /*
2553  * Additional checks if the channel we just stole dissolves the
2554  * original bridge.
2555  */
2556  bridge_dissolve_check_stolen(chan_bridge, bridge_channel);
2557  ast_bridge_unlock(chan_bridge);
2558  ast_bridge_unlock(bridge);
2559  } else {
2560  /* Slightly less easy case. We need to yank channel A from
2561  * where he currently is and impart him into our bridge.
2562  */
2563  yanked_chan = ast_channel_yank(chan);
2564  if (!yanked_chan) {
2565  ast_log(LOG_WARNING, "Could not gain control of channel %s\n", ast_channel_name(chan));
2566  ast_bridge_features_destroy(features);
2567  return -1;
2568  }
2569  if (ast_channel_state(yanked_chan) != AST_STATE_UP) {
2570  ast_answer(yanked_chan);
2571  }
2572  ast_channel_ref(yanked_chan);
2573  if (ast_bridge_impart(bridge, yanked_chan, NULL, features,
2575  /* It is possible for us to yank a channel and have some other
2576  * thread start a PBX on the channl after we yanked it. In particular,
2577  * this can theoretically happen on the ;2 of a Local channel if we
2578  * yank it prior to the ;1 being answered. Make sure that it isn't
2579  * executing a PBX before hanging it up.
2580  */
2581  if (ast_channel_pbx(yanked_chan)) {
2582  ast_channel_unref(yanked_chan);
2583  } else {
2584  ast_hangup(yanked_chan);
2585  }
2586  return -1;
2587  }
2588  }
2589 
2590  if (play_tone && !ast_strlen_zero(xfersound)) {
2591  struct ast_channel *play_chan = yanked_chan ?: chan;
2592  RAII_VAR(struct ast_bridge_channel *, play_bridge_channel, NULL, ao2_cleanup);
2593 
2594  ast_channel_lock(play_chan);
2595  play_bridge_channel = ast_channel_get_bridge_channel(play_chan);
2596  ast_channel_unlock(play_chan);
2597 
2598  if (!play_bridge_channel) {
2599  ast_log(LOG_WARNING, "Unable to play tone for channel %s. No longer in a bridge.\n",
2600  ast_channel_name(play_chan));
2601  } else {
2602  ast_bridge_channel_queue_playfile(play_bridge_channel, NULL, xfersound, NULL);
2603  }
2604  }
2605  return 0;
2606 }
static int bridge_move_locked(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_channel *chan, struct ast_channel *swap, int attempt_recovery)
Definition: bridge.c:2447
#define ast_channel_lock(chan)
Definition: channel.h:2890
Main Channel structure associated with a channel.
#define ast_bridge_lock_both(bridge1, bridge2)
Lock two bridges.
Definition: bridge.h:500
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2926
#define LOG_WARNING
Definition: logger.h:274
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
ast_channel_state
ast_channel states
Definition: channelstate.h:35
struct ast_channel * ast_channel_yank(struct ast_channel *yankee)
Gain control of a channel in the system.
Definition: channel.c:10651
#define ast_assert(a)
Definition: utils.h:650
static void bridge_dissolve_check_stolen(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
Definition: bridge.c:361
#define NULL
Definition: resample.c:96
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
Definition: channel.c:7739
#define ast_log
Definition: astobj2.c:42
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10592
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:851
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
Structure that contains information about a bridge.
Definition: bridge.h:357
int ast_bridge_impart(struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, enum ast_bridge_impart_flags flags)
Impart a channel to a bridge (non-blocking)
Definition: bridge.c:1924
#define ast_strlen_zero(a)
Definition: muted.c:73
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
void ast_bridge_features_destroy(struct ast_bridge_features *features)
Destroy an allocated bridge features struct.
Definition: bridge.c:3741
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2534
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel's bridge pointer.
Definition: channel.c:10640
Structure that contains information regarding a channel in a bridge.
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2915
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
int ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
Queue a bridge action play file frame onto the bridge channel.
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2800

◆ ast_bridge_base_new()

struct ast_bridge* ast_bridge_base_new ( uint32_t  capabilities,
unsigned int  flags,
const char *  creator,
const char *  name,
const char *  id 
)

Create a new base class bridge.

Parameters
capabilitiesThe capabilities that we require to be used on the bridge
flagsFlags that will alter the behavior of the bridge
creatorEntity that created the bridge (optional)
nameName given to the bridge by its creator (optional, requires named creator)
idUnique ID given to the bridge by its creator (optional)
Return values
apointer to a new bridge on success
NULLon failure

Example usage:

This creates a no frills two party bridge that will be destroyed once one of the channels hangs up.

Definition at line 960 of file bridge.c.

References bridge_manager_request::bridge, bridge_alloc(), bridge_base_init(), and bridge_register().

Referenced by AST_TEST_DEFINE(), get_wait_bridge_wrapper(), and join_conference_bridge().

961 {
962  void *bridge;
963 
964  bridge = bridge_alloc(sizeof(struct ast_bridge), &ast_bridge_base_v_table);
965  bridge = bridge_base_init(bridge, capabilities, flags, creator, name, id);
966  bridge = bridge_register(bridge);
967  return bridge;
968 }
struct ast_bridge * bridge_alloc(size_t size, const struct ast_bridge_methods *v_table)
Definition: bridge.c:724
struct ast_bridge_methods ast_bridge_base_v_table
Bridge base class virtual method table.
Definition: bridge.c:949
struct ast_bridge * bridge_register(struct ast_bridge *bridge)
Register the new bridge with the system.
Definition: bridge.c:709
Structure that contains information about a bridge.
Definition: bridge.h:357
static const char name[]
Definition: cdr_mysql.c:74
const ast_string_field creator
Definition: bridge.h:409
struct ast_bridge * bridge_base_init(struct ast_bridge *self, uint32_t capabilities, unsigned int flags, const char *creator, const char *name, const char *id)
Initialize the base class of the bridge.
Definition: bridge.c:760

◆ ast_bridge_depart()

int ast_bridge_depart ( struct ast_channel chan)

Depart a channel from a bridge.

Parameters
chanChannel to depart
Note
chan is locked by this function.
Return values
0on success
-1on failure

Example usage:

This removes the channel pointed to by the chan pointer from any bridge it may be in and gives control to the calling thread. This does not hang up the channel.

Note
This API call can only be used on channels that were added to the bridge using the ast_bridge_impart API call with the AST_BRIDGE_IMPART_CHAN_DEPARTABLE flag.

Definition at line 1952 of file bridge.c.

References ao2_ref, ast_assert, ast_bridge_channel_leave_bridge(), AST_CAUSE_NORMAL_CLEARING, ast_channel_internal_bridge_channel(), ast_channel_internal_bridge_channel_set(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_debug, ast_log, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, ast_bridge_channel::chan, ast_bridge_channel::depart_wait, LOG_ERROR, NULL, SCOPE_TRACE, and ast_bridge_channel::thread.

Referenced by app_control_continue(), AST_TEST_DEFINE(), control_swap_channel_in_bridge(), depart_channel(), and stasis_app_exec().

1953 {
1954  struct ast_bridge_channel *bridge_channel;
1955  int departable;
1956  SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
1957 
1958  ast_channel_lock(chan);
1959  bridge_channel = ast_channel_internal_bridge_channel(chan);
1960  departable = bridge_channel && bridge_channel->depart_wait;
1961  ast_channel_unlock(chan);
1962  if (!departable) {
1963  ast_log(LOG_ERROR, "Channel %s cannot be departed.\n",
1964  ast_channel_name(chan));
1965  /*
1966  * Should never happen. It likely means that
1967  * ast_bridge_depart() is called by two threads for the same
1968  * channel, the channel was never imparted to be departed, or it
1969  * has already been departed.
1970  */
1971  ast_assert(0);
1972  return -1;
1973  }
1974 
1975  /*
1976  * We are claiming the bridge_channel reference held by
1977  * bridge_channel_depart_thread().
1978  */
1979 
1980  ast_bridge_channel_leave_bridge(bridge_channel,
1982 
1983  /* Wait for the depart thread to die */
1984  ast_debug(1, "Waiting for %p(%s) bridge thread to die.\n",
1985  bridge_channel, ast_channel_name(bridge_channel->chan));
1986  pthread_join(bridge_channel->thread, NULL);
1987 
1988  ast_channel_lock(chan);
1990  ast_channel_unlock(chan);
1991 
1992  /* We can get rid of the bridge_channel after the depart thread has died. */
1993  ao2_ref(bridge_channel, -1);
1994  return 0;
1995 }
void ast_channel_internal_bridge_channel_set(struct ast_channel *chan, struct ast_bridge_channel *value)
#define ast_channel_lock(chan)
Definition: channel.h:2890
#define SCOPE_TRACE(__level,...)
Definition: logger.h:883
#define ast_assert(a)
Definition: utils.h:650
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define ast_log
Definition: astobj2.c:42
#define AST_CAUSE_NORMAL_CLEARING
Definition: causes.h:105
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
#define LOG_ERROR
Definition: logger.h:285
void ast_bridge_channel_leave_bridge(struct ast_bridge_channel *bridge_channel, enum bridge_channel_state new_state, int cause)
Set bridge channel state to leave bridge (if not leaving already).
#define ast_channel_unlock(chan)
Definition: channel.h:2891
struct ast_channel * chan
Structure that contains information regarding a channel in a bridge.
const char * ast_channel_name(const struct ast_channel *chan)
unsigned int depart_wait

◆ ast_bridge_destroy()

int ast_bridge_destroy ( struct ast_bridge bridge,
int  cause 
)

Destroy a bridge.

Parameters
bridgeBridge to destroy
causeCause of bridge being destroyed. (If cause <= 0 then use AST_CAUSE_NORMAL_CLEARING)
Return values
0on success
-1on failure

Example usage:

This destroys a bridge that was previously created.

Note
While this function will kick all channels out of the bridge, channels that were added to the bridge using ast_bridge_impart() with the flag AST_BRIDGE_IMPART_CHAN_DEPARTABLE set must have ast_bridge_depart() called on them.

Definition at line 970 of file bridge.c.

References ao2_ref, ast_bridge_lock, ast_bridge_unlock, ast_debug, bridge_dissolve(), and ast_bridge::uniqueid.

Referenced by action_bridge(), agent_connect_caller(), agent_logout(), agent_pvt_destructor(), agent_request_exec(), agent_run(), ast_bridge_call_with_flags(), attended_transfer_properties_shutdown(), bridge_create_common(), bridge_exec(), bridge_register(), caller_abort_agent(), destroy_conference_bridge(), fail_enter(), handle_bridge_show_specific(), manager_bridge_destroy(), parked_call_app_exec(), parking_lot_destructor(), safe_bridge_destroy(), stasis_app_bridge_destroy(), stasis_app_control_shutdown(), unload_module(), wait_bridge_wrapper_alloc(), and wait_bridge_wrapper_destructor().

971 {
972  ast_debug(1, "Bridge %s: telling all channels to leave the party\n", bridge->uniqueid);
973  ast_bridge_lock(bridge);
974  bridge_dissolve(bridge, cause);
975  ast_bridge_unlock(bridge);
976 
977  ao2_ref(bridge, -1);
978 
979  return 0;
980 }
const ast_string_field uniqueid
Definition: bridge.h:409
void bridge_dissolve(struct ast_bridge *bridge, int cause)
Definition: bridge.c:319
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_dtmf_hook()

int ast_bridge_dtmf_hook ( struct ast_bridge_features features,
const char *  dtmf,
ast_bridge_hook_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach a DTMF hook to a bridge features structure.

Parameters
featuresBridge features structure
dtmfDTMF string to be activated upon
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)

Example usage:

struct ast_bridge_features features;
ast_bridge_dtmf_hook(&features, "#", pound_callback, NULL, NULL, 0);

This makes the bridging core call pound_callback if a channel that has this feature structure inputs the DTMF string '#'. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3245 of file bridge.c.

References ao2_link, ao2_ref, AST_BRIDGE_HOOK_TYPE_DTMF, ast_copy_string(), bridge_hook_generic(), ast_bridge_hook_dtmf_parms::code, ast_bridge_hook::destructor, ast_bridge_hook_dtmf::dtmf, ast_bridge_features::dtmf_hooks, ast_bridge_hook_dtmf::generic, NULL, and ast_bridge_hook::type.

Referenced by apply_menu_to_user(), ast_bridge_features_enable(), AST_TEST_DEFINE(), bridge_agent_hold_push(), bridge_personality_atxfer_push(), and dynamic_dtmf_hook_add().

3251 {
3252  struct ast_bridge_hook_dtmf *hook;
3253  int res;
3254 
3255  /* Allocate new hook and setup it's various variables */
3256  hook = (struct ast_bridge_hook_dtmf *) bridge_hook_generic(sizeof(*hook), callback,
3257  hook_pvt, destructor, remove_flags);
3258  if (!hook) {
3259  return -1;
3260  }
3262  ast_copy_string(hook->dtmf.code, dtmf, sizeof(hook->dtmf.code));
3263 
3264  /* Once done we put it in the container. */
3265  res = ao2_link(features->dtmf_hooks, hook) ? 0 : -1;
3266  if (res) {
3267  /*
3268  * Could not link the hook into the container.
3269  *
3270  * Remove the hook_pvt destructor call from the hook since we
3271  * are returning failure to install the hook.
3272  */
3273  hook->generic.destructor = NULL;
3274  }
3275  ao2_ref(hook, -1);
3276 
3277  return res;
3278 }
static struct ast_bridge_hook * bridge_hook_generic(size_t size, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Definition: bridge.c:3225
ast_bridge_hook_pvt_destructor destructor
struct ao2_container * dtmf_hooks
#define NULL
Definition: resample.c:96
enum ast_bridge_hook_type type
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_bridge_hook_dtmf_parms dtmf
struct ast_bridge_hook generic
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
char code[MAXIMUM_DTMF_FEATURE_STRING]
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ ast_bridge_features_cleanup()

void ast_bridge_features_cleanup ( struct ast_bridge_features features)

Clean up the contents of a bridge features structure.

Parameters
featuresBridge features structure
Returns
Nothing

Example usage:

This cleans up the feature structure 'features'.

Note
This MUST be called after the features structure is done being used or a memory leak may occur.

Definition at line 3720 of file bridge.c.

References ao2_cleanup, ao2_ref, ast_heap_destroy(), ast_heap_pop(), ast_bridge_features::dtmf_hooks, ast_bridge_features::interval_hooks, NULL, and ast_bridge_features::other_hooks.

Referenced by agent_request_exec(), agent_run(), ast_bridge_call_with_flags(), ast_bridge_features_destroy(), AST_TEST_DEFINE(), bridge_exec(), bridgeadd_exec(), bridgewait_exec(), channel_feature_hooks_set_full(), confbridge_exec(), park_and_announce_app_exec(), park_app_exec(), and parked_call_app_exec().

3721 {
3722  struct ast_bridge_hook_timer *hook;
3723 
3724  /* Destroy the interval hooks heap. */
3725  if (features->interval_hooks) {
3726  while ((hook = ast_heap_pop(features->interval_hooks))) {
3727  ao2_ref(hook, -1);
3728  }
3729  features->interval_hooks = ast_heap_destroy(features->interval_hooks);
3730  }
3731 
3732  /* Destroy the miscellaneous other hooks container. */
3733  ao2_cleanup(features->other_hooks);
3734  features->other_hooks = NULL;
3735 
3736  /* Destroy the DTMF hooks container. */
3737  ao2_cleanup(features->dtmf_hooks);
3738  features->dtmf_hooks = NULL;
3739 }
struct ast_heap * ast_heap_destroy(struct ast_heap *h)
Destroy a max heap.
Definition: heap.c:146
struct ao2_container * dtmf_hooks
#define NULL
Definition: resample.c:96
void * ast_heap_pop(struct ast_heap *h)
Pop the max element off of the heap.
Definition: heap.c:262
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_heap * interval_hooks
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
struct ao2_container * other_hooks

◆ ast_bridge_features_destroy()

void ast_bridge_features_destroy ( struct ast_bridge_features features)

Destroy an allocated bridge features struct.

Since
12.0.0
Parameters
featuresBridge features structure

Example usage:

Returns
Nothing

Definition at line 3741 of file bridge.c.

References ast_bridge_features_cleanup(), and ast_free.

Referenced by ast_bridge_add_channel(), ast_bridge_call_with_flags(), ast_bridge_features_new(), ast_local_setup_bridge(), bridge_channel_depart_thread(), bridge_channel_ind_thread(), bridge_exec(), bridge_impart_internal(), conf_start_record(), control_dtor(), features_destroy(), and local_pvt_destructor().

3742 {
3743  if (!features) {
3744  return;
3745  }
3746  ast_bridge_features_cleanup(features);
3747  ast_free(features);
3748 }
#define ast_free(a)
Definition: astmm.h:182
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
Definition: bridge.c:3720

◆ ast_bridge_features_do()

int ast_bridge_features_do ( enum ast_bridge_builtin_feature  feature,
struct ast_bridge_channel bridge_channel,
void *  hook_pvt 
)

Invoke a built in feature hook now.

Parameters
featureThe feature to invoke
bridge_channelChannel executing the feature
hook_pvtPrivate data passed in when the hook was created
Note
This API call is only meant to be used by bridge subclasses and hook callbacks to request a builtin feature hook to be executed.
Return values
0on success
-1on failure

Example usage:

ast_bridge_features_do(AST_BRIDGE_BUILTIN_ATTENDED_TRANSFER, bridge_channel, hook_pvt);

Definition at line 3151 of file bridge.c.

References ARRAY_LEN, and builtin_features_handlers.

Referenced by agent_connect_caller().

3152 {
3153  ast_bridge_hook_callback callback;
3154 
3155  if (ARRAY_LEN(builtin_features_handlers) <= feature) {
3156  return -1;
3157  }
3158 
3159  callback = builtin_features_handlers[feature];
3160  if (!callback) {
3161  return -1;
3162  }
3163  callback(bridge_channel, hook_pvt);
3164 
3165  return 0;
3166 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static ast_bridge_hook_callback builtin_features_handlers[AST_BRIDGE_BUILTIN_END]
Definition: bridge.c:147
int(* ast_bridge_hook_callback)(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
Hook callback type.

◆ ast_bridge_features_enable()

int ast_bridge_features_enable ( struct ast_bridge_features features,
enum ast_bridge_builtin_feature  feature,
const char *  dtmf,
void *  config,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Enable a built in feature on a bridge features structure.

Parameters
featuresBridge features structure
featureFeature to enable
dtmfOptionally the DTMF stream to trigger the feature, if not specified it will be the default
configConfiguration structure unique to the built in type
destructorOptional destructor callback for config data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure

Example usage:

This enables the attended transfer DTMF option using the default DTMF string. An alternate string may be provided using the dtmf parameter. Internally this is simply setting up a hook to a built in feature callback function.

Definition at line 3428 of file bridge.c.

References ARRAY_LEN, ast_bridge_dtmf_hook(), ast_debug, ast_strlen_zero, builtin_features_dtmf, and builtin_features_handlers.

Referenced by builtin_features_helper().

3434 {
3435  if (ARRAY_LEN(builtin_features_handlers) <= feature
3436  || !builtin_features_handlers[feature]) {
3437  return -1;
3438  }
3439 
3440  /* If no alternate DTMF stream was provided use the default one */
3441  if (ast_strlen_zero(dtmf)) {
3442  dtmf = builtin_features_dtmf[feature];
3443  /* If no DTMF is still available (ie: it has been disabled) then error out now */
3444  if (ast_strlen_zero(dtmf)) {
3445  ast_debug(1, "Failed to enable built in feature %u on %p, no DTMF string is available for it.\n",
3446  feature, features);
3447  return -1;
3448  }
3449  }
3450 
3451  /*
3452  * The rest is basically pretty easy. We create another hook
3453  * using the built in feature's DTMF callback. Easy as pie.
3454  */
3455  return ast_bridge_dtmf_hook(features, dtmf, builtin_features_handlers[feature],
3456  config, destructor, remove_flags);
3457 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
char * config
Definition: conf2ael.c:66
static ast_bridge_hook_callback builtin_features_handlers[AST_BRIDGE_BUILTIN_END]
Definition: bridge.c:147
static char builtin_features_dtmf[AST_BRIDGE_BUILTIN_END][MAXIMUM_DTMF_FEATURE_STRING]
Definition: bridge.c:144
int ast_bridge_dtmf_hook(struct ast_bridge_features *features, const char *dtmf, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Attach a DTMF hook to a bridge features structure.
Definition: bridge.c:3245
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define ast_strlen_zero(a)
Definition: muted.c:73

◆ ast_bridge_features_init()

int ast_bridge_features_init ( struct ast_bridge_features features)

Initialize bridge features structure.

Parameters
featuresBridge featues structure
Return values
0on success
-1on failure

Example usage:

struct ast_bridge_features features;

This initializes the feature structure 'features' to have nothing enabled.

Note
This MUST be called before enabling features or flags. Failure to do so may result in a crash.

Definition at line 3687 of file bridge.c.

References AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_list, AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE, ast_heap_create, bridge_dtmf_hook_sort(), ast_bridge_features::dtmf_hooks, ast_bridge_features::dtmf_passthrough, interval_hook_time_cmp(), ast_bridge_features::interval_hooks, NULL, ast_bridge_features::other_hooks, ast_bridge_features::text_messaging, and timer.

Referenced by agent_request_exec(), agent_run(), ast_bridge_call_with_flags(), ast_bridge_features_new(), AST_TEST_DEFINE(), bridge_exec(), bridgeadd_exec(), bridgewait_exec(), channel_feature_hooks_set_full(), confbridge_exec(), park_and_announce_app_exec(), park_app_exec(), and parked_call_app_exec().

3688 {
3689  /* Zero out the structure */
3690  memset(features, 0, sizeof(*features));
3691 
3692  /* Initialize the DTMF hooks container */
3695  if (!features->dtmf_hooks) {
3696  return -1;
3697  }
3698 
3699  /* Initialize the miscellaneous other hooks container */
3701  NULL);
3702  if (!features->other_hooks) {
3703  return -1;
3704  }
3705 
3706  /* Initialize the interval hooks heap */
3708  offsetof(struct ast_bridge_hook_timer, timer.heap_index));
3709  if (!features->interval_hooks) {
3710  return -1;
3711  }
3712 
3713  features->dtmf_passthrough = 1;
3714  features->text_messaging = 1;
3715 
3716  return 0;
3717 }
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Definition: astobj2.h:1335
static int bridge_dtmf_hook_sort(const void *obj_left, const void *obj_right, int flags)
Definition: bridge.c:3606
struct ao2_container * dtmf_hooks
#define NULL
Definition: resample.c:96
unsigned int text_messaging
struct ast_heap * interval_hooks
unsigned int dtmf_passthrough
static int interval_hook_time_cmp(void *a, void *b)
Definition: bridge.c:3575
#define ast_heap_create(init_height, cmp_fn, index_offset)
Definition: heap.h:102
Replace objects with duplicate keys in container.
Definition: astobj2.h:1215
struct ao2_container * other_hooks
static struct ast_timer * timer
Definition: chan_iax2.c:361

◆ ast_bridge_features_limits_construct()

int ast_bridge_features_limits_construct ( struct ast_bridge_features_limits limits)

Constructor function for ast_bridge_features_limits.

Parameters
limitspointer to a ast_bridge_features_limits struct that has been allocted, but not initialized
Return values
0on success
-1on failure

Definition at line 3459 of file bridge.c.

References ast_string_field_init.

Referenced by bridge_builtin_set_limits(), and pre_bridge_setup().

3460 {
3461  memset(limits, 0, sizeof(*limits));
3462 
3463  if (ast_string_field_init(limits, 256)) {
3464  return -1;
3465  }
3466 
3467  return 0;
3468 }
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:353

◆ ast_bridge_features_limits_destroy()

void ast_bridge_features_limits_destroy ( struct ast_bridge_features_limits limits)

Destructor function for ast_bridge_features_limits.

Parameters
limitspointer to an ast_bridge_features_limits struct that needs to be destroyed

This function does not free memory allocated to the ast_bridge_features_limits struct, it only frees elements within the struct. You must still call ast_free on the struct if you allocated it with malloc.

Definition at line 3470 of file bridge.c.

References ast_string_field_free_memory.

Referenced by bridge_features_limits_dtor(), and pre_bridge_setup().

3471 {
3473 }
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:368

◆ ast_bridge_features_merge()

void ast_bridge_features_merge ( struct ast_bridge_features into,
const struct ast_bridge_features from 
)

Merge one ast_bridge_features into another.

Parameters
intoThe ast_bridge_features that will be merged into
fromThe ast_bridge_features that will be merged from

Definition at line 3662 of file bridge.c.

References ao2_callback, ast_heap_peek(), ast_heap_unlock, ast_heap_wrlock, ast_bridge_features::dtmf_hooks, ast_bridge_features::dtmf_passthrough, ast_bridge_features::feature_flags, ast_flags::flags, ast_bridge_features::interval_hooks, merge_container_cb(), ast_bridge_features::mute, ast_bridge_features::other_hooks, ast_bridge_features::usable, and wrap_hook().

Referenced by bridge_channel_internal_join(), and channel_feature_hooks_set_full().

3663 {
3664  struct ast_bridge_hook_timer *hook;
3665  int idx;
3666 
3667  /* Merge hook containers */
3670 
3671  /* Merge hook heaps */
3673  for (idx = 1; (hook = ast_heap_peek(from->interval_hooks, idx)); idx++) {
3674  wrap_hook(into, hook);
3675  }
3677 
3678  /* Merge feature flags */
3679  into->feature_flags.flags |= from->feature_flags.flags;
3680  into->usable |= from->usable;
3681 
3682  into->mute |= from->mute;
3683  into->dtmf_passthrough |= from->dtmf_passthrough;
3684 }
#define ast_heap_unlock(h)
Definition: heap.h:248
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
unsigned int flags
Definition: utils.h:200
struct ao2_container * dtmf_hooks
static int merge_container_cb(void *obj, void *data, int flags)
Callback for merging hook ao2_containers.
Definition: bridge.c:3629
struct ast_flags feature_flags
struct ast_heap * interval_hooks
unsigned int dtmf_passthrough
static void wrap_hook(struct ast_bridge_features *features, struct ast_bridge_hook_timer *hook)
Wrap the provided interval hook and add it to features.
Definition: bridge.c:3650
struct ao2_container * other_hooks
void * ast_heap_peek(struct ast_heap *h, unsigned int index)
Peek at an element on a heap.
Definition: heap.c:267
#define ast_heap_wrlock(h)
Definition: heap.h:246

◆ ast_bridge_features_new()

struct ast_bridge_features* ast_bridge_features_new ( void  )

Allocate a new bridge features struct.

Since
12.0.0

Example usage:

Return values
featuresNew allocated features struct.
NULLon error.

Definition at line 3750 of file bridge.c.

References ast_bridge_features_destroy(), ast_bridge_features_init(), ast_malloc, and NULL.

Referenced by ast_bridge_call_with_flags(), ast_unreal_channel_push_to_bridge(), bridge_exec(), bridge_impart_internal(), channel_feature_hooks_set_full(), conf_announce_channel_push(), conf_start_record(), and stasis_app_control_bridge_features_init().

3751 {
3752  struct ast_bridge_features *features;
3753 
3754  features = ast_malloc(sizeof(*features));
3755  if (features) {
3756  if (ast_bridge_features_init(features)) {
3757  ast_bridge_features_destroy(features);
3758  features = NULL;
3759  }
3760  }
3761 
3762  return features;
3763 }
Structure that contains features information.
#define NULL
Definition: resample.c:96
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
Definition: bridge.c:3687
void ast_bridge_features_destroy(struct ast_bridge_features *features)
Destroy an allocated bridge features struct.
Definition: bridge.c:3741

◆ ast_bridge_features_register()

int ast_bridge_features_register ( enum ast_bridge_builtin_feature  feature,
ast_bridge_hook_callback  callback,
const char *  dtmf 
)

Register a handler for a built in feature.

Parameters
featureThe feature that the handler will be responsible for
callbackThe callback function that will handle it
dtmfDefault DTMF string used to activate the feature
Return values
0on success
-1on failure

Example usage:

ast_bridge_features_register(AST_BRIDGE_BUILTIN_ATTENDED_TRANSFER, bridge_builtin_attended_transfer, "*1");

This registers the function bridge_builtin_attended_transfer as the function responsible for the built in attended transfer feature.

Definition at line 3123 of file bridge.c.

References ARRAY_LEN, ast_copy_string(), ast_strlen_zero, builtin_features_dtmf, and builtin_features_handlers.

Referenced by ast_bridging_init_basic(), load_module(), and load_parking_bridge_features().

3124 {
3125  if (ARRAY_LEN(builtin_features_handlers) <= feature
3126  || builtin_features_handlers[feature]) {
3127  return -1;
3128  }
3129 
3130  if (!ast_strlen_zero(dtmf)) {
3131  ast_copy_string(builtin_features_dtmf[feature], dtmf, sizeof(builtin_features_dtmf[feature]));
3132  }
3133 
3134  builtin_features_handlers[feature] = callback;
3135 
3136  return 0;
3137 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static ast_bridge_hook_callback builtin_features_handlers[AST_BRIDGE_BUILTIN_END]
Definition: bridge.c:147
static char builtin_features_dtmf[AST_BRIDGE_BUILTIN_END][MAXIMUM_DTMF_FEATURE_STRING]
Definition: bridge.c:144
#define ast_strlen_zero(a)
Definition: muted.c:73
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401

◆ ast_bridge_features_remove()

void ast_bridge_features_remove ( struct ast_bridge_features features,
enum ast_bridge_hook_remove_flags  flags 
)

Remove marked bridge channel feature hooks.

Since
12.0.0
Parameters
featuresBridge features structure
flagsDeterminator for whether hook is removed.
Returns
Nothing

Definition at line 3568 of file bridge.c.

References ast_bridge_features::dtmf_hooks, hooks_remove_container(), hooks_remove_heap(), ast_bridge_features::interval_hooks, and ast_bridge_features::other_hooks.

Referenced by bridge_base_pull(), bridge_channel_internal_join(), bridge_do_merge(), bridge_do_move(), and remove_hooks_on_personality_change().

3569 {
3570  hooks_remove_container(features->dtmf_hooks, remove_flags);
3571  hooks_remove_container(features->other_hooks, remove_flags);
3572  hooks_remove_heap(features->interval_hooks, remove_flags);
3573 }
struct ao2_container * dtmf_hooks
static void hooks_remove_heap(struct ast_heap *hooks, enum ast_bridge_hook_remove_flags remove_flags)
Definition: bridge.c:3546
static void hooks_remove_container(struct ao2_container *hooks, enum ast_bridge_hook_remove_flags remove_flags)
Definition: bridge.c:3530
struct ast_heap * interval_hooks
struct ao2_container * other_hooks

◆ ast_bridge_features_set_flag()

void ast_bridge_features_set_flag ( struct ast_bridge_features features,
unsigned int  flag 
)

Set a flag on a bridge channel features structure.

Parameters
featuresBridge channel features structure
flagFlag to enable
Returns
Nothing

Example usage:

This sets the AST_BRIDGE_CHANNEL_FLAG_DISSOLVE_HANGUP feature to be enabled on the features structure 'features'.

Definition at line 3490 of file bridge.c.

References ast_set_flag, ast_bridge_features::feature_flags, and ast_bridge_features::usable.

3491 {
3492  ast_set_flag(&features->feature_flags, flag);
3493  features->usable = 1;
3494 }
#define ast_set_flag(p, flag)
Definition: utils.h:70
struct ast_flags feature_flags
long int flag
Definition: f2c.h:83

◆ ast_bridge_features_set_limits()

int ast_bridge_features_set_limits ( struct ast_bridge_features features,
struct ast_bridge_features_limits limits,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Limit the amount of time a channel may stay in the bridge and optionally play warning messages as time runs out.

Parameters
featuresBridge features structure
limitsConfigured limits applicable to the channel
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure

Example usage:

This sets the maximum time the channel can be in the bridge to 10 seconds and does not play any warnings.

Note
This API call can only be used on a features structure that will be used in association with a bridge channel.
The ast_bridge_features_limits structure must remain accessible for the lifetime of the features structure.

Definition at line 3475 of file bridge.c.

References AST_BRIDGE_BUILTIN_INTERVAL_LIMITS, ast_log, builtin_interval_handlers, and LOG_ERROR.

Referenced by pre_bridge_setup().

3478 {
3481 
3483  return callback(features, limits, remove_flags);
3484  }
3485 
3486  ast_log(LOG_ERROR, "Attempted to set limits without an AST_BRIDGE_BUILTIN_INTERVAL_LIMITS callback registered.\n");
3487  return -1;
3488 }
int(* ast_bridge_builtin_set_limits_fn)(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
Attach interval hooks to a bridge features structure.
static ast_bridge_builtin_set_limits_fn builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_END]
Definition: bridge.c:150
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285

◆ ast_bridge_features_unregister()

int ast_bridge_features_unregister ( enum ast_bridge_builtin_feature  feature)

Unregister a handler for a built in feature.

Parameters
featureThe feature to unregister
Return values
0on success
-1on failure

Example usage:

ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_ATTENDED_TRANSFER);

This unregisters the function that is handling the built in attended transfer feature.

Definition at line 3139 of file bridge.c.

References ARRAY_LEN, builtin_features_handlers, and NULL.

Referenced by unload_module(), and unload_parking_bridge_features().

3140 {
3141  if (ARRAY_LEN(builtin_features_handlers) <= feature
3142  || !builtin_features_handlers[feature]) {
3143  return -1;
3144  }
3145 
3146  builtin_features_handlers[feature] = NULL;
3147 
3148  return 0;
3149 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static ast_bridge_hook_callback builtin_features_handlers[AST_BRIDGE_BUILTIN_END]
Definition: bridge.c:147
#define NULL
Definition: resample.c:96

◆ ast_bridge_find_by_id()

struct ast_bridge* ast_bridge_find_by_id ( const char *  bridge_id)

Find bridge by id.

Since
12.0.0
Parameters
bridge_idBridge identifier
Returns
NULL bridge not found
non-NULL reference to bridge

Definition at line 5070 of file bridge.c.

References ao2_find, and OBJ_SEARCH_KEY.

Referenced by ast_bridge_get_snapshot_by_uniqueid(), complete_bridge_participant(), handle_bridge_kick_channel(), handle_bridge_show_specific(), manager_bridge_destroy(), and manager_bridge_kick().

5071 {
5072  return ao2_find(bridges, bridge_id, OBJ_SEARCH_KEY);
5073 }
The arg parameter is a search key, but is not an object.
Definition: astobj2.h:1105
static struct ao2_container * bridges
Definition: bridge.c:123
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756

◆ ast_bridge_hangup_hook()

int ast_bridge_hangup_hook ( struct ast_bridge_features features,
ast_bridge_hook_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach a hangup hook to a bridge features structure.

Parameters
featuresBridge features structure
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)

Example usage:

struct ast_bridge_features features;
ast_bridge_hangup_hook(&features, hangup_callback, NULL, NULL, 0);

This makes the bridging core call hangup_callback if a channel that has this hook hangs up. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3328 of file bridge.c.

References AST_BRIDGE_HOOK_TYPE_HANGUP, and bridge_other_hook().

Referenced by add_normal_hooks(), and bridge_personality_atxfer_push().

3333 {
3334  return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
3336 }
static int bridge_other_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
Definition: bridge.c:3294

◆ ast_bridge_impart()

int ast_bridge_impart ( struct ast_bridge bridge,
struct ast_channel chan,
struct ast_channel swap,
struct ast_bridge_features features,
enum ast_bridge_impart_flags  flags 
)

Impart a channel to a bridge (non-blocking)

Parameters
bridgeBridge to impart on
chanChannel to impart (The channel reference is stolen if impart successful.)
swapChannel to swap out if swapping. NULL if not swapping.
featuresBridge features structure.
flagsdefined by enum ast_bridge_impart_flags.
Note
The given bridge must be unlocked when calling this function.
The features parameter must be NULL or obtained by ast_bridge_features_new(). You must not dereference features after calling even if the call fails.
chan is locked by this function.
Return values
0on success
-1on failure (Caller still has ownership of chan)

Example usage:

This adds a channel pointed to by the chan pointer to the bridge pointed to by the bridge pointer. This function will return immediately and will not wait until the channel is no longer part of the bridge.

If this channel will be replacing another channel the other channel can be specified in the swap parameter. The other channel will be thrown out of the bridge in an atomic fashion.

If channel specific features are enabled, a pointer to the features structure can be specified in the features parameter.

Note
If you impart a channel with AST_BRIDGE_IMPART_CHAN_DEPARTABLE you MUST ast_bridge_depart() the channel if this call succeeds. The bridge channel thread is created join-able. The implication is that the channel is special and will not behave like a normal channel.
If you impart a channel with AST_BRIDGE_IMPART_CHAN_INDEPENDENT you must not ast_bridge_depart() the channel. The bridge channel thread is created non-join-able. The channel must be treated as if it were placed into the bridge by ast_bridge_join(). Channels placed into a bridge by ast_bridge_join() are removed by a third party using ast_bridge_remove().
Any callbacks on the channel will be invoked on failure with the reason as AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED.

Definition at line 1924 of file bridge.c.

References AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED, ast_bridge_discard_after_callback(), ast_channel_name(), ast_cond_destroy, ast_cond_init, ast_mutex_destroy, ast_mutex_init, bridge_channel_impart_signal(), bridge_impart_internal(), bridge_channel_impart_cond::cond, bridge_channel_impart_cond::done, bridge_channel_impart_cond::lock, NULL, SCOPE_TRACE, and ast_bridge::uniqueid.

Referenced by add_to_dial_bridge(), ast_bridge_add_channel(), ast_bridge_call_with_flags(), AST_TEST_DEFINE(), ast_unreal_channel_push_to_bridge(), attended_transfer_bridge(), blind_transfer_bridge(), conf_announce_channel_push(), conf_start_record(), control_swap_channel_in_bridge(), feature_attended_transfer(), handle_invite_replaces(), local_call(), parking_blind_transfer_park(), recalling_exit(), refer_incoming_invite_request(), and retransfer_enter().

1929 {
1930  struct bridge_channel_impart_cond cond = {
1931  .done = 0,
1932  };
1933  int res;
1934  SCOPE_TRACE(1, "%s Bridge: %s\n", ast_channel_name(chan), bridge->uniqueid);
1935 
1936  ast_mutex_init(&cond.lock);
1937  ast_cond_init(&cond.cond, NULL);
1938 
1939  res = bridge_impart_internal(bridge, chan, swap, features, flags, &cond);
1940  if (res) {
1941  /* Impart failed. Signal any other waiting impart threads */
1944  }
1945 
1946  ast_cond_destroy(&cond.cond);
1947  ast_mutex_destroy(&cond.lock);
1948 
1949  return res;
1950 }
Internal bridge impart wait condition and associated conditional.
Definition: bridge.c:1515
const ast_string_field uniqueid
Definition: bridge.h:409
#define SCOPE_TRACE(__level,...)
Definition: logger.h:883
void bridge_channel_impart_signal(struct ast_channel *chan)
Signal imparting threads to wake up.
Definition: bridge.c:1626
#define ast_cond_init(cond, attr)
Definition: lock.h:199
#define NULL
Definition: resample.c:96
void ast_bridge_discard_after_callback(struct ast_channel *chan, enum ast_bridge_after_cb_reason reason)
Run discarding any after bridge callbacks.
Definition: bridge_after.c:247
ast_cond_t cond
Definition: app_meetme.c:1090
#define ast_cond_destroy(cond)
Definition: lock.h:200
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_mutex_init(pmutex)
Definition: lock.h:184
#define ast_mutex_destroy(a)
Definition: lock.h:186
static int bridge_impart_internal(struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, enum ast_bridge_impart_flags flags, struct bridge_channel_impart_cond *cond)
Definition: bridge.c:1823

◆ ast_bridge_interval_hook()

int ast_bridge_interval_hook ( struct ast_bridge_features features,
enum ast_bridge_hook_timer_option  flags,
unsigned int  interval,
ast_bridge_hook_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach an interval hook to a bridge features structure.

Parameters
featuresBridge features structure
flagsInterval timer callback option flags.
intervalThe interval that the hook should execute at in milliseconds
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)
struct ast_bridge_features features;
ast_bridge_interval_hook(&features, 1000, playback_callback, NULL, NULL, 0);

This makes the bridging core call playback_callback every second. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3382 of file bridge.c.

References ao2_ref, ast_atomic_fetchadd_int(), AST_BRIDGE_HOOK_TYPE_TIMER, ast_debug, ast_heap_push, ast_heap_unlock, ast_heap_wrlock, ast_samp2tv(), ast_tvadd(), ast_tvnow(), bridge_hook_generic(), ast_bridge_hook::destructor, ast_bridge_hook_timer_parms::flags, ast_bridge_hook_timer::generic, ast_bridge_hook_timer_parms::interval, ast_bridge_features::interval_hooks, ast_bridge_features::interval_sequence, NULL, ast_bridge_hook_timer_parms::seqno, ast_bridge_hook_timer::timer, ast_bridge_hook_timer_parms::trip_time, and ast_bridge_hook::type.

Referenced by agent_request_exec(), apply_option_timeout(), AST_TEST_DEFINE(), bridge_agent_hold_push(), bridge_builtin_set_limits(), confbridge_exec(), parking_set_duration(), set_interval_hook(), and wrap_hook().

3389 {
3390  struct ast_bridge_hook_timer *hook;
3391  int res;
3392 
3393  if (!features ||!interval || !callback) {
3394  return -1;
3395  }
3396 
3397  /* Allocate new hook and setup it's various variables */
3398  hook = (struct ast_bridge_hook_timer *) bridge_hook_generic(sizeof(*hook), callback,
3399  hook_pvt, destructor, remove_flags);
3400  if (!hook) {
3401  return -1;
3402  }
3404  hook->timer.interval = interval;
3405  hook->timer.trip_time = ast_tvadd(ast_tvnow(), ast_samp2tv(interval, 1000));
3406  hook->timer.seqno = ast_atomic_fetchadd_int((int *) &features->interval_sequence, +1);
3407  hook->timer.flags = flags;
3408 
3409  ast_debug(1, "Putting interval hook %p with interval %u in the heap on features %p\n",
3410  hook, hook->timer.interval, features);
3411  ast_heap_wrlock(features->interval_hooks);
3412  res = ast_heap_push(features->interval_hooks, hook);
3413  ast_heap_unlock(features->interval_hooks);
3414  if (res) {
3415  /*
3416  * Could not push the hook into the heap
3417  *
3418  * Remove the hook_pvt destructor call from the hook since we
3419  * are returning failure to install the hook.
3420  */
3421  hook->generic.destructor = NULL;
3422  ao2_ref(hook, -1);
3423  }
3424 
3425  return res ? -1 : 0;
3426 }
static struct ast_bridge_hook * bridge_hook_generic(size_t size, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags)
Definition: bridge.c:3225
#define ast_heap_unlock(h)
Definition: heap.h:248
struct ast_bridge_hook generic
ast_bridge_hook_pvt_destructor destructor
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define NULL
Definition: resample.c:96
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition: lock.h:755
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define ast_heap_push(h, elm)
Definition: heap.h:126
enum ast_bridge_hook_type type
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate)
Returns a timeval corresponding to the duration of n samples at rate r. Useful to convert samples to ...
Definition: time.h:238
struct ast_heap * interval_hooks
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2283
struct ast_bridge_hook_timer_parms timer
unsigned int interval_sequence
#define ast_heap_wrlock(h)
Definition: heap.h:246

◆ ast_bridge_interval_register()

int ast_bridge_interval_register ( enum ast_bridge_builtin_interval  interval,
ast_bridge_builtin_set_limits_fn  callback 
)

Register a handler for a built in interval feature.

Parameters
intervalThe interval feature that the handler will be responsible for
callbackthe Callback function that will handle it
Return values
0on success
-1on failure

Example usage:

This registers the function bridge_builtin_set_limits as the function responsible for the built in duration limit feature.

Definition at line 3168 of file bridge.c.

References ARRAY_LEN, and builtin_interval_handlers.

Referenced by load_module().

3169 {
3170  if (ARRAY_LEN(builtin_interval_handlers) <= interval
3171  || builtin_interval_handlers[interval]) {
3172  return -1;
3173  }
3174 
3175  builtin_interval_handlers[interval] = callback;
3176 
3177  return 0;
3178 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static ast_bridge_builtin_set_limits_fn builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_END]
Definition: bridge.c:150

◆ ast_bridge_interval_unregister()

int ast_bridge_interval_unregister ( enum ast_bridge_builtin_interval  interval)

Definition at line 3180 of file bridge.c.

References ARRAY_LEN, builtin_interval_handlers, and NULL.

Referenced by unload_module().

3181 {
3182  if (ARRAY_LEN(builtin_interval_handlers) <= interval
3183  || !builtin_interval_handlers[interval]) {
3184  return -1;
3185  }
3186 
3187  builtin_interval_handlers[interval] = NULL;
3188 
3189  return 0;
3190 
3191 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define NULL
Definition: resample.c:96
static ast_bridge_builtin_set_limits_fn builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_END]
Definition: bridge.c:150

◆ ast_bridge_is_video_src()

int ast_bridge_is_video_src ( struct ast_bridge bridge,
struct ast_channel chan 
)

Determine if a channel is a video src for the bridge.

Return values
0Not a current video source of the bridge.
None0, is a video source of the bridge, The number returned represents the priority this video stream has on the bridge where 1 is the highest priority.

Definition at line 3958 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_NONE, AST_BRIDGE_VIDEO_MODE_SFU, AST_BRIDGE_VIDEO_MODE_SINGLE_SRC, AST_BRIDGE_VIDEO_MODE_TALKER_SRC, ast_bridge_video_talker_src_data::chan_old_vsrc, ast_bridge_video_single_src_data::chan_vsrc, ast_bridge_video_talker_src_data::chan_vsrc, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge_video_mode::single_src_data, ast_bridge::softmix, ast_bridge_video_mode::talker_src_data, and ast_bridge_softmix::video_mode.

Referenced by handle_video_on_exit(), handle_video_on_join(), softmix_bridge_write_video(), and softmix_pass_video_top_priority().

3959 {
3960  int res = 0;
3961 
3962  ast_bridge_lock(bridge);
3963  switch (bridge->softmix.video_mode.mode) {
3965  break;
3967  if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc == chan) {
3968  res = 1;
3969  }
3970  break;
3972  if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc == chan) {
3973  res = 1;
3974  } else if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc == chan) {
3975  res = 2;
3976  }
3978  break;
3979  }
3980  ast_bridge_unlock(bridge);
3981  return res;
3982 }
union ast_bridge_video_mode::@221 mode_data
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
struct ast_channel * chan_old_vsrc
Definition: bridge.h:127
struct ast_channel * chan_vsrc
Definition: bridge.h:116
struct ast_bridge_softmix softmix
Definition: bridge.h:375
struct ast_bridge_video_talker_src_data talker_src_data
Definition: bridge.h:164
struct ast_bridge_video_single_src_data single_src_data
Definition: bridge.h:163
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
struct ast_channel * chan_vsrc
Definition: bridge.h:123
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_join()

int ast_bridge_join ( struct ast_bridge bridge,
struct ast_channel chan,
struct ast_channel swap,
struct ast_bridge_features features,
struct ast_bridge_tech_optimizations tech_args,
enum ast_bridge_join_flags  flags 
)

Join a channel to a bridge (blocking)

Parameters
bridgeBridge to join
chanChannel to join
swapChannel to swap out if swapping (A channel reference is stolen.)
featuresBridge features structure
tech_argsOptional Bridging tech optimization parameters for this channel.
flagsdefined by enum ast_bridge_join_flags.
Note
The passed in swap channel is always unreffed on return. It is not a good idea to access the swap channel on return or for the caller to keep a reference to it.
Absolutely NO locks should be held before calling this function since it blocks.
Return values
0if the channel successfully joined the bridge before it exited.
-1if the channel failed to join the bridge

Example usage:

This adds a channel pointed to by the chan pointer to the bridge pointed to by the bridge pointer. This function will not return until the channel has been removed from the bridge, swapped out for another channel, or has hung up.

If this channel will be replacing another channel the other channel can be specified in the swap parameter. The other channel will be thrown out of the bridge in an atomic fashion.

If channel specific features are enabled a pointer to the features structure can be specified in the features parameter.

Definition at line 1667 of file bridge.c.

References ao2_lock, ao2_ref, ao2_t_cleanup, ao2_unlock, ast_assert, AST_BRIDGE_JOIN_INHIBIT_JOIN_COLP, AST_BRIDGE_JOIN_PASS_REFERENCE, ast_bridge_lock, ast_bridge_run_after_callback(), ast_bridge_setup_after_goto(), ast_bridge_unlock, ast_channel_flags(), ast_channel_internal_bridge_channel_set(), ast_channel_lock, ast_channel_name(), ast_channel_softhangup_internal_flag(), ast_channel_unlock, AST_FLAG_ZOMBIE, AST_SOFTHANGUP_ASYNCGOTO, ast_softhangup_nolock(), ast_test_flag, bridge_channel_impart_signal(), bridge_channel_internal_alloc(), bridge_channel_internal_join(), bridge_find_channel(), ast_bridge_channel::chan, ast_bridge_channel::features, ast_bridge_channel::inhibit_colp, NULL, ast_bridge_methods::push_peek, SCOPE_TRACE, ast_bridge_channel::swap, ast_bridge_channel::tech_args, ast_bridge_channel::thread, ast_bridge::uniqueid, and ast_bridge::v_table.

Referenced by agent_request_exec(), agent_run(), ast_bridge_call_with_flags(), bridge_exec(), bridgeadd_exec(), bridgewait_exec(), confbridge_exec(), park_and_announce_app_exec(), park_app_exec(), and parked_call_app_exec().

1673 {
1674  struct ast_bridge_channel *bridge_channel;
1675  int res = 0;
1676  SCOPE_TRACE(1, "%s Bridge: %s\n", ast_channel_name(chan), bridge->uniqueid);
1677 
1678  bridge_channel = bridge_channel_internal_alloc(bridge);
1679  if (flags & AST_BRIDGE_JOIN_PASS_REFERENCE) {
1680  ao2_ref(bridge, -1);
1681  }
1682  if (!bridge_channel) {
1683  ao2_t_cleanup(swap, "Error exit: bridge_channel alloc failed");
1684  res = -1;
1685  goto join_exit;
1686  }
1687 /* XXX ASTERISK-21271 features cannot be NULL when passed in. When it is changed to allocated we can do like ast_bridge_impart() and allocate one. */
1688  ast_assert(features != NULL);
1689  if (!features) {
1690  ao2_ref(bridge_channel, -1);
1691  ao2_t_cleanup(swap, "Error exit: features is NULL");
1692  res = -1;
1693  goto join_exit;
1694  }
1695  if (tech_args) {
1696  bridge_channel->tech_args = *tech_args;
1697  }
1698 
1699  ast_channel_lock(chan);
1701  res = -1;
1702  } else {
1703  ast_channel_internal_bridge_channel_set(chan, bridge_channel);
1704  }
1705  ast_channel_unlock(chan);
1706  bridge_channel->thread = pthread_self();
1707  bridge_channel->chan = chan;
1708  bridge_channel->swap = swap;
1709  bridge_channel->features = features;
1710  bridge_channel->inhibit_colp = !!(flags & AST_BRIDGE_JOIN_INHIBIT_JOIN_COLP);
1711 
1712  /* allow subclass to peek at upcoming push operation */
1713  if (bridge->v_table->push_peek && !res) {
1714  struct ast_bridge_channel *bcswap = NULL;
1715 
1716  ast_bridge_lock(bridge);
1717  if (bridge_channel->swap) {
1718  bcswap = bridge_find_channel(bridge, bridge_channel->swap);
1719  }
1720  res = bridge->v_table->push_peek(bridge, bridge_channel, bcswap);
1721  ast_bridge_unlock(bridge);
1722  }
1723 
1724  if (!res) {
1725  res = bridge_channel_internal_join(bridge_channel);
1726  }
1727 
1728  /* Cleanup all the data in the bridge channel after it leaves the bridge. */
1729  ast_channel_lock(chan);
1731  ast_channel_unlock(chan);
1732  /* Due to a race condition, we lock the bridge channel here for ast_bridge_channel_get_chan */
1733  ao2_lock(bridge_channel);
1734  bridge_channel->chan = NULL;
1735  ao2_unlock(bridge_channel);
1736  /* If bridge_channel->swap is not NULL then the join failed. */
1737  ao2_t_cleanup(bridge_channel->swap, "Bridge complete: join failed");
1738  bridge_channel->swap = NULL;
1739  bridge_channel->features = NULL;
1740 
1741  ao2_ref(bridge_channel, -1);
1742 
1743 join_exit:
1747  && !ast_bridge_setup_after_goto(chan)) {
1748  /* Claim the after bridge goto is an async goto destination. */
1749  ast_channel_lock(chan);
1750  ast_softhangup_nolock(chan, AST_SOFTHANGUP_ASYNCGOTO);
1751  ast_channel_unlock(chan);
1752  }
1753  return res;
1754 }
void ast_channel_internal_bridge_channel_set(struct ast_channel *chan, struct ast_bridge_channel *value)
#define ast_channel_lock(chan)
Definition: channel.h:2890
#define ao2_t_cleanup(obj, tag)
Definition: astobj2.h:1959
const ast_string_field uniqueid
Definition: bridge.h:409
struct ast_bridge_features * features
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define SCOPE_TRACE(__level,...)
Definition: logger.h:883
void bridge_channel_impart_signal(struct ast_channel *chan)
Signal imparting threads to wake up.
Definition: bridge.c:1626
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
#define ast_assert(a)
Definition: utils.h:650
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_lock(a)
Definition: astobj2.h:718
const struct ast_bridge_methods * v_table
Definition: bridge.h:359
struct ast_bridge_tech_optimizations tech_args
int ast_softhangup_nolock(struct ast_channel *chan, int reason)
Softly hangup up a channel (no channel lock)
Definition: channel.c:2449
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
void ast_bridge_run_after_callback(struct ast_channel *chan)
Run any after bridge callback.
Definition: bridge_after.c:220
unsigned int inhibit_colp
struct ast_channel * swap
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
struct ast_channel * chan
Structure that contains information regarding a channel in a bridge.
ast_bridge_push_channel_fn push_peek
Definition: bridge.h:281
struct ast_bridge_channel * bridge_channel_internal_alloc(struct ast_bridge *bridge)
const char * ast_channel_name(const struct ast_channel *chan)
int bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
int ast_bridge_setup_after_goto(struct ast_channel *chan)
Setup any after bridge goto location to begin execution.
Definition: bridge_after.c:447

◆ ast_bridge_join_hook()

int ast_bridge_join_hook ( struct ast_bridge_features features,
ast_bridge_hook_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Unregisters a handler for a built in interval feature.

Parameters
intervalthe interval feature to unregister
Return values
0on success
-1on failure

Example usage:

ast_bridge_interval_unregister(AST_BRIDGE_BULTIN_INTERVAL_LIMITS)
/endcode
This unregisters the function that is handling the built in duration limit feature.
/
/*!
* \brief Attach a bridge channel join hook to a bridge features structure
* \param features Bridge features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
* \param remove_flags Dictates what situations the hook should be removed.
* \retval 0 on success
* \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
* Example usage:
* \code
* struct ast_bridge_features features;
* ast_bridge_features_init(&features);
* ast_bridge_join_hook(&features, join_callback, NULL, NULL, 0);
*

This makes the bridging core call join_callback when a channel successfully joins the bridging system. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3338 of file bridge.c.

References AST_BRIDGE_HOOK_TYPE_JOIN, and bridge_other_hook().

Referenced by agent_request_exec(), and confbridge_exec().

3343 {
3344  return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
3346 }
static int bridge_other_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
Definition: bridge.c:3294

◆ ast_bridge_kick()

int ast_bridge_kick ( struct ast_bridge bridge,
struct ast_channel chan 
)

Kick a channel from a bridge.

Parameters
bridgeBridge that the channel is to be kicked from
chanChannel to kick
Return values
0on success
-1on failure

Example usage:

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.
This API call can be used on channels that were added to the bridge using both ast_bridge_join and ast_bridge_impart.

Definition at line 2025 of file bridge.c.

References ast_bridge_channel_queue_callback(), ast_bridge_lock, ast_bridge_unlock, bridge_find_channel(), kick_it(), and NULL.

Referenced by handle_bridge_kick_channel(), and manager_bridge_kick().

2026 {
2027  struct ast_bridge_channel *bridge_channel;
2028  int res;
2029 
2030  ast_bridge_lock(bridge);
2031 
2032  /* Try to find the channel that we want to kick. */
2033  if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
2034  ast_bridge_unlock(bridge);
2035  return -1;
2036  }
2037 
2038  res = ast_bridge_channel_queue_callback(bridge_channel, 0, kick_it, NULL, 0);
2039 
2040  ast_bridge_unlock(bridge);
2041 
2042  return res;
2043 }
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
static void kick_it(struct ast_bridge_channel *bridge_channel, const void *payload, size_t payload_size)
Definition: bridge.c:2020
#define NULL
Definition: resample.c:96
int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, enum ast_bridge_channel_custom_callback_option flags, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
Queue a bridge action custom callback frame onto the bridge channel.
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.

◆ ast_bridge_leave_hook()

int ast_bridge_leave_hook ( struct ast_bridge_features features,
ast_bridge_hook_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach a bridge channel leave hook to a bridge features structure.

Parameters
featuresBridge features structure
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)

Example usage:

struct ast_bridge_features features;
ast_bridge_leave_hook(&features, leave_callback, NULL, NULL, 0);

This makes the bridging core call leave_callback when a channel successfully leaves the bridging system. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3348 of file bridge.c.

References AST_BRIDGE_HOOK_TYPE_LEAVE, and bridge_other_hook().

Referenced by confbridge_exec().

3353 {
3354  return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
3356 }
static int bridge_other_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
Definition: bridge.c:3294

◆ ast_bridge_merge()

int ast_bridge_merge ( struct ast_bridge dst_bridge,
struct ast_bridge src_bridge,
int  merge_best_direction,
struct ast_channel **  kick_me,
unsigned int  num_kick 
)

Merge two bridges together.

Parameters
dst_bridgeDestination bridge of merge.
src_bridgeSource bridge of merge.
merge_best_directionTRUE if don't care about which bridge merges into the other.
kick_meArray of channels to kick from the bridges.
num_kickNumber of channels in the kick_me array.
Note
Absolutely NO bridge or channel locks should be held before calling this function.
Return values
0on success
-1on failure

Example usage:

ast_bridge_merge(dst_bridge, src_bridge, 0, NULL, 0);

This moves the channels in src_bridge into the bridge pointed to by dst_bridge.

Definition at line 2348 of file bridge.c.

References ast_assert, ast_bridge_lock_both, ast_bridge_unlock, and bridge_merge_locked().

2349 {
2350  int res;
2351 
2352  /* Sanity check. */
2353  ast_assert(dst_bridge && src_bridge);
2354 
2355  ast_bridge_lock_both(dst_bridge, src_bridge);
2356  res = bridge_merge_locked(dst_bridge, src_bridge, merge_best_direction, kick_me, num_kick);
2357  ast_bridge_unlock(src_bridge);
2358  ast_bridge_unlock(dst_bridge);
2359  return res;
2360 }
#define ast_bridge_lock_both(bridge1, bridge2)
Lock two bridges.
Definition: bridge.h:500
static int bridge_merge_locked(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, int merge_best_direction, struct ast_channel **kick_me, unsigned int num_kick)
Definition: bridge.c:2264
#define ast_assert(a)
Definition: utils.h:650
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493

◆ ast_bridge_merge_inhibit()

void ast_bridge_merge_inhibit ( struct ast_bridge bridge,
int  request 
)

Adjust the bridge merge inhibit request count.

Since
12.0.0
Parameters
bridgeWhat to operate on.
requestInhibit request increment. (Positive to add requests. Negative to remove requests.)
Returns
Nothing

Definition at line 3061 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, and bridge_merge_inhibit_nolock().

Referenced by attended_transfer_properties_shutdown(), consulting_exit(), and feature_attended_transfer().

3062 {
3063  ast_bridge_lock(bridge);
3065  ast_bridge_unlock(bridge);
3066 }
void bridge_merge_inhibit_nolock(struct ast_bridge *bridge, int request)
Definition: bridge.c:3052
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
static int request(void *obj)
Definition: chan_pjsip.c:2550
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_move()

int ast_bridge_move ( struct ast_bridge dst_bridge,
struct ast_bridge src_bridge,
struct ast_channel chan,
struct ast_channel swap,
int  attempt_recovery 
)

Move a channel from one bridge to another.

Since
12.0.0
Parameters
dst_bridgeDestination bridge of bridge channel move.
src_bridgeSource bridge of bridge channel move.
chanChannel to move.
swapChannel to replace in dst_bridge.
attempt_recoveryTRUE if failure attempts to push channel back into original bridge.
Note
Absolutely NO bridge or channel locks should be held before calling this function.
Return values
0on success.
-1on failure.

Definition at line 2508 of file bridge.c.

References ast_bridge_lock_both, ast_bridge_unlock, and bridge_move_locked().

Referenced by agent_connect_caller(), parked_call_app_exec(), and parking_park_bridge_channel().

2509 {
2510  int res;
2511 
2512  ast_bridge_lock_both(dst_bridge, src_bridge);
2513  res = bridge_move_locked(dst_bridge, src_bridge, chan, swap, attempt_recovery);
2514  ast_bridge_unlock(src_bridge);
2515  ast_bridge_unlock(dst_bridge);
2516  return res;
2517 }
static int bridge_move_locked(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_channel *chan, struct ast_channel *swap, int attempt_recovery)
Definition: bridge.c:2447
#define ast_bridge_lock_both(bridge1, bridge2)
Lock two bridges.
Definition: bridge.h:500
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493

◆ ast_bridge_move_hook()

int ast_bridge_move_hook ( struct ast_bridge_features features,
ast_bridge_move_indicate_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach a bridge channel move detection hook to a bridge features structure.

Parameters
featuresBridge features structure
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)

Example usage:

struct ast_bridge_features features;
ast_bridge_move_hook(&features, move_callback, NULL, NULL, 0);

This makes the bridging core call callback when a channel is moved from one bridge to another. A pointer to useful data may be provided to the hook_pvt parameter.

Definition at line 3370 of file bridge.c.

References AST_BRIDGE_HOOK_TYPE_MOVE, bridge_other_hook(), and hook_cb().

Referenced by bridge_stasis_pull().

3375 {
3377 
3378  return bridge_other_hook(features, hook_cb, hook_pvt, destructor, remove_flags,
3380 }
int(* ast_bridge_hook_callback)(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
Hook callback type.
static int bridge_other_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
Definition: bridge.c:3294
static int hook_cb(struct ast_config *cfg)
Definition: test_config.c:875

◆ ast_bridge_notify_masquerade()

void ast_bridge_notify_masquerade ( struct ast_channel chan)

Notify bridging that this channel was just masqueraded.

Since
12.0.0
Parameters
chanChannel just involved in a masquerade
Returns
Nothing

Definition at line 1482 of file bridge.c.

References ao2_ref, ast_bridge_channel_lock_bridge(), ast_bridge_unlock, ast_channel_get_bridge_channel(), ast_channel_lock, ast_channel_unlock, ast_bridge_channel::bridge, bridge_manager_request::bridge, bridge_find_channel(), bridge_reconfigured(), ast_bridge_methods::notify_masquerade, and ast_bridge::v_table.

Referenced by channel_do_masquerade().

1483 {
1484  struct ast_bridge_channel *bridge_channel;
1485  struct ast_bridge *bridge;
1486 
1487  /* Safely get the bridge_channel pointer for the chan. */
1488  ast_channel_lock(chan);
1489  bridge_channel = ast_channel_get_bridge_channel(chan);
1490  ast_channel_unlock(chan);
1491  if (!bridge_channel) {
1492  /* Not in a bridge */
1493  return;
1494  }
1495 
1496  ast_bridge_channel_lock_bridge(bridge_channel);
1497  bridge = bridge_channel->bridge;
1498  if (bridge_channel == bridge_find_channel(bridge, chan)) {
1499 /*
1500  * XXX ASTERISK-22366 this needs more work. The channels need
1501  * to be made compatible again if the formats change. The
1502  * bridge_channel thread needs to monitor for this case.
1503  */
1504  /* The channel we want to notify is still in a bridge. */
1505  bridge->v_table->notify_masquerade(bridge, bridge_channel);
1506  bridge_reconfigured(bridge, 1);
1507  }
1508  ast_bridge_unlock(bridge);
1509  ao2_ref(bridge_channel, -1);
1510 }
#define ast_channel_lock(chan)
Definition: channel.h:2890
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
struct ast_bridge * bridge
Bridge this channel is participating in.
ast_bridge_notify_masquerade_fn notify_masquerade
Definition: bridge.h:277
#define ao2_ref(o, delta)
Definition: astobj2.h:464
const struct ast_bridge_methods * v_table
Definition: bridge.h:359
Structure that contains information about a bridge.
Definition: bridge.h:357
void bridge_reconfigured(struct ast_bridge *bridge, unsigned int colp_update)
Definition: bridge.c:1443
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel&#39;s bridge pointer.
Definition: channel.c:10640
Structure that contains information regarding a channel in a bridge.
void ast_bridge_channel_lock_bridge(struct ast_bridge_channel *bridge_channel)
Lock the bridge associated with the bridge channel.

◆ ast_bridge_number_video_src()

int ast_bridge_number_video_src ( struct ast_bridge bridge)

Returns the number of video sources currently active in the bridge.

Definition at line 3931 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_NONE, AST_BRIDGE_VIDEO_MODE_SFU, AST_BRIDGE_VIDEO_MODE_SINGLE_SRC, AST_BRIDGE_VIDEO_MODE_TALKER_SRC, ast_bridge_video_talker_src_data::chan_old_vsrc, ast_bridge_video_single_src_data::chan_vsrc, ast_bridge_video_talker_src_data::chan_vsrc, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge_video_mode::single_src_data, ast_bridge::softmix, ast_bridge_video_mode::talker_src_data, and ast_bridge_softmix::video_mode.

Referenced by softmix_bridge_write_video().

3932 {
3933  int res = 0;
3934 
3935  ast_bridge_lock(bridge);
3936  switch (bridge->softmix.video_mode.mode) {
3938  break;
3941  res = 1;
3942  }
3943  break;
3946  res++;
3947  }
3949  res++;
3950  }
3952  break;
3953  }
3954  ast_bridge_unlock(bridge);
3955  return res;
3956 }
union ast_bridge_video_mode::@221 mode_data
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
struct ast_channel * chan_old_vsrc
Definition: bridge.h:127
struct ast_channel * chan_vsrc
Definition: bridge.h:116
struct ast_bridge_softmix softmix
Definition: bridge.h:375
struct ast_bridge_video_talker_src_data talker_src_data
Definition: bridge.h:164
struct ast_bridge_video_single_src_data single_src_data
Definition: bridge.h:163
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
struct ast_channel * chan_vsrc
Definition: bridge.h:123
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_peer()

struct ast_channel* ast_bridge_peer ( struct ast_bridge bridge,
struct ast_channel chan 
)

Get the channel's bridge peer only if the bridge is two-party.

Since
12.0.0
Parameters
bridgeThe bridge
chanChannel desiring the bridge peer channel.
Note
The returned peer channel is the current peer in the bridge when called.
Return values
NULLChannel not in a bridge or the bridge is not two-party.
non-NULLReffed peer channel at time of calling.

Definition at line 4142 of file bridge.c.

References ast_bridge_lock, ast_bridge_peer_nolock(), and ast_bridge_unlock.

Referenced by ast_attended_transfer_message_create(), ast_bridge_transfer_blind(), ast_channel_bridge_peer(), and get_transfer_parties_transferer_bridge().

4143 {
4144  struct ast_channel *peer;
4145 
4146  ast_bridge_lock(bridge);
4147  peer = ast_bridge_peer_nolock(bridge, chan);
4148  ast_bridge_unlock(bridge);
4149 
4150  return peer;
4151 }
Main Channel structure associated with a channel.
struct ast_channel * ast_bridge_peer_nolock(struct ast_bridge *bridge, struct ast_channel *chan)
Get the channel&#39;s bridge peer only if the bridge is two-party.
Definition: bridge.c:4114
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_peer_nolock()

struct ast_channel* ast_bridge_peer_nolock ( struct ast_bridge bridge,
struct ast_channel chan 
)

Get the channel's bridge peer only if the bridge is two-party.

Since
12.0.0
Parameters
bridgeThe bridge which is already locked.
chanChannel desiring the bridge peer channel.
Note
The returned peer channel is the current peer in the bridge when called.
Return values
NULLChannel not in a bridge or the bridge is not two-party.
non-NULLReffed peer channel at time of calling.

Definition at line 4114 of file bridge.c.

References AST_BRIDGE_CAPABILITY_1TO1MIX, AST_BRIDGE_CAPABILITY_NATIVE, ast_channel_ref, AST_LIST_TRAVERSE, ast_bridge_technology::capabilities, ast_bridge_channel::chan, ast_bridge::channels, ast_bridge_channel::in_bridge, NULL, ast_bridge::num_channels, and ast_bridge::technology.

Referenced by ast_bridge_peer(), feature_automixmonitor(), and feature_automonitor().

4115 {
4116  struct ast_channel *peer = NULL;
4117  struct ast_bridge_channel *iter;
4118 
4119  /* Asking for the peer channel only makes sense on a two-party bridge. */
4120  if (bridge->num_channels == 2
4121  && bridge->technology->capabilities
4123  int in_bridge = 0;
4124 
4125  AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
4126  if (iter->chan != chan) {
4127  peer = iter->chan;
4128  } else {
4129  in_bridge = 1;
4130  }
4131  }
4132  if (in_bridge && peer) {
4133  ast_channel_ref(peer);
4134  } else {
4135  peer = NULL;
4136  }
4137  }
4138 
4139  return peer;
4140 }
Main Channel structure associated with a channel.
#define NULL
Definition: resample.c:96
struct ast_bridge_technology * technology
Definition: bridge.h:363
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
unsigned int in_bridge
struct ast_bridge_channels_list channels
Definition: bridge.h:371
struct ast_channel * chan
Structure that contains information regarding a channel in a bridge.
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2915
Definition: search.h:40
unsigned int num_channels
Definition: bridge.h:381

◆ ast_bridge_peers()

struct ao2_container* ast_bridge_peers ( struct ast_bridge bridge)

Get a container of all channels in the bridge.

Since
12.0.0
Parameters
bridgeThe bridge
Note
The returned container is a snapshot of channels in the bridge when called.
Return values
NULLFailed to create container
non-NULLContainer of channels in the bridge

Definition at line 4103 of file bridge.c.

References ast_bridge_lock, ast_bridge_peers_nolock(), ast_bridge_unlock, and channels.

4104 {
4105  struct ao2_container *channels;
4106 
4107  ast_bridge_lock(bridge);
4108  channels = ast_bridge_peers_nolock(bridge);
4109  ast_bridge_unlock(bridge);
4110 
4111  return channels;
4112 }
static struct channel_usage channels
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
struct ao2_container * ast_bridge_peers_nolock(struct ast_bridge *bridge)
Get a container of all channels in the bridge.
Definition: bridge.c:4085
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Generic container type.

◆ ast_bridge_peers_nolock()

struct ao2_container* ast_bridge_peers_nolock ( struct ast_bridge bridge)

Get a container of all channels in the bridge.

Since
12.0.0
Parameters
bridgeThe bridge which is already locked.
Return values
NULLFailed to create container
non-NULLContainer of channels in the bridge

Definition at line 4085 of file bridge.c.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_container_alloc_hash, ao2_link, AST_LIST_TRAVERSE, ast_bridge_channel::chan, channel_cmp(), channel_hash(), channels, ast_bridge::channels, and NULL.

Referenced by ast_bridge_peers(), ast_bridge_transfer_attended(), ast_bridge_transfer_blind(), and two_bridge_attended_transfer().

4086 {
4087  struct ao2_container *channels;
4088  struct ast_bridge_channel *iter;
4089 
4091  13, channel_hash, NULL, channel_cmp);
4092  if (!channels) {
4093  return NULL;
4094  }
4095 
4096  AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
4097  ao2_link(channels, iter->chan);
4098  }
4099 
4100  return channels;
4101 }
static int channel_cmp(void *obj, void *arg, int flags)
Definition: bridge.c:4063
#define NULL
Definition: resample.c:96
static struct channel_usage channels
static int channel_hash(const void *obj, int flags)
Definition: bridge.c:4040
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Definition: astobj2.h:1310
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
struct ast_bridge_channels_list channels
Definition: bridge.h:371
struct ast_channel * chan
Structure that contains information regarding a channel in a bridge.
Definition: search.h:40
Generic container type.
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ ast_bridge_queue_action()

int ast_bridge_queue_action ( struct ast_bridge bridge,
struct ast_frame action 
)

Put an action onto the specified bridge.

Since
12.0.0
Parameters
bridgeWhat to queue the action on.
actionWhat to do.
Return values
0on success.
-1on error.
Note
This API call is meant for internal bridging operations.

Definition at line 307 of file bridge.c.

References ast_frdup, and bridge_queue_action_nodup().

Referenced by bridge_dissolve().

308 {
309  struct ast_frame *dup;
310 
311  dup = ast_frdup(action);
312  if (!dup) {
313  return -1;
314  }
315  bridge_queue_action_nodup(bridge, dup);
316  return 0;
317 }
#define ast_frdup(fr)
Copies a frame.
static void bridge_queue_action_nodup(struct ast_bridge *bridge, struct ast_frame *action)
Definition: bridge.c:296
Data structure associated with a single frame of data.

◆ ast_bridge_remove()

int ast_bridge_remove ( struct ast_bridge bridge,
struct ast_channel chan 
)

Remove a channel from a bridge.

Parameters
bridgeBridge that the channel is to be removed from
chanChannel to remove
Return values
0on success
-1on failure

Example usage:

ast_bridge_remove(bridge, chan);

This removes 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
This API call can be used on channels that were added to the bridge using both ast_bridge_join and ast_bridge_impart.

Definition at line 1997 of file bridge.c.

References ast_bridge_channel_leave_bridge(), ast_bridge_lock, ast_bridge_unlock, AST_CAUSE_NORMAL_CLEARING, ast_channel_name(), ast_debug, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, bridge_find_channel(), and ast_bridge::uniqueid.

Referenced by action_kick_last(), ast_bridge_transfer_attended(), ast_bridge_transfer_blind(), execute_menu_entry(), kick_conference_participant(), and leave_marked().

1998 {
1999  struct ast_bridge_channel *bridge_channel;
2000 
2001  ast_debug(1, "Removing channel %s from bridge %s\n",
2002  ast_channel_name(chan), bridge->uniqueid);
2003 
2004  ast_bridge_lock(bridge);
2005 
2006  /* Try to find the channel that we want to remove */
2007  if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
2008  ast_bridge_unlock(bridge);
2009  return -1;
2010  }
2011 
2012  ast_bridge_channel_leave_bridge(bridge_channel,
2014 
2015  ast_bridge_unlock(bridge);
2016 
2017  return 0;
2018 }
const ast_string_field uniqueid
Definition: bridge.h:409
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define AST_CAUSE_NORMAL_CLEARING
Definition: causes.h:105
void ast_bridge_channel_leave_bridge(struct ast_bridge_channel *bridge_channel, enum bridge_channel_state new_state, int cause)
Set bridge channel state to leave bridge (if not leaving already).
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.
const char * ast_channel_name(const struct ast_channel *chan)

◆ ast_bridge_remove_video_src()

void ast_bridge_remove_video_src ( struct ast_bridge bridge,
struct ast_channel chan 
)

remove a channel as a source of video for the bridge.

Definition at line 3984 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_NONE, AST_BRIDGE_VIDEO_MODE_SFU, AST_BRIDGE_VIDEO_MODE_SINGLE_SRC, AST_BRIDGE_VIDEO_MODE_TALKER_SRC, ast_channel_unref, ast_bridge_video_talker_src_data::average_talking_energy, ast_bridge_video_talker_src_data::chan_old_vsrc, ast_bridge_video_single_src_data::chan_vsrc, ast_bridge_video_talker_src_data::chan_vsrc, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, NULL, ast_bridge_video_mode::single_src_data, ast_bridge::softmix, ast_bridge_video_mode::talker_src_data, and ast_bridge_softmix::video_mode.

Referenced by bridge_channel_internal_join(), and handle_video_on_exit().

3985 {
3986  ast_bridge_lock(bridge);
3987  switch (bridge->softmix.video_mode.mode) {
3989  break;
3991  if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc == chan) {
3994  }
3996  }
3997  break;
3999  if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc == chan) {
4002  }
4005  }
4009  }
4011  }
4013  break;
4014  }
4015  ast_bridge_unlock(bridge);
4016 }
union ast_bridge_video_mode::@221 mode_data
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2926
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
struct ast_channel * chan_old_vsrc
Definition: bridge.h:127
struct ast_channel * chan_vsrc
Definition: bridge.h:116
#define NULL
Definition: resample.c:96
struct ast_bridge_softmix softmix
Definition: bridge.h:375
struct ast_bridge_video_talker_src_data talker_src_data
Definition: bridge.h:164
struct ast_bridge_video_single_src_data single_src_data
Definition: bridge.h:163
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
struct ast_channel * chan_vsrc
Definition: bridge.h:123
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_binaural_active()

void ast_bridge_set_binaural_active ( struct ast_bridge bridge,
unsigned int  binaural_active 
)

Activates the use of binaural signals in a conference bridge.

Parameters
bridgeChannel to activate the binaural signals.
binaural_activeIf true binaural signal processing will be active for the bridge.

Definition at line 3772 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge_softmix::binaural_active, and ast_bridge::softmix.

Referenced by join_conference_bridge().

3773 {
3774  ast_bridge_lock(bridge);
3775  bridge->softmix.binaural_active = binaural_active;
3776  ast_bridge_unlock(bridge);
3777 }
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
unsigned int binaural_active
Definition: bridge.h:303

◆ ast_bridge_set_internal_sample_rate()

void ast_bridge_set_internal_sample_rate ( struct ast_bridge bridge,
unsigned int  sample_rate 
)

Adjust the internal mixing sample rate of a bridge used during multimix mode.

Parameters
bridgeChannel to change the sample rate on.
sample_ratethe sample rate to change to. If a value of 0 is passed here, the bridge will be free to pick what ever sample rate it chooses.

Definition at line 3779 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge_softmix::internal_sample_rate, and ast_bridge::softmix.

Referenced by join_conference_bridge().

3780 {
3781  ast_bridge_lock(bridge);
3782  bridge->softmix.internal_sample_rate = sample_rate;
3783  ast_bridge_unlock(bridge);
3784 }
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
unsigned int internal_sample_rate
The internal sample rate softmix uses to mix channels.
Definition: bridge.h:293

◆ ast_bridge_set_maximum_sample_rate()

void ast_bridge_set_maximum_sample_rate ( struct ast_bridge bridge,
unsigned int  sample_rate 
)

Adjust the maximum mixing sample rate of a bridge used during multimix mode.

Since
13.31.0
16.8.0
17.2.0
Parameters
bridgeChannel to change the sample rate on.
sample_ratethe maximum sample rate to use. If a value of 0 is passed here, the bridge will be free to pick what ever sample rate it chooses.

Definition at line 3786 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge_softmix::maximum_sample_rate, and ast_bridge::softmix.

Referenced by join_conference_bridge().

3787 {
3788  ast_bridge_lock(bridge);
3789  bridge->softmix.maximum_sample_rate = sample_rate;
3790  ast_bridge_unlock(bridge);
3791 }
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
unsigned int maximum_sample_rate
The maximum sample rate softmix uses to mix channels.
Definition: bridge.h:314

◆ ast_bridge_set_mixing_interval()

void ast_bridge_set_mixing_interval ( struct ast_bridge bridge,
unsigned int  mixing_interval 
)

Adjust the internal mixing interval of a bridge used during multimix mode.

Parameters
bridgeChannel to change the sample rate on.
mixing_intervalthe sample rate to change to. If 0 is set the bridge tech is free to choose any mixing interval it uses by default.

Definition at line 3765 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge_softmix::internal_mixing_interval, and ast_bridge::softmix.

Referenced by join_conference_bridge().

3766 {
3767  ast_bridge_lock(bridge);
3768  bridge->softmix.internal_mixing_interval = mixing_interval;
3769  ast_bridge_unlock(bridge);
3770 }
unsigned int internal_mixing_interval
The mixing interval indicates how quickly softmix mixing should occur to mix audio.
Definition: bridge.h:301
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_set_remb_estimated_bitrate()

void ast_bridge_set_remb_estimated_bitrate ( struct ast_bridge bridge,
float  estimated_bitrate 
)

Force the REMB report estimated bitrate to a specific max value.

Parameters
bridgeBridge to set the REMB behavior on
estimated_bitrateThe estimated bitrate in bits per second
Note
This can only be called when the bridge has been set to the SFU video mode.

Definition at line 3874 of file bridge.c.

References ast_assert, ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_SFU, ast_bridge_video_sfu_data::estimated_bitrate, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge_video_mode::sfu_data, ast_bridge::softmix, and ast_bridge_softmix::video_mode.

Referenced by join_conference_bridge().

3875 {
3877 
3878  ast_bridge_lock(bridge);
3879  bridge->softmix.video_mode.mode_data.sfu_data.estimated_bitrate = estimated_bitrate;
3880  ast_bridge_unlock(bridge);
3881 }
union ast_bridge_video_mode::@221 mode_data
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
#define ast_assert(a)
Definition: utils.h:650
struct ast_bridge_softmix softmix
Definition: bridge.h:375
struct ast_bridge_video_sfu_data sfu_data
Definition: bridge.h:165
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_remb_send_interval()

void ast_bridge_set_remb_send_interval ( struct ast_bridge bridge,
unsigned int  remb_send_interval 
)

Set the interval at which a combined REMB frame will be sent to video sources.

Parameters
bridgeBridge to set the REMB send interval on
remb_send_intervalThe REMB send interval
Note
This can only be called when the bridge has been set to the SFU video mode.

Definition at line 3856 of file bridge.c.

References ast_assert, ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_SFU, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge_video_sfu_data::remb_send_interval, ast_bridge_video_mode::sfu_data, ast_bridge::softmix, and ast_bridge_softmix::video_mode.

Referenced by join_conference_bridge().

3857 {
3859 
3860  ast_bridge_lock(bridge);
3861  bridge->softmix.video_mode.mode_data.sfu_data.remb_send_interval = remb_send_interval;
3862  ast_bridge_unlock(bridge);
3863 }
union ast_bridge_video_mode::@221 mode_data
unsigned int remb_send_interval
Definition: bridge.h:151
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
#define ast_assert(a)
Definition: utils.h:650
struct ast_bridge_softmix softmix
Definition: bridge.h:375
struct ast_bridge_video_sfu_data sfu_data
Definition: bridge.h:165
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_send_sdp_label()

void ast_bridge_set_send_sdp_label ( struct ast_bridge bridge,
unsigned int  send_sdp_label 
)

Controls whether to send a "label" attribute in each stream in an SDP.

Since
16.1.0
Parameters
bridgeThe bridge
send_sdp_labelWhether to send the labels or not
Note
The label will contain the uniqueid of the channel related to the stream. This is used to allow the recipient to correlate the stream to the participant information events sent by app_confbridge. The bridge will be locked in this function.

Definition at line 4033 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge_softmix::send_sdp_label, and ast_bridge::softmix.

Referenced by join_conference_bridge().

4034 {
4035  ast_bridge_lock(bridge);
4036  bridge->softmix.send_sdp_label = send_sdp_label;
4037  ast_bridge_unlock(bridge);
4038 }
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
unsigned int send_sdp_label
Definition: bridge.h:308
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_set_sfu_video_mode()

void ast_bridge_set_sfu_video_mode ( struct ast_bridge bridge)

Set the bridge to be a selective forwarding unit.

Definition at line 3841 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_SFU, cleanup_video_mode(), ast_bridge_video_mode::mode, ast_bridge::softmix, and ast_bridge_softmix::video_mode.

Referenced by bridge_stasis_new(), and join_conference_bridge().

3842 {
3843  ast_bridge_lock(bridge);
3844  cleanup_video_mode(bridge);
3846  ast_bridge_unlock(bridge);
3847 }
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
static void cleanup_video_mode(struct ast_bridge *bridge)
Definition: bridge.c:3793
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_single_src_video_mode()

void ast_bridge_set_single_src_video_mode ( struct ast_bridge bridge,
struct ast_channel video_src_chan 
)

Set a bridge to feed a single video source to all participants.

Definition at line 3816 of file bridge.c.

References ast_bridge_lock, ast_bridge_publish_state(), ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_SINGLE_SRC, ast_channel_name(), ast_channel_ref, ast_channel_uniqueid(), AST_CONTROL_VIDUPDATE, ast_indicate(), ast_verb, ast_bridge_video_single_src_data::chan_vsrc, cleanup_video_mode(), ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge::name, ast_bridge_video_mode::single_src_data, ast_bridge::softmix, ast_bridge::uniqueid, and ast_bridge_softmix::video_mode.

Referenced by action_confbridgesetsinglevideosrc(), bridge_set_video_source_cb(), bridge_stasis_new(), execute_menu_entry(), handle_video_on_exit(), and handle_video_on_join().

3817 {
3818  ast_bridge_lock(bridge);
3819  cleanup_video_mode(bridge);
3821  if (video_src_chan) {
3823  ast_verb(5, "Video source in bridge '%s' (%s) is now '%s' (%s)\n",
3824  bridge->name, bridge->uniqueid,
3825  ast_channel_name(video_src_chan),
3826  ast_channel_uniqueid(video_src_chan));
3827  ast_indicate(video_src_chan, AST_CONTROL_VIDUPDATE);
3828  }
3829  ast_bridge_publish_state(bridge);
3830  ast_bridge_unlock(bridge);
3831 }
const ast_string_field uniqueid
Definition: bridge.h:409
union ast_bridge_video_mode::@221 mode_data
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4291
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
const ast_string_field name
Definition: bridge.h:409
struct ast_channel * chan_vsrc
Definition: bridge.h:116
static void cleanup_video_mode(struct ast_bridge *bridge)
Definition: bridge.c:3793
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_verb(level,...)
Definition: logger.h:455
void ast_bridge_publish_state(struct ast_bridge *bridge)
Publish the state of a bridge.
struct ast_bridge_video_single_src_data single_src_data
Definition: bridge.h:163
const char * ast_channel_uniqueid(const struct ast_channel *chan)
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2915
const char * ast_channel_name(const struct ast_channel *chan)
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_talker_src_video_mode()

void ast_bridge_set_talker_src_video_mode ( struct ast_bridge bridge)

Set the bridge to pick the strongest talker supporting video as the single source video feed.

Definition at line 3833 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_TALKER_SRC, cleanup_video_mode(), ast_bridge_video_mode::mode, ast_bridge::softmix, and ast_bridge_softmix::video_mode.

Referenced by ast_ari_bridges_clear_video_source(), bridge_stasis_new(), handle_video_on_exit(), and join_conference_bridge().

3834 {
3835  ast_bridge_lock(bridge);
3836  cleanup_video_mode(bridge);
3838  ast_bridge_unlock(bridge);
3839 }
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
static void cleanup_video_mode(struct ast_bridge *bridge)
Definition: bridge.c:3793
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ ast_bridge_set_transfer_variables()

void ast_bridge_set_transfer_variables ( struct ast_channel chan,
const char *  value,
int  is_attended 
)

Set the relevant transfer variables for a single channel.

Sets either the ATTENDEDTRANSFER or BLINDTRANSFER variable for a channel while clearing the opposite.

Parameters
chanChannel the variable is being set for
valueValue the variable is being set to
is_attendedfalse set BLINDTRANSFER and unset ATTENDEDTRANSFER true set ATTENDEDTRANSFER and unset BLINDTRANSFER

Definition at line 4404 of file bridge.c.

References ATTENDEDTRANSFER, BLINDTRANSFER, NULL, and pbx_builtin_setvar_helper().

Referenced by dial_transfer(), manager_park(), park_local_transfer(), parking_park_bridge_channel(), and set_transfer_variables_all().

4405 {
4406  char *writevar;
4407  char *erasevar;
4408 
4409  if (attended) {
4410  writevar = ATTENDEDTRANSFER;
4411  erasevar = BLINDTRANSFER;
4412  } else {
4413  writevar = BLINDTRANSFER;
4414  erasevar = ATTENDEDTRANSFER;
4415  }
4416 
4417  pbx_builtin_setvar_helper(chan, writevar, value);
4418  pbx_builtin_setvar_helper(chan, erasevar, NULL);
4419 }
#define ATTENDEDTRANSFER
Definition: bridge.c:139
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
#define BLINDTRANSFER
Definition: bridge.c:136
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...

◆ ast_bridge_set_video_update_discard()

void ast_bridge_set_video_update_discard ( struct ast_bridge bridge,
unsigned int  video_update_discard 
)

Set the amount of time to discard subsequent video updates after a video update has been sent.

Parameters
bridgeBridge to set the minimum video update wait time on
video_update_discardAmount of time after sending a video update that others should be discarded

Definition at line 3849 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, ast_bridge::softmix, ast_bridge_softmix::video_mode, and ast_bridge_video_mode::video_update_discard.

Referenced by bridge_stasis_new(), and join_conference_bridge().

3850 {
3851  ast_bridge_lock(bridge);
3852  bridge->softmix.video_mode.video_update_discard = video_update_discard;
3853  ast_bridge_unlock(bridge);
3854 }
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
unsigned int video_update_discard
Definition: bridge.h:168
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480

◆ ast_bridge_suspend()

int ast_bridge_suspend ( struct ast_bridge bridge,
struct ast_channel chan 
)

Suspend a channel temporarily from a bridge.

Parameters
bridgeBridge to suspend the channel from
chanChannel to suspend
Return values
0on success
-1on failure

Example usage:

This suspends the channel pointed to by chan from the bridge pointed to by bridge temporarily. Control of the channel is given to the calling thread. This differs from ast_bridge_depart as the channel will not be removed from the bridge.

Note
This API call can be used on channels that were added to the bridge using both ast_bridge_join and ast_bridge_impart.

Definition at line 3068 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, bridge_channel_internal_suspend_nolock(), and bridge_find_channel().

Referenced by conf_moh_start(), and conf_moh_stop().

3069 {
3070  struct ast_bridge_channel *bridge_channel;
3071 /* XXX ASTERISK-21271 the case of a disolved bridge while channel is suspended is not handled. */
3072 /* XXX ASTERISK-21271 suspend/unsuspend needs to be rethought. The caller must block until it has successfully suspended the channel for temporary control. */
3073 /* XXX ASTERISK-21271 external suspend/unsuspend needs to be eliminated. The channel may be playing a file at the time and stealing it then is not good. */
3074 
3075  ast_bridge_lock(bridge);
3076 
3077  if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
3078  ast_bridge_unlock(bridge);
3079  return -1;
3080  }
3081 
3083 
3084  ast_bridge_unlock(bridge);
3085 
3086  return 0;
3087 }
void bridge_channel_internal_suspend_nolock(struct ast_bridge_channel *bridge_channel)
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.

◆ ast_bridge_talk_detector_hook()

int ast_bridge_talk_detector_hook ( struct ast_bridge_features features,
ast_bridge_talking_indicate_callback  callback,
void *  hook_pvt,
ast_bridge_hook_pvt_destructor  destructor,
enum ast_bridge_hook_remove_flags  remove_flags 
)

Attach a bridge channel talk detection hook to a bridge features structure.

Parameters
featuresBridge features structure
callbackFunction to execute upon activation
hook_pvtUnique data
destructorOptional destructor callback for hook_pvt data
remove_flagsDictates what situations the hook should be removed.
Return values
0on success
-1on failure (The caller must cleanup any hook_pvt resources.)

Example usage:

struct ast_bridge_features features;
ast_bridge_talk_hook(&features, talk_callback, NULL, NULL, 0);

This makes the bridging technology call talk_callback when a channel is recognized as starting and stopping talking. A pointer to useful data may be provided to the hook_pvt parameter.

Note
This hook is currently only supported by softmix.

Definition at line 3358 of file bridge.c.

References AST_BRIDGE_HOOK_TYPE_TALK, bridge_other_hook(), and hook_cb().

Referenced by confbridge_exec().

3363 {
3365 
3366  return bridge_other_hook(features, hook_cb, hook_pvt, destructor, remove_flags,
3368 }
int(* ast_bridge_hook_callback)(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
Hook callback type.
static int bridge_other_hook(struct ast_bridge_features *features, ast_bridge_hook_callback callback, void *hook_pvt, ast_bridge_hook_pvt_destructor destructor, enum ast_bridge_hook_remove_flags remove_flags, enum ast_bridge_hook_type type)
Definition: bridge.c:3294
static int hook_cb(struct ast_config *cfg)
Definition: test_config.c:875

◆ ast_bridge_technology_suspend()

void ast_bridge_technology_suspend ( struct ast_bridge_technology technology)

Suspend a bridge technology from consideration.

Parameters
technologyThe bridge technology to suspend

Example usage:

ast_bridge_technology_suspend(&simple_bridge_tech);

This suspends the bridge technology simple_bridge_tech from being considered when creating a new bridge. Existing bridges using the bridge technology are not affected.

Definition at line 3108 of file bridge.c.

References ast_bridge_technology::suspended.

Referenced by handle_bridge_technology_suspend(), and handle_manager_bridge_tech_suspend().

3109 {
3110  technology->suspended = 1;
3111 }

◆ ast_bridge_technology_unregister()

int ast_bridge_technology_unregister ( struct ast_bridge_technology technology)

Unregister a bridge technology from use.

Parameters
technologyThe bridge technology to unregister
Return values
0on success
-1on failure

Example usage:

ast_bridge_technology_unregister(&simple_bridge_tech);

This unregisters a bridge technlogy declared as the structure simple_bridge_tech with the bridging core. It will no longer be considered when creating a new bridge.

Definition at line 265 of file bridge.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, and ast_bridge_technology::name.

Referenced by dahdi_native_unload(), and unload_module().

266 {
267  struct ast_bridge_technology *current;
268 
270 
271  /* Ensure the bridge technology is registered before removing it */
273  if (current == technology) {
275  ast_verb(2, "Unregistered bridge technology %s\n", technology->name);
276  break;
277  }
278  }
280 
282 
283  return current ? 0 : -1;
284 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_verb(level,...)
Definition: logger.h:455
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:569
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
Structure that is the essence of a bridge technology.
Definition: search.h:40
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:616

◆ ast_bridge_technology_unsuspend()

void ast_bridge_technology_unsuspend ( struct ast_bridge_technology technology)

Unsuspend a bridge technology.

Parameters
technologyThe bridge technology to unsuspend

Example usage:

ast_bridge_technology_unsuspend(&simple_bridge_tech);

This makes the bridge technology simple_bridge_tech considered when creating a new bridge again.

Definition at line 3113 of file bridge.c.

References ast_bridge_technology::suspended.

Referenced by handle_bridge_technology_suspend(), and handle_manager_bridge_tech_suspend().

3114 {
3115  /*
3116  * XXX We may want the act of unsuspending a bridge technology
3117  * to prod all existing bridges to see if they should start
3118  * using it.
3119  */
3120  technology->suspended = 0;
3121 }

◆ ast_bridge_transfer_acquire_bridge()

struct ast_bridge* ast_bridge_transfer_acquire_bridge ( struct ast_channel chan)

Acquire the channel's bridge for transfer purposes.

Since
13.21.0
Parameters
chanChannel involved in a transfer.
Returns
The bridge the channel is in or NULL if it either isn't in a bridge or should not be considered to be in a bridge.

Definition at line 4460 of file bridge.c.

References ao2_ref, AST_BRIDGE_FLAG_INVISIBLE, AST_BRIDGE_FLAG_MASQUERADE_ONLY, ast_channel_get_bridge(), ast_channel_lock, ast_channel_unlock, ast_test_flag, bridge_manager_request::bridge, ast_bridge::feature_flags, and NULL.

Referenced by ast_bridge_transfer_attended(), ast_bridge_transfer_blind(), handle_invite_replaces(), and invite_replaces().

4461 {
4462  struct ast_bridge *bridge;
4463 
4464  ast_channel_lock(chan);
4465  bridge = ast_channel_get_bridge(chan);
4466  ast_channel_unlock(chan);
4467 
4468  if (bridge && ast_test_flag(&bridge->feature_flags,
4470  ao2_ref(bridge, -1);
4471  bridge = NULL;
4472  }
4473 
4474  return bridge;
4475 }
#define ast_channel_lock(chan)
Definition: channel.h:2890
struct ast_flags feature_flags
Definition: bridge.h:377
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define NULL
Definition: resample.c:96
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10592
#define ao2_ref(o, delta)
Definition: astobj2.h:464
Structure that contains information about a bridge.
Definition: bridge.h:357
#define ast_channel_unlock(chan)
Definition: channel.h:2891

◆ ast_bridge_transfer_attended()

enum ast_transfer_result ast_bridge_transfer_attended ( struct ast_channel to_transferee,
struct ast_channel to_transfer_target 
)

Attended transfer.

The two channels are both transferer channels. The first is the channel that is bridged to the transferee (or if unbridged, the 'first' call of the transfer). The second is the channel that is bridged to the transfer target (or if unbridged, the 'second' call of the transfer).

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
to_transfereeTransferer channel on initial call (presumably bridged to transferee)
to_transfer_targetTransferer channel on consultation call (presumably bridged to transfer target)
Returns
The success or failure of the attended transfer

Definition at line 4729 of file bridge.c.

References ao2_cleanup, ao2_container_count(), app, ast_attended_transfer_message_add_app(), ast_attended_transfer_message_create(), ast_bridge_channel_write_playfile(), ast_bridge_channel_write_unhold(), AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY, AST_BRIDGE_FLAG_TRANSFER_PROHIBITED, ast_bridge_lock, ast_bridge_lock_both, ast_bridge_peers_nolock(), ast_bridge_publish_attended_transfer(), ast_bridge_remove(), ast_bridge_transfer_acquire_bridge(), AST_BRIDGE_TRANSFER_FAIL, AST_BRIDGE_TRANSFER_INVALID, AST_BRIDGE_TRANSFER_NOT_PERMITTED, AST_BRIDGE_TRANSFER_SUCCESS, ast_bridge_unlock, ast_channel_appl(), ast_channel_get_bridge_channel(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_log, ast_softhangup(), AST_SOFTHANGUP_DEV, ast_strdupa, ast_strlen_zero, ast_test_flag, attended_transfer_bridge(), bridge_channel_internal_queue_attended_transfer(), channels, end, ast_bridge::feature_flags, get_transferee(), lock, LOG_ERROR, NULL, pbx_builtin_getvar_helper(), RAII_VAR, SCOPED_LOCK, set_transfer_variables_all(), and two_bridge_attended_transfer().

Referenced by analog_attempt_transfer(), AST_TEST_DEFINE(), attempt_transfer(), local_attended_transfer(), misdn_attempt_transfer(), refer_attended_task(), and skinny_transfer_attended().

4731 {
4732  RAII_VAR(struct ast_bridge *, to_transferee_bridge, NULL, ao2_cleanup);
4733  RAII_VAR(struct ast_bridge *, to_target_bridge, NULL, ao2_cleanup);
4734  RAII_VAR(struct ast_bridge_channel *, to_transferee_bridge_channel, NULL, ao2_cleanup);
4735  RAII_VAR(struct ast_bridge_channel *, to_target_bridge_channel, NULL, ao2_cleanup);
4737  RAII_VAR(struct ast_channel *, transferee, NULL, ao2_cleanup);
4738  RAII_VAR(struct ast_attended_transfer_message *, transfer_msg, NULL, ao2_cleanup);
4739  struct ast_bridge *the_bridge = NULL;
4740  struct ast_channel *chan_bridged;
4741  struct ast_channel *chan_unbridged;
4742  int transfer_prohibited;
4743  int do_bridge_transfer;
4744  enum ast_transfer_result res;
4745  const char *app = NULL;
4746  int hangup_target = 0;
4747 
4748  to_transferee_bridge = ast_bridge_transfer_acquire_bridge(to_transferee);
4749  to_target_bridge = ast_bridge_transfer_acquire_bridge(to_transfer_target);
4750 
4751  transfer_msg = ast_attended_transfer_message_create(1, to_transferee, to_transferee_bridge,
4752  to_transfer_target, to_target_bridge, NULL, NULL);
4753  if (!transfer_msg) {
4754  ast_log(LOG_ERROR, "Unable to create Stasis publication for attended transfer from %s\n",
4755  ast_channel_name(to_transferee));
4756  return AST_BRIDGE_TRANSFER_FAIL;
4757  }
4758 
4759  /* They can't both be unbridged, you silly goose! */
4760  if (!to_transferee_bridge && !to_target_bridge) {
4762  goto end;
4763  }
4764 
4765  ast_channel_lock(to_transferee);
4766  to_transferee_bridge_channel = ast_channel_get_bridge_channel(to_transferee);
4767  ast_channel_unlock(to_transferee);
4768 
4769  ast_channel_lock(to_transfer_target);
4770  to_target_bridge_channel = ast_channel_get_bridge_channel(to_transfer_target);
4771  ast_channel_unlock(to_transfer_target);
4772 
4773  if (to_transferee_bridge_channel) {
4774  /* Take off hold if they are on hold. */
4775  if (ast_bridge_channel_write_unhold(to_transferee_bridge_channel)) {
4776  ast_log(LOG_ERROR, "Transferee channel disappeared during transfer!\n");
4778  goto end;
4779  }
4780  }
4781 
4782  if (to_target_bridge_channel) {
4783  const char *target_complete_sound;
4784 
4785  /* Take off hold if they are on hold. */
4786  if (ast_bridge_channel_write_unhold(to_target_bridge_channel)) {
4787  ast_log(LOG_ERROR, "Target channel disappeared during transfer!\n");
4789  goto end;
4790  }
4791 
4792  /* Is there a courtesy sound to play to the target? */
4793  ast_channel_lock(to_transfer_target);
4794  target_complete_sound = pbx_builtin_getvar_helper(to_transfer_target,
4795  "ATTENDED_TRANSFER_COMPLETE_SOUND");
4796  if (!ast_strlen_zero(target_complete_sound)) {
4797  target_complete_sound = ast_strdupa(target_complete_sound);
4798  } else {
4799  target_complete_sound = NULL;
4800  }
4801  ast_channel_unlock(to_transfer_target);
4802  if (!target_complete_sound) {
4803  ast_channel_lock(to_transferee);
4804  target_complete_sound = pbx_builtin_getvar_helper(to_transferee,
4805  "ATTENDED_TRANSFER_COMPLETE_SOUND");
4806  if (!ast_strlen_zero(target_complete_sound)) {
4807  target_complete_sound = ast_strdupa(target_complete_sound);
4808  } else {
4809  target_complete_sound = NULL;
4810  }
4811  ast_channel_unlock(to_transferee);
4812  }
4813  if (target_complete_sound) {
4814  ast_bridge_channel_write_playfile(to_target_bridge_channel, NULL,
4815  target_complete_sound, NULL);
4816  }
4817  }
4818 
4819  /* Let's get the easy one out of the way first */
4820  if (to_transferee_bridge && to_target_bridge) {
4821 
4822  if (!to_transferee_bridge_channel || !to_target_bridge_channel) {
4824  goto end;
4825  }
4826 
4827  ast_bridge_lock_both(to_transferee_bridge, to_target_bridge);
4828  res = two_bridge_attended_transfer(to_transferee, to_transferee_bridge_channel,
4829  to_transfer_target, to_target_bridge_channel,
4830  to_transferee_bridge, to_target_bridge, transfer_msg);
4831  ast_bridge_unlock(to_transferee_bridge);
4832  ast_bridge_unlock(to_target_bridge);
4833 
4834  hangup_target = 1;
4835  goto end;
4836  }
4837 
4838  the_bridge = to_transferee_bridge ?: to_target_bridge;
4839  chan_bridged = to_transferee_bridge ? to_transferee : to_transfer_target;
4840  chan_unbridged = to_transferee_bridge ? to_transfer_target : to_transferee;
4841 
4842  /*
4843  * Race condition makes it possible for app to be NULL, so get the app prior to
4844  * transferring with a fallback of "unknown".
4845  */
4846  app = ast_strdupa(ast_channel_appl(chan_unbridged) ?: "unknown");
4847 
4848  {
4849  int chan_count;
4851 
4852  channels = ast_bridge_peers_nolock(the_bridge);
4853  if (!channels) {
4855  goto end;
4856  }
4857  chan_count = ao2_container_count(channels);
4858  if (chan_count <= 1) {
4860  goto end;
4861  }
4862  transfer_prohibited = ast_test_flag(&the_bridge->feature_flags,
4864  do_bridge_transfer = ast_test_flag(&the_bridge->feature_flags,
4866  chan_count > 2;
4867  }
4868 
4869  if (transfer_prohibited) {
4871  goto end;
4872  }
4873 
4874  set_transfer_variables_all(to_transferee, channels, 1);
4875 
4876  if (do_bridge_transfer) {
4877  /*
4878  * Hang up the target if it was bridged. Note, if it is not bridged
4879  * it is hung up during the masquerade.
4880  */
4881  hangup_target = chan_bridged == to_transfer_target;
4882  ast_bridge_lock(the_bridge);
4883  res = attended_transfer_bridge(chan_bridged, chan_unbridged, the_bridge, NULL, transfer_msg);
4884  ast_bridge_unlock(the_bridge);
4885  goto end;
4886  }
4887 
4888  transferee = get_transferee(channels, chan_bridged);
4889  if (!transferee) {
4891  goto end;
4892  }
4893 
4894  if (bridge_channel_internal_queue_attended_transfer(transferee, chan_unbridged)) {
4896  goto end;
4897  }
4898 
4899  ast_bridge_remove(the_bridge, chan_bridged);
4900 
4901  ast_attended_transfer_message_add_app(transfer_msg, app, NULL);
4903 
4904 end:
4905  if ((res == AST_BRIDGE_TRANSFER_SUCCESS && hangup_target) || res == AST_BRIDGE_TRANSFER_FAIL) {
4906  ast_softhangup(to_transfer_target, AST_SOFTHANGUP_DEV);
4907  }
4908 
4909  transfer_msg->result = res;
4911  return res;
4912 }
#define ast_channel_lock(chan)
Definition: channel.h:2890
Main Channel structure associated with a channel.
#define ast_bridge_lock_both(bridge1, bridge2)
Lock two bridges.
Definition: bridge.h:500
struct ast_flags feature_flags
Definition: bridge.h:377
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
struct ast_bridge * ast_bridge_transfer_acquire_bridge(struct ast_channel *chan)
Acquire the channel&#39;s bridge for transfer purposes.
Definition: bridge.c:4460
Message representing attended transfer.
#define ast_test_flag(p, flag)
Definition: utils.h:63
void ast_bridge_publish_attended_transfer(struct ast_attended_transfer_message *transfer_msg)
Publish an attended transfer.
int ast_attended_transfer_message_add_app(struct ast_attended_transfer_message *transfer_msg, const char *app, struct ast_channel *replace_channel)
Add details for an attended transfer to an application.
static enum ast_transfer_result two_bridge_attended_transfer(struct ast_channel *to_transferee, struct ast_bridge_channel *to_transferee_bridge_channel, struct ast_channel *to_transfer_target, struct ast_bridge_channel *to_target_bridge_channel, struct ast_bridge *to_transferee_bridge, struct ast_bridge *to_target_bridge, struct ast_attended_transfer_message *transfer_msg)
Definition: bridge.c:4663
#define NULL
Definition: resample.c:96
char * end
Definition: eagi_proxy.c:73
ast_transfer_result
Definition: bridge.h:1115
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_log
Definition: astobj2.c:42
static void set_transfer_variables_all(struct ast_channel *transferer, struct ao2_container *channels, int is_attended)
Definition: bridge.c:4435
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:851
ast_mutex_t lock
Definition: app_meetme.c:1091
int ast_softhangup(struct ast_channel *chan, int reason)
Softly hangup up a channel.
Definition: channel.c:2462
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition: lock.h:581
static struct channel_usage channels
static enum ast_transfer_result attended_transfer_bridge(struct ast_channel *chan1, struct ast_channel *chan2, struct ast_bridge *bridge1, struct ast_bridge *bridge2, struct ast_attended_transfer_message *transfer_msg)
Perform an attended transfer of a bridge.
Definition: bridge.c:4280
Structure that contains information about a bridge.
Definition: bridge.h:357
#define LOG_ERROR
Definition: logger.h:285
int ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
Write a bridge action play file frame into the bridge.
const char * ast_channel_appl(const struct ast_channel *chan)
#define ast_strlen_zero(a)
Definition: muted.c:73
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
struct ao2_container * ast_bridge_peers_nolock(struct ast_bridge *bridge)
Get a container of all channels in the bridge.
Definition: bridge.c:4085
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel&#39;s bridge pointer.
Definition: channel.c:10640
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
static struct ast_channel * get_transferee(struct ao2_container *channels, struct ast_channel *transferer)
Definition: bridge.c:4241
int bridge_channel_internal_queue_attended_transfer(struct ast_channel *transferee, struct ast_channel *unbridged_chan)
Generic container type.
int ast_bridge_remove(struct ast_bridge *bridge, struct ast_channel *chan)
Remove a channel from a bridge.
Definition: bridge.c:1997
int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
Write an unhold frame into the bridge.
struct ast_attended_transfer_message * ast_attended_transfer_message_create(int is_external, struct ast_channel *to_transferee, struct ast_bridge *transferee_bridge, struct ast_channel *to_transfer_target, struct ast_bridge *target_bridge, struct ast_channel *transferee, struct ast_channel *transfer_target)
Create an Attended transfer message to be published.
static const char app[]
Definition: app_mysql.c:62

◆ ast_bridge_transfer_blind()

enum ast_transfer_result ast_bridge_transfer_blind ( int  is_external,
struct ast_channel transferer,
const char *  exten,
const char *  context,
transfer_channel_cb  new_channel_cb,
void *  user_data 
)

Blind transfer target to the extension and context provided.

The channel given is bridged to one or multiple channels. Depending on the bridge and the number of participants, the entire bridge could be transferred to the given destination, or a single channel may be redirected.

Callers may also provide a callback to be called on the channel that will be running dialplan. The user data passed into ast_bridge_transfer_blind will be given as the argument to the callback to be interpreted as desired. This callback is guaranteed to be called in the same thread as ast_bridge_transfer_blind() and before ast_bridge_transfer_blind() returns.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
is_externalIndicates that transfer was initiated externally
transfererThe channel performing the blind transfer
extenThe dialplan extension to send the call to
contextThe dialplan context to send the call to
new_channel_cbA callback to be called on the channel that will be executing dialplan
user_dataArgument for new_channel_cb
Returns
The success or failure result of the blind transfer

Definition at line 4477 of file bridge.c.

References ao2_alloc, ao2_cleanup, ao2_container_count(), ast_blind_transfer_message_create(), ast_bridge_channel_write_unhold(), AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY, AST_BRIDGE_FLAG_TRANSFER_PROHIBITED, ast_bridge_lock, ast_bridge_peer(), ast_bridge_peers_nolock(), ast_bridge_publish_blind_transfer(), ast_bridge_remove(), ast_bridge_snapshot_create(), ast_bridge_transfer_acquire_bridge(), AST_BRIDGE_TRANSFER_FAIL, AST_BRIDGE_TRANSFER_INVALID, AST_BRIDGE_TRANSFER_NOT_PERMITTED, AST_BRIDGE_TRANSFER_SUCCESS, ast_bridge_unlock, ast_channel_cleanup, ast_channel_get_bridge_channel(), ast_channel_lock, ast_channel_name(), ast_channel_snapshot_get_latest(), ast_channel_uniqueid(), ast_channel_unlock, ast_log, ast_test_flag, blind_transfer_bridge(), bridge_manager_request::bridge, bridge_channel_internal_queue_blind_transfer(), channels, ast_bridge::feature_flags, lock, LOG_ERROR, NULL, publish, RAII_VAR, SCOPED_LOCK, set_transfer_variables_all(), and try_parking().

Referenced by action_blind_transfer(), blind_transfer_exec(), console_transfer(), feature_blind_transfer(), handle_request_refer(), refer_incoming_attended_request(), refer_incoming_blind_request(), skinny_transfer_blind(), and socket_process_helper().

4480 {
4481  RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
4482  RAII_VAR(struct ast_bridge_channel *, bridge_channel, NULL, ao2_cleanup);
4484  RAII_VAR(struct ast_channel *, transferee, NULL, ast_channel_cleanup);
4485  RAII_VAR(struct transfer_channel_data *, user_data_wrapper, NULL, ao2_cleanup);
4486  RAII_VAR(struct ast_blind_transfer_message *, transfer_message, NULL, ao2_cleanup);
4487  int do_bridge_transfer;
4488  int transfer_prohibited;
4489  enum ast_transfer_result transfer_result;
4490 
4491  transfer_message = ast_blind_transfer_message_create(is_external, transferer, exten, context);
4492  if (!transfer_message) {
4493  /* Out of memory. Not even possible to publish a Stasis message about the
4494  * failure
4495  */
4496  ast_log(LOG_ERROR, "Unable to allocate memory for blind transfer publication from %s\n",
4497  ast_channel_name(transferer));
4498  return AST_BRIDGE_TRANSFER_FAIL;
4499  }
4500 
4501  bridge = ast_bridge_transfer_acquire_bridge(transferer);
4502  if (!bridge) {
4503  transfer_result = AST_BRIDGE_TRANSFER_INVALID;
4504  goto publish;
4505  }
4506 
4507  ast_bridge_lock(bridge);
4508  transfer_message->bridge = ast_bridge_snapshot_create(bridge);
4509  ast_bridge_unlock(bridge);
4510  if (!transfer_message->bridge) {
4511  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4512  goto publish;
4513  }
4514 
4515  transferee = ast_bridge_peer(bridge, transferer);
4516  if (transferee) {
4517  transfer_message->transferee = ast_channel_snapshot_get_latest(ast_channel_uniqueid(transferee));
4518  if (!transfer_message->transferee) {
4519  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4520  goto publish;
4521  }
4522  }
4523 
4524  ast_channel_lock(transferer);
4525  bridge_channel = ast_channel_get_bridge_channel(transferer);
4526  ast_channel_unlock(transferer);
4527  if (!bridge_channel) {
4528  transfer_result = AST_BRIDGE_TRANSFER_INVALID;
4529  goto publish;
4530  }
4531 
4532  user_data_wrapper = ao2_alloc(sizeof(*user_data_wrapper), NULL);
4533  if (!user_data_wrapper) {
4534  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4535  goto publish;
4536  }
4537 
4538  user_data_wrapper->data = user_data;
4539 
4540  /* Take off hold if they are on hold. */
4541  ast_bridge_channel_write_unhold(bridge_channel);
4542 
4543  transfer_result = try_parking(transferer, context, exten, new_channel_cb, user_data_wrapper);
4544  if (transfer_result == AST_BRIDGE_TRANSFER_SUCCESS) {
4545  goto publish;
4546  }
4547 
4548  /* Since parking didn't take control of the user_data_wrapper, we are just going to raise the completed flag now. */
4549  user_data_wrapper->completed = 1;
4550 
4551  {
4553 
4555  if (!channels) {
4556  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4557  goto publish;
4558  }
4559  if (ao2_container_count(channels) <= 1) {
4560  transfer_result = AST_BRIDGE_TRANSFER_INVALID;
4561  goto publish;
4562  }
4563  transfer_prohibited = ast_test_flag(&bridge->feature_flags,
4565  do_bridge_transfer = ast_test_flag(&bridge->feature_flags,
4568  }
4569 
4570  if (transfer_prohibited) {
4571  transfer_result = AST_BRIDGE_TRANSFER_NOT_PERMITTED;
4572  goto publish;
4573  }
4574 
4575  set_transfer_variables_all(transferer, channels, 0);
4576 
4577  if (do_bridge_transfer) {
4578  transfer_result = blind_transfer_bridge(is_external, transferer, bridge,
4579  exten, context, transferee, new_channel_cb, user_data_wrapper, transfer_message);
4580  goto publish;
4581  }
4582 
4583  /* Reaching this portion means that we're dealing with a two-party bridge */
4584 
4585  if (!transferee) {
4586  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4587  goto publish;
4588  }
4589 
4591  new_channel_cb, user_data_wrapper)) {
4592  transfer_result = AST_BRIDGE_TRANSFER_FAIL;
4593  goto publish;
4594  }
4595 
4596  ast_bridge_remove(bridge, transferer);
4597  transfer_result = AST_BRIDGE_TRANSFER_SUCCESS;
4598 
4599 publish:
4600  transfer_message->result = transfer_result;
4601  ast_bridge_publish_blind_transfer(transfer_message);
4602  return transfer_result;
4603 }
#define ast_channel_lock(chan)
Definition: channel.h:2890
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
struct ast_blind_transfer_message * ast_blind_transfer_message_create(int is_external, struct ast_channel *transferer, const char *exten, const char *context)
Create a blind transfer message to be published.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
struct ast_bridge * ast_bridge_transfer_acquire_bridge(struct ast_channel *chan)
Acquire the channel&#39;s bridge for transfer purposes.
Definition: bridge.c:4460
#define ast_test_flag(p, flag)
Definition: utils.h:63
Message published during a blind transfer.
#define NULL
Definition: resample.c:96
ast_transfer_result
Definition: bridge.h:1115
unsigned char publish
Definition: res_corosync.c:241
#define ast_log
Definition: astobj2.c:42
static void set_transfer_variables_all(struct ast_channel *transferer, struct ao2_container *channels, int is_attended)
Definition: bridge.c:4435
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:851
ast_mutex_t lock
Definition: app_meetme.c:1091
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2937
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition: lock.h:581
static struct channel_usage channels
const char * ast_channel_uniqueid(const struct ast_channel *chan)
Structure that contains information about a bridge.
Definition: bridge.h:357
#define LOG_ERROR
Definition: logger.h:285
int bridge_channel_internal_queue_blind_transfer(struct ast_channel *transferee, const char *exten, const char *context, transfer_channel_cb new_channel_cb, void *user_data)
static enum ast_transfer_result try_parking(struct ast_channel *transferer, const char *context, const char *exten, transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper)
Definition: bridge.c:4378
static enum ast_transfer_result blind_transfer_bridge(int is_external, struct ast_channel *transferer, struct ast_bridge *bridge, const char *exten, const char *context, struct ast_channel *transferee, transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper, struct ast_blind_transfer_message *transfer_message)
Definition: bridge.c:4178
struct ast_bridge_snapshot * ast_bridge_snapshot_create(struct ast_bridge *bridge)
Generate a snapshot of the bridge state. This is an ao2 object, so ao2_cleanup() to deallocate...
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
struct ast_channel * ast_bridge_peer(struct ast_bridge *bridge, struct ast_channel *chan)
Get the channel&#39;s bridge peer only if the bridge is two-party.
Definition: bridge.c:4142
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
void ast_bridge_publish_blind_transfer(struct ast_blind_transfer_message *transfer_message)
Publish a blind transfer event.
struct ao2_container * ast_bridge_peers_nolock(struct ast_bridge *bridge)
Get a container of all channels in the bridge.
Definition: bridge.c:4085
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel&#39;s bridge pointer.
Definition: channel.c:10640
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object...
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
AO2 object that wraps data for transfer_channel_cb.
Definition: bridge.h:1136
Generic container type.
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
int ast_bridge_remove(struct ast_bridge *bridge, struct ast_channel *chan)
Remove a channel from a bridge.
Definition: bridge.c:1997
int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
Write an unhold frame into the bridge.

◆ ast_bridge_unreal_optimize_out()

int ast_bridge_unreal_optimize_out ( struct ast_channel chan,
struct ast_channel peer,
struct ast_unreal_pvt pvt 
)

Check and optimize out the unreal channels between bridges.

Since
12.0.0
Parameters
chanUnreal channel writing a frame into the channel driver.
peerOther unreal channel in the pair.
pvtPrivate data provided by an implementation of the unreal driver that contains the callbacks that should be called when optimization begins/ends
Note
It is assumed that chan is already locked.
Return values
0if unreal channels were not optimized out.
non-zeroif unreal channels were optimized out.

Definition at line 2968 of file bridge.c.

References ast_bridge_channel_unlock, ast_bridge_unlock, ast_channel_internal_bridge_channel(), ast_channel_unlock, optimize_lock_chan_stack(), optimize_lock_peer_stack(), try_merge_optimize_out(), and try_swap_optimize_out().

Referenced by got_optimized_out().

2969 {
2970  struct ast_bridge *chan_bridge;
2971  struct ast_bridge *peer_bridge;
2972  struct ast_bridge_channel *chan_bridge_channel;
2973  struct ast_bridge_channel *peer_bridge_channel;
2974  int res = 0;
2975 
2976  chan_bridge = optimize_lock_chan_stack(chan);
2977  if (!chan_bridge) {
2978  return res;
2979  }
2980  chan_bridge_channel = ast_channel_internal_bridge_channel(chan);
2981 
2982  peer_bridge = optimize_lock_peer_stack(peer);
2983  if (peer_bridge) {
2984  peer_bridge_channel = ast_channel_internal_bridge_channel(peer);
2985 
2986  res = try_swap_optimize_out(chan_bridge, chan_bridge_channel,
2987  peer_bridge, peer_bridge_channel, pvt);
2988  if (!res) {
2989  res = try_merge_optimize_out(chan_bridge, chan_bridge_channel,
2990  peer_bridge, peer_bridge_channel, pvt);
2991  } else if (0 < res) {
2992  res = 0;
2993  }
2994 
2995  /* Release peer locks. */
2996  ast_bridge_unlock(peer_bridge);
2997  ast_bridge_channel_unlock(peer_bridge_channel);
2998  ast_channel_unlock(peer);
2999  }
3000 
3001  /* Release chan locks. */
3002  ast_bridge_unlock(chan_bridge);
3003  ast_bridge_channel_unlock(chan_bridge_channel);
3004 
3005  return res;
3006 }
static int try_swap_optimize_out(struct ast_bridge *chan_bridge, struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge, struct ast_bridge_channel *peer_bridge_channel, struct ast_unreal_pvt *pvt)
Definition: bridge.c:2793
static int try_merge_optimize_out(struct ast_bridge *chan_bridge, struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge, struct ast_bridge_channel *peer_bridge_channel, struct ast_unreal_pvt *pvt)
Definition: bridge.c:2917
static struct ast_bridge * optimize_lock_peer_stack(struct ast_channel *peer)
Definition: bridge.c:2672
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
#define ast_bridge_channel_unlock(bridge_channel)
Unlock the bridge_channel.
Structure that contains information about a bridge.
Definition: bridge.h:357
#define ast_channel_unlock(chan)
Definition: channel.h:2891
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
static struct ast_bridge * optimize_lock_chan_stack(struct ast_channel *chan)
Definition: bridge.c:2627
Structure that contains information regarding a channel in a bridge.

◆ ast_bridge_unsuspend()

int ast_bridge_unsuspend ( struct ast_bridge bridge,
struct ast_channel chan 
)

Unsuspend a channel from a bridge.

Parameters
bridgeBridge to unsuspend the channel from
chanChannel to unsuspend
Return values
0on success
-1on failure

Example usage:

This unsuspends the channel pointed to by chan from the bridge pointed to by bridge. The bridge will go back to handling the channel once this function returns.

Note
You must not mess with the channel once this function returns. Doing so may result in bad things happening.

Definition at line 3089 of file bridge.c.

References ast_bridge_lock, ast_bridge_unlock, bridge_channel_internal_unsuspend_nolock(), and bridge_find_channel().

Referenced by conf_moh_start(), and conf_moh_stop().

3090 {
3091  struct ast_bridge_channel *bridge_channel;
3092 /* XXX ASTERISK-21271 the case of a disolved bridge while channel is suspended is not handled. */
3093 
3094  ast_bridge_lock(bridge);
3095 
3096  if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
3097  ast_bridge_unlock(bridge);
3098  return -1;
3099  }
3100 
3102 
3103  ast_bridge_unlock(bridge);
3104 
3105  return 0;
3106 }
struct ast_bridge_channel * bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
Definition: bridge.c:1469
void bridge_channel_internal_unsuspend_nolock(struct ast_bridge_channel *bridge_channel)
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
Structure that contains information regarding a channel in a bridge.

◆ ast_bridge_update_talker_src_video_mode()

void ast_bridge_update_talker_src_video_mode ( struct ast_bridge bridge,
struct ast_channel chan,
int  talker_energy,
int  is_keyframe 
)

Update information about talker energy for talker src video mode.

Definition at line 3883 of file bridge.c.

References ast_bridge_lock, ast_bridge_publish_state(), ast_bridge_unlock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_ref, ast_channel_uniqueid(), ast_channel_unref, AST_CONTROL_VIDUPDATE, ast_format_cap_has_type(), ast_indicate(), AST_MEDIA_TYPE_VIDEO, ast_verb, ast_bridge_video_talker_src_data::average_talking_energy, ast_bridge_video_talker_src_data::chan_old_vsrc, ast_bridge_video_talker_src_data::chan_vsrc, ast_bridge_video_mode::mode_data, ast_bridge::name, ast_bridge::softmix, ast_bridge_video_mode::talker_src_data, ast_bridge::uniqueid, and ast_bridge_softmix::video_mode.

Referenced by softmix_bridge_write_video().

3884 {
3885  struct ast_bridge_video_talker_src_data *data;
3886 
3887  /* If the channel doesn't support video, we don't care about it */
3889  return;
3890  }
3891 
3892  ast_bridge_lock(bridge);
3893  data = &bridge->softmix.video_mode.mode_data.talker_src_data;
3894 
3895  if (data->chan_vsrc == chan) {
3896  data->average_talking_energy = talker_energy;
3897  } else if ((data->average_talking_energy < talker_energy) && is_keyframe) {
3898  if (data->chan_old_vsrc) {
3900  }
3901  if (data->chan_vsrc) {
3902  data->chan_old_vsrc = data->chan_vsrc;
3904  }
3905  data->chan_vsrc = ast_channel_ref(chan);
3906  data->average_talking_energy = talker_energy;
3907  ast_verb(5, "Video source in bridge '%s' (%s) is now '%s' (%s)\n",
3908  bridge->name, bridge->uniqueid,
3909  ast_channel_name(data->chan_vsrc),
3911  ast_bridge_publish_state(bridge);
3913  } else if ((data->average_talking_energy < talker_energy) && !is_keyframe) {
3915  } else if (!data->chan_vsrc && is_keyframe) {
3916  data->chan_vsrc = ast_channel_ref(chan);
3917  data->average_talking_energy = talker_energy;
3918  ast_verb(5, "Video source in bridge '%s' (%s) is now '%s' (%s)\n",
3919  bridge->name, bridge->uniqueid,
3920  ast_channel_name(data->chan_vsrc),
3922  ast_bridge_publish_state(bridge);
3924  } else if (!data->chan_old_vsrc && is_keyframe) {
3925  data->chan_old_vsrc = ast_channel_ref(chan);
3927  }
3928  ast_bridge_unlock(bridge);
3929 }
const ast_string_field uniqueid
Definition: bridge.h:409
union ast_bridge_video_mode::@221 mode_data
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2926
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4291
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
const ast_string_field name
Definition: bridge.h:409
struct ast_channel * chan_old_vsrc
Definition: bridge.h:127
This is used for both SINGLE_SRC_TALKER mode to set what channel should be the current single video f...
Definition: bridge.h:121
struct ast_bridge_softmix softmix
Definition: bridge.h:375
#define ast_verb(level,...)
Definition: logger.h:455
struct ast_bridge_video_talker_src_data talker_src_data
Definition: bridge.h:164
void ast_bridge_publish_state(struct ast_bridge *bridge)
Publish the state of a bridge.
const char * ast_channel_uniqueid(const struct ast_channel *chan)
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2915
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_channel * chan_vsrc
Definition: bridge.h:123
int ast_format_cap_has_type(const struct ast_format_cap *cap, enum ast_media_type type)
Find out if the capabilities structure has any formats of a specific type.
Definition: format_cap.c:615

◆ ast_bridge_vars_set()

void ast_bridge_vars_set ( struct ast_channel chan,
const char *  name,
const char *  pvtid 
)

Sets BRIDGECHANNEL and BRIDGEPVTCALLID for a channel.

Precondition
chan must be locked before calling
Parameters
namechannel name of the bridged peer
pvtidPrivate CallID of the bridged peer
Returns
nothing

Definition at line 1242 of file bridge.c.

References ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), and pbx_builtin_setvar_helper().

Referenced by ast_bridge_channel_leave_bridge_nolock(), set_bridge_peer_vars_2party(), set_bridge_peer_vars_holding(), and set_bridge_peer_vars_multiparty().

1243 {
1245  pbx_builtin_setvar_helper(chan, "BRIDGEPEER", name);
1246  pbx_builtin_setvar_helper(chan, "BRIDGEPVTCALLID", pvtid);
1248 }
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
static const char name[]
Definition: cdr_mysql.c:74
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...

◆ ast_bridge_video_mode_to_string()

const char* ast_bridge_video_mode_to_string ( enum ast_bridge_video_mode_type  video_mode)

Converts an enum representation of a bridge video mode to string.

Parameters
video_modeThe video mode
Return values
Astring representation of video_mode

Definition at line 4018 of file bridge.c.

References AST_BRIDGE_VIDEO_MODE_NONE, AST_BRIDGE_VIDEO_MODE_SFU, AST_BRIDGE_VIDEO_MODE_SINGLE_SRC, and AST_BRIDGE_VIDEO_MODE_TALKER_SRC.

Referenced by ast_bridge_snapshot_to_json(), ast_manager_build_bridge_state_string_prefix(), and handle_bridge_show_specific().

4019 {
4020  switch (video_mode) {
4022  return "talker";
4024  return "single";
4026  return "sfu";
4028  default:
4029  return "none";
4030  }
4031 }

◆ ast_bridges()

struct ao2_container* ast_bridges ( void  )

Returns the global bridges container.

Since
17.0
Return values
apointer to the bridges container success
NULLon failure
Note
You must use ao2_ref(<container>, -1) when done with it
Warning
You must not attempt to modify the container returned.

Definition at line 174 of file bridge.c.

References ao2_bump.

Referenced by ast_ari_bridges_list(), bridges_scrape_cb(), and manager_bridges_list().

175 {
176  return ao2_bump(bridges);
177 }
#define ao2_bump(obj)
Definition: astobj2.h:491
static struct ao2_container * bridges
Definition: bridge.c:123

◆ ast_bridges_allow_optimization()

enum ast_bridge_optimization ast_bridges_allow_optimization ( struct ast_bridge chan_bridge,
struct ast_bridge peer_bridge 
)

Determine if bridges allow for optimization to occur betweem them.

Since
12.0.0
Parameters
chan_bridgeFirst bridge being tested
peer_bridgeSecond bridge being tested

This determines if two bridges allow for unreal channel optimization to occur between them. The function does not require for unreal channels to already be in the bridges when called.

Note
It is assumed that both bridges are locked prior to calling this function
A return other than AST_BRIDGE_OPTIMIZE_PROHIBITED does not guarantee that an optimization attempt will succeed. However, a return of AST_BRIDGE_OPTIMIZE_PROHIBITED guarantees that an optimization attempt will never succeed.
Returns
Optimization allowability for the bridges

Definition at line 3008 of file bridge.c.

References AST_BRIDGE_OPTIMIZE_MERGE_TO_CHAN_BRIDGE, AST_BRIDGE_OPTIMIZE_MERGE_TO_PEER_BRIDGE, AST_BRIDGE_OPTIMIZE_PROHIBITED, AST_BRIDGE_OPTIMIZE_SWAP_TO_CHAN_BRIDGE, AST_BRIDGE_OPTIMIZE_SWAP_TO_PEER_BRIDGE, bridge_allows_optimization(), bridges_allow_merge_optimization(), bridges_allow_swap_optimization(), merge_direction::dest, MERGE_ALLOWED, SWAP_PROHIBITED, SWAP_TO_CHAN_BRIDGE, and SWAP_TO_PEER_BRIDGE.

Referenced by two_bridge_attended_transfer().

3010 {
3011  struct merge_direction merge;
3012 
3013  if (!bridge_allows_optimization(chan_bridge) || !bridge_allows_optimization(peer_bridge)) {
3015  }
3016 
3017  switch (bridges_allow_swap_optimization(chan_bridge, peer_bridge)) {
3018  case SWAP_TO_CHAN_BRIDGE:
3020  case SWAP_TO_PEER_BRIDGE:
3022  case SWAP_PROHIBITED:
3023  default:
3024  break;
3025  }
3026 
3027  /* Two channels will be kicked from the bridges, the unreal;1 and unreal;2 channels */
3028  if (bridges_allow_merge_optimization(chan_bridge, peer_bridge, 2, &merge) != MERGE_ALLOWED) {
3030  }
3031 
3032  if (merge.dest == chan_bridge) {
3034  } else {
3036  }
3037 }
static int bridge_allows_optimization(struct ast_bridge *bridge)
Definition: bridge.c:2608
static enum bridge_allow_swap bridges_allow_swap_optimization(struct ast_bridge *chan_bridge, struct ast_bridge *peer_bridge)
Definition: bridge.c:2737
static enum bridge_allow_merge bridges_allow_merge_optimization(struct ast_bridge *chan_bridge, struct ast_bridge *peer_bridge, int num_kick_channels, struct merge_direction *merge)
Definition: bridge.c:2883

◆ ast_bridging_init()

int ast_bridging_init ( void  )

Initialize the bridging system.

Since
12.0.0
Return values
0on success.
-1on error.

Definition at line 5605 of file bridge.c.

References AO2_ALLOC_OPT_LOCK_MUTEX, AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE, ao2_container_alloc_rbtree, ao2_container_register(), ARRAY_LEN, ast_bridging_init_basic(), ast_cli_register_multiple, ast_manager_register_xml_core, ast_register_cleanup(), ast_stasis_bridging_init(), bridge_cleanup(), bridge_manager_create(), bridge_prnt_obj(), bridge_sort_cmp(), manager_bridge_tech_list(), manager_bridge_tech_suspend(), manager_bridge_tech_unsuspend(), and NULL.

Referenced by asterisk_daemon().

5606 {
5608 
5609  if (ast_stasis_bridging_init()) {
5610  return -1;
5611  }
5612 
5614  if (!bridge_manager) {
5615  return -1;
5616  }
5617 
5620  if (!bridges) {
5621  return -1;
5622  }
5624 
5626 
5628 
5629  ast_manager_register_xml_core("BridgeTechnologyList", 0, manager_bridge_tech_list);
5630  ast_manager_register_xml_core("BridgeTechnologySuspend", 0, manager_bridge_tech_suspend);
5631  ast_manager_register_xml_core("BridgeTechnologyUnsuspend", 0, manager_bridge_tech_unsuspend);
5632 
5633  return 0;
5634 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static void bridge_cleanup(void)
Definition: bridge.c:5591
static int manager_bridge_tech_suspend(struct mansession *s, const struct message *m)
Definition: bridge.c:5508
static void bridge_prnt_obj(void *v_obj, void *where, ao2_prnt_fn *prnt)
Definition: bridge.c:5573
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static struct bridge_manager_controller * bridge_manager
Definition: bridge.c:172
#define NULL
Definition: resample.c:96
#define ast_manager_register_xml_core(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition: manager.h:197
static int manager_bridge_tech_unsuspend(struct mansession *s, const struct message *m)
Definition: bridge.c:5513
static struct bridge_manager_controller * bridge_manager_create(void)
Definition: bridge.c:5009
int ao2_container_register(const char *name, struct ao2_container *self, ao2_prnt_obj_fn *prnt_obj)
Register a container for CLI stats and integrity check.
int ast_stasis_bridging_init(void)
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
static struct ao2_container * bridges
Definition: bridge.c:123
void ast_bridging_init_basic(void)
static int bridge_sort_cmp(const void *obj_left, const void *obj_right, int flags)
Definition: bridge.c:5048
Replace objects with duplicate keys in container.
Definition: astobj2.h:1215
#define ao2_container_alloc_rbtree(ao2_options, container_options, sort_fn, cmp_fn)
Definition: astobj2.h:1358
static int manager_bridge_tech_list(struct mansession *s, const struct message *m)
Definition: bridge.c:5518
static struct ast_cli_entry bridge_cli[]
Definition: bridge.c:5462

◆ ast_brige_set_remb_behavior()

void ast_brige_set_remb_behavior ( struct ast_bridge bridge,
enum ast_bridge_video_sfu_remb_behavior  behavior 
)

Set the REMB report generation behavior on a bridge.

Parameters
bridgeBridge to set the REMB behavior on
behaviorHow REMB reports are generated
Note
This can only be called when the bridge has been set to the SFU video mode.

Definition at line 3865 of file bridge.c.

References ast_assert, ast_bridge_lock, ast_bridge_unlock, AST_BRIDGE_VIDEO_MODE_SFU, ast_bridge_video_mode::mode, ast_bridge_video_mode::mode_data, ast_bridge_video_sfu_data::remb_behavior, ast_bridge_video_mode::sfu_data, ast_bridge::softmix, and ast_bridge_softmix::video_mode.

Referenced by join_conference_bridge().

3866 {
3868 
3869  ast_bridge_lock(bridge);
3870  bridge->softmix.video_mode.mode_data.sfu_data.remb_behavior = behavior;
3871  ast_bridge_unlock(bridge);
3872 }
union ast_bridge_video_mode::@221 mode_data
struct ast_bridge_video_mode video_mode
Definition: bridge.h:287
#define ast_assert(a)
Definition: utils.h:650
struct ast_bridge_softmix softmix
Definition: bridge.h:375
enum ast_bridge_video_sfu_remb_behavior remb_behavior
Definition: bridge.h:153
struct ast_bridge_video_sfu_data sfu_data
Definition: bridge.h:165
#define ast_bridge_unlock(bridge)
Unlock the bridge.
Definition: bridge.h:493
#define ast_bridge_lock(bridge)
Lock the bridge.
Definition: bridge.h:480
enum ast_bridge_video_mode_type mode
Definition: bridge.h:160

◆ attended_transfer_bridge()

static enum ast_transfer_result attended_transfer_bridge ( struct ast_channel chan1,
struct ast_channel chan2,
struct ast_bridge bridge1,
struct ast_bridge bridge2,
struct ast_attended_transfer_message transfer_msg 
)
static

Perform an attended transfer of a bridge.

This performs an attended transfer of an entire bridge to a target. The target varies, depending on what bridges exist during the transfer attempt.

If two bridges exist, then a local channel is created to link the two bridges together.

If only one bridge exists, then a local channel is created with one end placed into the existing bridge and the other end masquerading into the unbridged channel.

Parameters
chan1Transferer channel. Guaranteed to be bridged.
chan2Other transferer channel. May or may not be bridged.
bridge1Bridge that chan1 is in. Guaranteed to be non-NULL.
bridge2Bridge that chan2 is in. If NULL, then chan2 is not bridged.
publicationData to publish for a stasis attended transfer message.
Return values
AST_BRIDGE_TRANSFER_FAILInternal error occurred
AST_BRIDGE_TRANSFER_SUCCESSSuccesfully transferred the bridge

Definition at line 4280 of file bridge.c.

References ao2_cleanup, ao2_ref, app, ast_attended_transfer_message_add_app(), ast_attended_transfer_message_add_link(), ast_bridge_impart(), AST_BRIDGE_IMPART_CHAN_INDEPENDENT, AST_BRIDGE_TRANSFER_FAIL, AST_BRIDGE_TRANSFER_SUCCESS, ast_bridge_unlock, ast_call(), ast_channel_appl(), ast_channel_lock_both, ast_channel_name(), ast_channel_nativeformats(), ast_channel_req_accountcodes(), AST_CHANNEL_REQUESTOR_REPLACEMENT, ast_channel_unlock, ast_hangup(), ast_local_lock_all(), ast_local_setup_bridge(), ast_local_setup_masquerade(), ast_local_unlock_all(), ast_log, ast_request(), ast_strdupa, ATTENDEDTRANSFER, BRIDGE_LOCK_ONE_OR_BOTH, locals, LOG_ERROR, NULL, pbx_builtin_setvar_helper(), SWAP, and ast_channel::tech.

Referenced by ast_bridge_transfer_attended(), and two_bridge_attended_transfer().

4283 {
4284 #define BRIDGE_LOCK_ONE_OR_BOTH(b1, b2) \
4285  do { \
4286  if (b2) { \
4287  ast_bridge_lock_both(b1, b2); \
4288  } else { \
4289  ast_bridge_lock(b1); \
4290  } \
4291  } while (0)
4292 
4293  static const char *dest = "_attended@transfer/m";
4294  struct ast_channel *local_chan;
4295  int cause;
4296  int res;
4297  const char *app = NULL;
4298 
4299  local_chan = ast_request("Local", ast_channel_nativeformats(chan1), NULL, chan1,
4300  dest, &cause);
4301  if (!local_chan) {
4302  return AST_BRIDGE_TRANSFER_FAIL;
4303  }
4304 
4305  ast_channel_lock_both(local_chan, chan1);
4308  ast_channel_unlock(local_chan);
4309  ast_channel_unlock(chan1);
4310 
4311  if (bridge2) {
4312  res = ast_local_setup_bridge(local_chan, bridge2, chan2, NULL);
4313  } else {
4314  app = ast_strdupa(ast_channel_appl(chan2));
4315  res = ast_local_setup_masquerade(local_chan, chan2);
4316  }
4317 
4318  if (res) {
4319  ast_hangup(local_chan);
4320  return AST_BRIDGE_TRANSFER_FAIL;
4321  }
4322 
4323  /*
4324  * Since bridges need to be unlocked before entering ast_bridge_impart and
4325  * core_local may call into it then the bridges need to be unlocked here.
4326  */
4327  ast_bridge_unlock(bridge1);
4328  if (bridge2) {
4329  ast_bridge_unlock(bridge2);
4330  }
4331 
4332  if (ast_call(local_chan, dest, 0)) {
4333  ast_hangup(local_chan);
4334  BRIDGE_LOCK_ONE_OR_BOTH(bridge1, bridge2);
4335  return AST_BRIDGE_TRANSFER_FAIL;
4336  }
4337 
4338  /* Get a ref for use later since this one is being stolen */
4339  ao2_ref(local_chan, +1);
4340  if (ast_bridge_impart(bridge1, local_chan, chan1, NULL,
4342  ast_hangup(local_chan);
4343  ao2_cleanup(local_chan);
4344  BRIDGE_LOCK_ONE_OR_BOTH(bridge1, bridge2);
4345  return AST_BRIDGE_TRANSFER_FAIL;
4346  }
4347  BRIDGE_LOCK_ONE_OR_BOTH(bridge1, bridge2);
4348 
4349  if (bridge2) {
4350  void *tech;
4351  struct ast_channel *locals[2];
4352 
4353  /* Have to lock everything just in case a hangup comes in early */
4354  ast_local_lock_all(local_chan, &tech, &locals[0], &locals[1]);
4355  if (!locals[0] || !locals[1]) {
4356  ast_log(LOG_ERROR, "Transfer failed probably due to an early hangup - "
4357  "missing other half of '%s'\n", ast_channel_name(local_chan));
4358  ast_local_unlock_all(tech, locals[0], locals[1]);
4359  ao2_cleanup(local_chan);
4360  return AST_BRIDGE_TRANSFER_FAIL;
4361  }
4362 
4363  /* Make sure the peer is properly set */
4364  if (local_chan != locals[0]) {
4365  SWAP(locals[0], locals[1]);
4366  }
4367 
4368  ast_attended_transfer_message_add_link(transfer_msg, locals);
4369  ast_local_unlock_all(tech, locals[0], locals[1]);
4370  } else {
4371  ast_attended_transfer_message_add_app(transfer_msg, app, local_chan);
4372  }
4373 
4374  ao2_cleanup(local_chan);
4376 }
Main Channel structure associated with a channel.
int ast_attended_transfer_message_add_app(struct ast_attended_transfer_message *transfer_msg, const char *app, struct ast_channel *replace_channel)
Add details for an attended transfer to an application.
void ast_local_lock_all(struct ast_channel *chan, void **tech_pvt, struct ast_channel **base_chan, struct ast_channel **base_owner)
Add a reference to the local channel&#39;s private tech, lock the local channel&#39;s private base...
Definition: core_local.c:241
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.c:6445
#define ATTENDEDTRANSFER
Definition: bridge.c:139