[asterisk-commits] dlee: branch dlee/ASTERISK-21969 r396841 - in /team/dlee/ASTERISK-21969: ./ a...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Aug 16 10:49:21 CDT 2013


Author: dlee
Date: Fri Aug 16 10:49:13 2013
New Revision: 396841

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396841
Log:
Multiple revisions 396581,396584,396621,396658,396695,396703,396710,396712-396713,396722-396724,396732,396734,396747,396783,396792-396794,396802,396812,396814,396822,396829

........
  r396581 | wdoekes | 2013-08-13 13:36:27 -0500 (Tue, 13 Aug 2013) | 12 lines
  
  chan_sip: Fix IP-addr in warning when rejecting a contact ACL.
  
  Patches:
      reviewboard-2155.patch uploaded by Paul Belanger
  Review: https://reviewboard.asterisk.org/r/2155/
  ........
  
  Merged revisions 396579 from http://svn.asterisk.org/svn/asterisk/branches/1.8
  ........
  
  Merged revisions 396580 from http://svn.asterisk.org/svn/asterisk/branches/11
........
  r396584 | wdoekes | 2013-08-13 13:47:58 -0500 (Tue, 13 Aug 2013) | 12 lines
  
  chan_sip: Convert 'just did sched_add waitid...' from warning to debug message.
  
  Patches:
      reviewboard-2377.patch uploaded by Paul Belanger
  Review: https://reviewboard.asterisk.org/r/2377/
  ........
  
  Merged revisions 396582 from http://svn.asterisk.org/svn/asterisk/branches/1.8
  ........
  
  Merged revisions 396583 from http://svn.asterisk.org/svn/asterisk/branches/11
........
  r396621 | file | 2013-08-14 13:10:08 -0500 (Wed, 14 Aug 2013) | 16 lines
  
  Tweak test_hashtab_thrash test to allow the critical threads to execute.
  
  Depending on certain conditions it was possible for the hashtab counting thread
  to starve other threads, preventing them from executing in the expected fashion.
  This change adds a sleep to allow the others to do what they need to do. While
  this doesn't thrash the hashtab as much as previously, it at least works.
  
  (closes issue ASTERISK-22276)
  Reported by: Matt Jordan
  ........
  
  Merged revisions 396619 from http://svn.asterisk.org/svn/asterisk/branches/1.8
  ........
  
  Merged revisions 396620 from http://svn.asterisk.org/svn/asterisk/branches/11
........
  r396658 | file | 2013-08-14 14:06:59 -0500 (Wed, 14 Aug 2013) | 8 lines
  
  Tweak comment for why usleep is used.
  ........
  
  Merged revisions 396656 from http://svn.asterisk.org/svn/asterisk/branches/1.8
  ........
  
  Merged revisions 396657 from http://svn.asterisk.org/svn/asterisk/branches/11
........
  r396695 | rmudgett | 2013-08-14 16:28:21 -0500 (Wed, 14 Aug 2013) | 7 lines
  
  app_bridgewait: Inhibit local channel optimizations to the bridge.
  
  Holding bridges can allow local channel move/swap optimization to the
  bridge.  However, we cannot allow it for the BridgeWait holding bridge
  because the call will lose the channel roles and dialplan location as a
  result.
........
  r396703 | rmudgett | 2013-08-14 17:53:27 -0500 (Wed, 14 Aug 2013) | 1 line
  
  chan_misdn: Effectively remove native support.  Left enough bread crumbs to be able to convert later if needed.
........
  r396710 | rmudgett | 2013-08-14 18:20:02 -0500 (Wed, 14 Aug 2013) | 4 lines
  
  chan_iax2: Conditionally remove native support for now.
  
  (issue ASTERISK-21944)
........
  r396712 | rmudgett | 2013-08-14 18:35:08 -0500 (Wed, 14 Aug 2013) | 1 line
  
  chan_vpb: Effectively remove native support.  Left enough bread crumbs to be able to convert later if needed.
........
  r396713 | rmudgett | 2013-08-14 19:16:39 -0500 (Wed, 14 Aug 2013) | 1 line
  
  Remove unsupported channel technology callbacks.
........
  r396722 | kmoore | 2013-08-15 07:05:41 -0500 (Thu, 15 Aug 2013) | 8 lines
  
  Prevent automagic things from happening to Stasis application bridges
  
  This prevents swap optimization, merges, and transfers involving Stasis
  application bridges. It wouldn't be nice if the bridge you thought you
  owned disappeared from under you.
  
  Reported-by: Richard Mudgett
........
  r396723 | kmoore | 2013-08-15 07:12:26 -0500 (Thu, 15 Aug 2013) | 9 lines
  
  Fix deadlocks in chan_sip in REFER and BYE handling
  
  This resolves several deadlocks in chan_sip relating to usage of
  ast_channel_bridge_peer and improves accessibility of lock debugging
  function calls.
  
  Review: https://reviewboard.asterisk.org/r/2756/
  (closes issue ASTERISK-22215)
........
  r396724 | kmoore | 2013-08-15 07:17:41 -0500 (Thu, 15 Aug 2013) | 14 lines
  
  Fix feature_attended_transfer test
  
  The feature_attended_transfer test is failing due to Asterisk not
  passing DTMF in the bridges created for internal attended transfers.
  This sets the features initialization routine to set this flag by
  default and adjusts the basic bridge and confbridge's use of the
  bridging system accordingly as per Richard's suggestion instead of
  adjusting this individual case. This change allows the necessary DTMF
  to pass through the attended transfer bridge and complete the test
  successfully.
  
  Review: https://reviewboard.asterisk.org/r/2759/
  (closes issue ASTERISK-22222)
