[asterisk-commits] jrose: trunk r372808 - /trunk/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Sep 10 16:15:44 CDT 2012


Author: jrose
Date: Mon Sep 10 16:15:38 2012
New Revision: 372808

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=372808
Log:
chan_sip: Change SIPQualifyPeer to improve initial response time

Prior to this patch, The acknowledgement wasn't produced until after
executing the sip_poke_peer action actually responsible for
qualifying the peer. Now the response is given immediately once it is
known that a peer will be qualified and a SIPqualifypeerdone event
is issued when the process is finished. Thanks to OEJ for identifying
the problem and helping to come up with a solution.

(issue AST-969)
Reported by John Bigelow
Review: https://reviewboard.asterisk.org/r/2098/

Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=372808&r1=372807&r2=372808
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Mon Sep 10 16:15:38 2012
@@ -545,6 +545,9 @@
 		<description>
 			<para>Qualify a SIP peer.</para>
 		</description>
+		<see-also>
+			<ref type="managerEvent">SIPqualifypeerdone</ref>
+		</see-also>
 	</manager>
 	<manager name="SIPshowregistry" language="en_US">
 		<synopsis>
@@ -18957,18 +18960,47 @@
 
 	load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? TRUE : FALSE;
 	if ((peer = sip_find_peer(argv[3], NULL, load_realtime, FINDPEERS, FALSE, 0))) {
+
+		const char *id = astman_get_header(m,"ActionID");
+		char idText[256] = "";
+
+		if (type != 0) {
+			astman_send_ack(s, m, "SIP peer found - will qualify");
+		}
+
+		if (!ast_strlen_zero(id)) {
+			snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
+		}
+
 		sip_poke_peer(peer, 1);
+
+		/*** DOCUMENTATION
+			<managerEventInstance>
+				<synopsis>Raised when SIPqualifypeer has finished qualifying the specified peer.</synopsis>
+				<syntax>
+					<parameter name="Peer">
+						<para>The name of the peer.</para>
+					</parameter>
+					<parameter name="ActionID">
+						<para>This is only included if an ActionID Header was sent with the action request, in which case it will be that ActionID.</para>
+					</parameter>
+				</syntax>
+				<see-also>
+					<ref type="manager">SIPqualifypeer</ref>
+				</see-also>
+			</managerEventInstance>
+		***/
+		manager_event(EVENT_FLAG_CALL, "SIPqualifypeerdone",
+			"Peer: %s\r\n"
+			"%s",
+			argv[3],
+			idText);
+
 		sip_unref_peer(peer, "qualify: done with peer");
 	} else if (type == 0) {
 		ast_cli(fd, "Peer '%s' not found\n", argv[3]);
-		return CLI_SUCCESS;
 	} else {
 		astman_send_error(s, m, "Peer not found");
-		return CLI_SUCCESS;
-	}
-
-	if (type != 0) {
-		astman_send_ack(s, m, "Qualify Peer successful");
 	}
 
 	return CLI_SUCCESS;




More information about the asterisk-commits mailing list