2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 2007 - 2009, Digium, Inc.
6 * Joshua Colp <jcolp@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
23 * \author Joshua Colp <jcolp@digium.com>
27 <support_level>core</support_level>
32 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
34 #include "asterisk/logger.h"
35 #include "asterisk/channel.h"
36 #include "asterisk/options.h"
37 #include "asterisk/utils.h"
38 #include "asterisk/lock.h"
39 #include "asterisk/linkedlists.h"
40 #include "asterisk/bridge.h"
41 #include "asterisk/bridge_internal.h"
42 #include "asterisk/bridge_channel_internal.h"
43 #include "asterisk/bridge_features.h"
44 #include "asterisk/bridge_basic.h"
45 #include "asterisk/bridge_technology.h"
46 #include "asterisk/bridge_channel.h"
47 #include "asterisk/bridge_after.h"
48 #include "asterisk/stasis_bridges.h"
49 #include "asterisk/stasis_channels.h"
50 #include "asterisk/stasis_cache_pattern.h"
51 #include "asterisk/app.h"
52 #include "asterisk/file.h"
53 #include "asterisk/module.h"
54 #include "asterisk/astobj2.h"
55 #include "asterisk/pbx.h"
56 #include "asterisk/test.h"
57 #include "asterisk/_private.h"
58 #include "asterisk/heap.h"
59 #include "asterisk/say.h"
60 #include "asterisk/timing.h"
61 #include "asterisk/stringfields.h"
62 #include "asterisk/musiconhold.h"
63 #include "asterisk/features.h"
64 #include "asterisk/cli.h"
65 #include "asterisk/parking.h"
66 #include "asterisk/core_local.h"
67 #include "asterisk/core_unreal.h"
68 #include "asterisk/causes.h"
70 /*! All bridges container. */
71 static struct ao2_container *bridges;
73 static AST_RWLIST_HEAD_STATIC(bridge_technologies, ast_bridge_technology);
75 static unsigned int optimization_id;
77 /* Initial starting point for the bridge array of channels */
78 #define BRIDGE_ARRAY_START 128
80 /* Grow rate of bridge array of channels */
81 #define BRIDGE_ARRAY_GROW 32
83 static void cleanup_video_mode(struct ast_bridge *bridge);
84 static int bridge_make_compatible(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
86 /*! Default DTMF keys for built in features */
87 static char builtin_features_dtmf[AST_BRIDGE_BUILTIN_END][MAXIMUM_DTMF_FEATURE_STRING];
89 /*! Function handlers for the built in features */
90 static ast_bridge_hook_callback builtin_features_handlers[AST_BRIDGE_BUILTIN_END];
92 /*! Function handlers for built in interval features */
93 static ast_bridge_builtin_set_limits_fn builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_END];
95 /*! Bridge manager service request */
96 struct bridge_manager_request {
97 /*! List of bridge service requests. */
98 AST_LIST_ENTRY(bridge_manager_request) node;
99 /*! Refed bridge requesting service. */
100 struct ast_bridge *bridge;
103 struct bridge_manager_controller {
104 /*! Condition, used to wake up the bridge manager thread. */
106 /*! Queue of bridge service requests. */
107 AST_LIST_HEAD_NOLOCK(, bridge_manager_request) service_requests;
108 /*! Manager thread */
110 /*! TRUE if the manager needs to stop. */
114 /*! Bridge manager controller. */
115 static struct bridge_manager_controller *bridge_manager;
119 * \brief Request service for a bridge from the bridge manager.
122 * \param bridge Requesting service.
126 static void bridge_manager_service_req(struct ast_bridge *bridge)
128 struct bridge_manager_request *request;
130 ao2_lock(bridge_manager);
131 if (bridge_manager->stop) {
132 ao2_unlock(bridge_manager);
136 /* Create the service request. */
137 request = ast_calloc(1, sizeof(*request));
139 /* Well. This isn't good. */
140 ao2_unlock(bridge_manager);
144 request->bridge = bridge;
146 /* Put request into the queue and wake the bridge manager. */
147 AST_LIST_INSERT_TAIL(&bridge_manager->service_requests, request, node);
148 ast_cond_signal(&bridge_manager->cond);
149 ao2_unlock(bridge_manager);
152 int __ast_bridge_technology_register(struct ast_bridge_technology *technology, struct ast_module *module)
154 struct ast_bridge_technology *current;
156 /* Perform a sanity check to make sure the bridge technology conforms to our needed requirements */
157 if (ast_strlen_zero(technology->name)
158 || !technology->capabilities
159 || !technology->write) {
160 ast_log(LOG_WARNING, "Bridge technology %s failed registration sanity check.\n",
165 AST_RWLIST_WRLOCK(&bridge_technologies);
167 /* Look for duplicate bridge technology already using this name, or already registered */
168 AST_RWLIST_TRAVERSE(&bridge_technologies, current, entry) {
169 if ((!strcasecmp(current->name, technology->name)) || (current == technology)) {
170 ast_log(LOG_WARNING, "A bridge technology of %s already claims to exist in our world.\n",
172 AST_RWLIST_UNLOCK(&bridge_technologies);
177 /* Copy module pointer so reference counting can keep the module from unloading */
178 technology->mod = module;
180 /* Insert our new bridge technology into the list and print out a pretty message */
181 AST_RWLIST_INSERT_TAIL(&bridge_technologies, technology, entry);
183 AST_RWLIST_UNLOCK(&bridge_technologies);
185 ast_verb(2, "Registered bridge technology %s\n", technology->name);
190 int ast_bridge_technology_unregister(struct ast_bridge_technology *technology)
192 struct ast_bridge_technology *current;
194 AST_RWLIST_WRLOCK(&bridge_technologies);
196 /* Ensure the bridge technology is registered before removing it */
197 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&bridge_technologies, current, entry) {
198 if (current == technology) {
199 AST_RWLIST_REMOVE_CURRENT(entry);
200 ast_verb(2, "Unregistered bridge technology %s\n", technology->name);
204 AST_RWLIST_TRAVERSE_SAFE_END;
206 AST_RWLIST_UNLOCK(&bridge_technologies);
208 return current ? 0 : -1;
213 * \brief Put an action onto the specified bridge. Don't dup the action frame.
216 * \param bridge What to queue the action on.
217 * \param action What to do.
221 static void bridge_queue_action_nodup(struct ast_bridge *bridge, struct ast_frame *action)
223 ast_debug(1, "Bridge %s: queueing action type:%d sub:%d\n",
224 bridge->uniqueid, action->frametype, action->subclass.integer);
226 ast_bridge_lock(bridge);
227 AST_LIST_INSERT_TAIL(&bridge->action_queue, action, frame_list);
228 ast_bridge_unlock(bridge);
229 bridge_manager_service_req(bridge);
232 int ast_bridge_queue_action(struct ast_bridge *bridge, struct ast_frame *action)
234 struct ast_frame *dup;
236 dup = ast_frdup(action);
240 bridge_queue_action_nodup(bridge, dup);
244 void bridge_dissolve(struct ast_bridge *bridge, int cause)
246 struct ast_bridge_channel *bridge_channel;
247 struct ast_frame action = {
248 .frametype = AST_FRAME_BRIDGE_ACTION,
249 .subclass.integer = BRIDGE_CHANNEL_ACTION_DEFERRED_DISSOLVING,
252 if (bridge->dissolved) {
255 bridge->dissolved = 1;
258 cause = AST_CAUSE_NORMAL_CLEARING;
260 bridge->cause = cause;
262 ast_debug(1, "Bridge %s: dissolving bridge with cause %d(%s)\n",
263 bridge->uniqueid, cause, ast_cause2str(cause));
265 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
266 ast_bridge_channel_leave_bridge(bridge_channel,
267 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, cause);
270 /* Must defer dissolving bridge because it is already locked. */
271 ast_bridge_queue_action(bridge, &action);
276 * \brief Check if a bridge should dissolve because of a stolen channel and do it.
279 * \param bridge Bridge to check.
280 * \param bridge_channel Stolen channel causing the check. It is not in the bridge to check and may be in another bridge.
282 * \note On entry, bridge and bridge_channel->bridge are already locked.
286 static void bridge_dissolve_check_stolen(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
288 if (bridge->dissolved) {
292 if (bridge_channel->features->usable
293 && ast_test_flag(&bridge_channel->features->feature_flags,
294 AST_BRIDGE_CHANNEL_FLAG_DISSOLVE_HANGUP)) {
295 /* The stolen channel controlled the bridge it was stolen from. */
296 bridge_dissolve(bridge, 0);
299 if (bridge->num_channels < 2
300 && ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_DISSOLVE_HANGUP)) {
302 * The stolen channel has not left enough channels to keep the
303 * bridge alive. Assume the stolen channel hung up.
305 bridge_dissolve(bridge, 0);
312 * \brief Update connected line information after a bridge has been reconfigured.
314 * \param bridge The bridge itself.
318 static void bridge_reconfigured_connected_line_update(struct ast_bridge *bridge)
320 struct ast_party_connected_line connected;
321 struct ast_bridge_channel *bridge_channel = AST_LIST_FIRST(&bridge->channels), *peer;
322 unsigned char data[1024];
325 if (!bridge_channel ||
326 !(bridge->technology->capabilities & (AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE)) ||
327 !(peer = ast_bridge_channel_peer(bridge_channel)) ||
328 ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_ZOMBIE) ||
329 ast_test_flag(ast_channel_flags(peer->chan), AST_FLAG_ZOMBIE) ||
330 ast_check_hangup_locked(bridge_channel->chan) ||
331 ast_check_hangup_locked(peer->chan)) {
335 ast_party_connected_line_init(&connected);
337 ast_channel_lock(bridge_channel->chan);
338 ast_connected_line_copy_from_caller(&connected, ast_channel_caller(bridge_channel->chan));
339 ast_channel_unlock(bridge_channel->chan);
341 if ((datalen = ast_connected_line_build_data(data, sizeof(data), &connected, NULL)) != (size_t) -1) {
342 ast_bridge_channel_queue_control_data(peer, AST_CONTROL_CONNECTED_LINE, data, datalen);
345 ast_channel_lock(peer->chan);
346 ast_connected_line_copy_from_caller(&connected, ast_channel_caller(peer->chan));
347 ast_channel_unlock(peer->chan);
349 if ((datalen = ast_connected_line_build_data(data, sizeof(data), &connected, NULL)) != (size_t) -1) {
350 ast_bridge_channel_queue_control_data(bridge_channel, AST_CONTROL_CONNECTED_LINE, data, datalen);
353 ast_party_connected_line_free(&connected);
358 * \brief Complete joining a channel to the bridge.
361 * \param bridge What to operate upon.
362 * \param bridge_channel What is joining the bridge technology.
364 * \note On entry, bridge is already locked.
368 static void bridge_channel_complete_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
370 /* Make the channel compatible with the bridge */
371 bridge_make_compatible(bridge, bridge_channel);
373 /* Tell the bridge technology we are joining so they set us up */
374 ast_debug(1, "Bridge %s: %p(%s) is joining %s technology\n",
375 bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan),
376 bridge->technology->name);
377 if (bridge->technology->join
378 && bridge->technology->join(bridge, bridge_channel)) {
379 ast_debug(1, "Bridge %s: %p(%s) failed to join %s technology\n",
380 bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan),
381 bridge->technology->name);
382 bridge_channel->just_joined = 1;
386 bridge_channel->just_joined = 0;
391 * \brief Complete joining new channels to the bridge.
394 * \param bridge Check for new channels on this bridge.
396 * \note On entry, bridge is already locked.
400 static void bridge_complete_join(struct ast_bridge *bridge)
402 struct ast_bridge_channel *bridge_channel;
404 if (bridge->dissolved) {
406 * No sense in completing the join on channels for a dissolved
407 * bridge. They are just going to be removed soon anyway.
408 * However, we do have reason to abort here because the bridge
409 * technology may not be able to handle the number of channels
410 * still in the bridge.
415 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
416 if (!bridge_channel->just_joined) {
419 bridge_channel_complete_join(bridge, bridge_channel);
423 /*! \brief Helper function used to find the "best" bridge technology given specified capabilities */
424 static struct ast_bridge_technology *find_best_technology(uint32_t capabilities, struct ast_bridge *bridge)
426 struct ast_bridge_technology *current;
427 struct ast_bridge_technology *best = NULL;
429 AST_RWLIST_RDLOCK(&bridge_technologies);
430 AST_RWLIST_TRAVERSE(&bridge_technologies, current, entry) {
431 if (current->suspended) {
432 ast_debug(1, "Bridge technology %s is suspended. Skipping.\n",
436 if (!(current->capabilities & capabilities)) {
437 ast_debug(1, "Bridge technology %s does not have any capabilities we want.\n",
441 if (best && current->preference <= best->preference) {
442 ast_debug(1, "Bridge technology %s has less preference than %s (%d <= %d). Skipping.\n",
443 current->name, best->name, current->preference, best->preference);
446 if (current->compatible && !current->compatible(bridge)) {
447 ast_debug(1, "Bridge technology %s is not compatible with properties of existing bridge.\n",
455 /* Increment it's module reference count if present so it does not get unloaded while in use */
456 ast_module_ref(best->mod);
457 ast_debug(1, "Chose bridge technology %s\n", best->name);
460 AST_RWLIST_UNLOCK(&bridge_technologies);
465 struct tech_deferred_destroy {
466 struct ast_bridge_technology *tech;
472 * \brief Deferred destruction of bridge tech private structure.
475 * \param bridge What to execute the action on.
476 * \param action Deferred bridge tech destruction.
478 * \note On entry, bridge must not be locked.
482 static void bridge_tech_deferred_destroy(struct ast_bridge *bridge, struct ast_frame *action)
484 struct tech_deferred_destroy *deferred = action->data.ptr;
485 struct ast_bridge dummy_bridge = {
486 .technology = deferred->tech,
487 .tech_pvt = deferred->tech_pvt,
490 ast_copy_string(dummy_bridge.uniqueid, bridge->uniqueid, sizeof(dummy_bridge.uniqueid));
491 ast_debug(1, "Bridge %s: calling %s technology destructor (deferred, dummy)\n",
492 dummy_bridge.uniqueid, dummy_bridge.technology->name);
493 dummy_bridge.technology->destroy(&dummy_bridge);
494 ast_module_unref(dummy_bridge.technology->mod);
499 * \brief Handle bridge action frame.
502 * \param bridge What to execute the action on.
503 * \param action What to do.
505 * \note On entry, bridge is already locked.
506 * \note Can be called by the bridge destructor.
510 static void bridge_action_bridge(struct ast_bridge *bridge, struct ast_frame *action)
512 #if 0 /* In case we need to know when the destructor is calling us. */
513 int in_destructor = !ao2_ref(bridge, 0);
516 switch (action->subclass.integer) {
517 case BRIDGE_CHANNEL_ACTION_DEFERRED_TECH_DESTROY:
518 ast_bridge_unlock(bridge);
519 bridge_tech_deferred_destroy(bridge, action);
520 ast_bridge_lock(bridge);
522 case BRIDGE_CHANNEL_ACTION_DEFERRED_DISSOLVING:
523 ast_bridge_unlock(bridge);
524 bridge->v_table->dissolving(bridge);
525 ast_bridge_lock(bridge);
528 /* Unexpected deferred action type. Should never happen. */
536 * \brief Do any pending bridge actions.
539 * \param bridge What to do actions on.
541 * \note On entry, bridge is already locked.
542 * \note Can be called by the bridge destructor.
546 static void bridge_handle_actions(struct ast_bridge *bridge)
548 struct ast_frame *action;
550 while ((action = AST_LIST_REMOVE_HEAD(&bridge->action_queue, frame_list))) {
551 switch (action->frametype) {
552 case AST_FRAME_BRIDGE_ACTION:
553 bridge_action_bridge(bridge, action);
556 /* Unexpected deferred frame type. Should never happen. */
564 static struct stasis_message *create_bridge_snapshot_message(struct ast_bridge *bridge)
566 RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
568 snapshot = ast_bridge_snapshot_create(bridge);
573 return stasis_message_create(ast_bridge_snapshot_type(), snapshot);
576 static void destroy_bridge(void *obj)
578 struct ast_bridge *bridge = obj;
580 ast_debug(1, "Bridge %s: actually destroying %s bridge, nobody wants it anymore\n",
581 bridge->uniqueid, bridge->v_table->name);
583 if (bridge->construction_completed) {
584 RAII_VAR(struct stasis_message *, clear_msg, NULL, ao2_cleanup);
586 clear_msg = create_bridge_snapshot_message(bridge);
588 RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
590 msg = stasis_cache_clear_create(clear_msg);
592 stasis_publish(ast_bridge_topic(bridge), msg);
597 /* Do any pending actions in the context of destruction. */
598 ast_bridge_lock(bridge);
599 bridge_handle_actions(bridge);
600 ast_bridge_unlock(bridge);
602 /* There should not be any channels left in the bridge. */
603 ast_assert(AST_LIST_EMPTY(&bridge->channels));
605 ast_debug(1, "Bridge %s: calling %s bridge destructor\n",
606 bridge->uniqueid, bridge->v_table->name);
607 bridge->v_table->destroy(bridge);
609 /* Pass off the bridge to the technology to destroy if needed */
610 if (bridge->technology) {
611 ast_debug(1, "Bridge %s: calling %s technology stop\n",
612 bridge->uniqueid, bridge->technology->name);
613 if (bridge->technology->stop) {
614 ast_bridge_lock(bridge);
615 bridge->technology->stop(bridge);
616 ast_bridge_unlock(bridge);
618 ast_debug(1, "Bridge %s: calling %s technology destructor\n",
619 bridge->uniqueid, bridge->technology->name);
620 if (bridge->technology->destroy) {
621 bridge->technology->destroy(bridge);
623 ast_module_unref(bridge->technology->mod);
624 bridge->technology = NULL;
627 if (bridge->callid) {
628 bridge->callid = ast_callid_unref(bridge->callid);
631 cleanup_video_mode(bridge);
633 stasis_cp_single_unsubscribe(bridge->topics);
636 struct ast_bridge *bridge_register(struct ast_bridge *bridge)
639 bridge->construction_completed = 1;
640 ast_bridge_publish_state(bridge);
641 if (!ao2_link(bridges, bridge)) {
642 ast_bridge_destroy(bridge, 0);
649 struct ast_bridge *bridge_alloc(size_t size, const struct ast_bridge_methods *v_table)
651 struct ast_bridge *bridge;
653 /* Check v_table that all methods are present. */
657 || !v_table->dissolving
660 || !v_table->notify_masquerade
661 || !v_table->get_merge_priority) {
662 ast_log(LOG_ERROR, "Virtual method table for bridge class %s not complete.\n",
663 v_table && v_table->name ? v_table->name : "<unknown>");
668 bridge = ao2_alloc(size, destroy_bridge);
670 bridge->v_table = v_table;
675 struct ast_bridge *bridge_base_init(struct ast_bridge *self, uint32_t capabilities, unsigned int flags)
681 ast_uuid_generate_str(self->uniqueid, sizeof(self->uniqueid));
682 ast_set_flag(&self->feature_flags, flags);
683 self->allowed_capabilities = capabilities;
685 if (bridge_topics_init(self) != 0) {
686 ast_log(LOG_WARNING, "Bridge %s: Could not initialize topics\n",
692 /* Use our helper function to find the "best" bridge technology. */
693 self->technology = find_best_technology(capabilities, self);
694 if (!self->technology) {
695 ast_log(LOG_WARNING, "Bridge %s: Could not create class %s. No technology to support it.\n",
696 self->uniqueid, self->v_table->name);
701 /* Pass off the bridge to the technology to manipulate if needed */
702 ast_debug(1, "Bridge %s: calling %s technology constructor\n",
703 self->uniqueid, self->technology->name);
704 if (self->technology->create && self->technology->create(self)) {
705 ast_log(LOG_WARNING, "Bridge %s: failed to setup bridge technology %s\n",
706 self->uniqueid, self->technology->name);
710 ast_debug(1, "Bridge %s: calling %s technology start\n",
711 self->uniqueid, self->technology->name);
712 if (self->technology->start && self->technology->start(self)) {
713 ast_log(LOG_WARNING, "Bridge %s: failed to start bridge technology %s\n",
714 self->uniqueid, self->technology->name);
719 if (!ast_bridge_topic(self)) {
729 * \brief ast_bridge base class destructor.
732 * \param self Bridge to operate upon.
734 * \note Stub because of nothing to do.
738 static void bridge_base_destroy(struct ast_bridge *self)
744 * \brief The bridge is being dissolved.
747 * \param self Bridge to operate upon.
751 static void bridge_base_dissolving(struct ast_bridge *self)
753 ao2_unlink(bridges, self);
758 * \brief ast_bridge base push method.
761 * \param self Bridge to operate upon.
762 * \param bridge_channel Bridge channel to push.
763 * \param swap Bridge channel to swap places with if not NULL.
765 * \note On entry, self is already locked.
766 * \note Stub because of nothing to do.
768 * \retval 0 on success
769 * \retval -1 on failure
771 static int bridge_base_push(struct ast_bridge *self, struct ast_bridge_channel *bridge_channel, struct ast_bridge_channel *swap)
778 * \brief ast_bridge base pull method.
781 * \param self Bridge to operate upon.
782 * \param bridge_channel Bridge channel to pull.
784 * \note On entry, self is already locked.
788 static void bridge_base_pull(struct ast_bridge *self, struct ast_bridge_channel *bridge_channel)
790 ast_bridge_features_remove(bridge_channel->features, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
795 * \brief ast_bridge base notify_masquerade method.
798 * \param self Bridge to operate upon.
799 * \param bridge_channel Bridge channel that was masqueraded.
801 * \note On entry, self is already locked.
805 static void bridge_base_notify_masquerade(struct ast_bridge *self, struct ast_bridge_channel *bridge_channel)
807 self->reconfigured = 1;
812 * \brief Get the merge priority of this bridge.
815 * \param self Bridge to operate upon.
817 * \note On entry, self is already locked.
819 * \return Merge priority
821 static int bridge_base_get_merge_priority(struct ast_bridge *self)
826 struct ast_bridge_methods ast_bridge_base_v_table = {
828 .destroy = bridge_base_destroy,
829 .dissolving = bridge_base_dissolving,
830 .push = bridge_base_push,
831 .pull = bridge_base_pull,
832 .notify_masquerade = bridge_base_notify_masquerade,
833 .get_merge_priority = bridge_base_get_merge_priority,
836 struct ast_bridge *ast_bridge_base_new(uint32_t capabilities, unsigned int flags)
840 bridge = bridge_alloc(sizeof(struct ast_bridge), &ast_bridge_base_v_table);
841 bridge = bridge_base_init(bridge, capabilities, flags);
842 bridge = bridge_register(bridge);
846 int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
848 ast_debug(1, "Bridge %s: telling all channels to leave the party\n", bridge->uniqueid);
849 ast_bridge_lock(bridge);
850 bridge_dissolve(bridge, cause);
851 ast_bridge_unlock(bridge);
858 static int bridge_make_compatible(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
860 struct ast_format read_format;
861 struct ast_format write_format;
862 struct ast_format best_format;
865 ast_format_copy(&read_format, ast_channel_readformat(bridge_channel->chan));
866 ast_format_copy(&write_format, ast_channel_writeformat(bridge_channel->chan));
868 /* Are the formats currently in use something this bridge can handle? */
869 if (!ast_format_cap_iscompatible(bridge->technology->format_capabilities, ast_channel_readformat(bridge_channel->chan))) {
870 ast_best_codec(bridge->technology->format_capabilities, &best_format);
872 /* Read format is a no go... */
873 ast_debug(1, "Bridge technology %s wants to read any of formats %s but channel has %s\n",
874 bridge->technology->name,
875 ast_getformatname_multiple(codec_buf, sizeof(codec_buf), bridge->technology->format_capabilities),
876 ast_getformatname(&read_format));
878 /* Switch read format to the best one chosen */
879 if (ast_set_read_format(bridge_channel->chan, &best_format)) {
880 ast_log(LOG_WARNING, "Failed to set channel %s to read format %s\n",
881 ast_channel_name(bridge_channel->chan), ast_getformatname(&best_format));
884 ast_debug(1, "Bridge %s put channel %s into read format %s\n",
885 bridge->uniqueid, ast_channel_name(bridge_channel->chan),
886 ast_getformatname(&best_format));
888 ast_debug(1, "Bridge %s is happy that channel %s already has read format %s\n",
889 bridge->uniqueid, ast_channel_name(bridge_channel->chan),
890 ast_getformatname(&read_format));
893 if (!ast_format_cap_iscompatible(bridge->technology->format_capabilities, &write_format)) {
894 ast_best_codec(bridge->technology->format_capabilities, &best_format);
896 /* Write format is a no go... */
897 ast_debug(1, "Bridge technology %s wants to write any of formats %s but channel has %s\n",
898 bridge->technology->name,
899 ast_getformatname_multiple(codec_buf, sizeof(codec_buf), bridge->technology->format_capabilities),
900 ast_getformatname(&write_format));
902 /* Switch write format to the best one chosen */
903 if (ast_set_write_format(bridge_channel->chan, &best_format)) {
904 ast_log(LOG_WARNING, "Failed to set channel %s to write format %s\n",
905 ast_channel_name(bridge_channel->chan), ast_getformatname(&best_format));
908 ast_debug(1, "Bridge %s put channel %s into write format %s\n",
909 bridge->uniqueid, ast_channel_name(bridge_channel->chan),
910 ast_getformatname(&best_format));
912 ast_debug(1, "Bridge %s is happy that channel %s already has write format %s\n",
913 bridge->uniqueid, ast_channel_name(bridge_channel->chan),
914 ast_getformatname(&write_format));
922 * \brief Perform the smart bridge operation.
925 * \param bridge Work on this bridge.
928 * Basically see if a new bridge technology should be used instead
929 * of the current one.
931 * \note On entry, bridge is already locked.
933 * \retval 0 on success.
934 * \retval -1 on error.
936 static int smart_bridge_operation(struct ast_bridge *bridge)
938 uint32_t new_capabilities;
939 struct ast_bridge_technology *new_technology;
940 struct ast_bridge_technology *old_technology = bridge->technology;
941 struct ast_bridge_channel *bridge_channel;
942 struct ast_frame *deferred_action;
943 struct ast_bridge dummy_bridge = {
944 .technology = bridge->technology,
945 .tech_pvt = bridge->tech_pvt,
948 if (bridge->dissolved) {
949 ast_debug(1, "Bridge %s is dissolved, not performing smart bridge operation.\n",
954 /* Determine new bridge technology capabilities needed. */
955 if (2 < bridge->num_channels) {
956 new_capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX;
957 new_capabilities &= bridge->allowed_capabilities;
959 new_capabilities = AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_1TO1MIX;
960 new_capabilities &= bridge->allowed_capabilities;
961 if (!new_capabilities
962 && (bridge->allowed_capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX)) {
963 /* Allow switching between different multimix bridge technologies. */
964 new_capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX;
968 /* Find a bridge technology to satisfy the new capabilities. */
969 new_technology = find_best_technology(new_capabilities, bridge);
970 if (!new_technology) {
971 int is_compatible = 0;
973 if (old_technology->compatible) {
974 is_compatible = old_technology->compatible(bridge);
975 } else if (old_technology->capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX) {
977 } else if (bridge->num_channels <= 2
978 && (old_technology->capabilities & AST_BRIDGE_CAPABILITY_1TO1MIX)) {
983 ast_debug(1, "Bridge %s could not get a new technology, staying with old technology.\n",
987 ast_log(LOG_WARNING, "Bridge %s has no technology available to support it.\n",
991 if (new_technology == old_technology) {
992 ast_debug(1, "Bridge %s is already using the new technology.\n",
994 ast_module_unref(old_technology->mod);
998 ast_copy_string(dummy_bridge.uniqueid, bridge->uniqueid, sizeof(dummy_bridge.uniqueid));
1000 if (old_technology->destroy) {
1001 struct tech_deferred_destroy deferred_tech_destroy = {
1002 .tech = dummy_bridge.technology,
1003 .tech_pvt = dummy_bridge.tech_pvt,
1005 struct ast_frame action = {
1006 .frametype = AST_FRAME_BRIDGE_ACTION,
1007 .subclass.integer = BRIDGE_CHANNEL_ACTION_DEFERRED_TECH_DESTROY,
1008 .data.ptr = &deferred_tech_destroy,
1009 .datalen = sizeof(deferred_tech_destroy),
1013 * We need to defer the bridge technology destroy callback
1014 * because we have the bridge locked.
1016 deferred_action = ast_frdup(&action);
1017 if (!deferred_action) {
1018 ast_module_unref(new_technology->mod);
1022 deferred_action = NULL;
1026 * We are now committed to changing the bridge technology. We
1027 * must not release the bridge lock until we have installed the
1028 * new bridge technology.
1030 ast_verb(4, "Bridge %s: switching from %s technology to %s\n",
1031 bridge->uniqueid, old_technology->name, new_technology->name);
1034 * Since we are soon going to pass this bridge to a new
1035 * technology we need to NULL out the tech_pvt pointer but
1036 * don't worry as it still exists in dummy_bridge, ditto for the
1039 bridge->tech_pvt = NULL;
1040 bridge->technology = new_technology;
1042 /* Setup the new bridge technology. */
1043 ast_debug(1, "Bridge %s: calling %s technology constructor\n",
1044 bridge->uniqueid, new_technology->name);
1045 if (new_technology->create && new_technology->create(bridge)) {
1046 ast_log(LOG_WARNING, "Bridge %s: failed to setup bridge technology %s\n",
1047 bridge->uniqueid, new_technology->name);
1048 bridge->tech_pvt = dummy_bridge.tech_pvt;
1049 bridge->technology = dummy_bridge.technology;
1050 ast_module_unref(new_technology->mod);
1054 ast_debug(1, "Bridge %s: calling %s technology stop\n",
1055 dummy_bridge.uniqueid, old_technology->name);
1056 if (old_technology->stop) {
1057 old_technology->stop(&dummy_bridge);
1061 * Move existing channels over to the new technology and
1062 * complete joining any new channels to the bridge.
1064 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1065 if (!bridge_channel->just_joined) {
1066 /* Take existing channel from the old technology. */
1067 ast_debug(1, "Bridge %s: %p(%s) is leaving %s technology (dummy)\n",
1068 dummy_bridge.uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan),
1069 old_technology->name);
1070 if (old_technology->leave) {
1071 old_technology->leave(&dummy_bridge, bridge_channel);
1075 /* Add any new channels or re-add an existing channel to the bridge. */
1076 bridge_channel_complete_join(bridge, bridge_channel);
1079 ast_debug(1, "Bridge %s: calling %s technology start\n",
1080 bridge->uniqueid, new_technology->name);
1081 if (new_technology->start && new_technology->start(bridge)) {
1082 ast_log(LOG_WARNING, "Bridge %s: failed to start bridge technology %s\n",
1083 bridge->uniqueid, new_technology->name);
1087 * Now that all the channels have been moved over we need to get
1088 * rid of all the information the old technology may have left
1091 if (old_technology->destroy) {
1092 ast_debug(1, "Bridge %s: deferring %s technology destructor\n",
1093 dummy_bridge.uniqueid, old_technology->name);
1094 bridge_queue_action_nodup(bridge, deferred_action);
1096 ast_debug(1, "Bridge %s: calling %s technology destructor\n",
1097 dummy_bridge.uniqueid, old_technology->name);
1098 ast_module_unref(old_technology->mod);
1106 * \brief Bridge channel to check if a BRIDGE_PLAY_SOUND needs to be played.
1109 * \param bridge_channel What to check.
1113 static void check_bridge_play_sound(struct ast_bridge_channel *bridge_channel)
1115 const char *play_file;
1117 ast_channel_lock(bridge_channel->chan);
1118 play_file = pbx_builtin_getvar_helper(bridge_channel->chan, "BRIDGE_PLAY_SOUND");
1119 if (!ast_strlen_zero(play_file)) {
1120 play_file = ast_strdupa(play_file);
1121 pbx_builtin_setvar_helper(bridge_channel->chan, "BRIDGE_PLAY_SOUND", NULL);
1125 ast_channel_unlock(bridge_channel->chan);
1128 ast_bridge_channel_queue_playfile(bridge_channel, NULL, play_file, NULL);
1134 * \brief Check for any BRIDGE_PLAY_SOUND channel variables in the bridge.
1137 * \param bridge What to operate on.
1139 * \note On entry, the bridge is already locked.
1143 static void check_bridge_play_sounds(struct ast_bridge *bridge)
1145 struct ast_bridge_channel *bridge_channel;
1147 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1148 check_bridge_play_sound(bridge_channel);
1152 static void update_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid)
1154 pbx_builtin_setvar_helper(chan, "BRIDGEPEER", name);
1155 pbx_builtin_setvar_helper(chan, "BRIDGEPVTCALLID", pvtid);
1160 * \brief Set BRIDGEPEER and BRIDGEPVTCALLID channel variables in a 2 party bridge.
1163 * \param c0 Party of the first part.
1164 * \param c1 Party of the second part.
1166 * \note On entry, the bridge is already locked.
1167 * \note The bridge is expected to have exactly two parties.
1171 static void set_bridge_peer_vars_2party(struct ast_channel *c0, struct ast_channel *c1)
1173 const char *c0_name;
1174 const char *c1_name;
1175 const char *c0_pvtid = NULL;
1176 const char *c1_pvtid = NULL;
1177 #define UPDATE_BRIDGE_VARS_GET(chan, name, pvtid) \
1179 name = ast_strdupa(ast_channel_name(chan)); \
1180 if (ast_channel_tech(chan)->get_pvt_uniqueid) { \
1181 pvtid = ast_strdupa(ast_channel_tech(chan)->get_pvt_uniqueid(chan)); \
1185 ast_channel_lock(c1);
1186 UPDATE_BRIDGE_VARS_GET(c1, c1_name, c1_pvtid);
1187 ast_channel_unlock(c1);
1189 ast_channel_lock(c0);
1190 update_bridge_vars_set(c0, c1_name, c1_pvtid);
1191 UPDATE_BRIDGE_VARS_GET(c0, c0_name, c0_pvtid);
1192 ast_channel_unlock(c0);
1194 ast_channel_lock(c1);
1195 update_bridge_vars_set(c1, c0_name, c0_pvtid);
1196 ast_channel_unlock(c1);
1201 * \brief Fill the BRIDGEPEER value buffer with a comma separated list of channel names.
1204 * \param buf Buffer to fill. The caller must guarantee the buffer is large enough.
1205 * \param cur_idx Which index into names[] to skip.
1206 * \param names Channel names to put in the buffer.
1207 * \param num_names Number of names in the array.
1211 static void fill_bridgepeer_buf(char *buf, unsigned int cur_idx, const char *names[], unsigned int num_names)
1213 int need_separator = 0;
1219 for (idx = 0; idx < num_names; ++idx) {
1220 if (idx == cur_idx) {
1224 if (need_separator) {
1229 /* Copy name into buffer. */
1240 * \brief Set BRIDGEPEER and BRIDGEPVTCALLID channel variables in a multi-party bridge.
1243 * \param bridge What to operate on.
1245 * \note On entry, the bridge is already locked.
1246 * \note The bridge is expected to have more than two parties.
1250 static void set_bridge_peer_vars_multiparty(struct ast_bridge *bridge)
1253 * Set a maximum number of channel names for the BRIDGEPEER
1254 * list. The plus one is for the current channel which is not
1257 #define MAX_BRIDGEPEER_CHANS (10 + 1)
1260 unsigned int num_names;
1264 struct ast_bridge_channel *bridge_channel;
1266 /* Get first MAX_BRIDGEPEER_CHANS channel names. */
1267 num_names = MIN(bridge->num_channels, MAX_BRIDGEPEER_CHANS);
1268 names = ast_alloca(num_names * sizeof(*names));
1270 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1271 if (num_names <= idx) {
1274 ast_channel_lock(bridge_channel->chan);
1275 names[idx++] = ast_strdupa(ast_channel_name(bridge_channel->chan));
1276 ast_channel_unlock(bridge_channel->chan);
1279 /* Determine maximum buf size needed. */
1281 for (idx = 0; idx < num_names; ++idx) {
1282 len += strlen(names[idx]);
1284 buf = ast_alloca(len);
1286 /* Set the bridge channel variables. */
1289 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1290 if (idx < num_names) {
1291 fill_bridgepeer_buf(buf, idx, names, num_names);
1295 ast_channel_lock(bridge_channel->chan);
1296 update_bridge_vars_set(bridge_channel->chan, buf, NULL);
1297 ast_channel_unlock(bridge_channel->chan);
1303 * \brief Set BRIDGEPEER and BRIDGEPVTCALLID channel variables in a holding bridge.
1306 * \param bridge What to operate on.
1308 * \note On entry, the bridge is already locked.
1312 static void set_bridge_peer_vars_holding(struct ast_bridge *bridge)
1314 struct ast_bridge_channel *bridge_channel;
1316 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1317 ast_channel_lock(bridge_channel->chan);
1318 update_bridge_vars_set(bridge_channel->chan, NULL, NULL);
1319 ast_channel_unlock(bridge_channel->chan);
1325 * \brief Set BRIDGEPEER and BRIDGEPVTCALLID channel variables in the bridge.
1328 * \param bridge What to operate on.
1330 * \note On entry, the bridge is already locked.
1334 static void set_bridge_peer_vars(struct ast_bridge *bridge)
1336 if (bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_HOLDING) {
1337 set_bridge_peer_vars_holding(bridge);
1340 if (bridge->num_channels < 2) {
1343 if (bridge->num_channels == 2) {
1344 set_bridge_peer_vars_2party(AST_LIST_FIRST(&bridge->channels)->chan,
1345 AST_LIST_LAST(&bridge->channels)->chan);
1347 set_bridge_peer_vars_multiparty(bridge);
1351 void bridge_reconfigured(struct ast_bridge *bridge, unsigned int colp_update)
1353 if (!bridge->reconfigured) {
1356 bridge->reconfigured = 0;
1357 if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_SMART)
1358 && smart_bridge_operation(bridge)) {
1359 /* Smart bridge failed. */
1360 bridge_dissolve(bridge, 0);
1363 bridge_complete_join(bridge);
1365 if (bridge->dissolved) {
1368 check_bridge_play_sounds(bridge);
1369 set_bridge_peer_vars(bridge);
1370 ast_bridge_publish_state(bridge);
1373 bridge_reconfigured_connected_line_update(bridge);
1377 struct ast_bridge_channel *bridge_find_channel(struct ast_bridge *bridge, struct ast_channel *chan)
1379 struct ast_bridge_channel *bridge_channel;
1381 AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
1382 if (bridge_channel->chan == chan) {
1387 return bridge_channel;
1390 void ast_bridge_notify_masquerade(struct ast_channel *chan)
1392 struct ast_bridge_channel *bridge_channel;
1393 struct ast_bridge *bridge;
1395 /* Safely get the bridge_channel pointer for the chan. */
1396 ast_channel_lock(chan);
1397 bridge_channel = ast_channel_get_bridge_channel(chan);
1398 ast_channel_unlock(chan);
1399 if (!bridge_channel) {
1400 /* Not in a bridge */
1404 ast_bridge_channel_lock_bridge(bridge_channel);
1405 bridge = bridge_channel->bridge;
1406 if (bridge_channel == bridge_find_channel(bridge, chan)) {
1408 * XXX ASTERISK-22366 this needs more work. The channels need
1409 * to be made compatible again if the formats change. The
1410 * bridge_channel thread needs to monitor for this case.
1412 /* The channel we want to notify is still in a bridge. */
1413 bridge->v_table->notify_masquerade(bridge, bridge_channel);
1414 bridge_reconfigured(bridge, 1);
1416 ast_bridge_unlock(bridge);
1417 ao2_ref(bridge_channel, -1);
1421 * XXX ASTERISK-21271 make ast_bridge_join() require features to be allocated just like ast_bridge_impart() and not expect the struct back.
1423 * This change is really going to break ConfBridge. All other
1424 * users are easily changed. However, it is needed so the
1425 * bridging code can manipulate features on all channels
1426 * consistently no matter how they joined.
1428 * Need to update the features parameter doxygen when this
1429 * change is made to be like ast_bridge_impart().
1431 int ast_bridge_join(struct ast_bridge *bridge,
1432 struct ast_channel *chan,
1433 struct ast_channel *swap,
1434 struct ast_bridge_features *features,
1435 struct ast_bridge_tech_optimizations *tech_args,
1438 struct ast_bridge_channel *bridge_channel;
1441 bridge_channel = bridge_channel_internal_alloc(bridge);
1442 if (pass_reference) {
1443 ao2_ref(bridge, -1);
1445 if (!bridge_channel) {
1449 /* 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. */
1450 ast_assert(features != NULL);
1452 ao2_ref(bridge_channel, -1);
1457 bridge_channel->tech_args = *tech_args;
1460 ast_channel_lock(chan);
1461 if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_ZOMBIE)) {
1464 ast_channel_internal_bridge_channel_set(chan, bridge_channel);
1466 ast_channel_unlock(chan);
1467 bridge_channel->thread = pthread_self();
1468 bridge_channel->chan = chan;
1469 bridge_channel->swap = swap;
1470 bridge_channel->features = features;
1473 res = bridge_channel_internal_join(bridge_channel);
1476 /* Cleanup all the data in the bridge channel after it leaves the bridge. */
1477 ast_channel_lock(chan);
1478 ast_channel_internal_bridge_channel_set(chan, NULL);
1479 ast_channel_unlock(chan);
1480 bridge_channel->chan = NULL;
1481 bridge_channel->swap = NULL;
1482 bridge_channel->features = NULL;
1484 ao2_ref(bridge_channel, -1);
1487 ast_bridge_run_after_callback(chan);
1488 if (!(ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO)
1489 && !ast_bridge_setup_after_goto(chan)) {
1490 /* Claim the after bridge goto is an async goto destination. */
1491 ast_channel_lock(chan);
1492 ast_softhangup_nolock(chan, AST_SOFTHANGUP_ASYNCGOTO);
1493 ast_channel_unlock(chan);
1498 /*! \brief Thread responsible for imparted bridged channels to be departed */
1499 static void *bridge_channel_depart_thread(void *data)
1501 struct ast_bridge_channel *bridge_channel = data;
1503 if (bridge_channel->callid) {
1504 ast_callid_threadassoc_add(bridge_channel->callid);
1507 bridge_channel_internal_join(bridge_channel);
1510 bridge_channel->swap = NULL;
1511 ast_bridge_features_destroy(bridge_channel->features);
1512 bridge_channel->features = NULL;
1514 ast_bridge_discard_after_callback(bridge_channel->chan, AST_BRIDGE_AFTER_CB_REASON_DEPART);
1515 ast_bridge_discard_after_goto(bridge_channel->chan);
1520 /*! \brief Thread responsible for independent imparted bridged channels */
1521 static void *bridge_channel_ind_thread(void *data)
1523 struct ast_bridge_channel *bridge_channel = data;
1524 struct ast_channel *chan;
1526 if (bridge_channel->callid) {
1527 ast_callid_threadassoc_add(bridge_channel->callid);
1530 bridge_channel_internal_join(bridge_channel);
1531 chan = bridge_channel->chan;
1534 ast_channel_lock(chan);
1535 ast_channel_internal_bridge_channel_set(chan, NULL);
1536 ast_channel_unlock(chan);
1537 bridge_channel->chan = NULL;
1538 bridge_channel->swap = NULL;
1539 ast_bridge_features_destroy(bridge_channel->features);
1540 bridge_channel->features = NULL;
1542 ao2_ref(bridge_channel, -1);
1544 ast_bridge_run_after_callback(chan);
1545 ast_bridge_run_after_goto(chan);
1549 int ast_bridge_impart(struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, int independent)
1552 struct ast_bridge_channel *bridge_channel;
1554 /* Imparted channels cannot have a PBX. */
1555 if (ast_channel_pbx(chan)) {
1556 ast_log(AST_LOG_WARNING, "Channel %s has a PBX thread and cannot be imparted into bridge %s\n",
1557 ast_channel_name(chan), bridge->uniqueid);
1561 /* Supply an empty features structure if the caller did not. */
1563 features = ast_bridge_features_new();
1569 /* Try to allocate a structure for the bridge channel */
1570 bridge_channel = bridge_channel_internal_alloc(bridge);
1571 if (!bridge_channel) {
1572 ast_bridge_features_destroy(features);
1576 ast_channel_lock(chan);
1577 if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_ZOMBIE)) {
1578 ast_log(AST_LOG_NOTICE, "Channel %s is a zombie and cannot be imparted into bridge %s\n",
1579 ast_channel_name(chan), bridge->uniqueid);
1582 ast_channel_internal_bridge_channel_set(chan, bridge_channel);
1584 ast_channel_unlock(chan);
1585 bridge_channel->chan = chan;
1586 bridge_channel->swap = swap;
1587 bridge_channel->features = features;
1588 bridge_channel->depart_wait = independent ? 0 : 1;
1589 bridge_channel->callid = ast_read_threadstorage_callid();
1591 /* Actually create the thread that will handle the channel */
1594 res = ast_pthread_create_detached(&bridge_channel->thread, NULL,
1595 bridge_channel_ind_thread, bridge_channel);
1597 res = ast_pthread_create(&bridge_channel->thread, NULL,
1598 bridge_channel_depart_thread, bridge_channel);
1604 ast_channel_lock(chan);
1605 ast_channel_internal_bridge_channel_set(chan, NULL);
1606 ast_channel_unlock(chan);
1607 bridge_channel->chan = NULL;
1608 bridge_channel->swap = NULL;
1609 ast_bridge_features_destroy(bridge_channel->features);
1610 bridge_channel->features = NULL;
1612 ao2_ref(bridge_channel, -1);
1619 int ast_bridge_depart(struct ast_channel *chan)
1621 struct ast_bridge_channel *bridge_channel;
1624 ast_channel_lock(chan);
1625 bridge_channel = ast_channel_internal_bridge_channel(chan);
1626 departable = bridge_channel && bridge_channel->depart_wait;
1627 ast_channel_unlock(chan);
1629 ast_log(LOG_ERROR, "Channel %s cannot be departed.\n",
1630 ast_channel_name(chan));
1632 * Should never happen. It likely means that
1633 * ast_bridge_depart() is called by two threads for the same
1634 * channel, the channel was never imparted to be departed, or it
1635 * has already been departed.
1642 * We are claiming the reference held by the depart bridge
1646 ast_bridge_channel_leave_bridge(bridge_channel,
1647 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, AST_CAUSE_NORMAL_CLEARING);
1649 /* Wait for the depart thread to die */
1650 ast_debug(1, "Waiting for %p(%s) bridge thread to die.\n",
1651 bridge_channel, ast_channel_name(bridge_channel->chan));
1652 pthread_join(bridge_channel->thread, NULL);
1654 ast_channel_lock(chan);
1655 ast_channel_internal_bridge_channel_set(chan, NULL);
1656 ast_channel_unlock(chan);
1658 /* We can get rid of the bridge_channel after the depart thread has died. */
1659 ao2_ref(bridge_channel, -1);
1663 int ast_bridge_remove(struct ast_bridge *bridge, struct ast_channel *chan)
1665 struct ast_bridge_channel *bridge_channel;
1667 ast_bridge_lock(bridge);
1669 /* Try to find the channel that we want to remove */
1670 if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
1671 ast_bridge_unlock(bridge);
1675 ast_bridge_channel_leave_bridge(bridge_channel,
1676 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, AST_CAUSE_NORMAL_CLEARING);
1678 ast_bridge_unlock(bridge);
1683 static void kick_it(struct ast_bridge_channel *bridge_channel, const void *payload, size_t payload_size)
1685 ast_bridge_channel_kick(bridge_channel, AST_CAUSE_NORMAL_CLEARING);
1688 int ast_bridge_kick(struct ast_bridge *bridge, struct ast_channel *chan)
1690 struct ast_bridge_channel *bridge_channel;
1693 ast_bridge_lock(bridge);
1695 /* Try to find the channel that we want to kick. */
1696 if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
1697 ast_bridge_unlock(bridge);
1701 res = ast_bridge_channel_queue_callback(bridge_channel, 0, kick_it, NULL, 0);
1703 ast_bridge_unlock(bridge);
1710 * \brief Point the bridge_channel to a new bridge.
1713 * \param bridge_channel What is to point to a new bridge.
1714 * \param new_bridge Where the bridge channel should point.
1718 static void bridge_channel_change_bridge(struct ast_bridge_channel *bridge_channel, struct ast_bridge *new_bridge)
1720 struct ast_bridge *old_bridge;
1722 ao2_ref(new_bridge, +1);
1723 ast_bridge_channel_lock(bridge_channel);
1724 ast_channel_lock(bridge_channel->chan);
1725 old_bridge = bridge_channel->bridge;
1726 bridge_channel->bridge = new_bridge;
1727 ast_channel_internal_bridge_set(bridge_channel->chan, new_bridge);
1728 ast_channel_unlock(bridge_channel->chan);
1729 ast_bridge_channel_unlock(bridge_channel);
1730 ao2_ref(old_bridge, -1);
1733 void bridge_do_merge(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_bridge_channel **kick_me, unsigned int num_kick,
1734 unsigned int optimized)
1736 struct ast_bridge_channel *bridge_channel;
1739 ast_debug(1, "Merging bridge %s into bridge %s\n",
1740 src_bridge->uniqueid, dst_bridge->uniqueid);
1742 ast_bridge_publish_merge(dst_bridge, src_bridge);
1745 * Move channels from src_bridge over to dst_bridge.
1747 * We must use AST_LIST_TRAVERSE_SAFE_BEGIN() because
1748 * bridge_channel_internal_pull() alters the list we are traversing.
1750 AST_LIST_TRAVERSE_SAFE_BEGIN(&src_bridge->channels, bridge_channel, entry) {
1751 if (bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT) {
1753 * The channel is already leaving let it leave normally because
1754 * pulling it may delete hooks that should run for this channel.
1758 if (ast_test_flag(&bridge_channel->features->feature_flags,
1759 AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE)) {
1764 for (idx = 0; idx < num_kick; ++idx) {
1765 if (bridge_channel == kick_me[idx]) {
1766 ast_bridge_channel_leave_bridge(bridge_channel,
1767 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, AST_CAUSE_NORMAL_CLEARING);
1772 bridge_channel_internal_pull(bridge_channel);
1773 if (bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT) {
1775 * The channel died as a result of being pulled or it was
1776 * kicked. Leave it pointing to the original bridge.
1781 /* Point to new bridge.*/
1782 bridge_channel_change_bridge(bridge_channel, dst_bridge);
1784 if (bridge_channel_internal_push(bridge_channel)) {
1785 ast_bridge_channel_leave_bridge(bridge_channel,
1786 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, bridge_channel->bridge->cause);
1789 AST_LIST_TRAVERSE_SAFE_END;
1793 * Now we can kick any channels in the dst_bridge without
1794 * potentially dissolving the bridge.
1796 for (idx = 0; idx < num_kick; ++idx) {
1797 bridge_channel = kick_me[idx];
1798 ast_bridge_channel_lock(bridge_channel);
1799 if (bridge_channel->state == BRIDGE_CHANNEL_STATE_WAIT) {
1800 ast_bridge_channel_leave_bridge_nolock(bridge_channel,
1801 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, AST_CAUSE_NORMAL_CLEARING);
1802 bridge_channel_internal_pull(bridge_channel);
1804 ast_bridge_channel_unlock(bridge_channel);
1808 bridge_reconfigured(dst_bridge, !optimized);
1809 bridge_reconfigured(src_bridge, !optimized);
1811 ast_debug(1, "Merged bridge %s into bridge %s\n",
1812 src_bridge->uniqueid, dst_bridge->uniqueid);
1815 struct merge_direction {
1816 /*! Destination merge bridge. */
1817 struct ast_bridge *dest;
1818 /*! Source merge bridge. */
1819 struct ast_bridge *src;
1824 * \brief Determine which bridge should merge into the other.
1827 * \param bridge1 A bridge for merging
1828 * \param bridge2 A bridge for merging
1830 * \note The two bridges are assumed already locked.
1832 * \return Which bridge merges into which or NULL bridges if cannot merge.
1834 static struct merge_direction bridge_merge_determine_direction(struct ast_bridge *bridge1, struct ast_bridge *bridge2)
1836 struct merge_direction merge = { NULL, NULL };
1837 int bridge1_priority;
1838 int bridge2_priority;
1840 if (!ast_test_flag(&bridge1->feature_flags,
1841 AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM)
1842 && !ast_test_flag(&bridge2->feature_flags,
1843 AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM)) {
1845 * Can merge either way. Merge to the higher priority merge
1846 * bridge. Otherwise merge to the larger bridge.
1848 bridge1_priority = bridge1->v_table->get_merge_priority(bridge1);
1849 bridge2_priority = bridge2->v_table->get_merge_priority(bridge2);
1850 if (bridge2_priority < bridge1_priority) {
1851 merge.dest = bridge1;
1852 merge.src = bridge2;
1853 } else if (bridge1_priority < bridge2_priority) {
1854 merge.dest = bridge2;
1855 merge.src = bridge1;
1857 /* Merge to the larger bridge. */
1858 if (bridge2->num_channels <= bridge1->num_channels) {
1859 merge.dest = bridge1;
1860 merge.src = bridge2;
1862 merge.dest = bridge2;
1863 merge.src = bridge1;
1866 } else if (!ast_test_flag(&bridge1->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_TO)
1867 && !ast_test_flag(&bridge2->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM)) {
1868 /* Can merge only one way. */
1869 merge.dest = bridge1;
1870 merge.src = bridge2;
1871 } else if (!ast_test_flag(&bridge2->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_TO)
1872 && !ast_test_flag(&bridge1->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM)) {
1873 /* Can merge only one way. */
1874 merge.dest = bridge2;
1875 merge.src = bridge1;
1883 * \brief Merge two bridges together
1886 * \param dst_bridge Destination bridge of merge.
1887 * \param src_bridge Source bridge of merge.
1888 * \param merge_best_direction TRUE if don't care about which bridge merges into the other.
1889 * \param kick_me Array of channels to kick from the bridges.
1890 * \param num_kick Number of channels in the kick_me array.
1892 * \note The dst_bridge and src_bridge are assumed already locked.
1894 * \retval 0 on success
1895 * \retval -1 on failure
1897 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)
1899 struct merge_direction merge;
1900 struct ast_bridge_channel **kick_them = NULL;
1903 ast_assert(dst_bridge && src_bridge && dst_bridge != src_bridge && (!num_kick || kick_me));
1905 if (dst_bridge->dissolved || src_bridge->dissolved) {
1906 ast_debug(1, "Can't merge bridges %s and %s, at least one bridge is dissolved.\n",
1907 src_bridge->uniqueid, dst_bridge->uniqueid);
1910 if (ast_test_flag(&dst_bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)
1911 || ast_test_flag(&src_bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)) {
1912 ast_debug(1, "Can't merge bridges %s and %s, masquerade only.\n",
1913 src_bridge->uniqueid, dst_bridge->uniqueid);
1916 if (dst_bridge->inhibit_merge || src_bridge->inhibit_merge) {
1917 ast_debug(1, "Can't merge bridges %s and %s, merging temporarily inhibited.\n",
1918 src_bridge->uniqueid, dst_bridge->uniqueid);
1922 if (merge_best_direction) {
1923 merge = bridge_merge_determine_direction(dst_bridge, src_bridge);
1925 merge.dest = dst_bridge;
1926 merge.src = src_bridge;
1930 || ast_test_flag(&merge.dest->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_TO)
1931 || ast_test_flag(&merge.src->feature_flags, AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM)) {
1932 ast_debug(1, "Can't merge bridges %s and %s, merging inhibited.\n",
1933 src_bridge->uniqueid, dst_bridge->uniqueid);
1936 if (merge.src->num_channels < 2) {
1938 * For a two party bridge, a channel may be temporarily removed
1939 * from the source bridge or the initial bridge members have not
1942 ast_debug(1, "Can't merge bridge %s into bridge %s, not enough channels in source bridge.\n",
1943 merge.src->uniqueid, merge.dest->uniqueid);
1946 if (2 + num_kick < merge.dest->num_channels + merge.src->num_channels
1947 && !(merge.dest->technology->capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX)
1948 && (!ast_test_flag(&merge.dest->feature_flags, AST_BRIDGE_FLAG_SMART)
1949 || !(merge.dest->allowed_capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX))) {
1950 ast_debug(1, "Can't merge bridge %s into bridge %s, multimix is needed and it cannot be acquired.\n",
1951 merge.src->uniqueid, merge.dest->uniqueid);
1956 unsigned int num_to_kick = 0;
1959 kick_them = ast_alloca(num_kick * sizeof(*kick_them));
1960 for (idx = 0; idx < num_kick; ++idx) {
1961 kick_them[num_to_kick] = bridge_find_channel(merge.src, kick_me[idx]);
1962 if (!kick_them[num_to_kick]) {
1963 kick_them[num_to_kick] = bridge_find_channel(merge.dest, kick_me[idx]);
1965 if (kick_them[num_to_kick]) {
1970 if (num_to_kick != num_kick) {
1971 ast_debug(1, "Can't merge bridge %s into bridge %s, at least one kicked channel is not in either bridge.\n",
1972 merge.src->uniqueid, merge.dest->uniqueid);
1977 bridge_do_merge(merge.dest, merge.src, kick_them, num_kick, 0);
1981 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)
1986 ast_assert(dst_bridge && src_bridge);
1988 ast_bridge_lock_both(dst_bridge, src_bridge);
1989 res = bridge_merge_locked(dst_bridge, src_bridge, merge_best_direction, kick_me, num_kick);
1990 ast_bridge_unlock(src_bridge);
1991 ast_bridge_unlock(dst_bridge);
1995 int bridge_do_move(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bridge_channel, int attempt_recovery,
1996 unsigned int optimized)
1998 struct ast_bridge *orig_bridge;
2002 if (bridge_channel->swap) {
2003 ast_debug(1, "Moving %p(%s) into bridge %s swapping with %s\n",
2004 bridge_channel, ast_channel_name(bridge_channel->chan), dst_bridge->uniqueid,
2005 ast_channel_name(bridge_channel->swap));
2007 ast_debug(1, "Moving %p(%s) into bridge %s\n",
2008 bridge_channel, ast_channel_name(bridge_channel->chan), dst_bridge->uniqueid);
2011 orig_bridge = bridge_channel->bridge;
2012 was_in_bridge = bridge_channel->in_bridge;
2014 bridge_channel_internal_pull(bridge_channel);
2015 if (bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT) {
2017 * The channel died as a result of being pulled. Leave it
2018 * pointing to the original bridge.
2020 bridge_reconfigured(orig_bridge, 0);
2024 /* Point to new bridge.*/
2025 ao2_ref(orig_bridge, +1);/* Keep a ref in case the push fails. */
2026 bridge_channel_change_bridge(bridge_channel, dst_bridge);
2028 if (bridge_channel_internal_push(bridge_channel)) {
2029 /* Try to put the channel back into the original bridge. */
2030 if (attempt_recovery && was_in_bridge) {
2031 /* Point back to original bridge. */
2032 bridge_channel_change_bridge(bridge_channel, orig_bridge);
2034 if (bridge_channel_internal_push(bridge_channel)) {
2035 ast_bridge_channel_leave_bridge(bridge_channel,
2036 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, bridge_channel->bridge->cause);
2037 bridge_channel_settle_owed_events(orig_bridge, bridge_channel);
2040 ast_bridge_channel_leave_bridge(bridge_channel,
2041 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, bridge_channel->bridge->cause);
2042 bridge_channel_settle_owed_events(orig_bridge, bridge_channel);
2046 bridge_channel_settle_owed_events(orig_bridge, bridge_channel);
2049 bridge_reconfigured(dst_bridge, !optimized);
2050 bridge_reconfigured(orig_bridge, !optimized);
2051 ao2_ref(orig_bridge, -1);
2057 * \brief Move a channel from one bridge to another.
2060 * \param dst_bridge Destination bridge of bridge channel move.
2061 * \param src_bridge Source bridge of bridge channel move.
2062 * \param chan Channel to move.
2063 * \param swap Channel to replace in dst_bridge.
2064 * \param attempt_recovery TRUE if failure attempts to push channel back into original bridge.
2066 * \note The dst_bridge and src_bridge are assumed already locked.
2068 * \retval 0 on success.
2069 * \retval -1 on failure.
2071 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)
2073 struct ast_bridge_channel *bridge_channel;
2075 if (dst_bridge->dissolved || src_bridge->dissolved) {
2076 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, at least one bridge is dissolved.\n",
2077 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2080 if (ast_test_flag(&dst_bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)
2081 || ast_test_flag(&src_bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)) {
2082 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, masquerade only.\n",
2083 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2086 if (dst_bridge->inhibit_merge || src_bridge->inhibit_merge) {
2087 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, temporarily inhibited.\n",
2088 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2092 bridge_channel = bridge_find_channel(src_bridge, chan);
2093 if (!bridge_channel) {
2094 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, channel not in bridge.\n",
2095 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2098 if (bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT) {
2099 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, channel leaving bridge.\n",
2100 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2103 if (ast_test_flag(&bridge_channel->features->feature_flags,
2104 AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE)) {
2105 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, channel immovable.\n",
2106 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid);
2111 struct ast_bridge_channel *bridge_channel_swap;
2113 bridge_channel_swap = bridge_find_channel(dst_bridge, swap);
2114 if (!bridge_channel_swap) {
2115 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, swap channel %s not in bridge.\n",
2116 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid,
2117 ast_channel_name(swap));
2120 if (bridge_channel_swap->state != BRIDGE_CHANNEL_STATE_WAIT) {
2121 ast_debug(1, "Can't move channel %s from bridge %s into bridge %s, swap channel %s leaving bridge.\n",
2122 ast_channel_name(chan), src_bridge->uniqueid, dst_bridge->uniqueid,
2123 ast_channel_name(swap));
2128 bridge_channel->swap = swap;
2129 return bridge_do_move(dst_bridge, bridge_channel, attempt_recovery, 0);
2132 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)
2136 ast_bridge_lock_both(dst_bridge, src_bridge);
2137 res = bridge_move_locked(dst_bridge, src_bridge, chan, swap, attempt_recovery);
2138 ast_bridge_unlock(src_bridge);
2139 ast_bridge_unlock(dst_bridge);
2143 int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan,
2144 struct ast_bridge_features *features, int play_tone, const char *xfersound)
2146 RAII_VAR(struct ast_bridge *, chan_bridge, NULL, ao2_cleanup);
2147 RAII_VAR(struct ast_channel *, yanked_chan, NULL, ao2_cleanup);
2149 ast_channel_lock(chan);
2150 chan_bridge = ast_channel_get_bridge(chan);
2151 ast_channel_unlock(chan);
2154 struct ast_bridge_channel *bridge_channel;
2156 ast_bridge_lock_both(bridge, chan_bridge);
2157 bridge_channel = bridge_find_channel(chan_bridge, chan);
2159 if (bridge_move_locked(bridge, chan_bridge, chan, NULL, 1)) {
2160 ast_bridge_unlock(chan_bridge);
2161 ast_bridge_unlock(bridge);
2166 * bridge_move_locked() will implicitly ensure that
2167 * bridge_channel is not NULL.
2169 ast_assert(bridge_channel != NULL);
2172 * Additional checks if the channel we just stole dissolves the
2175 bridge_dissolve_check_stolen(chan_bridge, bridge_channel);
2176 ast_bridge_unlock(chan_bridge);
2177 ast_bridge_unlock(bridge);
2179 /* The channel was in a bridge so it is not getting any new features. */
2180 ast_bridge_features_destroy(features);
2182 /* Slightly less easy case. We need to yank channel A from
2183 * where he currently is and impart him into our bridge.
2185 yanked_chan = ast_channel_yank(chan);
2187 ast_log(LOG_WARNING, "Could not gain control of channel %s\n", ast_channel_name(chan));
2190 if (ast_channel_state(yanked_chan) != AST_STATE_UP) {
2191 ast_answer(yanked_chan);
2193 ast_channel_ref(yanked_chan);
2194 if (ast_bridge_impart(bridge, yanked_chan, NULL, features, 1)) {
2195 /* It is possible for us to yank a channel and have some other
2196 * thread start a PBX on the channl after we yanked it. In particular,
2197 * this can theoretically happen on the ;2 of a Local channel if we
2198 * yank it prior to the ;1 being answered. Make sure that it isn't
2199 * executing a PBX before hanging it up.
2201 if (ast_channel_pbx(yanked_chan)) {
2202 ast_channel_unref(yanked_chan);
2204 ast_hangup(yanked_chan);
2210 if (play_tone && !ast_strlen_zero(xfersound)) {
2211 struct ast_channel *play_chan = yanked_chan ?: chan;
2212 RAII_VAR(struct ast_bridge_channel *, play_bridge_channel, NULL, ao2_cleanup);
2214 ast_channel_lock(play_chan);
2215 play_bridge_channel = ast_channel_get_bridge_channel(play_chan);
2216 ast_channel_unlock(play_chan);
2218 if (!play_bridge_channel) {
2219 ast_log(LOG_WARNING, "Unable to play tone for channel %s. No longer in a bridge.\n",
2220 ast_channel_name(play_chan));
2222 ast_bridge_channel_queue_playfile(play_bridge_channel, NULL, xfersound, NULL);
2228 static int bridge_allows_optimization(struct ast_bridge *bridge)
2230 return !(bridge->inhibit_merge
2231 || bridge->dissolved
2232 || ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY));
2237 * \brief Lock the unreal channel stack for chan and prequalify it.
2240 * \param chan Unreal channel writing a frame into the channel driver.
2242 * \note It is assumed that chan is already locked.
2244 * \retval bridge on success with bridge and bridge_channel locked.
2245 * \retval NULL if cannot do optimization now.
2247 static struct ast_bridge *optimize_lock_chan_stack(struct ast_channel *chan)
2249 struct ast_bridge *bridge;
2250 struct ast_bridge_channel *bridge_channel;
2252 if (!AST_LIST_EMPTY(ast_channel_readq(chan))) {
2255 if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_EMULATE_DTMF)) {
2258 if (ast_channel_has_audio_frame_or_monitor(chan)) {
2259 /* Channel has an active monitor, audiohook, or framehook. */
2262 bridge_channel = ast_channel_internal_bridge_channel(chan);
2263 if (!bridge_channel || ast_bridge_channel_trylock(bridge_channel)) {
2266 bridge = bridge_channel->bridge;
2267 if (bridge_channel->activity != BRIDGE_CHANNEL_THREAD_SIMPLE
2268 || bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT
2269 || ast_bridge_trylock(bridge)) {
2270 ast_bridge_channel_unlock(bridge_channel);
2273 if (!bridge_channel_internal_allows_optimization(bridge_channel) ||
2274 !bridge_allows_optimization(bridge)) {
2275 ast_bridge_unlock(bridge);
2276 ast_bridge_channel_unlock(bridge_channel);
2284 * \brief Lock the unreal channel stack for peer and prequalify it.
2287 * \param peer Other unreal channel in the pair.
2289 * \retval bridge on success with bridge, bridge_channel, and peer locked.
2290 * \retval NULL if cannot do optimization now.
2292 static struct ast_bridge *optimize_lock_peer_stack(struct ast_channel *peer)
2294 struct ast_bridge *bridge;
2295 struct ast_bridge_channel *bridge_channel;
2297 if (ast_channel_trylock(peer)) {
2300 if (!AST_LIST_EMPTY(ast_channel_readq(peer))) {
2301 ast_channel_unlock(peer);
2304 if (ast_test_flag(ast_channel_flags(peer), AST_FLAG_EMULATE_DTMF)) {
2305 ast_channel_unlock(peer);
2308 if (ast_channel_has_audio_frame_or_monitor(peer)) {
2309 /* Peer has an active monitor, audiohook, or framehook. */
2310 ast_channel_unlock(peer);
2313 bridge_channel = ast_channel_internal_bridge_channel(peer);
2314 if (!bridge_channel || ast_bridge_channel_trylock(bridge_channel)) {
2315 ast_channel_unlock(peer);
2318 bridge = bridge_channel->bridge;
2319 if (bridge_channel->activity != BRIDGE_CHANNEL_THREAD_IDLE
2320 || bridge_channel->state != BRIDGE_CHANNEL_STATE_WAIT
2321 || ast_bridge_trylock(bridge)) {
2322 ast_bridge_channel_unlock(bridge_channel);
2323 ast_channel_unlock(peer);
2326 if (!bridge_allows_optimization(bridge) ||
2327 !bridge_channel_internal_allows_optimization(bridge_channel)) {
2328 ast_bridge_unlock(bridge);
2329 ast_bridge_channel_unlock(bridge_channel);
2330 ast_channel_unlock(peer);
2338 * \brief Indicates allowability of a swap optimization
2340 enum bridge_allow_swap {
2341 /*! Bridges cannot allow for a swap optimization to occur */
2343 /*! Bridge swap optimization can occur into the chan_bridge */
2344 SWAP_TO_CHAN_BRIDGE,
2345 /*! Bridge swap optimization can occur into the peer_bridge */
2346 SWAP_TO_PEER_BRIDGE,
2351 * \brief Determine if two bridges allow for swap optimization to occur
2353 * \param chan_bridge First bridge being tested
2354 * \param peer_bridge Second bridge being tested
2355 * \return Allowability of swap optimization
2357 static enum bridge_allow_swap bridges_allow_swap_optimization(struct ast_bridge *chan_bridge,
2358 struct ast_bridge *peer_bridge)
2363 if (!ast_test_flag(&chan_bridge->feature_flags,
2364 AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM |
2365 AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY)
2366 && !ast_test_flag(&peer_bridge->feature_flags,
2367 AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM |
2368 AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY)) {
2370 * Can swap either way. Swap to the higher priority merge
2373 chan_priority = chan_bridge->v_table->get_merge_priority(chan_bridge);
2374 peer_priority = peer_bridge->v_table->get_merge_priority(peer_bridge);
2375 if (chan_bridge->num_channels == 2
2376 && chan_priority <= peer_priority) {
2377 return SWAP_TO_PEER_BRIDGE;
2378 } else if (peer_bridge->num_channels == 2
2379 && peer_priority <= chan_priority) {
2380 return SWAP_TO_CHAN_BRIDGE;
2382 } else if (chan_bridge->num_channels == 2
2383 && !ast_test_flag(&chan_bridge->feature_flags, AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY)
2384 && !ast_test_flag(&peer_bridge->feature_flags, AST_BRIDGE_FLAG_SWAP_INHIBIT_TO)) {
2385 /* Can swap optimize only one way. */
2386 return SWAP_TO_PEER_BRIDGE;
2387 } else if (peer_bridge->num_channels == 2
2388 && !ast_test_flag(&peer_bridge->feature_flags, AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY)
2389 && !ast_test_flag(&chan_bridge->feature_flags, AST_BRIDGE_FLAG_SWAP_INHIBIT_TO)) {
2390 /* Can swap optimize only one way. */
2391 return SWAP_TO_CHAN_BRIDGE;
2394 return SWAP_PROHIBITED;
2399 * \brief Check and attempt to swap optimize out the unreal channels.
2402 * \param chan_bridge
2403 * \param chan_bridge_channel
2404 * \param peer_bridge
2405 * \param peer_bridge_channel
2406 * \param pvt Unreal data containing callbacks to call if the optimization actually
2409 * \retval 1 if unreal channels failed to optimize out.
2410 * \retval 0 if unreal channels were not optimized out.
2411 * \retval -1 if unreal channels were optimized out.
2413 static int try_swap_optimize_out(struct ast_bridge *chan_bridge,
2414 struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge,
2415 struct ast_bridge_channel *peer_bridge_channel,
2416 struct ast_unreal_pvt *pvt)
2418 struct ast_bridge *dst_bridge;
2419 struct ast_bridge_channel *dst_bridge_channel;
2420 struct ast_bridge_channel *src_bridge_channel;
2421 struct ast_bridge_channel *other;
2424 switch (bridges_allow_swap_optimization(chan_bridge, peer_bridge)) {
2425 case SWAP_TO_CHAN_BRIDGE:
2426 dst_bridge = chan_bridge;
2427 dst_bridge_channel = chan_bridge_channel;
2428 src_bridge_channel = peer_bridge_channel;
2430 case SWAP_TO_PEER_BRIDGE:
2431 dst_bridge = peer_bridge;
2432 dst_bridge_channel = peer_bridge_channel;
2433 src_bridge_channel = chan_bridge_channel;
2435 case SWAP_PROHIBITED:
2440 other = ast_bridge_channel_peer(src_bridge_channel);
2441 if (other && other->state == BRIDGE_CHANNEL_STATE_WAIT) {
2442 unsigned int id = ast_atomic_fetchadd_int((int *) &optimization_id, +1);
2444 ast_verb(3, "Move-swap optimizing %s <-- %s.\n",
2445 ast_channel_name(dst_bridge_channel->chan),
2446 ast_channel_name(other->chan));
2448 if (pvt && !ast_test_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN) && pvt->callbacks
2449 && pvt->callbacks->optimization_started) {
2450 pvt->callbacks->optimization_started(pvt, other->chan,
2451 dst_bridge_channel->chan == pvt->owner ? AST_UNREAL_OWNER : AST_UNREAL_CHAN,
2453 ast_set_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN);
2455 other->swap = dst_bridge_channel->chan;
2456 if (!bridge_do_move(dst_bridge, other, 1, 1)) {
2457 ast_bridge_channel_leave_bridge(src_bridge_channel,
2458 BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, AST_CAUSE_NORMAL_CLEARING);
2461 if (pvt && pvt->callbacks && pvt->callbacks->optimization_finished) {
2462 pvt->callbacks->optimization_finished(pvt, res == 1, id);
2470 * \brief Indicates allowability of a merge optimization
2472 enum bridge_allow_merge {
2473 /*! Bridge properties prohibit merge optimization */
2475 /*! Merge optimization cannot occur because the source bridge has too few channels */
2476 MERGE_NOT_ENOUGH_CHANNELS,
2477 /*! Merge optimization cannot occur because multimix capability could not be requested */
2479 /*! Merge optimization allowed between bridges */
2485 * \brief Determines allowability of a merge optimization
2487 * \note The merge output parameter is undefined if MERGE_PROHIBITED is returned. For success
2488 * and other failure returns, a merge direction was determined, and the parameter is safe to
2491 * \param chan_bridge First bridge being tested
2492 * \param peer_bridge Second bridge being tested
2493 * \param num_kick_channels The number of channels to remove from the bridges during merging
2494 * \param[out] merge Indicates the recommended direction for the bridge merge
2496 static enum bridge_allow_merge bridges_allow_merge_optimization(struct ast_bridge *chan_bridge,
2497 struct ast_bridge *peer_bridge, int num_kick_channels, struct merge_direction *merge)
2499 *merge = bridge_merge_determine_direction(chan_bridge, peer_bridge);
2501 return MERGE_PROHIBITED;
2503 if (merge->src->num_channels < 2) {
2504 return MERGE_NOT_ENOUGH_CHANNELS;
2505 } else if ((2 + num_kick_channels) < merge->dest->num_channels + merge->src->num_channels
2506 && !(merge->dest->technology->capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX)
2507 && (!ast_test_flag(&merge->dest->feature_flags, AST_BRIDGE_FLAG_SMART)
2508 || !(merge->dest->allowed_capabilities & AST_BRIDGE_CAPABILITY_MULTIMIX))) {
2509 return MERGE_NO_MULTIMIX;
2512 return MERGE_ALLOWED;
2517 * \brief Check and attempt to merge optimize out the unreal channels.
2520 * \param chan_bridge
2521 * \param chan_bridge_channel
2522 * \param peer_bridge
2523 * \param peer_bridge_channel
2524 * \param pvt Unreal data containing callbacks to call if the optimization actually
2527 * \retval 0 if unreal channels were not optimized out.
2528 * \retval -1 if unreal channels were optimized out.
2530 static int try_merge_optimize_out(struct ast_bridge *chan_bridge,
2531 struct ast_bridge_channel *chan_bridge_channel, struct ast_bridge *peer_bridge,
2532 struct ast_bridge_channel *peer_bridge_channel,
2533 struct ast_unreal_pvt *pvt)
2535 struct merge_direction merge;
2536 struct ast_bridge_channel *kick_me[] = {
2537 chan_bridge_channel,
2538 peer_bridge_channel,
2542 switch (bridges_allow_merge_optimization(chan_bridge, peer_bridge, ARRAY_LEN(kick_me), &merge)) {
2545 case MERGE_PROHIBITED:
2547 case MERGE_NOT_ENOUGH_CHANNELS:
2548 ast_debug(4, "Can't optimize %s -- %s out, not enough channels in bridge %s.\n",
2549 ast_channel_name(chan_bridge_channel->chan),
2550 ast_channel_name(peer_bridge_channel->chan),
2551 merge.src->uniqueid);
2553 case MERGE_NO_MULTIMIX:
2554 ast_debug(4, "Can't optimize %s -- %s out, multimix is needed and it cannot be acquired.\n",
2555 ast_channel_name(chan_bridge_channel->chan),
2556 ast_channel_name(peer_bridge_channel->chan));
2560 ast_verb(3, "Merge optimizing %s -- %s out.\n",
2561 ast_channel_name(chan_bridge_channel->chan),
2562 ast_channel_name(peer_bridge_channel->chan));
2564 id = ast_atomic_fetchadd_int((int *) &optimization_id, +1);
2566 if (pvt && !ast_test_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN) && pvt->callbacks
2567 && pvt->callbacks->optimization_started) {
2568 pvt->callbacks->optimization_started(pvt, NULL,
2569 merge.dest == ast_channel_internal_bridge(pvt->owner) ? AST_UNREAL_OWNER : AST_UNREAL_CHAN,
2571 ast_set_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN);
2573 bridge_do_merge(merge.dest, merge.src, kick_me, ARRAY_LEN(kick_me), 1);
2574 if (pvt && pvt->callbacks && pvt->callbacks->optimization_finished) {
2575 pvt->callbacks->optimization_finished(pvt, 1, id);
2581 int ast_bridge_unreal_optimize_out(struct ast_channel *chan, struct ast_channel *peer, struct ast_unreal_pvt *pvt)
2583 struct ast_bridge *chan_bridge;
2584 struct ast_bridge *peer_bridge;
2585 struct ast_bridge_channel *chan_bridge_channel;
2586 struct ast_bridge_channel *peer_bridge_channel;
2589 chan_bridge = optimize_lock_chan_stack(chan);
2593 chan_bridge_channel = ast_channel_internal_bridge_channel(chan);
2595 peer_bridge = optimize_lock_peer_stack(peer);
2597 peer_bridge_channel = ast_channel_internal_bridge_channel(peer);
2599 res = try_swap_optimize_out(chan_bridge, chan_bridge_channel,
2600 peer_bridge, peer_bridge_channel, pvt);
2602 res = try_merge_optimize_out(chan_bridge, chan_bridge_channel,
2603 peer_bridge, peer_bridge_channel, pvt);
2604 } else if (0 < res) {
2608 /* Release peer locks. */
2609 ast_bridge_unlock(peer_bridge);
2610 ast_bridge_channel_unlock(peer_bridge_channel);
2611 ast_channel_unlock(peer);
2614 /* Release chan locks. */
2615 ast_bridge_unlock(chan_bridge);
2616 ast_bridge_channel_unlock(chan_bridge_channel);
2621 enum ast_bridge_optimization ast_bridges_allow_optimization(struct ast_bridge *chan_bridge,
2622 struct ast_bridge *peer_bridge)
2624 struct merge_direction merge;
2626 if (!bridge_allows_optimization(chan_bridge) || !bridge_allows_optimization(peer_bridge)) {
2627 return AST_BRIDGE_OPTIMIZE_PROHIBITED;
2630 switch (bridges_allow_swap_optimization(chan_bridge, peer_bridge)) {
2631 case SWAP_TO_CHAN_BRIDGE:
2632 return AST_BRIDGE_OPTIMIZE_SWAP_TO_CHAN_BRIDGE;
2633 case SWAP_TO_PEER_BRIDGE:
2634 return AST_BRIDGE_OPTIMIZE_SWAP_TO_PEER_BRIDGE;
2635 case SWAP_PROHIBITED:
2640 /* Two channels will be kicked from the bridges, the unreal;1 and unreal;2 channels */
2641 if (bridges_allow_merge_optimization(chan_bridge, peer_bridge, 2, &merge) != MERGE_ALLOWED) {
2642 return AST_BRIDGE_OPTIMIZE_PROHIBITED;
2645 if (merge.dest == chan_bridge) {
2646 return AST_BRIDGE_OPTIMIZE_MERGE_TO_CHAN_BRIDGE;
2648 return AST_BRIDGE_OPTIMIZE_MERGE_TO_PEER_BRIDGE;
2654 * \brief Adjust the bridge merge inhibit request count.
2657 * \param bridge What to operate on.
2658 * \param request Inhibit request increment.
2659 * (Positive to add requests. Negative to remove requests.)
2661 * \note This function assumes bridge is locked.
2665 void bridge_merge_inhibit_nolock(struct ast_bridge *bridge, int request)
2669 new_request = bridge->inhibit_merge + request;
2670 ast_assert(0 <= new_request);
2671 bridge->inhibit_merge = new_request;
2674 void ast_bridge_merge_inhibit(struct ast_bridge *bridge, int request)
2676 ast_bridge_lock(bridge);
2677 bridge_merge_inhibit_nolock(bridge, request);
2678 ast_bridge_unlock(bridge);
2681 int ast_bridge_suspend(struct ast_bridge *bridge, struct ast_channel *chan)
2683 struct ast_bridge_channel *bridge_channel;
2684 /* XXX ASTERISK-21271 the case of a disolved bridge while channel is suspended is not handled. */
2685 /* XXX ASTERISK-21271 suspend/unsuspend needs to be rethought. The caller must block until it has successfully suspended the channel for temporary control. */
2686 /* 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. */
2688 ast_bridge_lock(bridge);
2690 if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
2691 ast_bridge_unlock(bridge);
2695 bridge_channel_internal_suspend_nolock(bridge_channel);
2697 ast_bridge_unlock(bridge);
2702 int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan)
2704 struct ast_bridge_channel *bridge_channel;
2705 /* XXX ASTERISK-21271 the case of a disolved bridge while channel is suspended is not handled. */
2707 ast_bridge_lock(bridge);
2709 if (!(bridge_channel = bridge_find_channel(bridge, chan))) {
2710 ast_bridge_unlock(bridge);
2714 bridge_channel_internal_unsuspend_nolock(bridge_channel);
2716 ast_bridge_unlock(bridge);
2721 void ast_bridge_technology_suspend(struct ast_bridge_technology *technology)
2723 technology->suspended = 1;
2726 void ast_bridge_technology_unsuspend(struct ast_bridge_technology *technology)
2729 * XXX We may want the act of unsuspending a bridge technology
2730 * to prod all existing bridges to see if they should start
2733 technology->suspended = 0;
2736 int ast_bridge_features_register(enum ast_bridge_builtin_feature feature, ast_bridge_hook_callback callback, const char *dtmf)
2738 if (ARRAY_LEN(builtin_features_handlers) <= feature
2739 || builtin_features_handlers[feature]) {
2743 if (!ast_strlen_zero(dtmf)) {
2744 ast_copy_string(builtin_features_dtmf[feature], dtmf, sizeof(builtin_features_dtmf[feature]));
2747 builtin_features_handlers[feature] = callback;
2752 int ast_bridge_features_unregister(enum ast_bridge_builtin_feature feature)
2754 if (ARRAY_LEN(builtin_features_handlers) <= feature
2755 || !builtin_features_handlers[feature]) {
2759 builtin_features_handlers[feature] = NULL;
2764 int ast_bridge_features_do(enum ast_bridge_builtin_feature feature, struct ast_bridge_channel *bridge_channel, void *hook_pvt)
2766 ast_bridge_hook_callback callback;
2768 if (ARRAY_LEN(builtin_features_handlers) <= feature) {
2772 callback = builtin_features_handlers[feature];
2776 callback(bridge_channel, hook_pvt);
2781 int ast_bridge_interval_register(enum ast_bridge_builtin_interval interval, ast_bridge_builtin_set_limits_fn callback)
2783 if (ARRAY_LEN(builtin_interval_handlers) <= interval
2784 || builtin_interval_handlers[interval]) {
2788 builtin_interval_handlers[interval] = callback;
2793 int ast_bridge_interval_unregister(enum ast_bridge_builtin_interval interval)
2795 if (ARRAY_LEN(builtin_interval_handlers) <= interval
2796 || !builtin_interval_handlers[interval]) {
2800 builtin_interval_handlers[interval] = NULL;
2808 * \brief Bridge hook destructor.
2811 * \param vhook Object to destroy.
2815 static void bridge_hook_destroy(void *vhook)
2817 struct ast_bridge_hook *hook = vhook;
2819 if (hook->destructor) {
2820 hook->destructor(hook->hook_pvt);
2826 * \brief Allocate and setup a generic bridge hook.
2829 * \param size How big an object to allocate.
2830 * \param callback Function to execute upon activation
2831 * \param hook_pvt Unique data
2832 * \param destructor Optional destructor callback for hook_pvt data
2833 * \param remove_flags Dictates what situations the hook should be removed.
2835 * \retval hook on success.
2836 * \retval NULL on error.
2838 static struct ast_bridge_hook *bridge_hook_generic(size_t size,
2839 ast_bridge_hook_callback callback,
2841 ast_bridge_hook_pvt_destructor destructor,
2842 enum ast_bridge_hook_remove_flags remove_flags)
2844 struct ast_bridge_hook *hook;
2846 /* Allocate new hook and setup it's basic variables */
2847 hook = ao2_alloc_options(size, bridge_hook_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
2849 hook->callback = callback;
2850 hook->destructor = destructor;
2851 hook->hook_pvt = hook_pvt;
2852 ast_set_flag(&hook->remove_flags, remove_flags);
2858 int ast_bridge_dtmf_hook(struct ast_bridge_features *features,
2860 ast_bridge_hook_callback callback,
2862 ast_bridge_hook_pvt_destructor destructor,
2863 enum ast_bridge_hook_remove_flags remove_flags)
2865 struct ast_bridge_hook_dtmf *hook;
2868 /* Allocate new hook and setup it's various variables */
2869 hook = (struct ast_bridge_hook_dtmf *) bridge_hook_generic(sizeof(*hook), callback,
2870 hook_pvt, destructor, remove_flags);
2874 hook->generic.type = AST_BRIDGE_HOOK_TYPE_DTMF;
2875 ast_copy_string(hook->dtmf.code, dtmf, sizeof(hook->dtmf.code));
2877 /* Once done we put it in the container. */
2878 res = ao2_link(features->dtmf_hooks, hook) ? 0 : -1;
2881 * Could not link the hook into the container.
2883 * Remove the hook_pvt destructor call from the hook since we
2884 * are returning failure to install the hook.
2886 hook->generic.destructor = NULL;
2895 * \brief Attach an other hook to a bridge features structure
2897 * \param features Bridge features structure
2898 * \param callback Function to execute upon activation
2899 * \param hook_pvt Unique data
2900 * \param destructor Optional destructor callback for hook_pvt data
2901 * \param remove_flags Dictates what situations the hook should be removed.
2902 * \param type What type of hook is being attached.
2904 * \retval 0 on success
2905 * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
2907 static int bridge_other_hook(struct ast_bridge_features *features,
2908 ast_bridge_hook_callback callback,
2910 ast_bridge_hook_pvt_destructor destructor,
2911 enum ast_bridge_hook_remove_flags remove_flags,
2912 enum ast_bridge_hook_type type)
2914 struct ast_bridge_hook *hook;
2917 /* Allocate new hook and setup it's various variables */
2918 hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
2925 /* Once done we put it in the container. */
2926 res = ao2_link(features->other_hooks, hook) ? 0 : -1;
2929 * Could not link the hook into the container.
2931 * Remove the hook_pvt destructor call from the hook since we
2932 * are returning failure to install the hook.
2934 hook->destructor = NULL;
2941 int ast_bridge_hangup_hook(struct ast_bridge_features *features,
2942 ast_bridge_hook_callback callback,
2944 ast_bridge_hook_pvt_destructor destructor,
2945 enum ast_bridge_hook_remove_flags remove_flags)
2947 return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
2948 AST_BRIDGE_HOOK_TYPE_HANGUP);
2951 int ast_bridge_join_hook(struct ast_bridge_features *features,
2952 ast_bridge_hook_callback callback,
2954 ast_bridge_hook_pvt_destructor destructor,
2955 enum ast_bridge_hook_remove_flags remove_flags)
2957 return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
2958 AST_BRIDGE_HOOK_TYPE_JOIN);
2961 int ast_bridge_leave_hook(struct ast_bridge_features *features,
2962 ast_bridge_hook_callback callback,
2964 ast_bridge_hook_pvt_destructor destructor,
2965 enum ast_bridge_hook_remove_flags remove_flags)
2967 return bridge_other_hook(features, callback, hook_pvt, destructor, remove_flags,
2968 AST_BRIDGE_HOOK_TYPE_LEAVE);
2971 int ast_bridge_talk_detector_hook(struct ast_bridge_features *features,
2972 ast_bridge_talking_indicate_callback callback,
2974 ast_bridge_hook_pvt_destructor destructor,
2975 enum ast_bridge_hook_remove_flags remove_flags)
2977 ast_bridge_hook_callback hook_cb = (ast_bridge_hook_callback) callback;
2979 return bridge_other_hook(features, hook_cb, hook_pvt, destructor, remove_flags,
2980 AST_BRIDGE_HOOK_TYPE_TALK);
2983 int ast_bridge_interval_hook(struct ast_bridge_features *features,
2984 enum ast_bridge_hook_timer_option flags,
2985 unsigned int interval,
2986 ast_bridge_hook_callback callback,
2988 ast_bridge_hook_pvt_destructor destructor,
2989 enum ast_bridge_hook_remove_flags remove_flags)
2991 struct ast_bridge_hook_timer *hook;
2994 if (!features ||!interval || !callback) {
2998 /* Allocate new hook and setup it's various variables */
2999 hook = (struct ast_bridge_hook_timer *) bridge_hook_generic(sizeof(*hook), callback,
3000 hook_pvt, destructor, remove_flags);
3004 hook->generic.type = AST_BRIDGE_HOOK_TYPE_TIMER;
3005 hook->timer.interval = interval;
3006 hook->timer.trip_time = ast_tvadd(ast_tvnow(), ast_samp2tv(interval, 1000));
3007 hook->timer.seqno = ast_atomic_fetchadd_int((int *) &features->interval_sequence, +1);
3008 hook->timer.flags = flags;
3010 ast_debug(1, "Putting interval hook %p with interval %u in the heap on features %p\n",
3011 hook, hook->timer.interval, features);
3012 ast_heap_wrlock(features->interval_hooks);
3013 res = ast_heap_push(features->interval_hooks, hook);
3014 ast_heap_unlock(features->interval_hooks);
3017 * Could not push the hook into the heap
3019 * Remove the hook_pvt destructor call from the hook since we
3020 * are returning failure to install the hook.
3022 hook->generic.destructor = NULL;
3026 return res ? -1 : 0;
3029 int ast_bridge_features_enable(struct ast_bridge_features *features,
3030 enum ast_bridge_builtin_feature feature,
3033 ast_bridge_hook_pvt_destructor destructor,
3034 enum ast_bridge_hook_remove_flags remove_flags)
3036 if (ARRAY_LEN(builtin_features_handlers) <= feature
3037 || !builtin_features_handlers[feature]) {
3041 /* If no alternate DTMF stream was provided use the default one */
3042 if (ast_strlen_zero(dtmf)) {
3043 dtmf = builtin_features_dtmf[feature];
3044 /* If no DTMF is still available (ie: it has been disabled) then error out now */
3045 if (ast_strlen_zero(dtmf)) {
3046 ast_debug(1, "Failed to enable built in feature %d on %p, no DTMF string is available for it.\n",
3053 * The rest is basically pretty easy. We create another hook
3054 * using the built in feature's DTMF callback. Easy as pie.
3056 return ast_bridge_dtmf_hook(features, dtmf, builtin_features_handlers[feature],
3057 config, destructor, remove_flags);
3060 int ast_bridge_features_limits_construct(struct ast_bridge_features_limits *limits)
3062 memset(limits, 0, sizeof(*limits));
3064 if (ast_string_field_init(limits, 256)) {
3071 void ast_bridge_features_limits_destroy(struct ast_bridge_features_limits *limits)
3073 ast_string_field_free_memory(limits);
3076 int ast_bridge_features_set_limits(struct ast_bridge_features *features,
3077 struct ast_bridge_features_limits *limits,
3078 enum ast_bridge_hook_remove_flags remove_flags)
3080 if (builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_LIMITS]) {
3081 ast_bridge_builtin_set_limits_fn callback;
3083 callback = builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_LIMITS];
3084 return callback(features, limits, remove_flags);
3087 ast_log(LOG_ERROR, "Attempted to set limits without an AST_BRIDGE_BUILTIN_INTERVAL_LIMITS callback registered.\n");
3091 void ast_bridge_features_set_flag(struct ast_bridge_features *features, unsigned int flag)
3093 ast_set_flag(&features->feature_flags, flag);
3094 features->usable = 1;
3099 * \brief ao2 object match hooks with appropriate remove_flags.
3102 * \param obj Feature hook object.
3103 * \param arg Removal flags
3104 * \param flags Not used
3106 * \retval CMP_MATCH if hook's remove_flags match the removal flags set.
3107 * \retval 0 if not match.
3109 static int hook_remove_match(void *obj, void *arg, int flags)
3111 struct ast_bridge_hook *hook = obj;
3112 enum ast_bridge_hook_remove_flags *remove_flags = arg;
3114 if (ast_test_flag(&hook->remove_flags, *remove_flags)) {
3123 * \brief Remove all hooks with appropriate remove_flags in the container.
3126 * \param hooks Hooks container to work on.
3127 * \param remove_flags Determinator for whether hook is removed
3131 static void hooks_remove_container(struct ao2_container *hooks, enum ast_bridge_hook_remove_flags remove_flags)
3133 ao2_callback(hooks, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE,
3134 hook_remove_match, &remove_flags);
3139 * \brief Remove all hooks in the heap with appropriate remove_flags set.
3142 * \param hooks Hooks heap to work on.
3143 * \param remove_flags Determinator for whether hook is removed
3147 static void hooks_remove_heap(struct ast_heap *hooks, enum ast_bridge_hook_remove_flags remove_flags)
3149 struct ast_bridge_hook *hook;
3152 ast_heap_wrlock(hooks);
3157 for (idx = ast_heap_size(hooks); idx; --idx) {
3158 hook = ast_heap_peek(hooks, idx);
3159 if (ast_test_flag(&hook->remove_flags, remove_flags)) {
3160 ast_heap_remove(hooks, hook);
3166 ast_heap_unlock(hooks);
3169 void ast_bridge_features_remove(struct ast_bridge_features *features, enum ast_bridge_hook_remove_flags remove_flags)
3171 hooks_remove_container(features->dtmf_hooks, remove_flags);
3172 hooks_remove_container(features->other_hooks, remove_flags);
3173 hooks_remove_heap(features->interval_hooks, remove_flags);
3176 static int interval_hook_time_cmp(void *a, void *b)
3178 struct ast_bridge_hook_timer *hook_a = a;
3179 struct ast_bridge_hook_timer *hook_b = b;
3182 cmp = ast_tvcmp(hook_b->timer.trip_time, hook_a->timer.trip_time);
3187 cmp = hook_b->timer.seqno - hook_a->timer.seqno;
3193 * \brief DTMF hook container sort comparison function.
3196 * \param obj_left pointer to the (user-defined part) of an object.
3197 * \param obj_right pointer to the (user-defined part) of an object.
3198 * \param flags flags from ao2_callback()
3199 * OBJ_POINTER - if set, 'obj_right', is an object.
3200 * OBJ_KEY - if set, 'obj_right', is a search key item that is not an object.
3201 * OBJ_PARTIAL_KEY - if set, 'obj_right', is a partial search key item that is not an object.
3203 * \retval <0 if obj_left < obj_right
3204 * \retval =0 if obj_left == obj_right
3205 * \retval >0 if obj_left > obj_right
3207 static int bridge_dtmf_hook_sort(const void *obj_left, const void *obj_right, int flags)
3209 const struct ast_bridge_hook_dtmf *hook_left = obj_left;
3210 const struct ast_bridge_hook_dtmf *hook_right = obj_right;
3211 const char *right_key = obj_right;
3214 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
3217 right_key = hook_right->dtmf.code;
3220 cmp = strcasecmp(hook_left->dtmf.code, right_key);
3222 case OBJ_PARTIAL_KEY:
3223 cmp = strncasecmp(hook_left->dtmf.code, right_key, strlen(right_key));
3229 /* XXX ASTERISK-21271 make ast_bridge_features_init() static when make ast_bridge_join() requires features to be allocated. */
3230 int ast_bridge_features_init(struct ast_bridge_features *features)
3232 /* Zero out the structure */
3233 memset(features, 0, sizeof(*features));
3235 /* Initialize the DTMF hooks container */
3236 features->dtmf_hooks = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX,
3237 AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE, bridge_dtmf_hook_sort, NULL);
3238 if (!features->dtmf_hooks) {
3242 /* Initialize the miscellaneous other hooks container */
3243 features->other_hooks = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL,
3245 if (!features->other_hooks) {
3249 /* Initialize the interval hooks heap */
3250 features->interval_hooks = ast_heap_create(8, interval_hook_time_cmp,
3251 offsetof(struct ast_bridge_hook_timer, timer.heap_index));
3252 if (!features->interval_hooks) {
3256 features->dtmf_passthrough = 1;
3261 /* XXX ASTERISK-21271 make ast_bridge_features_cleanup() static when make ast_bridge_join() requires features to be allocated. */
3262 void ast_bridge_features_cleanup(struct ast_bridge_features *features)
3264 struct ast_bridge_hook_timer *hook;
3266 /* Destroy the interval hooks heap. */
3267 if (features->interval_hooks) {
3268 while ((hook = ast_heap_pop(features->interval_hooks))) {
3271 features->interval_hooks = ast_heap_destroy(features->interval_hooks);
3274 /* Destroy the miscellaneous other hooks container. */
3275 ao2_cleanup(features->other_hooks);
3276 features->other_hooks = NULL;
3278 /* Destroy the DTMF hooks container. */
3279 ao2_cleanup(features->dtmf_hooks);
3280 features->dtmf_hooks = NULL;
3283 void ast_bridge_features_destroy(struct ast_bridge_features *features)
3288 ast_bridge_features_cleanup(features);
3292 struct ast_bridge_features *ast_bridge_features_new(void)
3294 struct ast_bridge_features *features;
3296 features = ast_malloc(sizeof(*features));
3298 if (ast_bridge_features_init(features)) {
3299 ast_bridge_features_destroy(features);
3307 void ast_bridge_set_mixing_interval(struct ast_bridge *bridge, unsigned int mixing_interval)
3309 ast_bridge_lock(bridge);
3310 bridge->softmix.internal_mixing_interval = mixing_interval;
3311 ast_bridge_unlock(bridge);
3314 void ast_bridge_set_internal_sample_rate(struct ast_bridge *bridge, unsigned int sample_rate)
3316 ast_bridge_lock(bridge);
3317 bridge->softmix.internal_sample_rate = sample_rate;
3318 ast_bridge_unlock(bridge);
3321 static void cleanup_video_mode(struct ast_bridge *bridge)
3323 switch (bridge->softmix.video_mode.mode) {
3324 case AST_BRIDGE_VIDEO_MODE_NONE:
3326 case AST_BRIDGE_VIDEO_MODE_SINGLE_SRC:
3327 if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc) {
3328 ast_channel_unref(bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc);
3331 case AST_BRIDGE_VIDEO_MODE_TALKER_SRC:
3332 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc) {
3333 ast_channel_unref(bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc);
3335 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc) {
3336 ast_channel_unref(bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc);
3339 memset(&bridge->softmix.video_mode, 0, sizeof(bridge->softmix.video_mode));
3342 void ast_bridge_set_single_src_video_mode(struct ast_bridge *bridge, struct ast_channel *video_src_chan)
3344 ast_bridge_lock(bridge);
3345 cleanup_video_mode(bridge);
3346 bridge->softmix.video_mode.mode = AST_BRIDGE_VIDEO_MODE_SINGLE_SRC;
3347 bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc = ast_channel_ref(video_src_chan);
3348 ast_test_suite_event_notify("BRIDGE_VIDEO_MODE", "Message: video mode set to single source\r\nVideo Mode: %d\r\nVideo Channel: %s",
3349 bridge->softmix.video_mode.mode, ast_channel_name(video_src_chan));
3350 ast_indicate(video_src_chan, AST_CONTROL_VIDUPDATE);
3351 ast_bridge_unlock(bridge);
3354 void ast_bridge_set_talker_src_video_mode(struct ast_bridge *bridge)
3356 ast_bridge_lock(bridge);
3357 cleanup_video_mode(bridge);
3358 bridge->softmix.video_mode.mode = AST_BRIDGE_VIDEO_MODE_TALKER_SRC;
3359 ast_test_suite_event_notify("BRIDGE_VIDEO_MODE", "Message: video mode set to talker source\r\nVideo Mode: %d",
3360 bridge->softmix.video_mode.mode);
3361 ast_bridge_unlock(bridge);
3364 void ast_bridge_update_talker_src_video_mode(struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyframe)
3366 struct ast_bridge_video_talker_src_data *data;
3368 /* If the channel doesn't support video, we don't care about it */
3369 if (!ast_format_cap_has_type(ast_channel_nativeformats(chan), AST_FORMAT_TYPE_VIDEO)) {
3373 ast_bridge_lock(bridge);
3374 data = &bridge->softmix.video_mode.mode_data.talker_src_data;
3376 if (data->chan_vsrc == chan) {
3377 data->average_talking_energy = talker_energy;
3378 } else if ((data->average_talking_energy < talker_energy) && is_keyframe) {
3379 if (data->chan_old_vsrc) {
3380 ast_channel_unref(data->chan_old_vsrc);
3382 if (data->chan_vsrc) {
3383 data->chan_old_vsrc = data->chan_vsrc;
3384 ast_indicate(data->chan_old_vsrc, AST_CONTROL_VIDUPDATE);
3386 data->chan_vsrc = ast_channel_ref(chan);
3387 data->average_talking_energy = talker_energy;
3388 ast_test_suite_event_notify("BRIDGE_VIDEO_SRC", "Message: video source updated\r\nVideo Channel: %s", ast_channel_name(data->chan_vsrc));
3389 ast_indicate(data->chan_vsrc, AST_CONTROL_VIDUPDATE);
3390 } else if ((data->average_talking_energy < talker_energy) && !is_keyframe) {
3391 ast_indicate(chan, AST_CONTROL_VIDUPDATE);
3392 } else if (!data->chan_vsrc && is_keyframe) {
3393 data->chan_vsrc = ast_channel_ref(chan);
3394 data->average_talking_energy = talker_energy;
3395 ast_test_suite_event_notify("BRIDGE_VIDEO_SRC", "Message: video source updated\r\nVideo Channel: %s", ast_channel_name(data->chan_vsrc));
3396 ast_indicate(chan, AST_CONTROL_VIDUPDATE);
3397 } else if (!data->chan_old_vsrc && is_keyframe) {
3398 data->chan_old_vsrc = ast_channel_ref(chan);
3399 ast_indicate(chan, AST_CONTROL_VIDUPDATE);
3401 ast_bridge_unlock(bridge);
3404 int ast_bridge_number_video_src(struct ast_bridge *bridge)
3408 ast_bridge_lock(bridge);
3409 switch (bridge->softmix.video_mode.mode) {
3410 case AST_BRIDGE_VIDEO_MODE_NONE:
3412 case AST_BRIDGE_VIDEO_MODE_SINGLE_SRC:
3413 if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc) {
3417 case AST_BRIDGE_VIDEO_MODE_TALKER_SRC:
3418 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc) {
3421 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc) {
3425 ast_bridge_unlock(bridge);
3429 int ast_bridge_is_video_src(struct ast_bridge *bridge, struct ast_channel *chan)
3433 ast_bridge_lock(bridge);
3434 switch (bridge->softmix.video_mode.mode) {
3435 case AST_BRIDGE_VIDEO_MODE_NONE:
3437 case AST_BRIDGE_VIDEO_MODE_SINGLE_SRC:
3438 if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc == chan) {
3442 case AST_BRIDGE_VIDEO_MODE_TALKER_SRC:
3443 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc == chan) {
3445 } else if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc == chan) {
3450 ast_bridge_unlock(bridge);
3454 void ast_bridge_remove_video_src(struct ast_bridge *bridge, struct ast_channel *chan)
3456 ast_bridge_lock(bridge);
3457 switch (bridge->softmix.video_mode.mode) {
3458 case AST_BRIDGE_VIDEO_MODE_NONE:
3460 case AST_BRIDGE_VIDEO_MODE_SINGLE_SRC:
3461 if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc == chan) {
3462 if (bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc) {
3463 ast_channel_unref(bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc);
3465 bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc = NULL;
3468 case AST_BRIDGE_VIDEO_MODE_TALKER_SRC:
3469 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc == chan) {
3470 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc) {
3471 ast_channel_unref(bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc);
3473 bridge->softmix.video_mode.mode_data.talker_src_data.chan_vsrc = NULL;
3474 bridge->softmix.video_mode.mode_data.talker_src_data.average_talking_energy = 0;
3476 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc == chan) {
3477 if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc) {
3478 ast_channel_unref(bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc);
3480 bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc = NULL;
3483 ast_bridge_unlock(bridge);
3486 static int channel_hash(const void *obj, int flags)
3488 const struct ast_channel *chan = obj;
3489 const char *name = obj;
3492 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
3495 name = ast_channel_name(chan);
3498 hash = ast_str_hash(name);
3500 case OBJ_PARTIAL_KEY:
3501 /* Should never happen in hash callback. */
3509 static int channel_cmp(void *obj, void *arg, int flags)
3511 const struct ast_channel *left = obj;
3512 const struct ast_channel *right = arg;
3513 const char *right_name = arg;
3516 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
3519 right_name = ast_channel_name(right);
3522 cmp = strcmp(ast_channel_name(left), right_name);
3524 case OBJ_PARTIAL_KEY:
3525 cmp = strncmp(ast_channel_name(left), right_name, strlen(right_name));
3528 return cmp ? 0 : CMP_MATCH;
3531 struct ao2_container *ast_bridge_peers_nolock(struct ast_bridge *bridge)
3533 struct ao2_container *channels;
3534 struct ast_bridge_channel *iter;
3536 channels = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK,
3537 13, channel_hash, channel_cmp);
3542 AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
3543 ao2_link(channels, iter->chan);
3549 struct ao2_container *ast_bridge_peers(struct ast_bridge *bridge)
3551 struct ao2_container *channels;
3553 ast_bridge_lock(bridge);
3554 channels = ast_bridge_peers_nolock(bridge);
3555 ast_bridge_unlock(bridge);
3560 struct ast_channel *ast_bridge_peer_nolock(struct ast_bridge *bridge, struct ast_channel *chan)
3562 struct ast_channel *peer = NULL;
3563 struct ast_bridge_channel *iter;
3565 /* Asking for the peer channel only makes sense on a two-party bridge. */
3566 if (bridge->num_channels == 2
3567 && bridge->technology->capabilities
3568 & (AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_1TO1MIX)) {
3571 AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
3572 if (iter->chan != chan) {
3578 if (in_bridge && peer) {
3579 ast_channel_ref(peer);
3588 struct ast_channel *ast_bridge_peer(struct ast_bridge *bridge, struct ast_channel *chan)
3590 struct ast_channel *peer;
3592 ast_bridge_lock(bridge);
3593 peer = ast_bridge_peer_nolock(bridge, chan);
3594 ast_bridge_unlock(bridge);
3601 * \brief Transfer an entire bridge to a specific destination.
3603 * This creates a local channel to dial out and swaps the called local channel
3604 * with the transferer channel. By doing so, all participants in the bridge are
3605 * connected to the specified destination.
3607 * While this means of transferring would work for both two-party and multi-party
3608 * bridges, this method is only used for multi-party bridges since this method would
3609 * be less efficient for two-party bridges.
3611 * \param transferer The channel performing a transfer
3612 * \param bridge The bridge where the transfer is being performed
3613 * \param exten The destination extension for the blind transfer
3614 * \param context The destination context for the blind transfer
3615 * \param hook Framehook to attach to local channel
3616 * \return The success or failure of the operation
3618 static enum ast_transfer_result blind_transfer_bridge(struct ast_channel *transferer,
3619 struct ast_bridge *bridge, const char *exten, const char *context,
3620 transfer_channel_cb new_channel_cb, void *user_data)
3622 struct ast_channel *local;
3623 char chan_name[AST_MAX_EXTENSION + AST_MAX_CONTEXT + 2];
3626 snprintf(chan_name, sizeof(chan_name), "%s@%s", exten, context);
3627 local = ast_request("Local", ast_channel_nativeformats(transferer), transferer,
3630 return AST_BRIDGE_TRANSFER_FAIL;
3633 if (new_channel_cb) {
3634 new_channel_cb(local, user_data, AST_BRIDGE_TRANSFER_MULTI_PARTY);
3637 if (ast_call(local, chan_name, 0)) {
3639 return AST_BRIDGE_TRANSFER_FAIL;
3641 if (ast_bridge_impart(bridge, local, transferer, NULL, 1)) {
3643 return AST_BRIDGE_TRANSFER_FAIL;
3645 return AST_BRIDGE_TRANSFER_SUCCESS;
3650 * \brief Base data to publish for stasis attended transfer messages
3652 struct stasis_attended_transfer_publish_data {
3653 /* The bridge between the transferer and transferee, and the transferer channel in this bridge */
3654 struct ast_bridge_channel_pair to_transferee;
3655 /* The bridge between the transferer and transfer target, and the transferer channel in this bridge */
3656 struct ast_bridge_channel_pair to_transfer_target;
3659 static void stasis_publish_data_cleanup(struct stasis_attended_transfer_publish_data *publication)
3661 ast_channel_unref(publication->to_transferee.channel);
3662 ast_channel_unref(publication->to_transfer_target.channel);
3663 ao2_cleanup(publication->to_transferee.bridge);
3664 ao2_cleanup(publication->to_transfer_target.bridge);
3669 * \brief Set up base data for an attended transfer stasis publication
3671 * \param to_transferee The original transferer channel, which may be bridged to a transferee
3672 * \param to_transferee_bridge The bridge that to_transferee is in.
3673 * \param to_transfer_target The second transferer channel, which may be bridged to a transfer target
3674 * \param to_target_bridge The bridge that to_transfer_target_is in.
3675 * \param[out] publication A structure to hold the other parameters
3677 static void stasis_publish_data_init(struct ast_channel *to_transferee,
3678 struct ast_bridge *to_transferee_bridge, struct ast_channel *to_transfer_target,
3679 struct ast_bridge *to_target_bridge,
3680 struct stasis_attended_transfer_publish_data *publication)
3682 memset(publication, 0, sizeof(*publication));
3683 publication->to_transferee.channel = ast_channel_ref(to_transferee);
3684 if (to_transferee_bridge) {
3685 ao2_ref(to_transferee_bridge, +1);
3686 publication->to_transferee.bridge = to_transferee_bridge;
3689 publication->to_transfer_target.channel = ast_channel_ref(to_transfer_target);
3690 if (to_target_bridge) {
3691 ao2_ref(to_target_bridge, +1);
3692 publication->to_transfer_target.bridge = to_target_bridge;
3698 * \brief Publish a stasis attended transfer resulting in a bridge merge
3700 * \param publication Base data about the attended transfer
3701 * \param final_bridge The surviving bridge of the attended transfer
3703 static void publish_attended_transfer_bridge_merge(struct stasis_attended_transfer_publish_data *publication,
3704 struct ast_bridge *final_bridge)
3706 ast_bridge_publish_attended_transfer_bridge_merge(1, AST_BRIDGE_TRANSFER_SUCCESS,
3707 &publication->to_transferee, &publication->to_transfer_target, final_bridge);
3712 * \brief Publish a stasis attended transfer to an application
3714 * \param publication Base data about the attended transfer
3715 * \param app The app that is running at the conclusion of the transfer
3717 static void publish_attended_transfer_app(struct stasis_attended_transfer_publish_data *publication,
3720 ast_bridge_publish_attended_transfer_app(1, AST_BRIDGE_TRANSFER_SUCCESS,
3721 &publication->to_transferee, &publication->to_transfer_target, app);
3726 * \brief Publish a stasis attended transfer showing a link between bridges
3728 * \param publication Base data about the attended transfer
3729 * \param local_channel1 Local channel in the original bridge
3730 * \param local_channel2 Local channel in the second bridge
3732 static void publish_attended_transfer_link(struct stasis_attended_transfer_publish_data *publication,
3733 struct ast_channel *local_channel1, struct ast_channel *local_channel2)
3735 struct ast_channel *locals[2] = { local_channel1, local_channel2 };
3737 ast_bridge_publish_attended_transfer_link(1, AST_BRIDGE_TRANSFER_SUCCESS,
3738 &publication->to_transferee, &publication->to_transfer_target, locals);
3743 * \brief Publish a stasis attended transfer failure
3745 * \param publication Base data about the attended transfer
3746 * \param result The transfer result
3748 static void publish_attended_transfer_fail(struct stasis_attended_transfer_publish_data *publication,
3749 enum ast_transfer_result result)
3751 ast_bridge_publish_attended_transfer_fail(1, result, &publication->to_transferee,
3752 &publication->to_transfer_target);
3756 * \brief Perform an attended transfer of a bridge
3758 * This performs an attended transfer of an entire bridge to a target.
3759 * The target varies, depending on what bridges exist during the transfer
3762 * If two bridges exist, then a local channel is created to link the two
3765 * If only one bridge exists, then a local channel is created with one end
3766 * placed into the existing bridge and the other end masquerading into
3767 * the unbridged channel.
3769 * \param chan1 Transferer channel. Guaranteed to be bridged.
3770 * \param chan2 Other transferer channel. May or may not be bridged.
3771 * \param bridge1 Bridge that chan1 is in. Guaranteed to be non-NULL.
3772 * \param bridge2 Bridge that chan2 is in. If NULL, then chan2 is not bridged.
3773 * \param publication Data to publish for a stasis attended transfer message.
3774 * \retval AST_BRIDGE_TRANSFER_FAIL Internal error occurred
3775 * \retval AST_BRIDGE_TRANSFER_SUCCESS Succesfully transferred the bridge
3777 static enum ast_transfer_result attended_transfer_bridge(struct ast_channel *chan1,
3778 struct ast_channel *chan2, struct ast_bridge *bridge1, struct ast_bridge *bridge2,
3779 struct stasis_attended_transfer_publish_data *publication)
3781 static const char *dest = "_attended@transfer/m";
3782 struct ast_channel *local_chan;
3785 const char *app = NULL;
3787 local_chan = ast_request("Local", ast_channel_nativeformats(chan1), chan1,
3791 return AST_BRIDGE_TRANSFER_FAIL;
3795 res = ast_local_setup_bridge(local_chan, bridge2, chan2, NULL);
3797 app = ast_strdupa(ast_channel_appl(chan2));
3798 res = ast_local_setup_masquerade(local_chan, chan2);
3802 ast_hangup(local_chan);
3803 return AST_BRIDGE_TRANSFER_FAIL;
3806 if (ast_call(local_chan, dest, 0)) {
3807 ast_hangup(local_chan);
3808 return AST_BRIDGE_TRANSFER_FAIL;
3811 if (ast_bridge_impart(bridge1, local_chan, chan1, NULL, 1)) {
3812 ast_hangup(local_chan);
3813 return AST_BRIDGE_TRANSFER_FAIL;
3817 RAII_VAR(struct ast_channel *, local_chan2, NULL, ao2_cleanup);
3819 ast_channel_lock(local_chan);
3820 local_chan2 = ast_local_get_peer(local_chan);
3821 ast_channel_unlock(local_chan);
3823 ast_assert(local_chan2 != NULL);
3825 publish_attended_transfer_link(publication,
3826 local_chan, local_chan2);
3828 publish_attended_transfer_app(publication, app);
3830 return AST_BRIDGE_TRANSFER_SUCCESS;
3835 * \brief Get the transferee channel
3837 * This is only applicable to cases where a transfer is occurring on a
3838 * two-party bridge. The channels container passed in is expected to only
3839 * contain two channels, the transferer and the transferee. The transferer
3840 * channel is passed in as a parameter to ensure we don't return it as
3841 * the transferee channel.
3843 * \param channels A two-channel container containing the transferer and transferee
3844 * \param transferer The party that is transfering the call
3845 * \return The party that is being transferred
3847 static struct ast_channel *get_transferee(struct ao2_container *channels, struct ast_channel *transferer)
3849 struct ao2_iterator channel_iter;
3850 struct ast_channel *transferee;
3852 for (channel_iter = ao2_iterator_init(channels, 0);
3853 (transferee = ao2_iterator_next(&channel_iter));
3854 ao2_cleanup(transferee)) {
3855 if (transferee != transferer) {
3860 ao2_iterator_destroy(&channel_iter);
3864 static enum ast_transfer_result try_parking(struct ast_channel *transferer, const char *context, const char *exten)
3866 RAII_VAR(struct ast_bridge_channel *, transferer_bridge_channel, NULL, ao2_cleanup);
3868 if (!ast_parking_provider_registered()) {
3869 return AST_BRIDGE_TRANSFER_FAIL;
3872 ast_channel_lock(transferer);
3873 transferer_bridge_channel = ast_channel_get_bridge_channel(transferer);
3874 ast_channel_unlock(transferer);
3876 if (!transferer_bridge_channel) {
3877 return AST_BRIDGE_TRANSFER_FAIL;
3880 if (ast_parking_blind_transfer_park(transferer_bridge_channel,
3882 return AST_BRIDGE_TRANSFER_FAIL;
3885 return AST_BRIDGE_TRANSFER_SUCCESS;
3890 * \brief Set the BLINDTRANSFER variable as appropriate on channels involved in the transfer
3892 * The transferer channel will have its BLINDTRANSFER variable set the same as its BRIDGEPEER
3893 * variable. This will account for all channels that it is bridged to. The other channels
3894 * involved in the transfer will have their BLINDTRANSFER variable set to the transferer
3897 * \param transferer The channel performing the blind transfer
3898 * \param channels The channels belonging to the bridge
3900 static void set_blind_transfer_variables(struct ast_channel *transferer, struct ao2_container *channels)
3902 struct ao2_iterator iter;
3903 struct ast_channel *chan;
3904 const char *transferer_name;
3905 const char *transferer_bridgepeer;
3907 ast_channel_lock(transferer);
3908 transferer_name = ast_strdupa(ast_channel_name(transferer));
3909 transferer_bridgepeer = ast_strdupa(S_OR(pbx_builtin_getvar_helper(transferer, "BRIDGEPEER"), ""));
3910 ast_channel_unlock(transferer);
3912 for (iter = ao2_iterator_init(channels, 0);
3913 (chan = ao2_iterator_next(&iter));
3914 ao2_cleanup(chan)) {
3915 if (chan == transferer) {
3916 pbx_builtin_setvar_helper(chan, "BLINDTRANSFER", transferer_bridgepeer);
3918 pbx_builtin_setvar_helper(chan, "BLINDTRANSFER", transferer_name);
3922 ao2_iterator_destroy(&iter);
3925 static struct ast_bridge *acquire_bridge(struct ast_channel *chan)
3927 struct ast_bridge *bridge;
3929 ast_channel_lock(chan);
3930 bridge = ast_channel_get_bridge(chan);
3931 ast_channel_unlock(chan);
3934 && ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)) {
3935 ao2_ref(bridge, -1);
3942 static void publish_blind_transfer(int is_external, enum ast_transfer_result result,
3943 struct ast_channel *transferer, struct ast_bridge *bridge,
3944 const char *context, const char *exten)
3946 struct ast_bridge_channel_pair pair;
3947 pair.channel = transferer;
3948 pair.bridge = bridge;
3949 ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten);
3952 enum ast_transfer_result ast_bridge_transfer_blind(int is_external,
3953 struct ast_channel *transferer, const char *exten, const char *context,
3954 transfer_channel_cb new_channel_cb, void *user_data)
3956 RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
3957 RAII_VAR(struct ast_bridge_channel *, bridge_channel, NULL, ao2_cleanup);
3958 RAII_VAR(struct ao2_container *, channels, NULL, ao2_cleanup);
3959 RAII_VAR(struct ast_channel *, transferee, NULL, ast_channel_cleanup);
3960 int do_bridge_transfer;
3961 int transfer_prohibited;
3962 enum ast_transfer_result transfer_result;
3964 bridge = acquire_bridge(transferer);
3966 transfer_result = AST_BRIDGE_TRANSFER_INVALID;
3969 ast_channel_lock(transferer);
3970 bridge_channel = ast_channel_get_bridge_channel(transferer);
3971 ast_channel_unlock(transferer);
3972 if (!bridge_channel) {
3973 transfer_result = AST_BRIDGE_TRANSFER_INVALID;
3977 /* Take off hold if they are on hold. */
3978 ast_bridge_channel_write_unhold(bridge_channel);
3980 transfer_result = try_parking(transferer, context, exten);
3981 if (transfer_result == AST_BRIDGE_TRANSFER_SUCCESS) {