........
  r396732 | rmudgett | 2013-08-15 09:20:59 -0500 (Thu, 15 Aug 2013) | 18 lines
  
  Fix Bridge API DTMF hook matching for begin and end DTMF events.
  
  The Bridge API DTMF hook matching would not deal with DTMF end events
  only.  It required a DTMF begin event to start matching the DTMF hooks.
  There are many places in Asterisk where code only generates DTMF end
  events without the corresponding begin event.  One such place is the AMI
  action Atxfer.
  
  * Fixed DTMF hook matching if there is a string of DTMF frames in the read
  queue.  We could potentially miss some of them before.
  
  * Fixed AMI Atxfer action documentation.
  
  (closes issue ASTERISK-22037)
  Reported by: Matt Jordan
  
  Review: https://reviewboard.asterisk.org/r/2752/
........
  r396734 | rmudgett | 2013-08-15 10:12:16 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Remove some dead code dealing with: AST_BRIDGE_REC_CHANNEL_0, AST_BRIDGE_REC_CHANNEL_1, and AST_BRIDGE_IGNORE_SIGS.
........
  r396747 | kmoore | 2013-08-15 11:37:06 -0500 (Thu, 15 Aug 2013) | 16 lines
  
  Remove leading spaces from the CLI command before parsing
  
  If you've mistakenly put a space before typing in a command, the
  leading space will be included as part of the command, and the command
  parser will not find the corresponding command. This patch rectifies
  that situation by stripping the leading spaces on commands.
  
  Review: https://reviewboard.asterisk.org/r/2709/
  Patch-by: Tilghman Lesher
  ........
  
  Merged revisions 396745 from http://svn.asterisk.org/svn/asterisk/branches/1.8
  ........
  
  Merged revisions 396746 from http://svn.asterisk.org/svn/asterisk/branches/11
........
  r396783 | rmudgett | 2013-08-15 12:57:33 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Resolve some BUGBUG comments.
........
  r396792 | rmudgett | 2013-08-15 13:20:52 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Changed some BUGBUG tags to associated JIRA issue tags.
........
  r396793 | rmudgett | 2013-08-15 14:13:34 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Update features.conf.sample atxferdropcall option.
........
  r396794 | rmudgett | 2013-08-15 14:14:43 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Remove early bridge BUGBUG comments.  Remove some unneeded features.c comments.
........
  r396802 | rmudgett | 2013-08-15 15:09:10 -0500 (Thu, 15 Aug 2013) | 5 lines
  
  Parking: Eliminate local channel name hack to get peer channel.
  
  (closes issue ASTERISK-22034)
  Reported by: Matt Jordan
........
  r396812 | rmudgett | 2013-08-15 16:52:01 -0500 (Thu, 15 Aug 2013) | 1 line
  
  Minor parking cleanup.
........
  r396814 | rmudgett | 2013-08-15 17:10:20 -0500 (Thu, 15 Aug 2013) | 8 lines
  
  Bridge: Don't suspend/unspend the channel for interception routines.
  
  By their nature, the connected line and redirecting interception routines
  are not supposed to affect the channel's media.  Therefore, they should
  not suspend and unsuspend the channel while running.  The
  suspend/unsuspend operations could be expensive depending upon the bridge
  and channel technology involved.
........
  r396822 | wdoekes | 2013-08-16 02:18:51 -0500 (Fri, 16 Aug 2013) | 11 lines
  
  Prevent heap alloc functions from running out of stack space.
  
  When asterisk has run out of memory (for whatever reason), the alloc
  function logs a message. Logging requires memory. A recipe for
  infinite recursion.
  
  Stop the recursion by comparing the function call depth for sane values
  before attempting another OOM log message.
  
  Review: https://reviewboard.asterisk.org/r/2743/
........
  r396829 | kmoore | 2013-08-16 07:20:59 -0500 (Fri, 16 Aug 2013) | 12 lines
  
  Improve sounds indexer CLI commands
  
  This reworks the CLI commands used to access sounds information from
  "sounds show[ soundid]" to "core show sounds" and
  "core show sound <soundid>". This also reworks the "sounds reload" CLI
  command to fall under normal module reloading ("module reload sounds").
  
  Also, make trunk build when DEBUG_MALLOC is not enabled.
  
  Review: https://reviewboard.asterisk.org/r/2745/
  (closes issue ASTERISK-22141)
........

Merged revisions 396581,396584,396621,396658,396695,396703,396710,396712-396713,396722-396724,396732,396734,396747,396783,396792-396794,396802,396812,396814,396822,396829 from http://svn.asterisk.org/svn/asterisk/trunk

