chan_sip: Change SIPQualifyPeer to improve initial response time
authorJonathan Rose <jrose@digium.com>
Mon, 10 Sep 2012 21:15:38 +0000 (21:15 +0000)
committerJonathan Rose <jrose@digium.com>
Mon, 10 Sep 2012 21:15:38 +0000 (21:15 +0000)
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/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372808 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 8fc8084..69efc06 100644 (file)
@@ -545,6 +545,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                <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 @@ static char *_sip_qualify_peer(int type, int fd, struct mansession *s, const str
 
        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;