[asterisk-commits] dlee: trunk r379023 - in /trunk: ./ include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jan 14 09:58:09 CST 2013


Author: dlee
Date: Mon Jan 14 09:58:01 2013
New Revision: 379023

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=379023
Log:
Masquerades are an insane implementation detail within Asterisk. It generates
a number of useless and confusing events, and manipulates channels in a way
that semantically doesn't make sense. I've given a fairly thorough review of
masquerade code and its usage on the wiki at
https://wiki.asterisk.org/wiki/x/IwBRAQ.

While ultimately it makes the most sense to abandon masquerades altogether,
it will take some time to completely irradicate. Even then, there may always
be code that's not worth rewriting to get rid of the masquerade.

This patch does two things to make masquerades slightly less insane:
 * When swapping the names of the original and clone channel, only emit a
   single rename event of original -> original<ZOMBIE>. The original code
   issued three rename events to accomplish the same end.
 * In addition to swapping the names of the channels, also swap their
   uniqueid's. This allows the 'Uniqueid' field to be used as a stable
   identifier for a channel from and external interface, such as AMI.

Review: https://reviewboard.asterisk.org/r/2266/

Modified:
    trunk/UPGRADE.txt
    trunk/include/asterisk/manager.h
    trunk/main/channel.c

Modified: trunk/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/trunk/UPGRADE.txt?view=diff&rev=379023&r1=379022&r2=379023
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Mon Jan 14 09:58:01 2013
@@ -27,6 +27,17 @@
  - The SIP SIPqualifypeer action now sends a response indicating it will qualify
    a peer once a peer has been found to qualify.  Once the qualify has been
    completed it will now issue a SIPqualifypeerdone event.
+ - Version 1.4 - The details of what happens to a channel when a masquerade
+   happens (transfers, parking, etc) have changed.
+   - The Masquerade event now includes the Uniqueid's of the clone and original
+     channels.
+   - Channels no longer swap Uniqueid's as a result of the masquerade.
+   - Instead of a shell game of renames, there's now a single rename, appending
+     <ZOMBIE> to the name of the original channel.
+
+CEL:
+ - The Uniqueid field for a channel is now a stable identifier, and will not
+   change due to transfers, parking, etc.
 
 Queues:
  - Queue logging for PAUSEALL/UNPAUSEALL now only occurs if the interface this is

Modified: trunk/include/asterisk/manager.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/manager.h?view=diff&rev=379023&r1=379022&r2=379023
==============================================================================
--- trunk/include/asterisk/manager.h (original)
+++ trunk/include/asterisk/manager.h Mon Jan 14 09:58:01 2013
@@ -54,7 +54,7 @@
 - \ref manager.c Main manager code file
  */
 
-#define AMI_VERSION                     "1.3"
+#define AMI_VERSION                     "1.4"
 #define DEFAULT_MANAGER_PORT 5038	/* Default port for Asterisk management via TCP */
 #define DEFAULT_MANAGER_TLS_PORT 5039	/* Default port for Asterisk management via TCP */
 

Modified: trunk/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/channel.c?view=diff&rev=379023&r1=379022&r2=379023
==============================================================================
--- trunk/main/channel.c (original)
+++ trunk/main/channel.c Mon Jan 14 09:58:01 2013
@@ -6865,10 +6865,8 @@
 	struct ast_format rformat;
 	struct ast_format wformat;
 	struct ast_format tmp_format;
-	char newn[AST_CHANNEL_NAME];
-	char orig[AST_CHANNEL_NAME];
-	char masqn[AST_CHANNEL_NAME];
-	char zombn[AST_CHANNEL_NAME];
+	char tmp_name[AST_CHANNEL_NAME];
+	const char *tmp_id;
 	char clone_sending_dtmf_digit;
 	struct timeval clone_sending_dtmf_tv;
 
@@ -6971,11 +6969,17 @@
 				<parameter name="Clone">
 					<para>The name of the channel whose information will be going into the Original channel.</para>
 				</parameter>