Modified:
    team/dlee/ASTERISK-21969/   (props changed)
    team/dlee/ASTERISK-21969/apps/app_bridgewait.c
    team/dlee/ASTERISK-21969/apps/app_confbridge.c
    team/dlee/ASTERISK-21969/apps/confbridge/conf_config_parser.c
    team/dlee/ASTERISK-21969/bridges/bridge_softmix.c
    team/dlee/ASTERISK-21969/channels/chan_iax2.c
    team/dlee/ASTERISK-21969/channels/chan_misdn.c
    team/dlee/ASTERISK-21969/channels/chan_sip.c
    team/dlee/ASTERISK-21969/channels/chan_vpb.cc
    team/dlee/ASTERISK-21969/configs/features.conf.sample
    team/dlee/ASTERISK-21969/include/asterisk/bridge.h
    team/dlee/ASTERISK-21969/include/asterisk/bridge_channel.h
    team/dlee/ASTERISK-21969/include/asterisk/bridge_channel_internal.h
    team/dlee/ASTERISK-21969/include/asterisk/channel.h
    team/dlee/ASTERISK-21969/include/asterisk/lock.h
    team/dlee/ASTERISK-21969/include/asterisk/utils.h
    team/dlee/ASTERISK-21969/main/asterisk.c
    team/dlee/ASTERISK-21969/main/bridge.c
    team/dlee/ASTERISK-21969/main/bridge_channel.c
    team/dlee/ASTERISK-21969/main/channel.c
    team/dlee/ASTERISK-21969/main/cli.c
    team/dlee/ASTERISK-21969/main/config_options.c
    team/dlee/ASTERISK-21969/main/features.c
    team/dlee/ASTERISK-21969/main/loader.c
    team/dlee/ASTERISK-21969/main/manager.c
    team/dlee/ASTERISK-21969/main/pbx.c
    team/dlee/ASTERISK-21969/main/sounds_index.c
    team/dlee/ASTERISK-21969/main/utils.c
    team/dlee/ASTERISK-21969/res/parking/parking_bridge_features.c
    team/dlee/ASTERISK-21969/res/parking/parking_tests.c
    team/dlee/ASTERISK-21969/res/parking/res_parking.h
    team/dlee/ASTERISK-21969/res/res_parking.c
    team/dlee/ASTERISK-21969/res/res_stasis.c
    team/dlee/ASTERISK-21969/tests/test_hashtab_thrash.c

Propchange: team/dlee/ASTERISK-21969/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Propchange: team/dlee/ASTERISK-21969/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Fri Aug 16 10:49:13 2013
@@ -1,1 +1,1 @@
-/trunk:1-396568
+/trunk:1-396840

Modified: team/dlee/ASTERISK-21969/apps/app_bridgewait.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/apps/app_bridgewait.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/apps/app_bridgewait.c (original)
+++ team/dlee/ASTERISK-21969/apps/app_bridgewait.c Fri Aug 16 10:49:13 2013
@@ -349,10 +349,16 @@
 		return wrapper;
 	}
 
+	/*
+	 * Holding bridges can allow local channel move/swap
+	 * optimization to the bridge.  However, we cannot allow it for
+	 * this holding bridge because the call will lose the channel
+	 * roles and dialplan location as a result.
+	 */
 	bridge = ast_bridge_base_new(AST_BRIDGE_CAPABILITY_HOLDING,
 		AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM
-		| AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_PROHIBITED
-		| AST_BRIDGE_FLAG_DISSOLVE_EMPTY);
+		| AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM
+		| AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_DISSOLVE_EMPTY);
 
 	if (!bridge) {
 		return NULL;

Modified: team/dlee/ASTERISK-21969/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/apps/app_confbridge.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/apps/app_confbridge.c (original)
+++ team/dlee/ASTERISK-21969/apps/app_confbridge.c Fri Aug 16 10:49:13 2013
@@ -1587,6 +1587,8 @@
 	/* Set if DTMF should pass through for this user or not */
 	if (ast_test_flag(&user.u_profile, USER_OPT_DTMF_PASS)) {
 		user.features.dtmf_passthrough = 1;
+	} else {
+		user.features.dtmf_passthrough = 0;
 	}
 
 	/* Set dsp threshold values if present */

Modified: team/dlee/ASTERISK-21969/apps/confbridge/conf_config_parser.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/apps/confbridge/conf_config_parser.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/apps/confbridge/conf_config_parser.c (original)
+++ team/dlee/ASTERISK-21969/apps/confbridge/conf_config_parser.c Fri Aug 16 10:49:13 2013
@@ -1922,7 +1922,7 @@
 	/* This option should only be used with the CONFBRIDGE dialplan function */
 	aco_option_register_custom(&cfg_info, "template", ACO_EXACT, user_types, NULL, user_template_handler, 0);
 
-/* BUGBUG need a user supplied bridge merge_priority to merge ConfBridges (default = 1, range 1-INT_MAX) */
+/* XXX ASTERISK-21271 need a user supplied bridge merge_priority to merge ConfBridges (default = 1, range 1-INT_MAX) */
 	/* Bridge options */
 	aco_option_register(&cfg_info, "type", ACO_EXACT, bridge_types, NULL, OPT_NOOP_T, 0, 0);
 	aco_option_register(&cfg_info, "jitterbuffer", ACO_EXACT, bridge_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct bridge_profile, flags), USER_OPT_JITTERBUFFER);

Modified: team/dlee/ASTERISK-21969/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/bridges/bridge_softmix.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/bridges/bridge_softmix.c (original)
+++ team/dlee/ASTERISK-21969/bridges/bridge_softmix.c Fri Aug 16 10:49:13 2013
@@ -594,8 +594,10 @@
  */
 static int softmix_bridge_write_control(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
 {
-/* BUGBUG need to look at channel roles to determine what to do with control frame. */
-	/*! \todo BUGBUG softmix_bridge_write_control() not written */
+	/*
+	 * XXX Softmix needs to use channel roles to determine what to
+	 * do with control frames.
+	 */
 	return 0;
 }
 
@@ -622,6 +624,11 @@
 		return 0;
 	}
 
+	/*
+	 * XXX Softmix needs to use channel roles to determine who gets
+	 * what frame.  Possible roles: announcer, recorder, agent,
+	 * supervisor.
+	 */
 	switch (frame->frametype) {
 	case AST_FRAME_NULL:
 		/* "Accept" the frame and discard it. */
@@ -820,6 +827,10 @@
 		goto softmix_cleanup;
 	}
 
+	/*
+	 * XXX Softmix needs to use channel roles to determine who gets
+	 * what audio mixed.
+	 */
 	while (!softmix_data->stop && bridge->num_active) {
 		struct ast_bridge_channel *bridge_channel;
 		int timeout = -1;

Modified: team/dlee/ASTERISK-21969/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/channels/chan_iax2.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/channels/chan_iax2.c (original)
+++ team/dlee/ASTERISK-21969/channels/chan_iax2.c Fri Aug 16 10:49:13 2013
@@ -37,6 +37,18 @@
 
 /*! \page iax.conf iax.conf
  * \verbinclude iax.conf.sample
+ */
+
+/*!
+ * \todo XXX The IAX2 channel driver needs its native bridge
+ * code converted to the new bridge technology scheme.
+ *
+ * \note The chan_dahdi native bridge code can be used as an
+ * example.  It also appears that chan_iax2 also has a native
+ * transfer check like chan_dahdi to eliminate tromboned calls.
+ *
+ * \note The existing native bridge code is marked with the
+ * IAX2_NATIVE_BRIDGING conditional.
  */
 
 /*** MODULEINFO
@@ -1213,7 +1225,6 @@
 	ast_verbose("%s", buf);
 }
 
-static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
 static int expire_registry(const void *data);
 static int iax2_answer(struct ast_channel *c);
 static int iax2_call(struct ast_channel *c, const char *dest, int timeout);
@@ -1263,7 +1274,6 @@
 static void network_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *message);
 static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *message);
 
-/* BUGBUG The IAX2 channel driver needs its own native bridge technology. */
 static struct ast_channel_tech iax2_tech = {
 	.type = "IAX2",
 	.description = tdesc,
@@ -1284,7 +1294,6 @@
 	.indicate = iax2_indicate,
 	.setoption = iax2_setoption,
 	.queryoption = iax2_queryoption,
-	.bridge = iax2_bridge,
 	.transfer = iax2_transfer,
 	.fixup = iax2_fixup,
 	.func_channel_read = acf_channel_read,
@@ -5326,6 +5335,7 @@
 	return res;
 }
 
+#if defined(IAX2_NATIVE_BRIDGING)
 static int iax2_start_transfer(unsigned short callno0, unsigned short callno1, int mediaonly)
 {
 	int res;
@@ -5360,7 +5370,9 @@
 	iaxs[callno1]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
 	return 0;
 }
-
+#endif	/* defined(IAX2_NATIVE_BRIDGING) */
+
+#if defined(IAX2_NATIVE_BRIDGING)
 static void lock_both(unsigned short callno0, unsigned short callno1)
 {
 	ast_mutex_lock(&iaxsl[callno0]);
@@ -5368,13 +5380,17 @@
 		DEADLOCK_AVOIDANCE(&iaxsl[callno0]);
 	}
 }
-
+#endif	/* defined(IAX2_NATIVE_BRIDGING) */
+
+#if defined(IAX2_NATIVE_BRIDGING)
 static void unlock_both(unsigned short callno0, unsigned short callno1)
 {
 	ast_mutex_unlock(&iaxsl[callno1]);
 	ast_mutex_unlock(&iaxsl[callno0]);
 }