+				<parameter name="CloneUniqueid">
+					<para>The uniqueid of the channel whose information will be going into the Original channel.</para>
+				</parameter>
 				<parameter name="CloneState">
 					<para>The current state of the clone channel.</para>
 				</parameter>
 				<parameter name="Original">
 					<para>The name of the channel whose information will be replaced by the Clone channel's information.</para>
+				</parameter>
+				<parameter name="OriginalUniqueid">
+					<para>The uniqueid of the channel whose information will be replaced by the Clone channel's information.</para>
 				</parameter>
 				<parameter name="OriginalState">
 					<para>The current state of the original channel.</para>
@@ -6985,10 +6989,12 @@
 	***/
 	ast_manager_event_multichan(EVENT_FLAG_CALL, "Masquerade", 2, chans,
 		"Clone: %s\r\n"
+		"CloneUniqueid: %s\r\n"
 		"CloneState: %s\r\n"
 		"Original: %s\r\n"
+		"OriginalUniqueid: %s\r\n"
 		"OriginalState: %s\r\n",
-		ast_channel_name(clonechan), ast_state2str(ast_channel_state(clonechan)), ast_channel_name(original), ast_state2str(ast_channel_state(original)));
+		ast_channel_name(clonechan), ast_channel_uniqueid(clonechan), ast_state2str(ast_channel_state(clonechan)), ast_channel_name(original), ast_channel_uniqueid(original), ast_state2str(ast_channel_state(original)));
 
 	/*
 	 * Remember the original read/write formats.  We turn off any
@@ -7003,18 +7009,23 @@
 	clone_sending_dtmf_digit = ast_channel_sending_dtmf_digit(clonechan);
 	clone_sending_dtmf_tv = ast_channel_sending_dtmf_tv(clonechan);
 
-	/* Save the original name */
-	ast_copy_string(orig, ast_channel_name(original), sizeof(orig));
-	/* Save the new name */
-	ast_copy_string(newn, ast_channel_name(clonechan), sizeof(newn));
-	/* Create the masq name */
-	snprintf(masqn, sizeof(masqn), "%s<MASQ>", newn);
-
-	/* Mangle the name of the clone channel */
-	__ast_change_name_nolink(clonechan, masqn);
-
-	/* Copy the name from the clone channel */
-	__ast_change_name_nolink(original, newn);
+	/* Swap uniqueid's of the channels. This needs to happen before channel renames,
+	 * so rename events get the proper id's.
+	 */
+	tmp_id = ast_strdupa(ast_channel_uniqueid(clonechan));
+	ast_channel_uniqueid_set(clonechan, ast_channel_uniqueid(original));
+	ast_channel_uniqueid_set(original, tmp_id);
+
+	/* Swap channel names. This uses ast_channel_name_set directly, so we
+	 * don't get any spurious rename events.
+	 */
+	ast_copy_string(tmp_name, ast_channel_name(clonechan), sizeof(tmp_name));
+	ast_channel_name_set(clonechan, ast_channel_name(original));
+	ast_channel_name_set(original, tmp_name);
+
+	/* Now zombify the clonechan. This gets a real rename event. */
+	snprintf(tmp_name, sizeof(tmp_name), "%s<ZOMBIE>", ast_channel_name(clonechan)); /* quick, hide the brains! */
+	__ast_change_name_nolink(clonechan, tmp_name);
 
 	/* share linked id's */
 	ast_channel_set_linkgroup(original, clonechan);
@@ -7080,10 +7091,6 @@
 	origstate = ast_channel_state(original);
 	ast_channel_state_set(original, ast_channel_state(clonechan));
 	ast_channel_state_set(clonechan, origstate);
-
-	/* Mangle the name of the clone channel */
-	snprintf(zombn, sizeof(zombn), "%s<ZOMBIE>", orig); /* quick, hide the brains! */
-	__ast_change_name_nolink(clonechan, zombn);
 
 	/* Update the type. */
 	t_pvt = ast_channel_monitor(original);




More information about the asterisk-commits mailing list