-
+#endif	/* defined(IAX2_NATIVE_BRIDGING) */
+
+#if defined(IAX2_NATIVE_BRIDGING)
 static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
 {
 	struct ast_channel *cs[3];
@@ -5497,8 +5513,7 @@
 		if ((f->frametype == AST_FRAME_CONTROL)) {
 			if (f->subclass.integer == AST_CONTROL_PVT_CAUSE_CODE) {
 				ast_channel_hangupcause_hash_set(other, f->data.ptr, f->datalen);
-			} else if (!(flags & AST_BRIDGE_IGNORE_SIGS)
-				&& (f->subclass.integer != AST_CONTROL_SRCUPDATE)) {
+			} else if (f->subclass.integer != AST_CONTROL_SRCUPDATE) {
 				*fo = f;
 				*rc = who;
 				res =  AST_BRIDGE_COMPLETE;
@@ -5539,6 +5554,7 @@
 	unlock_both(callno0, callno1);
 	return res;
 }
+#endif	/* defined(IAX2_NATIVE_BRIDGING) */
 
 static int iax2_answer(struct ast_channel *c)
 {

Modified: team/dlee/ASTERISK-21969/channels/chan_misdn.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/channels/chan_misdn.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/channels/chan_misdn.c (original)
+++ team/dlee/ASTERISK-21969/channels/chan_misdn.c Fri Aug 16 10:49:13 2013
@@ -56,6 +56,21 @@
 
 /* Define to enable cli commands to generate canned CCBS messages. */
 // #define CCBS_TEST_MESSAGES	1
+
+/*
+ * XXX The mISDN channel driver needs its native bridge code
+ * converted to the new bridge technology scheme.  The
+ * chan_dahdi native bridge code can be used as an example.  It
+ * is unlikely that this will ever get done.  Support for this
+ * channel driver is dwindling because the supported version of
+ * mISDN does not support newer kernels.
+ *
+ * Without native bridge support, the following config file
+ * parameters have no effect: bridging.
+ *
+ * The existing native bridge code is marked with the
+ * mISDN_NATIVE_BRIDGING conditional.
+ */
 
 /*** MODULEINFO
 	<depend>isdnnet</depend>
@@ -750,6 +765,7 @@
 	return 0;
 }
 
+#if defined(mISDN_NATIVE_BRIDGING)
 /*! Returns a reference to the found chan_list. */
 static struct chan_list *get_chan_by_ast(struct ast_channel *ast)
 {
@@ -767,6 +783,7 @@
 
 	return NULL;
 }
+#endif	/* defined(mISDN_NATIVE_BRIDGING) */
 
 /*! Returns a reference to the found chan_list. */
 static struct chan_list *get_chan_by_ast_name(const char *name)
@@ -7557,6 +7574,7 @@
 	return 0;
 }
 
+#if defined(mISDN_NATIVE_BRIDGING)
 static enum ast_bridge_result misdn_bridge(struct ast_channel *c0,
 	struct ast_channel *c1, int flags,
 	struct ast_frame **fo,
@@ -7570,14 +7588,20 @@
 	int p1_b, p2_b;
 	int bridging;
 
+	misdn_cfg_get(0, MISDN_GEN_BRIDGING, &bridging, sizeof(bridging));
+	if (!bridging) {
+		/* Native mISDN bridging globally disabled. */
+		return AST_BRIDGE_FAILED_NOWARN;
+	}
+
 	ch1 = get_chan_by_ast(c0);
 	if (!ch1) {
-		return -1;
+		return AST_BRIDGE_FAILED;
 	}
 	ch2 = get_chan_by_ast(c1);
 	if (!ch2) {
 		chan_list_unref(ch1, "Failed to find ch2");
-		return -1;
+		return AST_BRIDGE_FAILED;
 	}
 
 	carr[0] = c0;
@@ -7585,20 +7609,16 @@
 
 	misdn_cfg_get(ch1->bc->port, MISDN_CFG_BRIDGING, &p1_b, sizeof(p1_b));
 	misdn_cfg_get(ch2->bc->port, MISDN_CFG_BRIDGING, &p2_b, sizeof(p2_b));
-
-	if (! p1_b || ! p2_b) {
+	if (!p1_b || !p2_b) {
 		ast_log(LOG_NOTICE, "Falling back to Asterisk bridging\n");
 		chan_list_unref(ch1, "Bridge fallback ch1");
 		chan_list_unref(ch2, "Bridge fallback ch2");
-		return AST_BRIDGE_FAILED;
-	}
-
-	misdn_cfg_get(0, MISDN_GEN_BRIDGING, &bridging, sizeof(bridging));
-	if (bridging) {
-		/* trying to make a mISDN_dsp conference */
-		chan_misdn_log(1, ch1->bc->port, "I SEND: Making conference with Number:%d\n", ch1->bc->pid + 1);
-		misdn_lib_bridge(ch1->bc, ch2->bc);
-	}
+		return AST_BRIDGE_FAILED_NOWARN;
+	}
+
+	/* make a mISDN_dsp conference */
+	chan_misdn_log(1, ch1->bc->port, "I SEND: Making conference with Number:%d\n", ch1->bc->pid + 1);
+	misdn_lib_bridge(ch1->bc, ch2->bc);
 
 	ast_verb(3, "Native bridging %s and %s\n", ast_channel_name(c0), ast_channel_name(c1));
 
@@ -7671,6 +7691,7 @@
 	chan_list_unref(ch2, "Bridge complete ch2");
 	return AST_BRIDGE_COMPLETE;
 }
+#endif	/* defined(mISDN_NATIVE_BRIDGING) */
 
 /** AST INDICATIONS END **/
 
@@ -8097,26 +8118,7 @@
 	return 0;
 }
 
-/* BUGBUG The mISDN channel driver needs its own native bridge technology. (More like just never give it one.) */
 static struct ast_channel_tech misdn_tech = {
-	.type = misdn_type,
-	.description = "Channel driver for mISDN Support (Bri/Pri)",
-	.requester = misdn_request,
-	.send_digit_begin = misdn_digit_begin,
-	.send_digit_end = misdn_digit_end,
-	.call = misdn_call,
-	.bridge = misdn_bridge,
-	.hangup = misdn_hangup,
-	.answer = misdn_answer,
-	.read = misdn_read,
-	.write = misdn_write,
-	.indicate = misdn_indication,
-	.fixup = misdn_fixup,
-	.send_text = misdn_send_text,
-	.properties = 0,
-};
-
-static struct ast_channel_tech misdn_tech_wo_bridge = {
 	.type = misdn_type,
 	.description = "Channel driver for mISDN Support (Bri/Pri)",
 	.requester = misdn_request,
@@ -8167,7 +8169,6 @@
 	char *cid_num = NULL;
 	int chan_offset = 0;
 	int tmp_port = misdn_cfg_get_next_port(0);
-	int bridging;
 	struct ast_format tmpfmt;
 
 	for (; tmp_port > 0; tmp_port = misdn_cfg_get_next_port(tmp_port)) {
@@ -8200,8 +8201,7 @@
 		MISDN_ASTERISK_TECH_PVT_SET(tmp, chlist);
 		chlist->ast = tmp;
 
-		misdn_cfg_get(0, MISDN_GEN_BRIDGING, &bridging, sizeof(bridging));
-		ast_channel_tech_set(tmp, bridging ? &misdn_tech : &misdn_tech_wo_bridge);
+		ast_channel_tech_set(tmp, &misdn_tech);
 
 		ast_channel_priority_set(tmp, 1);
 
@@ -11270,7 +11270,6 @@
 	misdn_cc_destroy();
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 	misdn_tech.capabilities = ast_format_cap_destroy(misdn_tech.capabilities);
-	misdn_tech_wo_bridge.capabilities = ast_format_cap_destroy(misdn_tech_wo_bridge.capabilities);
 
 	return 0;
 }
@@ -11302,12 +11301,8 @@
 	if (!(misdn_tech.capabilities = ast_format_cap_alloc())) {
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	if (!(misdn_tech_wo_bridge.capabilities = ast_format_cap_alloc())) {
-		return AST_MODULE_LOAD_DECLINE;
-	}
 	ast_format_set(&prefformat, AST_FORMAT_ALAW, 0);
 	ast_format_cap_add(misdn_tech.capabilities, &prefformat);
-	ast_format_cap_add(misdn_tech_wo_bridge.capabilities, &prefformat);
 
 	max_ports = misdn_lib_maxports_get();
 

Modified: team/dlee/ASTERISK-21969/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/channels/chan_sip.c?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/channels/chan_sip.c (original)
+++ team/dlee/ASTERISK-21969/channels/chan_sip.c Fri Aug 16 10:49:13 2013
@@ -16148,7 +16148,7 @@
 	if (ast_apply_acl(sip_cfg.contact_acl, &peer->addr, "SIP contact ACL: ") != AST_SENSE_ALLOW ||
 			ast_apply_acl(peer->contactacl, &peer->addr, "SIP contact ACL: ") != AST_SENSE_ALLOW) {
 		ast_log(LOG_WARNING, "Domain '%s' disallowed by contact ACL (violating IP %s)\n", hostport,
-			ast_sockaddr_stringify_addr(&testsa));
+				ast_sockaddr_stringify_addr(&peer->addr));
 		ast_string_field_set(peer, fullcontact, "");
 		ast_string_field_set(pvt, our_contact, "");
 		return PARSE_REGISTER_DENIED;
@@ -18008,22 +18008,29 @@
 
 	/* Give useful transfer information to the dialplan */
 	if (transferer->owner) {
-		RAII_VAR(struct ast_channel *, peer, ast_channel_bridge_peer(transferer->owner), ast_channel_cleanup);
-
-		/*! pbx_builtin_setvar_helper will attempt to lock the channel. We need
-		 * to be sure it's already locked here so we don't deadlock.
-		 */
-		while (peer && ast_channel_trylock(peer)) {
-			sip_pvt_unlock(transferer);
-			do {
-				CHANNEL_DEADLOCK_AVOIDANCE(transferer->owner);
-			} while (sip_pvt_trylock(transferer));
-		}
-
+		RAII_VAR(struct ast_channel *, peer, NULL, ast_channel_cleanup);
+		RAII_VAR(struct ast_channel *, owner_relock, NULL, ast_channel_cleanup);
+		RAII_VAR(struct ast_channel *, owner_ref, NULL, ast_channel_cleanup);
+
+		/* Grab a reference to transferer->owner to prevent it from going away */
+		owner_ref = ast_channel_ref(transferer->owner);
+
+		/* Established locking order here is bridge, channel, pvt
+		 * and the bridge will be locked during ast_channel_bridge_peer */
+		ast_channel_unlock(owner_ref);
+		sip_pvt_unlock(transferer);
+
+		peer = ast_channel_bridge_peer(owner_ref);
 		if (peer) {
 			pbx_builtin_setvar_helper(peer, "SIPREFERRINGCONTEXT", transferer->context);
 			pbx_builtin_setvar_helper(peer, "SIPREFERREDBYHDR", p_referred_by);
 			ast_channel_unlock(peer);
+		}
+
+		owner_relock = sip_pvt_lock_full(transferer);
+		if (!owner_relock) {
+			ast_debug(3, "Unable to reacquire owner channel lock, channel is gone\n");
+			return -5;
 		}
 	}
 
@@ -23403,8 +23410,8 @@
 					wait = ast_random() % 2000;
 				}
 				p->waitid = ast_sched_add(sched, wait, sip_reinvite_retry, dialog_ref(p, "passing dialog ptr into sched structure based on waitid for sip_reinvite_retry."));
-				ast_log(LOG_WARNING, "just did sched_add waitid(%d) for sip_reinvite_retry for dialog %s in handle_response_invite\n", p->waitid, p->callid);
-				ast_debug(2, "Reinvite race. Waiting %d secs before retry\n", wait);
+				ast_debug(2, "Reinvite race. Scheduled sip_reinvite_retry in %d secs in handle_response_invite (waitid %d, dialog '%s')\n",
+						wait, p->waitid, p->callid);
 			}
 		}
 		break;
@@ -26091,7 +26098,7 @@
 	int res = 0;
 	struct blind_transfer_cb_data cb_data;
 	enum ast_transfer_result transfer_res;
-	RAII_VAR(struct ast_channel *, transferer, NULL, ao2_cleanup);
+	RAII_VAR(struct ast_channel *, transferer, NULL, ast_channel_cleanup);
 	RAII_VAR(struct ast_str *, replaces_str, NULL, ast_free_ptr);
 
 	if (req->debug) {
@@ -26368,6 +26375,8 @@
 	struct ast_channel *c=NULL;
 	int res;
 	const char *required;
+	RAII_VAR(struct ast_channel *, peer_channel, NULL, ast_channel_cleanup);
+	char quality_buf[AST_MAX_USER_FIELD], *quality;
 
 	/* If we have an INCOMING invite that we haven't answered, terminate that transaction */
 	if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !req->ignore) {
@@ -26384,70 +26393,88 @@
 	check_via(p, req);
 	sip_alreadygone(p);
 
+	if (p->owner) {
+		RAII_VAR(struct ast_channel *, owner_relock, NULL, ast_channel_cleanup);
+		RAII_VAR(struct ast_channel *, owner_ref, NULL, ast_channel_cleanup);
+
+		/* Grab a reference to p->owner to prevent it from going away */
+		owner_ref = ast_channel_ref(p->owner);
+
+		/* Established locking order here is bridge, channel, pvt
+		 * and the bridge will be locked during ast_channel_bridge_peer */
+		ast_channel_unlock(owner_ref);
+		sip_pvt_unlock(p);
+
+		peer_channel = ast_channel_bridge_peer(owner_ref);
+
+		owner_relock = sip_pvt_lock_full(p);
+		if (!owner_relock) {
+			ast_debug(3, "Unable to reacquire owner channel lock, channel is gone\n");
+			return 0;
+		}
+	}
+
 	/* Get RTCP quality before end of call */
-	if (p->do_history || p->owner) {
-		char quality_buf[AST_MAX_USER_FIELD], *quality;
-		RAII_VAR(struct ast_channel *, bridge, p->owner ? ast_channel_bridge_peer(p->owner) : NULL, ast_channel_cleanup);
-
-		/* We need to get the lock on bridge because ast_rtp_instance_set_stats_vars will attempt
-		 * to lock the bridge. This may get hairy...
-		 */
-		while (bridge && ast_channel_trylock(bridge)) {
-			ast_channel_unlock(p->owner);
-			do {
-				/* Can't use DEADLOCK_AVOIDANCE since p is an ao2 object */
-				sip_pvt_unlock(p);
-				usleep(1);
-				sip_pvt_lock(p);
-			} while (p->owner && ast_channel_trylock(p->owner));
-		}
-
-
-		if (p->rtp && (quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
-			if (p->do_history) {
+	if (p->rtp) {
+		if (p->do_history) {
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
 				append_history(p, "RTCPaudio", "Quality:%s", quality);
-
-				if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, quality_buf, sizeof(quality_buf)))) {
-					append_history(p, "RTCPaudioJitter", "Quality:%s", quality);
+			}
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, quality_buf, sizeof(quality_buf)))) {
+				append_history(p, "RTCPaudioJitter", "Quality:%s", quality);
+			}
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, quality_buf, sizeof(quality_buf)))) {
+				append_history(p, "RTCPaudioLoss", "Quality:%s", quality);
+			}
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, quality_buf, sizeof(quality_buf)))) {
+				append_history(p, "RTCPaudioRTT", "Quality:%s", quality);
+			}
+		}
+
+		if (p->owner) {
+			RAII_VAR(struct ast_channel *, owner_relock, NULL, ast_channel_cleanup);
+			RAII_VAR(struct ast_channel *, owner_ref, NULL, ast_channel_cleanup);
+
+			/* Grab a reference to p->owner to prevent it from going away */
+			owner_ref = ast_channel_ref(p->owner);
+
+			/* Established locking order here is bridge, channel, pvt
+			 * and the bridge and channel will be locked during
+			 * ast_rtp_instance_set_stats_vars */
+			ast_channel_unlock(owner_ref);
+			sip_pvt_unlock(p);
+
+			ast_rtp_instance_set_stats_vars(owner_ref, p->rtp);
+			if (peer_channel && IS_SIP_TECH(ast_channel_tech(peer_channel))) {
+				struct sip_pvt *q = ast_channel_tech_pvt(peer_channel);
+				if (q && q->rtp) {
+					ast_rtp_instance_set_stats_vars(peer_channel, q->rtp);
 				}
-				if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, quality_buf, sizeof(quality_buf)))) {
-					append_history(p, "RTCPaudioLoss", "Quality:%s", quality);
-				}
-				if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, quality_buf, sizeof(quality_buf)))) {
-					append_history(p, "RTCPaudioRTT", "Quality:%s", quality);
-				}
-			}
-
-			if (p->owner) {
-				ast_rtp_instance_set_stats_vars(p->owner, p->rtp);
-			}
-
-		}
-
-		if (bridge) {
-			struct sip_pvt *q = ast_channel_tech_pvt(bridge);
-
-			if (IS_SIP_TECH(ast_channel_tech(bridge)) && q && q->rtp) {
-				ast_rtp_instance_set_stats_vars(bridge, q->rtp);
-			}
-			ast_channel_unlock(bridge);
-		}
-
-		if (p->vrtp && (quality = ast_rtp_instance_get_quality(p->vrtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
-			if (p->do_history) {
-				append_history(p, "RTCPvideo", "Quality:%s", quality);
-			}
-			if (p->owner) {
-				pbx_builtin_setvar_helper(p->owner, "RTPVIDEOQOS", quality);
-			}
-		}
-		if (p->trtp && (quality = ast_rtp_instance_get_quality(p->trtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
-			if (p->do_history) {
-				append_history(p, "RTCPtext", "Quality:%s", quality);
-			}
-			if (p->owner) {
-				pbx_builtin_setvar_helper(p->owner, "RTPTEXTQOS", quality);
-			}
+			}
+
+			owner_relock = sip_pvt_lock_full(p);
+			if (!owner_relock) {
+				ast_debug(3, "Unable to reacquire owner channel lock, channel is gone\n");
+				return 0;
+			}
+		}
+	}
+
+	if (p->vrtp && (quality = ast_rtp_instance_get_quality(p->vrtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+		if (p->do_history) {
+			append_history(p, "RTCPvideo", "Quality:%s", quality);
+		}
+		if (p->owner) {
+			pbx_builtin_setvar_helper(p->owner, "RTPVIDEOQOS", quality);
+		}
+	}
+
+	if (p->trtp && (quality = ast_rtp_instance_get_quality(p->trtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+		if (p->do_history) {
+			append_history(p, "RTCPtext", "Quality:%s", quality);
+		}
+		if (p->owner) {
+			pbx_builtin_setvar_helper(p->owner, "RTPTEXTQOS", quality);
 		}
 	}
 
@@ -26463,15 +26490,30 @@
 		if (!res) {
 			c = p->owner;
 			if (c) {
-				RAII_VAR(struct ast_channel *, bridged_to, ast_channel_bridge_peer(c), ast_channel_cleanup);
-				if (bridged_to) {
+				if (peer_channel) {
+					RAII_VAR(struct ast_channel *, owner_relock, NULL, ast_channel_cleanup);
+					char *local_context = ast_strdupa(p->context);
+					char *local_refer_to = ast_strdupa(p->refer->refer_to);
+
+					/* Grab a reference to p->owner to prevent it from going away */
+					ast_channel_ref(c);
+
 					/* Don't actually hangup here... */
 					ast_queue_unhold(c);
 					ast_channel_unlock(c);  /* async_goto can do a masquerade, no locks can be held during a masq */
-					ast_async_goto(bridged_to, p->context, p->refer->refer_to, 1);
-					ast_channel_lock(c);
-				} else
+					sip_pvt_unlock(p);
+
+					ast_async_goto(peer_channel, local_context, local_refer_to, 1);
+
+					owner_relock = sip_pvt_lock_full(p);
+					ast_channel_cleanup(c);
+					if (!owner_relock) {
+						ast_debug(3, "Unable to reacquire owner channel lock, channel is gone\n");
+						return 0;
+					}
+				} else {
 					ast_queue_hangup(p->owner);
+				}
 			}
 		} else {
 			ast_log(LOG_WARNING, "Invalid transfer information from '%s'\n", ast_sockaddr_stringify(&p->recv));

Modified: team/dlee/ASTERISK-21969/channels/chan_vpb.cc
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/channels/chan_vpb.cc?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/channels/chan_vpb.cc (original)
+++ team/dlee/ASTERISK-21969/channels/chan_vpb.cc Fri Aug 16 10:49:13 2013
@@ -37,6 +37,16 @@
  * \verbinclude vpb.conf.sample
  */
 
+/*
+ * XXX chan_vpb needs its native bridge code converted to the
+ * new bridge technology scheme.  The chan_dahdi native bridge
+ * code can be used as an example.  It is unlikely that this
+ * will ever get done.
+ *
+ * The existing native bridge code is marked with the
+ * VPB_NATIVE_BRIDGING conditional.
+ */
+
 /*** MODULEINFO
 	<depend>vpb</depend>
 	<defaultenabled>no</defaultenabled>
@@ -347,7 +357,6 @@
 static int vpb_answer(struct ast_channel *ast);
 static struct ast_frame *vpb_read(struct ast_channel *ast);
 static int vpb_write(struct ast_channel *ast, struct ast_frame *frame);
-static enum ast_bridge_result ast_vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
 static int vpb_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen);
 static int vpb_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
 
@@ -369,7 +378,6 @@
 	send_image: NULL,
 	send_html: NULL,
 	exception: NULL,
-	bridge: ast_vpb_bridge,
 	early_bridge: NULL,
 	indicate: vpb_indicate,
 	fixup: vpb_fixup,
@@ -378,11 +386,8 @@
 	transfer: NULL,
 	write_video: NULL,
 	write_text: NULL,
-	bridged_channel: NULL,
 	func_channel_read: NULL,
 	func_channel_write: NULL,
-	get_base_channel: NULL,
-	set_base_channel: NULL
 };
 
 static struct ast_channel_tech vpb_tech_indicate = {
@@ -403,7 +408,6 @@
 	send_image: NULL,
 	send_html: NULL,
 	exception: NULL,
-	bridge: ast_vpb_bridge,
 	early_bridge: NULL,
 	indicate: NULL,
 	fixup: vpb_fixup,
@@ -412,13 +416,11 @@
 	transfer: NULL,
 	write_video: NULL,
 	write_text: NULL,
-	bridged_channel: NULL,
 	func_channel_read: NULL,
 	func_channel_write: NULL,
-	get_base_channel: NULL,
-	set_base_channel: NULL
 };
 
+#if defined(VPB_NATIVE_BRIDGING)
 /* Can't get ast_vpb_bridge() working on v4pci without either a horrible 
 *  high pitched feedback noise or bad hiss noise depending on gain settings
 *  Get asterisk to do the bridging
@@ -618,6 +620,7 @@
 */
 	return (res == VPB_OK) ? AST_BRIDGE_COMPLETE : AST_BRIDGE_FAILED;
 }
+#endif	/* defined(VPB_NATIVE_BRIDGING) */
 
 /* Caller ID can be located in different positions between the rings depending on your Telco
  * Australian (Telstra) callerid starts 700ms after 1st ring and finishes 1.5s after first ring
@@ -1030,15 +1033,7 @@
 			break;
 
 		case AST_FRAME_CONTROL:
-			if (!(p->bridge->flags & AST_BRIDGE_IGNORE_SIGS)) {
-			#if 0
-			if (f.subclass == AST_CONTROL_BUSY ||
-			f.subclass == AST_CONTROL_CONGESTION ||
-			f.subclass == AST_CONTROL_HANGUP ||
-			f.subclass == AST_CONTROL_FLASH)
-			#endif
-				endbridge = 1;
-			}
+			endbridge = 1;
 			break;
 
 		default:
@@ -2260,12 +2255,7 @@
 		ast_verb(5, "%s: chanreads: Starting cycle ...\n", p->dev);
 		ast_verb(5, "%s: chanreads: Checking bridge \n", p->dev);
 		if (p->bridge) {
-			if (p->bridge->c0 == p->owner && (p->bridge->flags & AST_BRIDGE_REC_CHANNEL_0))
-				bridgerec = 1;
-			else if (p->bridge->c1 == p->owner && (p->bridge->flags & AST_BRIDGE_REC_CHANNEL_1))
-				bridgerec = 1;
-			else 
-				bridgerec = 0;
+			bridgerec = 0;
 		} else {
 			bridgerec = ast_channel_is_bridged(p->owner) ? 1 : 0;
 		}

Modified: team/dlee/ASTERISK-21969/configs/features.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-21969/configs/features.conf.sample?view=diff&rev=396841&r1=396840&r2=396841
==============================================================================
--- team/dlee/ASTERISK-21969/configs/features.conf.sample (original)

[... 1310 lines stripped ...]



More information about the asterisk-commits mailing list